ForEach-Object
Effectue une opération sur chaque élément d’une collection d’objets d’entrée.
Syntaxe
ScriptBlockSet (Par défaut)
ForEach-Object
[-Process] <ScriptBlock[]>
[-InputObject <PSObject>]
[-Begin <ScriptBlock>]
[-End <ScriptBlock>]
[-RemainingScripts <ScriptBlock[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
PropertyAndMethodSet
ForEach-Object
[-MemberName] <String>
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
ParallelParameterSet
ForEach-Object
-Parallel <ScriptBlock>
[-InputObject <PSObject>]
[-ThrottleLimit <Int32>]
[-TimeoutSeconds <Int32>]
[-AsJob]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
Description
L’applet ForEach-Object de commande effectue une opération sur chaque élément d’une collection d’objets d’entrée. Les objets d’entrée peuvent être redirigés vers l’applet de commande ou spécifiés à l’aide du paramètre InputObject
À compter de Windows PowerShell 3.0, il existe deux façons différentes de construire une commande ForEach-Object.
de bloc de script . Vous pouvez utiliser un bloc de script pour spécifier l’opération. Dans le bloc de script, utilisez la
$_variable pour représenter l’objet actuel. Le bloc de script est la valeur du paramètre Process . Le bloc de script peut contenir n’importe quel script PowerShell.Par exemple, la commande suivante obtient la valeur de la propriété ProcessName de chaque processus sur l’ordinateur.
Get-Process | ForEach-Object {$_.ProcessName}ForEach-ObjectPrend en charge lesbeginblocs ,processetendcomme décrit dans about_functions.Remarque
Les blocs de script s’exécutent dans l’étendue de l’appelant. Par conséquent, les blocs ont accès aux variables de cette étendue et peuvent créer de nouvelles variables qui persistent dans cette étendue une fois l’applet de commande terminée.
instruction Operation. Vous pouvez également écrire une instruction d’opération, qui est beaucoup plus semblable au langage naturel. Vous pouvez utiliser l’instruction d’opération pour spécifier une valeur de propriété ou appeler une méthode. Les instructions d’opération ont été introduites dans Windows PowerShell 3.0.
Par exemple, la commande suivante obtient également la valeur de la propriété ProcessName de chaque processus sur l’ordinateur.
Get-Process | ForEach-Object ProcessNameBloc de script en cours d’exécution parallèle. À compter de PowerShell 7.0, un troisième jeu de paramètres est disponible qui exécute chaque bloc de script en parallèle. Le paramètre ThrottleLimit limite le nombre de scripts parallèles en cours d’exécution à la fois. Comme précédemment, utilisez la
$_variable pour représenter l’objet d’entrée actuel dans le bloc de script. Utilisez le mot-clé pour transmettre des$using:références de variables au script en cours d’exécution.Dans PowerShell 7, un nouvel espace d’exécution est créé pour chaque itération de boucle pour garantir l’isolation maximale. Il peut s’agir d’un impact important sur les performances et les ressources si le travail que vous effectuez est petit par rapport à la création de nouveaux espaces d’exécution ou s’il existe beaucoup d’itérations effectuant un travail significatif. À partir de PowerShell 7.1, les instances d’exécution d’un pool d’espaces de exécution sont réutilisées par défaut. La taille du pool d’espace d’exécution est spécifiée par le paramètre ThrottleLimit . La taille du pool runspace par défaut est 5. Vous pouvez toujours créer un espace d’exécution pour chaque itération à l’aide du commutateur UseNewRunspace .
Par défaut, les blocs de script parallèles utilisent le répertoire de travail actuel de l’appelant qui a démarré les tâches parallèles.
Pour plus d’informations, consultez la section NOTES de cet article.
Exemples
Exemple 1 : Diviser des entiers dans un tableau
Cet exemple prend un tableau de trois entiers et divise chacun d’eux par 1024.
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
Exemple 2 : Obtenir la longueur de tous les fichiers d’un répertoire
Cet exemple traite les fichiers et les répertoires dans le répertoire $PSHOMEd’installation de PowerShell.
Get-ChildItem $PSHOME |
ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}
Si l’objet n’est pas un répertoire, le bloc de script obtient le nom du fichier, divise la valeur de sa propriété Length par 1024 et ajoute un espace ( » « ) pour le séparer de l’entrée suivante. L’applet de commande utilise la propriété PSISContainer pour déterminer si un objet est un répertoire.
Exemple 3 : Utiliser les événements système les plus récents
Cet exemple écrit les 1 000 événements les plus récents du journal des événements système dans un fichier texte. L’heure actuelle s’affiche avant et après le traitement des événements.
$Events = Get-EventLog -LogName System -Newest 1000
$events | ForEach-Object -Begin {Get-Date} -Process {Out-File -FilePath Events.txt -Append -InputObject $_.Message} -End {Get-Date}
Get-EventLog récupère les 1000 événements les plus récents à partir du journal des événements système et les stocke dans la $Events variable.
$Events est ensuite redirigé vers l’applet ForEach-Object de commande. Le paramètre Begin affiche la date et l’heure actuelles. Ensuite, le paramètre Process utilise l’applet de commande Out-File pour créer un fichier texte nommé events.txt et stocke la propriété de message de chacun des événements de ce fichier. Enfin, le paramètre End est utilisé pour afficher la date et l’heure après la fin du traitement.
Exemple 4 : Modifier la valeur d’une clé de Registre
Cet exemple remplace la valeur de l’entrée de registre RemotePath dans toutes les sous-clés sous la HKCU:\Network clé par du texte en majuscules.
Get-ItemProperty -Path HKCU:\Network\* |
ForEach-Object {Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper();}
Vous pouvez utiliser ce format pour modifier le formulaire ou le contenu d’une valeur d’entrée de Registre.
Chaque sous-clé de la clé réseau représente un lecteur réseau mappé qui se reconnecte lors de l’authentification. L’entrée RemotePath contient le chemin UNC du lecteur connecté. Par exemple, si vous mappez le lecteur E : à \\Server\Share, une sous-clé E est créée dans HKCU:\Network avec la valeur de registre RemotePath définie sur \\Server\Share.
La commande utilise l’applet de commande Set-ItemProperty commande, le chemin d’accès est la valeur de la propriété PSPath de la clé de Registre. Il s’agit d’une propriété de l’objet Microsoft .NET Framework qui représente la clé de Registre, et non une entrée de Registre. La commande utilise la méthode
Étant donné que Set-ItemProperty la modification de la propriété de chaque clé est nécessaire, l’applet ForEach-Object de commande doit accéder à la propriété.
Exemple 5 : Utiliser la variable automatique $Null
Cet exemple montre l’effet de la conversion de la $Null variable automatique à l’applet ForEach-Object de commande.
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
Étant donné que PowerShell traite null comme un espace réservé explicite, l’applet de commande ForEach-Object génère une valeur pour $Null, tout comme pour les autres objets que vous dirigez vers celui-ci.
Exemple 6 : Obtenir des valeurs de propriété
Cet exemple récupère la valeur de la propriété Path de tous les modules PowerShell installés à l’aide du paramètre MemberName de l’applet ForEach-Object de commande.
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path
La deuxième commande équivaut au premier. Il utilise l’alias Foreach de l’applet ForEach-Object de commande et omet le nom du paramètre MemberName , qui est facultatif.
L’applet ForEach-Object de commande est utile pour obtenir des valeurs de propriété, car elle obtient la valeur sans modifier le type, contrairement aux applets de commande Format ou à l’applet Select-Object de commande, qui modifient le type de valeur de propriété.
Exemple 7 : Fractionner les noms de module en noms de composants
Cet exemple montre trois façons de fractionner deux noms de modules séparés par points en noms de composants. Les commandes appellent la méthode Split de chaînes. Les trois commandes utilisent une syntaxe différente, mais elles sont équivalentes et interchangeables. La sortie est la même pour les trois cas.
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | ForEach-Object {$_.Split(".")}
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | ForEach-Object -MemberName Split -ArgumentList "."
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | Foreach Split "."
Microsoft
PowerShell
Core
Microsoft
PowerShell
Host
La première commande utilise la syntaxe traditionnelle, qui inclut un bloc de script et l’opérateur $_d’objet actuel. Il utilise la syntaxe des points pour spécifier la méthode et les parenthèses pour placer l’argument délimiteur.
La deuxième commande utilise le paramètre MemberName pour spécifier la méthode Split et le paramètre ArgumentList pour identifier le point (.) comme délimiteur fractionné.
La troisième commande utilise l’alias Foreach de l’applet ForEach-Object de commande et omet les noms des paramètres MemberName et ArgumentList , qui sont facultatifs.
Exemple 8 : Utilisation de ForEach-Object avec deux blocs de script
Dans cet exemple, nous passons deux blocs de script en position position. Tous les blocs de script sont liés au paramètre Process . Cependant, ils sont traités comme s’ils avaient été transmis aux paramètres Begin et Process .
1..2 | ForEach-Object { 'begin' } { 'process' }
begin
process
process
Exemple 9 : Utilisation de ForEach-Object avec plus de deux blocs de script
Dans cet exemple, nous passons deux blocs de script en position position. Tous les blocs de script sont liés au paramètre Process . Cependant, ils sont traités comme s’ils avaient été transmis aux paramètres Begin, Process et End .
1..2 | ForEach-Object { 'begin' } { 'process A' } { 'process B' } { 'end' }
begin
process A
process B
process A
process B
end
Remarque
Le premier bloc de script est toujours mappé au begin bloc, le dernier bloc est mappé au end bloc et les blocs intermédiaires sont tous mappés au process bloc.
Exemple 10 : Exécuter plusieurs blocs de script pour chaque élément de pipeline
Comme indiqué dans l’exemple précédent, plusieurs blocs de script passés à l’aide du paramètre Process sont mappés aux paramètres Begin et End . Pour éviter ce mappage, vous devez fournir des valeurs explicites pour les paramètres Begin et End .
1..2 | ForEach-Object -Begin $null -Process { 'one' }, { 'two' }, { 'three' } -End $null
one
two
three
one
two
three
Exemple 11 : Exécuter un script lent dans des lots parallèles
Cet exemple exécute un bloc de script simple qui évalue une chaîne et se met en veille pendant une seconde.
$Message = "Output:"
1..8 | ForEach-Object -Parallel {
"$using:Message $_"
Start-Sleep 1
} -ThrottleLimit 4
Output: 1
Output: 2
Output: 3
Output: 4
Output: 5
Output: 6
Output: 7
Output: 8
La valeur du paramètre ThrottleLimit est définie sur 4 afin que l’entrée soit traitée par lots de quatre.
Le $using: mot-clé est utilisé pour passer la $Message variable dans chaque bloc de script parallèle.
Exemple 12 : Récupérer des entrées de journal en parallèle
Cet exemple récupère 50 000 entrées de journal à partir de 5 journaux système sur un ordinateur Windows local.
$logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'
$logEntries = $logNames | ForEach-Object -Parallel {
Get-WinEvent -LogName $_ -MaxEvents 10000
} -ThrottleLimit 5
$logEntries.Count
50000
Le paramètre Parallel spécifie le bloc de script qui est exécuté en parallèle pour chaque nom de journal d’entrée. Le paramètre ThrottleLimit garantit que les cinq blocs de script s’exécutent en même temps.
Exemple 13 : Exécuter en parallèle en tant que travail
Cet exemple exécute un bloc de script simple en parallèle, en créant deux travaux d’arrière-plan à la fois.
$job = 1..10 | ForEach-Object -Parallel {
"Output: $_"
Start-Sleep 1
} -ThrottleLimit 2 -AsJob
$job | Receive-Job -Wait
Output: 1
Output: 2
Output: 3
Output: 4
Output: 5
Output: 6
Output: 7
Output: 8
Output: 9
Output: 10
La $job variable reçoit l’objet Job qui collecte les données de sortie et surveille l’état en cours d’exécution.
L’objet de travail est redirigé Receive-Job vers l’aide du paramètre de commutateur Wait . Et cela transmet la sortie à la console, comme s’il ForEach-Object -Parallel était exécuté sans AsJob.
Exemple 14 : Utilisation de références de variables thread safe
Cet exemple appelle des blocs de script en parallèle pour collecter des objets Process nommés de manière unique.
$threadSafeDictionary = [System.Collections.Concurrent.ConcurrentDictionary[string,object]]::new()
Get-Process | ForEach-Object -Parallel {
$dict = $using:threadSafeDictionary
$dict.TryAdd($_.ProcessName, $_)
}
$threadSafeDictionary["pwsh"]
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
82 82.87 130.85 15.55 2808 2 pwsh
Une seule instance d’un objet ConcurrentDictionary est passée à chaque bloc de script pour collecter les objets. Étant donné que le ConcurrentDictionary est thread-safe, il peut être modifié en toute sécurité par chaque script parallèle. Un objet non thread-safe, tel que System.Collections.Generic.Dictionary, ne serait pas sûr d’être utilisé ici.
Remarque
Cet exemple est une utilisation très inefficace du paramètre Parallel . Le script ajoute simplement l’objet d’entrée à un objet dictionnaire concurrent. C’est trivial et cela ne vaut pas la peine d’invoquer chaque script dans un fil de discussion séparé. Fonctionner ForEach-Object normalement sans le commutateur parallèle est beaucoup plus efficace et plus rapide. Cet exemple est destiné uniquement à montrer comment utiliser des variables thread safe.
Exemple 15 : Écriture d’erreurs avec exécution parallèle
Cet exemple écrit dans le flux d’erreurs en parallèle, où l’ordre des erreurs écrites est aléatoire.
1..3 | ForEach-Object -Parallel {
Write-Error "Error: $_"
}
Write-Error: Error: 1
Write-Error: Error: 3
Write-Error: Error: 2
Exemple 16 : Fin des erreurs dans l’exécution parallèle
Cet exemple illustre une erreur de fin dans un scriptblock en cours d’exécution parallèle.
1..5 | ForEach-Object -Parallel {
if ($_ -eq 3)
{
throw "Terminating Error: $_"
}
Write-Output "Output: $_"
}
Exception: Terminating Error: 3
Output: 1
Output: 4
Output: 2
Output: 5
Output: 3 n’est jamais écrit, car le scriptblock parallèle pour cette itération a été arrêté.
Remarque
Les variables de paramètre commun PipelineVariablene sont pas prises en charge dans les Foreach-Object -Parallel scénarios, même avec le mot-clé.$using:
Exemple 17 : Passage de variables dans un script parallèle imbriqué ScriptBlockSet
Vous pouvez créer une variable en dehors d’un Foreach-Object -Parallel scriptblock limité et l’utiliser à l’intérieur du scriptblock avec le mot-clé $using .
$test1 = 'TestA'
1..2 | Foreach-Object -Parallel {
$using:test1
}
TestA
TestA
# You CANNOT create a variable inside a scoped scriptblock
# to be used in a nested foreach parallel scriptblock.
$test1 = 'TestA'
1..2 | Foreach-Object -Parallel {
$using:test1
$test2 = 'TestB'
1..2 | Foreach-Object -Parallel {
$using:test2
}
}
Line |
2 | 1..2 | Foreach-Object -Parallel {
| ~~~~~~~~~~~~~~~~~~~~~~~~~~
| The value of the using variable '$using:test2' cannot be retrieved because it has not been set in the local session.
Le scriptblock imbriqué ne peut pas accéder à la $test2 variable et une erreur est générée.
Paramètres
-ArgumentList
Spécifie un tableau d’arguments à un appel de méthode. Pour plus d'informations sur le comportement d'ArgumentList, voir about_Splatting.
Ce paramètre a été introduit dans Windows PowerShell 3.0.
Propriétés du paramètre
| Type: | Object[] |
| Valeur par défaut: | None |
| Prend en charge les caractères génériques: | False |
| DontShow: | False |
| Alias: | Args |
Jeux de paramètres
PropertyAndMethodSet
| Position: | Named |
| Obligatoire: | False |
| Valeur du pipeline: | False |
| Valeur du pipeline par nom de propriété: | False |
| Valeur des arguments restants: | False |
-AsJob
Provoque l’exécution de l’appel parallèle en tant que travail PowerShell. Un objet de travail unique est retourné au lieu de la sortie des blocs de script en cours d’exécution. L’objet de travail contient des travaux enfants pour chaque bloc de script parallèle qui s’exécute. L’objet de travail peut être utilisé par toutes les applets de commande de travail PowerShell pour surveiller l’état d’exécution et récupérer des données.
Ce paramètre a été introduit dans PowerShell 7.0.
Propriétés du paramètre
| Type: | SwitchParameter |
| Valeur par défaut: | None |
| Prend en charge les caractères génériques: | False |
| DontShow: | False |
Jeux de paramètres
ParallelParameterSet
| Position: | Named |
| Obligatoire: | False |
| Valeur du pipeline: | False |
| Valeur du pipeline par nom de propriété: | False |
| Valeur des arguments restants: | False |
-Begin
Spécifie un bloc de script qui s’exécute avant que cette applet de commande traite les objets d’entrée. Ce bloc de script n’est exécuté qu’une seule fois pour l’ensemble du pipeline. Pour plus d’informations sur le begin bloc, consultez about_Functions.
Propriétés du paramètre
| Type: | ScriptBlock |
| Valeur par défaut: | None |
| Prend en charge les caractères génériques: | False |
| DontShow: | False |
Jeux de paramètres
ScriptBlockSet
| Position: | Named |
| Obligatoire: | False |
| Valeur du pipeline: | False |
| Valeur du pipeline par nom de propriété: | False |
| Valeur des arguments restants: | False |
-Confirm
Vous invite à confirmer avant d’exécuter l’applet de commande.
Propriétés du paramètre
| Type: | SwitchParameter |
| Valeur par défaut: | False |
| Prend en charge les caractères génériques: | False |
| DontShow: | False |
| Alias: | cf |
Jeux de paramètres
(All)
| Position: | Named |
| Obligatoire: | False |
| Valeur du pipeline: | False |
| Valeur du pipeline par nom de propriété: | False |
| Valeur des arguments restants: | False |
-End
Spécifie un bloc de script qui s’exécute après que cette applet de commande traite tous les objets d’entrée. Ce bloc de script n’est exécuté qu’une seule fois pour l’ensemble du pipeline. Pour plus d’informations sur le end bloc, consultez about_Functions.
Propriétés du paramètre
| Type: | ScriptBlock |
| Valeur par défaut: | None |
| Prend en charge les caractères génériques: | False |
| DontShow: | False |
Jeux de paramètres
ScriptBlockSet
| Position: | Named |
| Obligatoire: | False |
| Valeur du pipeline: | False |
| Valeur du pipeline par nom de propriété: | False |
| Valeur des arguments restants: | False |
-InputObject
Spécifie les objets d’entrée.
ForEach-Object exécute l’instruction de bloc de script ou d’opération sur chaque objet d’entrée. Entrez une variable qui contient les objets, ou tapez une commande ou une expression qui obtient les objets.
Lorsque vous utilisez le paramètre InputObject avec ForEach-Object, au lieu de passer aux ForEach-Objectrésultats de la commande piping, la valeur InputObject est traitée comme un seul objet. Cela est vrai même si la valeur est une collection qui est le résultat d’une commande, telle que -InputObject (Get-Process).
Étant donné que InputObject ne peut pas retourner des propriétés individuelles à partir d’un tableau ou d’une collection d’objets, nous vous recommandons que si vous utilisez ForEach-Object pour effectuer des opérations sur une collection d’objets pour ces objets qui ont des valeurs spécifiques dans des propriétés définies, vous utilisez ForEach-Object dans le pipeline, comme illustré dans les exemples de cette rubrique.
Propriétés du paramètre
| Type: | PSObject |
| Valeur par défaut: | None |
| Prend en charge les caractères génériques: | False |
| DontShow: | False |
Jeux de paramètres
(All)
| Position: | Named |
| Obligatoire: | False |
| Valeur du pipeline: | True |
| Valeur du pipeline par nom de propriété: | False |
| Valeur des arguments restants: | False |
-MemberName
Spécifie la propriété à obtenir ou la méthode à appeler.
Les caractères génériques sont autorisés, mais fonctionnent uniquement si la chaîne résultante se résout en une valeur unique.
Par exemple, si vous exécutez Get-Process | ForEach -MemberName *Name, le modèle générique correspond à plusieurs membres à l’origine de l’échec de la commande.
Ce paramètre a été introduit dans Windows PowerShell 3.0.
Propriétés du paramètre
| Type: | String |
| Valeur par défaut: | None |
| Prend en charge les caractères génériques: | True |
| DontShow: | False |
Jeux de paramètres
PropertyAndMethodSet
| Position: | 0 |
| Obligatoire: | True |
| Valeur du pipeline: | False |
| Valeur du pipeline par nom de propriété: | False |
| Valeur des arguments restants: | False |
-Parallel
Spécifie le bloc de script à utiliser pour le traitement parallèle des objets d’entrée. Entrez un bloc de script qui décrit l’opération.
Ce paramètre a été introduit dans PowerShell 7.0.
Propriétés du paramètre
| Type: | ScriptBlock |
| Valeur par défaut: | None |
| Prend en charge les caractères génériques: | False |
| DontShow: | False |
Jeux de paramètres
ParallelParameterSet
| Position: | Named |
| Obligatoire: | True |
| Valeur du pipeline: | False |
| Valeur du pipeline par nom de propriété: | False |
| Valeur des arguments restants: | False |
-Process
Spécifie l’opération effectuée sur chaque objet d’entrée. Ce bloc de script est exécuté pour chaque objet du pipeline. Pour plus d’informations sur le process bloc, consultez about_Functions.
Lorsque vous fournissez plusieurs blocs de script au paramètre Process , le premier bloc de script est toujours mappé au begin bloc. S’il n’y a que deux blocs de script, le deuxième bloc est mappé au process bloc. S’il y a trois blocs de script ou plus, le premier bloc de script est toujours mappé au begin bloc, le dernier bloc est mappé au end bloc et les blocs intermédiaires sont tous mappés au process bloc.
Propriétés du paramètre
| Type: | |
| Valeur par défaut: | None |
| Prend en charge les caractères génériques: | False |
| DontShow: | False |
Jeux de paramètres
ScriptBlockSet
| Position: | 0 |
| Obligatoire: | True |
| Valeur du pipeline: | False |
| Valeur du pipeline par nom de propriété: | False |
| Valeur des arguments restants: | False |
-RemainingScripts
Spécifie tous les blocs de script qui ne sont pas pris par le paramètre Process.
Ce paramètre a été introduit dans Windows PowerShell 3.0.
Propriétés du paramètre
| Type: | |
| Valeur par défaut: | None |
| Prend en charge les caractères génériques: | False |
| DontShow: | False |
Jeux de paramètres
ScriptBlockSet
| Position: | Named |
| Obligatoire: | False |
| Valeur du pipeline: | False |
| Valeur du pipeline par nom de propriété: | False |
| Valeur des arguments restants: | False |
-ThrottleLimit
Spécifie le nombre de blocs de script qui sont en parallèle. Les objets d’entrée sont bloqués jusqu’à ce que le nombre de blocs de script en cours d’exécution soit inférieur à la limite de limitation. La valeur par défaut est 5.
Ce paramètre a été introduit dans PowerShell 7.0.
Propriétés du paramètre
| Type: | Int32 |
| Valeur par défaut: | 5 |
| Prend en charge les caractères génériques: | False |
| DontShow: | False |
Jeux de paramètres
ParallelParameterSet
| Position: | Named |
| Obligatoire: | False |
| Valeur du pipeline: | False |
| Valeur du pipeline par nom de propriété: | False |
| Valeur des arguments restants: | False |
-TimeoutSeconds
Spécifie le nombre de secondes à attendre que toutes les entrées soient traitées en parallèle. Après le délai d’expiration spécifié, tous les scripts en cours d’exécution sont arrêtés. Et tous les objets d’entrée restants à traiter sont ignorés. La valeur par défaut de 0 désactive le délai d’expiration et ForEach-Object -Parallel peut s’exécuter indéfiniment. La saisie de Ctrl+C sur la ligne de commande arrête une commande en cours d’exécution ForEach-Object -Parallel . Ce paramètre ne peut pas être utilisé avec le paramètre AsJob .
Ce paramètre a été introduit dans PowerShell 7.0.
Propriétés du paramètre
| Type: | Int32 |
| Valeur par défaut: | 0 |
| Prend en charge les caractères génériques: | False |
| DontShow: | False |
Jeux de paramètres
ParallelParameterSet
| Position: | Named |
| Obligatoire: | False |
| Valeur du pipeline: | False |
| Valeur du pipeline par nom de propriété: | False |
| Valeur des arguments restants: | False |
-UseNewRunspace
Provoque l’appel parallèle pour créer un espace d’exécution pour chaque itération de boucle au lieu de réutiliser les espaces d’exécution à partir du pool d’instances d’exécution.
Ce paramètre a été introduit dans PowerShell 7.1
Propriétés du paramètre
| Type: | SwitchParameter |
| Valeur par défaut: | False |
| Prend en charge les caractères génériques: | False |
| DontShow: | False |
Jeux de paramètres
ParallelParameterSet
| Position: | Named |
| Obligatoire: | False |
| Valeur du pipeline: | False |
| Valeur du pipeline par nom de propriété: | False |
| Valeur des arguments restants: | False |
-WhatIf
Affiche ce qui se passerait si l’applet de commande s’exécute. L’applet de commande ne s’exécute pas.
Propriétés du paramètre
| Type: | SwitchParameter |
| Valeur par défaut: | False |
| Prend en charge les caractères génériques: | False |
| DontShow: | False |
| Alias: | Wi |
Jeux de paramètres
(All)
| Position: | Named |
| Obligatoire: | False |
| Valeur du pipeline: | False |
| Valeur du pipeline par nom de propriété: | False |
| Valeur des arguments restants: | False |
CommonParameters
Cette applet de commande prend en charge les paramètres courants : -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction et -WarningVariable. Pour plus d’informations, consultez about_CommonParameters.
Entrées
PSObject
Vous pouvez diriger n’importe quel objet vers cette applet de commande.
Sorties
PSObject
Cette applet de commande retourne des objets déterminés par l’entrée.
Notes
L’applet de commande ForEach-Object fonctionne comme l’instruction Foreach, sauf que vous ne pouvez pas diriger l’entrée vers une instruction Foreach. Pour plus d’informations sur l’instruction Foreach, consultez about_Foreach.
À compter de PowerShell 4.0, Where les ForEach méthodes ont été ajoutées pour une utilisation avec des collections. Vous pouvez en savoir plus sur ces nouvelles méthodes ici about_arrays
Utilisation de ForEach-Object -Parallel:
L’ensemble
ForEach-Object -Parallelde paramètres utilise l’API interne de PowerShell pour exécuter chaque bloc de script dans un nouvel espace d’exécution. Il s’agit d’une surcharge nettement supérieure à celle d’un traitementForEach-Objectséquentiel. Il est important d’utiliser Parallel lorsque la surcharge liée à l’exécution en parallèle est faible par rapport au travail effectué par le bloc de script. Par exemple:- Calcul de scripts intensifs sur des machines multicœurs
- Scripts qui passent du temps à attendre les résultats ou à effectuer des opérations de fichier
L’utilisation du paramètre Parallel peut entraîner l’exécution de scripts beaucoup plus lents que la normale. Surtout si les scripts parallèles sont trivials. Expérimentez avec Parallel pour découvrir où il peut être bénéfique.
Lorsqu’ils s’exécutent en parallèle, le bon fonctionnement des objets décorés avec ScriptProperties ou ScriptMethods est impossible s’ils sont exécutés dans un espace d’exécution différent de celui auquel les scripts étaient attachés à l’origine.
L’appel scriptblock tente toujours de s’exécuter dans son runspace d’accueil , quel que soit l’emplacement où il est réellement appelé. Toutefois,
ForEach-Object -Parallelcrée des runspaces temporaires qui sont supprimés après l’utilisation. Il n’existe donc plus d’espace d’exécution pour que les scripts s’exécutent plus.Ce comportement peut fonctionner tant que l’espace d’exécution d’accueil existe toujours. Toutefois, vous n’obtenez peut-être pas le résultat souhaité si le script dépend de variables externes uniquement présentes dans l’espace d’exécution de l’appelant et non dans l’espace d’exécution de l’appelant.
Les erreurs sans fin sont écrites dans le flux d’erreurs d’applet de commande lorsqu’elles se produisent dans des blocs de script en cours d’exécution parallèles. Étant donné que l’ordre d’exécution de scriptblock parallèle n’est pas déterministe, l’ordre dans lequel les erreurs apparaissent dans le flux d’erreurs est aléatoire. De même, les messages écrits dans d’autres flux de données, tels que l’avertissement, le verbe ou les informations, sont écrits dans ces flux de données dans un ordre indéterminé.
La fin des erreurs, telles que les exceptions, met fin à l’instance parallèle individuelle des blocs de script dans lesquels elles se produisent. Une erreur de fin dans un scriptblocks peut ne pas entraîner l’arrêt de l’applet
Foreach-Objectde commande. Les autres blocs de script, s’exécutant en parallèle, continuent à s’exécuter, sauf s’ils rencontrent également une erreur de fin. L’erreur de fin est écrite dans le flux de données d’erreur en tant que ErrorRecord avec un FullyQualifiedErrorId dePSTaskException. Les erreurs de fin peuvent être converties en erreurs non finales à l’aide de blocs try/catch ou trap PowerShell.Les variables de paramètre commun PipelineVariablene sont pas prises en charge dans les scénarios parallèles, même avec le mot-clé
$using:.Important
Le
ForEach-Object -Paralleljeu de paramètres exécute des blocs de script en parallèle sur des threads de processus distincts. Le$using:mot-clé permet de transmettre des références de variables du thread d’appel de l’applet de commande à chaque thread de bloc de script en cours d’exécution. Étant donné que les blocs de script s’exécutent dans différents threads, les variables d’objet passées par référence doivent être utilisées en toute sécurité. En général, il est prudent de lire à partir d’objets référencés qui ne changent pas. Toutefois, si l’état de l’objet est modifié, vous devez utiliser des objets threads sécurisés, tels que les types .NET System.Collection.Concurrent (voir l’exemple 11).