So führen Sie das Powershell-Skript gleichzeitig auf mehreren Computern aus

So führen Sie das Powershell-Skript gleichzeitig auf mehreren Computern aus

Ich versuche, das vorhandene PowerShell-Skript auf mehreren Computern gleichzeitig auszuführen. Derzeit verwende ich PowerShell Version 5.

Ich möchte wissen, ob es möglich ist, es ohne Hintergrundprozess auszuführen, um die Protokolle besser zu verstehen.

$computers = @("Hostname1", "Hostname2", "Hostname3")
$scriptPath = "C:\Projects\Scripts\Environment\InstallEnvironment.ps1"

$scriptBlock = {
    param (
        [string]$scriptPath
    )
    try {
        # Execute the script
        & $scriptPath
    }
    catch {
        Write-Host "Error occurred on $($env:COMPUTERNAME): $_"
    }
}
foreach ($computer in $computers) {
    Start-Job -ScriptBlock $scriptBlock -ArgumentList $scriptPath -Name $computer
}
while (Get-Job -State Running) {
    Start-Sleep -Milliseconds 100
}
Get-Job | Receive-Job
Get-Job | Remove-Job

Wir sind für jede Hilfe sehr dankbar.

Antwort1

Ich denke, Sie haben drei Möglichkeiten:

  • Machen Sie mit Jobs weiter, aber überarbeiten Sie Ihren Code ein wenig
  • Verwendung ForEach-Object -Parallelin PowerShell 7
  • Versuchen zu benutzenWorkflowsin PowerShell 5, die foreach -Parallel ($a in $x) {}eine andere Art von Kopfschmerzen verursachen

Hier ist ein Code-Schnipsel, der Invoke-Commandzum Erstellen der Jobs und Wait-Jobzum Warten auf sie verwendet wird:

$computers = @("Hostname1", "Hostname2", "Hostname3")
$scriptPath = "C:\Projects\Scripts\Environment\InstallEnvironment.ps1"
$scriptBlock = {
    try {
        & $Using:scriptPath
    }
    catch {
        Write-Host "Error occurred on $($env:COMPUTERNAME): $_"
    }
}
$Jobs = Invoke-Command -ScriptBlock $scriptBlock -ComputerName $computers -AsJob
# Results (Logs) are stored in the $Result variable
$Result = $Jobs | Wait-Job | Receive-Job
$Jobs | Remove-Job

So können Sie verwenden. ForEach-Object -ParallelBeachten Sie jedoch, dass dies in manchen Fällen die Ausgabe von Daten auf der Konsole nicht wie gewohnt ermöglicht und Ihnen andere Arten von Kopfschmerzen bereiten kann:

#Requires -Version 7
$computers = @("Hostname1", "Hostname2", "Hostname3")
$scriptPath = "C:\Projects\Scripts\Environment\InstallEnvironment.ps1"
$scriptBlock = {
    try {
        & $Using:scriptPath
    }
    catch {
        Write-Host "Error occurred on $($env:COMPUTERNAME): $_"
    }
}
$computers | ForEach-Object -Parallel {
    Invoke-Command -ScriptBlock $scriptBlock -ComputerName $_
}

Ich würde Ihnen unbedingt empfehlen, bei Jobs zu bleiben und Ihre Protokolle überReceive-Job

verwandte Informationen