PowerShell中如何等待所有并行作业完成后再执行后续操作
PowerShell等待并行后台作业完成的实现方案
PowerShell原生提供了和其他编程语言join()功能完全对应的命令:Wait-Job,该命令会阻塞当前执行流,直到指定的后台作业全部运行结束后,才会继续执行后续逻辑。
修正后可直接运行的代码
先修复你原代码里的几处笔误(脚本块定义漏写赋值符、cmdlet名拼写错误、变量名漏写$符号),再加入等待作业的逻辑:
# 定义停止单个服务的脚本块,用于作业并行执行 $stopService = { param($service) Stop-Service -Name $service.name -Force } # 查询所有匹配命名规则的目标服务 $services = Get-Service | Where-Object {$_.name -like "*XYX_*"} # 遍历为每个服务启动独立后台作业并行执行停止操作 foreach($service in $services) { Start-Job -ScriptBlock $stopService -ArgumentList $service } # 阻塞等待所有已启动的停服务作业执行完成,等价于其他语言的join()操作 Get-Job | Wait-Job # 所有作业全部执行完成后,才会运行后续逻辑 $doSomethingElse
优化建议
- 如果你的PowerShell会话里之前已经启动过其他无关后台作业,不建议直接用
Get-Job获取全量作业等待,可以把本次启动的作业对象单独存到变量里定向等待,避免不必要的阻塞:
# 启动作业时同步收集作业对象 $stopServiceJobs = foreach($service in $services) { Start-Job -ScriptBlock $stopService -ArgumentList $service } # 仅等待本次启动的停服务作业完成 $stopServiceJobs | Wait-Job
- 作业执行完成后如果不需要留存作业的输出、执行状态记录,可以在等待命令后追加
| Remove-Job清理作业对象,释放会话占用的资源。
内容的提问来源于stack exchange,提问作者Chris F
相关产品推荐
相关产品推荐

