Objekte parallel mit ForEach-Object aufzählen

Abgeschlossen

PowerShell 7.0 führte einen dritten Parametersatz für ForEach-Object: den -Parallel Parameter ein. Mit diesem Parameter können Sie mehrere Pipelineobjekte gleichzeitig verarbeiten, anstatt nacheinander. Der parameter -Parallel erfordert PowerShell 7.0 oder höher– er ist in Windows PowerShell 5.1 nicht verfügbar.

Grundlegende parallele Syntax

Die grundlegende Syntax verwendet den -Parallel Parameter mit einem Skriptblock:

1..5 | ForEach-Object -Parallel { "Processing $_" }

Standardmäßig führt ForEach-Object -Parallel bis zu fünf Iterationen gleichzeitig aus. Verwenden Sie den -ThrottleLimit Parameter, um die maximale Anzahl gleichzeitiger Skriptblöcke zu steuern:

Get-Content servers.txt | ForEach-Object -Parallel {
    Test-Connection -ComputerName $_ -Count 1
} -ThrottleLimit 10

Übergeben von Variablen in parallele Skriptblöcke

Parallele Skriptblöcke werden in separaten Runspaces ausgeführt und können nicht direkt auf Variablen aus dem Bereich des Aufrufers zugreifen. Verwenden Sie den $using: Bereichsmodifizierer, um äußere Variablen zu übergeben.

$logPath = "C:\Logs"
Get-ChildItem $logPath -File | ForEach-Object -Parallel {
    $path = $using:logPath
    Move-Item $_.FullName -Destination "$path\Archive\$($_.Name)"
}

Hinweis

Variablen, auf die ohne $using: innerhalb eines -Parallel Skriptblocks verwiesen wird, sind $null, da der Skriptblock in einem isolierten Runspace ausgeführt wird.

Wann sollte man parallele Aufzählungen verwenden?

Parallele Ausführung eignet sich am besten für Vorgänge, bei denen die Arbeit pro Objekt zeitaufwändig und unabhängig ist, z. B.:

  • Netzwerkvorgänge (Testverbindung, Invoke-RestMethod)
  • Datei-E/A-Vorgänge auf separaten Dateien
  • Abfragen an mehrere Server

Bei trivialen Aufgaben kann der Aufwand beim Erstellen neuer Runspaces die parallele Ausführung langsamer als die sequenzielle Verarbeitung machen. Verwenden Sie -Parallel, wenn jeder Vorgang mindestens mehrere Sekunden dauert.

Andere Parameter

  • -TimeoutSeconds begrenzt, wie lange der parallele Vorgang ausgeführt wird, bevor verbleibende Elemente beendet werden.
  • -AsJob gibt den Vorgang als Hintergrundauftragsobjekt zurück, anstatt auf Ergebnisse zu warten.
1..20 | ForEach-Object -Parallel { Start-Sleep 1; $_ } -ThrottleLimit 5 -TimeoutSeconds 10