Opfør objekter parallelt med ForEach-Object

Fuldført

PowerShell 7.0 introducerede et tredje parametersæt for ForEach-Object: parameteren -Parallel . Denne parameter lader dig behandle flere pipeline-objekter samtidig, i stedet for ét ad gangen. Parameteren -Parallel kræver PowerShell 7.0 eller nyere – den er ikke tilgængelig i Windows PowerShell 5.1.

Grundlæggende parallel syntaks

Den grundlæggende syntaks bruger parameteren -Parallel med et scriptblok:

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

Som standard ForEach-Object -Parallel kører den op til fem iterationer samtidig. Brug parameteren -ThrottleLimit til at kontrollere det maksimale antal samtidige scriptblokke:

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

Overførsel af variabler til parallelle scriptblokke

Parallelle scriptblokke kører i separate runspaces og kan ikke direkte tilgå variabler fra callerens scope. Brug scope-modifikatoren $using: til at overføre ydre variabler ind:

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

Bemærk!

Variable, der refereres uden $using: inden for en -Parallel scriptblok, skyldes $null , at scriptblokken kører i et isoleret runspace.

Hvornår skal man bruge parallel opramning

Parallel udførelse egner sig bedst til opgaver, hvor arbejdet pr. objekt er tidskrævende og uafhængigt, såsom:

  • Netværksoperationer (Test-Connection, Invoke-RestMethod)
  • Fil-I/O-operationer på separate filer
  • Forespørgsler til flere servere

For trivielle opgaver kan overhead ved at oprette nye runspaces gøre parallel eksekvering langsommere end sekventiel behandling. Brug -Parallel den, når hver operation tager mindst flere sekunder.

Andre parametre

  • -TimeoutSeconds begrænser, hvor længe den parallelle drift kører, før de resterende genstande stopper.
  • -AsJob returnerer operationen som et baggrundsjobobjekt i stedet for at vente på resultater.
1..20 | ForEach-Object -Parallel { Start-Sleep 1; $_ } -ThrottleLimit 5 -TimeoutSeconds 10