在服务下运行的Powershell挂起* .zip CopyHere

时间:2010-01-12 15:57:52

标签: powershell hudson

我正在运行一个Windows服务(Hudson),它反过来生成一个PowerShell进程来运行我的自定义PowerShell命令。我的部分脚本是使用CopyHere解压缩文件。当我在本地运行此脚本时,我会看到在提取和复制文件时弹出一个进度对话框。但是,当它在服务下运行时,它会挂起,否则会出现一个对话框。

这是我脚本的解压缩部分。

# Extract the contents of a zip file to a folder
function Extract-Zip {
    param([string]$zipFilePath, [string]$destination)
    if(test-path($zipFilePath))     {   
        $shellApplication = new-object -com shell.application

        $zipFile = get-item $zipFilePath
        $zipFolder = $shellApplication.NameSpace($zipFile.fullname)

        $destinationFile = get-item $destination
        $destinationFolder = $shellApplication.NameSpace($destinationFile.fullname)

        $destinationFolder.CopyHere($zipFolder.Items())
    }
}

我怀疑因为它是在一个无头的服务过程中运行(没有与桌面交互),所以它不知何故试图显示一个对话框。

有解决方法吗?

3 个答案:

答案 0 :(得分:3)

如果它仍然是实际的,我设法通过让CopyHere params等于1564来解决这个问题。

所以在我的案例中,提取zip函数看起来像:

    function Expand-ZIPFile{
    param(
    $file, $destination
    )
    $shell = new-object -com shell.application
    $zip = $shell.NameSpace($file)
    foreach($item in $zip.items())
    {
    $shell.Namespace($destination).copyhere($item,1564)
    "$($item.path) extracted"
    }

1564说明可在此处找到 - http://msdn.microsoft.com/en-us/library/windows/desktop/bb787866(v=vs.85).aspx

(4)不显示进度对话框 (8)如果已存在具有目标名称的文件,则在移动,复制或重命名操作中以新名称操作文件。
(16)对显示的任何对话框回答“是全是” (512)如果操作需要创建新目录,则不确认创建新目录 (1024)如果发生错误,请勿显示用户界面。

答案 1 :(得分:2)

如果这是在Vista或Windows 7上运行,最终用户将不会像您怀疑的那样从服务中弹出UI。请参阅Session 0 Isolation上的这篇论文。但是,进度对话框是否需要用户输入?如果没有,我认为这不会导致服务挂起。我会寻找一个禁用进度显示的选项。如果找不到,请尝试切换到另一个ZIP提取器。 PSCX 1.2附带一个Expand-Archive cmdlet。我相信还有其他人可用。

答案 2 :(得分:1)

查看PowerShell的documentation,看起来 -NonInteractive 选项可能对此有所帮助

相关问题