Opfør objekter parallelt med ForEach-Object
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
-
-TimeoutSecondsbegrænser, hvor længe den parallelle drift kører, før de resterende genstande stopper. -
-AsJobreturnerer operationen som et baggrundsjobobjekt i stedet for at vente på resultater.
1..20 | ForEach-Object -Parallel { Start-Sleep 1; $_ } -ThrottleLimit 5 -TimeoutSeconds 10