在Powershell中,如何等待并行作业完成后再继续?

Chr*_*s F 5 powershell powershell-2.0

基于如何并行执行PowerShell函数多次?,我能够做到这一点,同时停止所有正在运行的作业。

# Run this in parallel
$stopService {
  param($service)
  Stop-Service -Name $service.name -Force
}

$services = Get-Services | Where-Oject {$_.name -like "*XYX_*"}
Foreach($service in Sservices) {
  Start-Job -ScriptBlock $stopService -ArgumentList $service
}

$doSomethingElse
Run Code Online (Sandbox Code Playgroud)

但是我怎样才能修改代码,以便我所有的并行作业先于我完成呢$doSomethingElse?有点像join()命令?

San*_*zon 8

您可以捕获变量中PSRemotingJob返回的所有实例,然后使用或 using等待它们:Start-JobWait-JobReceive-Job -Wait -AutoRemoveJob

$jobs = foreach($service in $services) {
    Start-Job -ScriptBlock $stopService -ArgumentList $service
}

Receive-Job $jobs -Wait -AutoRemoveJob
Run Code Online (Sandbox Code Playgroud)

还有其他替代方案,例如此答案中显示的替代方案,使用循环和WaitHandle.WaitAny方法

这个答案显示了一个类似的、更成熟的替代方案,使用一个函数来等待有进度的作业和一个可选的TimeOut参数。