Remote-PowerShell Script auf mehreren Rechnern gleichzeitig Ausführen
Hallo zusammen,
nach dem mein letztes Script (Remote-PowerShell Script gibt Probleme bei einigen Testrechnern) Dank der Hilfe von 'grexit' super läuft und die heutige Erprobung bis auf einen Anwenderfehler sehr gut lief... dauerte das Update doch über eine Stunde, bei 28 Rechnern.
Da ich dies, für die Mitbarbeiter und mich, gerne beschleunigen würde interessiert mich ob man Powershell irgendwie dazu bringen könnte das Script für die in PC.txt enthaltenen Rechner parallel starten zu lassen.
Zum Bleistift das man der Powershell sagt sie solle sich die ersten 5 Rechner nehmen, für die 5 Rechner die Installation parallel fertig stellen und dann die nächsten 5 Rechner nehmen. Da noch 80 Systeme mit einer Installation über das Script warten wäre dies natürlich extrem Hilfreich und Zeitsparend.
LG Althalus
PS: Codebeispiele würden mich sehr Freuen.
nach dem mein letztes Script (Remote-PowerShell Script gibt Probleme bei einigen Testrechnern) Dank der Hilfe von 'grexit' super läuft und die heutige Erprobung bis auf einen Anwenderfehler sehr gut lief... dauerte das Update doch über eine Stunde, bei 28 Rechnern.
Da ich dies, für die Mitbarbeiter und mich, gerne beschleunigen würde interessiert mich ob man Powershell irgendwie dazu bringen könnte das Script für die in PC.txt enthaltenen Rechner parallel starten zu lassen.
Zum Bleistift das man der Powershell sagt sie solle sich die ersten 5 Rechner nehmen, für die 5 Rechner die Installation parallel fertig stellen und dann die nächsten 5 Rechner nehmen. Da noch 80 Systeme mit einer Installation über das Script warten wäre dies natürlich extrem Hilfreich und Zeitsparend.
LG Althalus
PS: Codebeispiele würden mich sehr Freuen.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 287323
Url: https://administrator.de/contentid/287323
Ausgedruckt am: 22.11.2024 um 10:11 Uhr
4 Kommentare
Neuester Kommentar
Moin,
Kannst du z.B. über den Parameter -AsJob von Invoke-Command. Das führt den Job als separaten Thread im Hintergrund aus.
Gruß jodel32
Kannst du z.B. über den Parameter -AsJob von Invoke-Command. Das führt den Job als separaten Thread im Hintergrund aus.
-AsJob
Runs the command as a background job on a remote computer. Use this parameter to run commands that take an extensive time to complete.
When you use AsJob, the command returns an object that represents the job, and then displays the command prompt. You can continue to work in the session while the job completes. To manage the job, use the Job cmdlets. To get the job results, use the Receive-Job cmdlet.
The AsJob parameter is similar to using the Invoke-Command cmdlet to run a Start-Job command remotely. However, with AsJob, the job is created on the local computer, even though the job runs on a remote computer, and the results of the remote job are automatically returned to the local computer.
1000 und ein Invoke-Command OMG hast wohl den Vorschlag von @122990 im letzten Post nicht übernommen, denn dann bräuchtest du nur ein einziges Invoke-Command pro Rechner, dann einfach den o.g. Parameter dran hängen Schleife, durchlaufen lassen und Kaffee trinken gehen, dann machen sich alle Rechner gleichzeitig an die Installation.
Ein bißchen Lesen kann man eigentlich schon erwarten:
Background Jobs
Beispiel:
Ein bißchen Lesen kann man eigentlich schon erwarten:
Background Jobs
Beispiel:
# Array für alle Jobs
$jobs = @()
(gc 'D:\Powershell\1.txt') | %{
# Job erstellen und starten
$job = Invoke-Command -ComputerName $_ -ScriptBlock {
# hier kommen deine Befehle rein die auf dem Remote-Computer ausgeführt werden sollen
# für deinen Test hier mal eine simple sleep Schleife
1..(Get-Random -Min 1 -Max 10) | %{sleep(1)}
} -AsJob -Jobname "RechnerJob_$_"
# Job dem Array hinzufügen
$jobs +=$job
}
# Überprüfen welche Jobs noch laufen
$j = $jobs | ?{$_.State -eq "Running"}
# so lange checken bis alle Jobs erledigt sind
while ($j){
cls
$j = $jobs | ?{$_.State -eq "Running"}
write-host "Noch $($j.Count) Jobs zu erledigen" -ForegroundColor Green
$j | ft Name,State -AutoSize
sleep 1
}
write-host "Fertig"
# Jobs entfernen
remove-job $jobs