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

Voir aussi

about_Automatic_Variables

about_If

ForEach-Object