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

在服务下运行的Powershell挂起*.zip CopyHere,powershell,hudson,Powershell,Hudson,我正在运行一个Windows服务(Hudson),它反过来生成一个PowerShell进程来运行我的自定义PowerShell命令。我的脚本的一部分是使用CopyHere解压文件。当我在本地运行此脚本时,在提取和复制文件时会弹出一个进度对话框。但是,当它在服务下运行时,它会挂起在对话框出现的位置 这是我脚本的解压部分 # Extract the contents of a zip file to a folder function Extract-Zip { param([string]

我正在运行一个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())
    }
}
我怀疑,因为它是在一个无头的服务进程下运行的(与桌面没有交互),所以它在试图显示对话框时不知何故被卡住了


有办法解决这个问题吗?

看看for PowerShell,看起来-非交互的选项在这里可能会有所帮助

如果它在Vista或Windows 7上运行,最终用户不会像您所怀疑的那样看到服务弹出的UI。请看这篇文章。但是,“进度”对话框是否需要用户输入?如果不是,我认为这不会导致服务挂起。我会寻找一个选项来禁用进度显示。如果找不到,请尝试切换到另一个ZIP提取器。随附扩展存档cmdlet。我确信还有其他可用的参数。

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

在我的例子中,extract 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说明可在此处找到-:

(4) 不要显示进度对话框。
(8) 如果目标名称的文件已存在,则在移动、复制或重命名操作中为正在操作的文件指定一个新名称。
(16) 对于显示的任何对话框,回答“全部是”。
(512)如果操作需要创建新目录,则不要确认创建新目录。

(1024)如果发生错误,不要显示用户界面。

这将阻止PowerShell显示提示,但我认为这不会阻止Windows shell显示UI。进度对话框不应要求用户输入。当我在命令提示符下运行它时,它不会——它只是显示进度对话框,没有任何必需的输入,然后当它完成时,对话框消失。实际进度对话框由CopyHere方法生成。据推测,您应该能够传递一些选项来阻止任何潜在的交互,但有几十篇帖子抱怨PowerShell忽略了这些特定选项。我本来希望尽量避免使用第三方的东西,但我可能不得不在7-Zip上添加cave.PSCX providers wrapper cmdlet,但如果您愿意,您始终可以直接使用7-Zip-您是否尝试过Hudson的powershell插件?也许这会有帮助。