在服务下运行的Powershell挂起*.zip CopyHere
我正在运行一个Windows服务(Hudson),它反过来生成一个PowerShell进程来运行我的自定义PowerShell命令。我的脚本的一部分是使用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]
# 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插件?也许这会有帮助。