如何在PowerShell 5中并行执行带对应ID的远程服务器脚本
PowerShell 5 并行执行远程脚本(按门店传递对应ID)
方法一:使用 Invoke-Command -AsJob(推荐)
这种方式基于WinRM远程会话实现并行,开销远低于本地后台作业,执行效率高,且能确保每个门店对应正确的ID参数。
修改后的脚本:
# 读取并解析门店ID映射文件 $storeids = Get-Content 'D:\StoreMap.json' -Raw | ConvertFrom-Json | Select-Object STORE, ID # 遍历门店列表,启动异步远程执行作业 $jobs = $storeids | ForEach-Object { $computer = 'IN' + $_.STORE + 'test.org' $targetId = $_.ID $scriptPath = 'D:\test.ps1' Write-Host "开始执行门店 $computer 的远程任务" # 启动异步远程作业,传递目标脚本路径和ID参数 Invoke-Command -ComputerName $computer -ScriptBlock { param($script, $storeId) try { & $script $storeId } catch { Write-Error "门店 $($env:COMPUTERNAME) 执行失败: $($_.Exception.Message)" } } -ArgumentList $scriptPath, $targetId -AsJob } # 等待所有远程作业完成 Write-Host "等待所有门店任务执行完毕..." Wait-Job -Job $jobs # 获取所有作业的执行结果(包括输出和错误) Write-Host "获取任务执行结果:" Receive-Job -Job $jobs # 清理已完成的作业 Remove-Job -Job $jobs
关键说明:
-AsJob参数让每个远程任务在后台异步运行,自动实现并行处理。- 可通过
-ThrottleLimit参数控制并发数(默认32),比如-ThrottleLimit 20限制同时执行20个远程任务,避免资源过载。 - 远程端的错误会被捕获并返回,方便后续排查问题。
方法二:使用 Start-Job(本地后台作业)
如果WinRM配置存在问题,可采用本地后台作业实现并行,但每个作业会启动独立的PowerShell进程,开销较大,仅适合少量门店场景。
修改后的脚本:
# 读取并解析门店ID映射文件 $storeids = Get-Content 'D:\StoreMap.json' -Raw | ConvertFrom-Json | Select-Object STORE, ID $jobs = @() # 遍历门店,创建本地后台作业 foreach ($store in $storeids) { $computer = 'IN' + $store.STORE + 'test.org' $targetId = $store.ID $scriptPath = 'D:\test.ps1' Write-Host "启动门店 $computer 的后台作业" $job = Start-Job -ScriptBlock { param($computerName, $script, $storeId) try { Invoke-Command -ComputerName $computerName -FilePath $script -ArgumentList $storeId } catch { Write-Error "门店 $computerName 执行失败: $($_.Exception.Message)" } } -ArgumentList $computer, $scriptPath, $targetId $jobs += $job } # 等待所有作业完成 Write-Host "等待所有作业完成..." Wait-Job -Job $jobs # 获取作业结果 Receive-Job -Job $jobs # 清理作业 Remove-Job -Job $jobs
注意事项
- 确保本地和所有远程服务器已启用WinRM:在管理员权限下运行
Enable-PSRemoting -Force完成配置。 - 确认执行脚本的账号对所有远程服务器有足够权限,能访问
D:\test.ps1并执行。 - 根据门店数量和服务器性能调整并发数,避免因并发过高导致系统资源耗尽。
内容的提问来源于stack exchange,提问作者Laba Ningombam
相关产品推荐
相关产品推荐

