ForEach-Object
Effectue une opération sur chaque élément d'une collection d'objets d'entrée.
Syntaxe
ForEach-Object
[-InputObject <PSObject>]
[-Begin <ScriptBlock>]
[-Process] <ScriptBlock[]>
[-End <ScriptBlock>]
[-RemainingScripts <ScriptBlock[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
ForEach-Object
[-InputObject <PSObject>]
[-MemberName] <String>
[-ArgumentList <Object[]>]
[-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 ForEach-Object
commande.
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-Object
prend en charge lesbegin
blocs,process
commeend
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 ProcessName
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 $PSHOME
d’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.
Get-EventLog -LogName System -Newest 1000 |
ForEach-Object -Begin {Get-Date} -Process {
Out-File -FilePath Events.txt -Append -InputObject $_.Message
} -End {Get-Date}
Get-EventLog
obtient les 1000 événements les plus récents du journal des événements système et les canalise 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 Out-File
de commande 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 montre comment modifier la valeur de l’entrée de Registre RemotePath dans toutes les sous-clés sous la HKCU:\Network
clé en 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 la forme 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 E:
lecteur à \\Server\Share
, une sous-clé E est créée avec HKCU:\Network
la valeur de Registre RemotePath définie sur \\Server\Share
.
La commande utilise l’applet Get-ItemProperty
de commande pour obtenir toutes les sous-clés de la clé réseau et l’applet Set-ItemProperty
de commande pour modifier la valeur de l’entrée de Registre RemotePath dans chaque clé. Dans la 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 ToUpper() de la valeur RemotePath , qui est une chaîne REG_SZ.
É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 ForEach-Object
de commande génère une valeur comme $null
elle le fait pour d’autres objets redirigés vers celui-ci.
Exemple 6 : Obtenir des valeurs de propriété
Cet exemple obtient 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 est équivalente à la première. 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. Elle utilise la syntaxe à point pour spécifier la méthode et des parenthèses pour encadrer 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 . Toutefois, ils sont traités comme s’ils avaient été passés 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 quatre blocs de script en position position. Tous les blocs de script sont liés au paramètre Process . Toutefois, ils sont traités comme s’ils avaient été passés 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 deux blocs intermédiaires sont 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
Paramètres
-ArgumentList
Spécifie un tableau d’arguments à un appel de méthode. Pour plus d’informations sur le comportement d’ArgumentList, consultez about_Splatting.
Ce paramètre a été introduit dans Windows PowerShell 3.0.
Type: | Object[] |
Alias: | Args |
Position: | Named |
Valeur par défaut: | None |
Obligatoire: | False |
Accepter l'entrée de pipeline: | False |
Accepter les caractères génériques: | 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.
Type: | ScriptBlock |
Position: | Named |
Valeur par défaut: | None |
Obligatoire: | False |
Accepter l'entrée de pipeline: | False |
Accepter les caractères génériques: | False |
-Confirm
Vous demande une confirmation avant d’exécuter l’applet de commande.
Type: | SwitchParameter |
Alias: | cf |
Position: | Named |
Valeur par défaut: | False |
Obligatoire: | False |
Accepter l'entrée de pipeline: | False |
Accepter les caractères génériques: | 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.
Type: | ScriptBlock |
Position: | Named |
Valeur par défaut: | None |
Obligatoire: | False |
Accepter l'entrée de pipeline: | False |
Accepter les caractères génériques: | 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 contenant les objets, ou tapez une commande ou une expression qui obtient ces objets.
Lorsque vous utilisez le paramètre InputObject avec ForEach-Object
, au lieu de passer aux ForEach-Object
ré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)
.
Comme InputObject ne peut pas retourner des propriétés individuelles à partir d’un tableau ou d’une collection d’objets, nous vous ForEach-Object
recommandons d’effectuer des opérations sur une collection d’objets pour ces objets qui ont des valeurs spécifiques dans les propriétés définies, que vous utilisez ForEach-Object
dans le pipeline, comme illustré dans les exemples de cette rubrique.
Type: | PSObject |
Position: | Named |
Valeur par défaut: | None |
Obligatoire: | False |
Accepter l'entrée de pipeline: | True |
Accepter les caractères génériques: | False |
-MemberName
Spécifie le nom de la propriété membre à appeler ou la méthode membre à appeler. Les membres doivent être des membres d’instance, et non des membres statiques.
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.
Type: | String |
Position: | 0 |
Valeur par défaut: | None |
Obligatoire: | True |
Accepter l'entrée de pipeline: | False |
Accepter les caractères génériques: | True |
-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 existe 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 mappés au process
bloc.
Type: | ScriptBlock[] |
Position: | 0 |
Valeur par défaut: | None |
Obligatoire: | True |
Accepter l'entrée de pipeline: | False |
Accepter les caractères génériques: | 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.
Type: | ScriptBlock[] |
Position: | Named |
Valeur par défaut: | None |
Obligatoire: | False |
Accepter l'entrée de pipeline: | False |
Accepter les caractères génériques: | False |
-WhatIf
Montre ce qui se passe en cas d’exécution de l’applet de commande. L’applet de commande n’est pas exécutée.
Type: | SwitchParameter |
Alias: | wi |
Position: | Named |
Valeur par défaut: | False |
Obligatoire: | False |
Accepter l'entrée de pipeline: | False |
Accepter les caractères génériques: | False |
Entrées
Vous pouvez diriger n’importe quel objet vers cette applet de commande.
Sorties
Cette applet de commande retourne des objets déterminés par l’entrée.
Notes
Windows PowerShell inclut les alias suivants pour ForEach-Object
:
%
foreach
L’applet ForEach-Object
de commande fonctionne beaucoup 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