开始 - 处理并等待仅父进程

时间:2018-03-22 18:47:06

标签: powershell process

我正在使用PowerShell语法:

Start-Process -FilePath $file -ArgumentList $argList -NoNewWindow -Wait

正在启动的进程是一个安装程序,它安装Windows服务然后启动该服务,然后该进程停止。发生的事情是我的脚本无限期挂起,即使在进程成功完成并且进程已退出之后(正如我在任务管理器中看到的那样。当我从命令行运行它时,没有PowerShell,它在一分钟内完成)。显然,它还在等待,因为有一个从原始进程中产生的子进程。如何告诉PowerShell只等待初始进程($ file)而不是任何子进程?

由于

3 个答案:

答案 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分钟内关闭记事本(调整到适合)你应该看到一条消息,否则我们仍然继续,所以脚本不会无限期挂起。

相关问题