我正在使用PowerShell语法:
Start-Process -FilePath $file -ArgumentList $argList -NoNewWindow -Wait
正在启动的进程是一个安装程序,它安装Windows服务然后启动该服务,然后该进程停止。发生的事情是我的脚本无限期挂起,即使在进程成功完成并且进程已退出之后(正如我在任务管理器中看到的那样。当我从命令行运行它时,没有PowerShell,它在一分钟内完成)。显然,它还在等待,因为有一个从原始进程中产生的子进程。如何告诉PowerShell只等待初始进程($ file)而不是任何子进程?
由于
答案 0 :(得分:2)
最后,我决定简单地以.NETy的方式进行,尽管我更喜欢Powershelly的方式。以下代码是从https://stackoverflow.com/a/8762068/1378356复制的:
indexDist
这种方式没有问题。
答案 1 :(得分:0)
我已经处理了这个问题多年了。一般来说,如果安装非常简短,我只需要等待脚本(Start-Sleep 60或其他)。但是,如果安装运行的时间非常多,那么我实际编目在开始安装之前运行的msiexec进程然后循环并检查每60秒左右以查看是否所有新进程都已结束。如果安装调用实际的子安装,它会变得更加棘手。根据安装,我习惯使用的另一种方法是更低或更大程度的成功是每60秒左右再次循环检查以查看针对WMI Win32_Product类的查询是否具有正在安装的产品的实例。您几乎必须为安装和环境定制解决方案。
答案 2 :(得分:0)
在过去,我做了相反的事情,我想等到某个过程开始才能继续,并且我已经使用了WMI事件来完成它。值得一试,看看相同的技术是否有助于你:
# Start a process to track
Start-Process "Notepad.exe"
# Get WMI to track process exits
Register-WmiEvent -Query "SELECT * FROM __instancedeletionevent WITHIN 5 WHERE targetinstance isa 'win32_process'" `
-SourceIdentifier "WMI.ProcessDeleted" `
-Action {
if($eventArgs.NewEvent.TargetInstance.Name -eq "Notepad.exe")
{
Write-Host "Notepad exited!"
# Raise an event to notify completion
New-Event "PowerShell.ProcessDeleted" -Sender $sender -EventArguments $EventArgs.NewEvent.TargetInstance | Out-Null
}
} | Out-Null
# Wait for the event signifying that we completed the work (timeout after 10 min)
Wait-Event -SourceIdentifier "PowerShell.ProcessDeleted" -Timeout 600 | Out-Null
# Remove any events we created
Get-Event -SourceIdentifier "PowerShell.ProcessDeleted" -ErrorAction SilentlyContinue | Remove-Event
# Unregister the event monitor
Unregister-Event -Force -SourceIdentifier "WMI.ProcessDeleted"
只需更换" Notepad.exe"使用安装程序进程的名称,并删除对Write-Host的调用(或替换为更有用的内容)。如果你在10分钟内关闭记事本(调整到适合)你应该看到一条消息,否则我们仍然继续,所以脚本不会无限期挂起。