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 脚本之类的东西,但为什么要重新发明轮子呢?我当然不是第一个遇到这个问题的人。
您可以使用 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)