Énumérer des objets en parallèle avec ForEach-Object

Effectué

PowerShell 7.0 a introduit un troisième jeu de paramètres pour ForEach-Object: le -Parallel paramètre. Ce paramètre vous permet de traiter plusieurs objets de pipeline simultanément, plutôt qu’un à la fois. Le paramètre -Parallel nécessite PowerShell 7.0 ou version ultérieure. Il n'est pas disponible dans Windows PowerShell 5.1.

Syntaxe parallèle de base

La syntaxe de base utilise le -Parallel paramètre avec un bloc de script :

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

Par défaut, ForEach-Object -Parallel exécute jusqu’à cinq itérations en même temps. Utilisez le -ThrottleLimit paramètre pour contrôler le nombre maximal de blocs de script simultanés :

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

Passage de variables dans des blocs de script parallèles

Les blocs de script parallèles s’exécutent dans des runspaces distincts et ne peuvent pas accéder directement aux variables de l’étendue de l’appelant. Utilisez le modificateur d’étendue $using: pour passer des variables externes dans :

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

Note

Les variables référencées sans $using: à l’intérieur d’un -Parallel bloc de script sont $null parce que le bloc de script s’exécute dans un espace d’exécution isolé.

Quand utiliser l’énumération parallèle

L’exécution parallèle est idéale pour les tâches où le travail par objet prend du temps et est indépendant, par exemple :

  • Opérations réseau (Test-Connection, Invoke-RestMethod)
  • Opérations d’E/S de fichier sur des fichiers distincts
  • Requêtes sur plusieurs serveurs

Pour les tâches triviales, la surcharge liée à la création de nouveaux espaces d’exécution peut ralentir l’exécution parallèle au traitement séquentiel. Utilisez -Parallel quand chaque opération prend au moins plusieurs secondes.

Autres paramètres

  • -TimeoutSeconds limite la durée pendant laquelle l’opération parallèle s’exécute avant d’arrêter les éléments restants.
  • -AsJob retourne l’opération en tant qu’objet de tâche en arrière-plan au lieu d’attendre les résultats.
1..20 | ForEach-Object -Parallel { Start-Sleep 1; $_ } -ThrottleLimit 5 -TimeoutSeconds 10