/ / Gibt es eine M├Âglichkeit, einen Befehl auf mehreren Windows-Servern parallel auszuf├╝hren - Windows, Befehlszeile, Powershell?

Gibt es eine M├Âglichkeit, einen Befehl auf mehreren Windows-Servern parallel auszuf├╝hren - Windows, Befehlszeile, Powershell?

Hin und wieder muss ich einen Befehl ausf├╝hrenmehrere Windows-Server (synchronisieren Sie Dateien aus einem Quellcode-Repository, das Skriptdateien [und andere zuf├Ąllige Dinge] enth├Ąlt). Die Ausf├╝hrungszeit dieses Befehls wird von der Netzwerklatenz bestimmt.

Derzeit verwende ich den PowerShell-Befehl "Invoke-Command"Cmdlet, das den Befehl jedoch nacheinander auf jedem Host ausf├╝hrt. Da die Ausf├╝hrung dieses Skripts viel Zeit in Anspruch nimmt (manchmal einige Minuten pro Server), m├Âchte ich die Ausf├╝hrung des Befehls auf allen Servern gleichzeitig beschleunigen.

Invoke-Command kann das, soweit ich das beurteilen kann, nicht. SysInternals "psexec kann das auch nicht.

Mir ist vage bewusst, dass PowerShell eine Parallele hatSchleifenfunktion, die mehrere Iterationen der Schleife gleichzeitig auf mehreren Threads ausf├╝hren kann. In der Dokumentation hei├čt es jedoch, dass dies nur in einem PowerShell-Workflow verf├╝gbar ist, mit dem ich nicht vertraut bin, und es klingt nach einem massiven Overkill.

In einer Unix-y-Shell konnte ich jeden Aufruf von psexec im Hintergrund ausf├╝hren. Meines Wissens unterst├╝tzt PowerShell dies jedoch nicht. Oder ich k├Ânnte ein Tool wie GNU parallel oder ts verwenden.

Gibt es eine (einfache) M├Âglichkeit, dies auf einem Windows 7-Computer zu tun?

Wenn alles andere fehlschl├Ągt, k├Ânnte ich ein Perl-Skript schreiben oder so, aber warum das Rad neu erfinden? Ich bin sicherlich nicht der erste, der auf dieses Problem st├Â├čt.

Antworten:

5 f├╝r Antwort Ôäľ 1

Sie k├Ânnen Powershell-Jobs verwenden, um mehrere Aufrufbefehle gleichzeitig auszuf├╝hren. Wie das genau funktioniert, wurde bereits bei Stack Overflow erkl├Ąrt: https://stackoverflow.com/questions/8781666/run-n-parallel-jobs-in-powershell

Ich kopiere es hier als Referenz, leicht angepasst an Ihren Anwendungsfall:

Mit dem Cmdlet Start-Job k├Ânnen Sie Code im Hintergrund ausf├╝hren.

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
}