如何修改PowerShell脚本实现数百台远程计算机异步批量重启服务?
PowerShell远程批量并行重启服务实现方案
你当前使用的串行脚本单台依次执行,处理大量主机时耗时过长,以下是3种可实现并行下发任务的可行方案:
方案1:使用Invoke-Command(推荐,适配WinRM环境,并发数可控)
该方案依托Windows自带的WinRM远程管理体系,可自定义并发上限,兼容性好:
$services = "winmgmt", "cryptsvc", "vss" $computers = Get-Content "${env:\userprofile}\servers.txt" # -ThrottleLimit参数控制最大并行数,可根据网络和设备性能调整 Invoke-Command -ComputerName $computers -ScriptBlock { param($serviceList) Get-Service -Name $serviceList | Restart-Service -Force } -ArgumentList $services -ThrottleLimit 50 -AsJob | Receive-Job -Wait -AutoRemoveJob
方案2:PowerShell 7+ 原生ForEach-Object并行(语法更简洁)
如果本地运行环境为PowerShell 7及以上版本,可使用更简洁的原生并行语法:
$services = "winmgmt", "cryptsvc", "vss" $computers = Get-Content "${env:\userprofile}\servers.txt" # $using:前缀可直接引用外部变量,-ThrottleLimit控制并行上限 $computers | ForEach-Object -Parallel { Get-Service -ComputerName $_ -Name $using:services | Restart-Service -Force } -ThrottleLimit 50
方案3:兼容PowerShell 5.1的Start-Job实现
如果仍在使用PowerShell 5.1版本无法升级,可通过Start-Job手动提交后台作业实现并行:
$services = "winmgmt", "cryptsvc", "vss" $computers = Get-Content "${env:\userprofile}\servers.txt" # 批量提交后台作业 $jobs = foreach ($srv in $computers) { Start-Job -ScriptBlock { param($srv, $svc) Get-Service -ComputerName $srv -Name $svc | Restart-Service -Force } -ArgumentList $srv, $services } # 等待所有作业执行完成并返回结果 $jobs | Wait-Job | Receive-Job # 清理已完成的作业 $jobs | Remove-Job
注意事项
- 所有方案都需要当前操作账号拥有对应远程主机的服务管理权限,否则会触发权限报错
- 并发数不要设置过高,避免本地出口网络占满或触发远程主机的安全拦截规则
- 可自行添加远程主机连通性检测逻辑,提前过滤离线主机,减少执行报错
内容的提问来源于stack exchange,提问作者Tony Wong
相关产品推荐
相关产品推荐

