我正在运行一个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())
}
}
我怀疑因为它是在一个无头的服务过程中运行(没有与桌面交互),所以它不知何故试图显示一个对话框。
有解决方法吗?
答案 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 选项可能对此有所帮助