about_Foreach
Description courte
Décrit une commande de langage que vous pouvez utiliser pour parcourir tous les éléments d’une collection d’éléments.
Description longue
L’instruction foreach
(également appelée foreach
boucle) est une construction de langage pour parcourir (itérer) une série de valeurs dans une collection d’éléments.
Le type de collection le plus simple et le plus classique à parcourir est un tableau.
Dans une foreach
boucle, il est courant d’exécuter une ou plusieurs commandes sur chaque élément d’un tableau.
Syntax
L’exemple suivant illustre la foreach
syntaxe :
foreach ($<item> in $<collection>){<statement list>}
La partie de l’instruction foreach
placée entre parenthèses représente une variable et une collection à itérer. PowerShell crée automatiquement la variable $<item>
lors de l’exécution de la foreach
boucle. Avant chaque itération par le biais de la boucle, la variable est définie sur une valeur dans la collection.
Le bloc suivant une foreach
instruction {<statement list>}
contient un ensemble de commandes à exécuter sur chaque élément d’une collection.
Exemples
Par exemple, la foreach
boucle de l’exemple suivant affiche les valeurs du $letterArray
tableau.
$letterArray = "a","b","c","d"
foreach ($letter in $letterArray)
{
Write-Host $letter
}
Dans cet exemple, le $letterArray
tableau est créé et initialisé avec les valeurs "a"
de chaîne , "b"
, "c"
et "d"
. La première fois que l’instruction foreach
s’exécute, elle définit la $letter
variable égale au premier élément dans $letterArray
("a"
). Ensuite, il utilise l’applet Write-Host
de commande pour afficher la lettre a. La prochaine fois dans la boucle, $letter
est définie "b"
sur , et ainsi de suite. Une fois la foreach
boucle affichée la lettre d, PowerShell quitte la boucle.
foreach
les instructions peuvent également être utilisées avec des applets de commande qui retournent une collection d’éléments. Dans l’exemple suivant, l’instruction Foreach effectue les étapes de la liste des éléments retournés par l’applet Get-ChildItem
de commande.
foreach ($file in Get-ChildItem)
{
Write-Host $file
}
Vous pouvez affiner l’exemple à l’aide d’une if
instruction pour limiter les résultats retournés. Dans l’exemple suivant, l’instruction foreach
effectue la même opération de bouclage que l’exemple précédent, mais ajoute une if
instruction pour limiter les résultats aux fichiers supérieurs à 100 kilo-octets (Ko) :
foreach ($file in Get-ChildItem)
{
if ($file.length -gt 100KB)
{
Write-Host $file
}
}
Dans cet exemple, la foreach
boucle utilise une propriété de la $file
variable pour effectuer une opération de comparaison ($file.length -gt 100KB
). La $file
variable contient toutes les propriétés de l’objet retourné par l’applet Get-ChildItem
de commande. Par conséquent, vous pouvez retourner plus qu’un seul nom de fichier.
Dans l’exemple suivant, PowerShell retourne la longueur et la dernière heure d’accès dans la liste des instructions :
foreach ($file in Get-ChildItem)
{
if ($file.length -gt 100KB)
{
Write-Host $file
Write-Host $file.length
Write-Host $file.lastaccesstime
}
}
Dans cet exemple, vous n’êtes pas limité à l’exécution d’une seule commande dans une liste d’instructions.
Vous pouvez également utiliser une variable en dehors d’une foreach
boucle et incrémenter la variable à l’intérieur de la boucle. L’exemple suivant compte les fichiers de plus de 100 Ko de taille :
$i = 0
foreach ($file in Get-ChildItem) {
if ($file.length -gt 100KB) {
Write-Host $file "file size:" ($file.length / 1024).ToString("F0") KB
$i = $i + 1
}
}
if ($i -ne 0) {
Write-Host
Write-Host $i " file(s) over 100 KB in the current directory."
}
else {
Write-Host "No files greater than 100 KB in the current directory."
}
Dans l’exemple précédent, la $i
variable est définie à 0
l’extérieur de la boucle, et la variable est incrémentée à l’intérieur de la boucle pour chaque fichier trouvé supérieur à 100 Ko. Lorsque la boucle se ferme, une if
instruction évalue la valeur de l’affichage d’un $i
nombre de tous les fichiers de plus de 100 Ko. Il affiche également un message indiquant qu’aucun fichier de plus de 100 Ko n’a été trouvé.
L’exemple précédent montre également comment mettre en forme les résultats de la longueur du fichier :
($file.length / 1024).ToString("F0")
La valeur est divisée par 1 024 pour afficher les résultats en kilo-octets plutôt qu’en octets, et la valeur résultante est ensuite mise en forme à l’aide du spécificateur de format à virgule fixe pour supprimer les valeurs décimales du résultat. Le 0 fait que le spécificateur de format n’affiche pas de décimales.
Dans l’exemple suivant, la fonction définie analyse les scripts PowerShell et les modules de script et retourne l’emplacement des fonctions contenues dans. L’exemple montre comment utiliser la MoveNext
méthode (qui fonctionne de la même façon skip X
que sur une For
boucle) et la Current
propriété de la $foreach
variable à l’intérieur d’un bloc de script foreach. L’exemple de fonction peut rechercher des fonctions dans un script même s’il existe des définitions de fonctions inhabituelles ou incohérentes qui s’étendent sur plusieurs lignes.
Pour plus d’informations, consultez Utilisation des énumérateurs.
function Get-FunctionPosition {
[CmdletBinding()]
[OutputType('FunctionPosition')]
param(
[Parameter(Position = 0, Mandatory,
ValueFromPipeline, ValueFromPipelineByPropertyName)]
[ValidateNotNullOrEmpty()]
[Alias('PSPath')]
[System.String[]]
$Path
)
process {
try {
$filesToProcess = if ($_ -is [System.IO.FileSystemInfo]) {
$_
} else {
Get-Item -Path $Path
}
$parser = [System.Management.Automation.Language.Parser]
foreach ($item in $filesToProcess) {
if ($item.PSIsContainer -or
$item.Extension -notin @('.ps1', '.psm1')) {
continue
}
$tokens = $errors = $null
$ast = $parser::ParseFile($item.FullName, ([REF]$tokens),
([REF]$errors))
if ($errors) {
$msg = "File '{0}' has {1} parser errors." -f $item.FullName,
$errors.Count
Write-Warning $msg
}
:tokenLoop foreach ($token in $tokens) {
if ($token.Kind -ne 'Function') {
continue
}
$position = $token.Extent.StartLineNumber
do {
if (-not $foreach.MoveNext()) {
break tokenLoop
}
$token = $foreach.Current
} until ($token.Kind -in @('Generic', 'Identifier'))
$functionPosition = [pscustomobject]@{
Name = $token.Text
LineNumber = $position
Path = $item.FullName
}
Add-Member -InputObject $functionPosition `
-TypeName FunctionPosition -PassThru
}
}
}
catch {
throw
}
}
}