有没有办法在多个 Windows 服务器上并行运行命令

kry*_*lon 2 windows powershell command-line

时不时地,我需要在多个 Windows 服务器上运行一个命令(从包含脚本文件 [和其他随机内容] 的源代码存储库中同步文件)。该命令的执行时间由网络延迟决定。

目前,我使用 PowerShell 的 Invoke-Command cmdlet,但它在每个主机上按顺序运行命令。由于这个脚本需要很长时间才能运行(有时每台服务器需要几分钟),我想通过一次在所有服务器上并行运行命令来加快速度。

据我所知,Invoke-Command 无法做到这一点。SysInternals 的 psexec 也不能这样做。

我隐约知道 PowerShell 有一个并行循环工具,可以在多个线程上同时执行多次循环迭代。但是文档指出这仅在我不熟悉的 PowerShell 工作流程中可用,这听起来有点矫枉过正。

在 Unix-y shell 中,我可以在后台运行 psexec 的每次调用。但据我所知,PowerShell 不支持这一点。或者我可以使用像 GNU parallel 或 ts 这样的工具。

在 Windows 7 机器上有(简单的)方法可以做到这一点吗?

如果所有其他方法都失败了,我可以编写 Perl 脚本之类的东西,但为什么要重新发明轮子呢?我当然不是第一个遇到这个问题的人。

han*_*njo 5

您可以使用 Powershell 作业并行运行多个调用命令。Stack Overflow 已经解释了它的工作原理:https : //stackoverflow.com/questions/8781666/run-n-parallel-jobs-in-powershell

我将它复制到这里供您参考,稍微适应了您的用例:

Start-Job cmdlet 允许您在后台运行代码。

foreach ($server in $servers) {
    $running = @(Get-Job | Where-Object { $_.State -eq 'Running' })
    if ($running.Count -le 8) {
        Start-Job {
             $list = Invoke-Command -FilePath .\file.ps1 -ComputerName <hostname>
             ...
        }
    } else {
         $running | Wait-Job
    }
    Get-Job | Receive-Job
}
Run Code Online (Sandbox Code Playgroud)