You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:48:02