Partager via


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>]

Description

L’applet de commande forEach-Object 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}

  • 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

    Lorsque vous utilisez le format de bloc de script, en plus d’utiliser le bloc de script qui décrit les opérations effectuées sur chaque objet d’entrée, vous pouvez fournir deux blocs de script supplémentaires. Le bloc de script Begin, qui est la valeur du paramètre Begin, s’exécute avant que cette applet de commande traite le premier objet d’entrée. Le bloc de script End, qui est la valeur du paramètre End, s’exécute après que cette applet de commande traite le dernier objet d’entrée.

Exemples

Exemple 1 : Diviser des entiers dans un tableau

30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625

Cette commande prend un tableau de trois entiers et divise chacun d’eux par 1024.

Exemple 2 : Obtenir la longueur de tous les fichiers d’un répertoire

Get-ChildItem $pshome | ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}

Cette commande obtient les fichiers et répertoires du répertoire d’installation PowerShell $pshome et les transmet à l’applet de commande ForEach-Object. 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

$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}

Cette commande obtient les 1 000 événements les plus récents du journal des événements système et les stocke dans la variable $Events. Il canalise ensuite les événements vers l’applet de commande ForEach-Object.

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

Get-ItemProperty -Path HKCU:\Network\* | ForEach-Object {Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper();}

Cette commande modifie la valeur de l’entrée de Registre RemotePath dans toutes les sous-clés sous la clé HKCU :\Network en texte en majuscules. 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 à l’ouverture de session. L’entrée RemotePath contient le chemin UNC du lecteur connecté. Par exemple, si vous mappez le lecteur E : à \\Server\Share, il y aura une sous-clé E de HKCU :\Network et la valeur de l’entrée de registre RemotePath dans la sous-clé E sera \\Server\Share.

La commande utilise l’applet de commande pour obtenir toutes les sous-clés de la clé de Réseau et l’applet 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

1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello

Cet exemple montre l’effet de la conversion de la $Null variable automatique à l’applet ForEach-Object de commande.

É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.

Pour plus d’informations sur la variable automatique $Null, consultez about_Automatic_Variables.

Exemple 6 : Obtenir des valeurs de propriété

Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path

Ces commandes obtiennent la valeur de la propriété Path de tous les modules PowerShell installés. Ils utilisent le paramètre MemberName pour spécifier la propriété Path des modules.

La deuxième commande équivaut au premier. Il utilise l’alias foreach de l’applet de commande et omet le nom du paramètre MemberName, facultatif.

L’applet de commande est très 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 de commande , qui modifient le type de valeur de propriété.

Exemple 7 : Fractionner les noms de module en noms de composants

"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

Ces commandes divisent deux noms de modules séparés par des 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 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 de fractionnement et le paramètre ArgumentName pour identifier le point (« . ») comme délimiteur fractionné.

La troisième commande utilise l’alias Foreach de l’applet de commande Foreach-Object et omet les noms des paramètres MemberName et ArgumentList facultatifs.

La sortie de ces trois commandes, illustrées ci-dessous, est identique.

fractionner n’est qu’une des nombreuses méthodes utiles de chaînes. Pour afficher toutes les propriétés et méthodes de chaînes, dirigez une chaîne vers l’applet de commande Get-Member.

Paramètres

-ArgumentList

Spécifie un tableau d’arguments à un appel de méthode.

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

-Begin

Spécifie un bloc de script qui s’exécute avant que cette applet de commande traite les objets d’entrée.

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.

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. Si, par exemple, vous exécutez et que plusieurs membres existent avec un nom qui contient le nom de la chaîne, tel que le ProcessName et les propriétés Name, la commande échoue.

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

-Process

Spécifie l’opération effectuée sur chaque objet d’entrée. Entrez un bloc de script qui décrit l’opération.

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: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:

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

-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