时不时地,我需要在多个 Windows 服务器上运行一个命令(从包含脚本文件 [和其他随机内容] 的源代码存储库同步文件)。此命令的执行时间主要由网络延迟决定。
目前,我使用 PowerShell 的 Invoke-Command cmdlet,但它在每个主机上按顺序运行命令。由于此脚本需要花费相当长的时间才能运行(有时每个服务器需要几分钟),因此我想通过同时在所有服务器上并行运行命令来加快速度。
据我所知,Invoke-Command 无法做到这一点。SysInternals 的 psexec 也无法做到这一点。
我隐约知道 PowerShell 具有并行循环功能,可以在多个线程上同时执行循环的多个迭代。但文档指出,这仅在 PowerShell 工作流中可用,而我对此并不熟悉,这听起来有点大材小用。
在 Unix-y shell 中,我可以在后台运行 psexec 的每次调用。但据我所知,PowerShell 不支持此功能。或者我可以使用 GNU parallel 或 ts 之类的工具。
有没有在 Windows 7 机器上执行此操作的(简单)方法?
如果其他方法都失败了,我可以编写一个 Perl 脚本或类似的东西,但为什么要重新发明轮子呢?我肯定不是第一个遇到这个问题的人。
答案1
您可以使用 Powershell Jobs 并行运行多个 Invoke-Command。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
}