Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
Brève description
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 est une construction de langage pour itérer sur un ensemble de valeurs dans une collection.
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.
Syntaxe
Voici la foreach syntaxe suivante :
foreach ($<item> in $<collection>){<statement list>}
La partie de l’instruction foreach 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. Au début de chaque itération, foreach définit la variable d’élément sur la valeur suivante de la collection. Le {<statement list>} bloc contient les commandes à exécuter pour chaque itération.
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 fichier contient les valeurs ade chaîne , b, cet 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 Write-Host pour afficher la valeur. La prochaine fois dans la boucle, $letter est définie sur b. Le modèle se répète pour chaque élément du tableau.
Vous pouvez également utiliser foreach des instructions avec des applets de commande qui retournent une collection d’éléments. Dans l’exemple suivant, l’instruction foreach décrit 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 if limite 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 a toutes les propriétés de l’objet retourné par le Get-ChildItem.
Dans l’exemple suivant, le script affiche 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
}
}
Vous pouvez également utiliser des variables en dehors d’une foreach boucle. L’exemple suivant compte 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 100KB in the current directory.'
}
else {
Write-Host 'No files greater than 100KB in the current directory.'
}
Dans l’exemple précédent, $i commence par une valeur de l’extérieur de 0 la boucle.
Ensuite, $i est incrémenté à l’intérieur de la boucle pour chaque fichier supérieur à 100 Ko. Lorsque la boucle se termine, une if instruction évalue la valeur de $i l’affichage d’un nombre de fichiers supérieur à 100 Ko.
L’exemple précédent montre également comment mettre en forme les résultats de 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 que en octets, et la valeur obtenue 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 spécificateur de format n’affiche pas de décimales.
La fonction suivante 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 et la Current propriété de la variable à l’intérieur $foreach d’un foreach bloc de script.
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
}
$addMemberSplat = @{
InputObject = $functionPosition
TypeName = 'FunctionPosition'
PassThru = $true
}
Add-Member @addMemberSplat
}
}
}
catch {
throw
}
}
}