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

如何在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

注意事项

  1. 确保本地和所有远程服务器已启用WinRM:在管理员权限下运行 Enable-PSRemoting -Force 完成配置。
  2. 确认执行脚本的账号对所有远程服务器有足够权限,能访问 D:\test.ps1 并执行。
  3. 根据门店数量和服务器性能调整并发数,避免因并发过高导致系统资源耗尽。

内容的提问来源于stack exchange,提问作者Laba Ningombam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:22:08