RUBRIQUE
    about_Foreach

DESCRIPTION COURTE
    Décrit une commande de langage permettant de parcourir tous les 
    éléments d'une collection d'éléments.


DESCRIPTION LONGUE
    L'instruction Foreach (également appelée " boucle Foreach ") est une 
    construction de langage permettant de parcourir une série de valeurs 
    présentes dans une collection d'éléments (c'est-à-dire d'effectuer 
    des itérations dans ces valeurs). 


    Le type de collection le plus simple et le plus classique à 
    parcourir est le tableau. Dans une boucle Foreach, il est 
    fréquent d'exécuter une ou plusieurs commandes sur chaque 
    élément d'un tableau. 


  Syntaxe        
      La syntaxe de l'instruction Foreach est présentée ci-dessous.

        
          foreach ($<élément> in $<collection>){<liste d'instructions>}


  Instruction Foreach située hors d'un pipeline de commande La partie de 
      l'instruction Foreach figurant entre parenthèses représente une 
      variable et une collection à parcourir. Windows PowerShell crée 
      automatiquement la variable ($<élément>) lorsque la boucle 
      Foreach s'exécute. Avant chaque passage dans la boucle, 
      la variable est définie sur une valeur de la collection. 
      Le bloc qui suit une instruction Foreach {<liste d'instructions>} 
      contient un jeu de commandes à exécuter sur chaque élément d'une 
      collection.
 

  Exemples
      La boucle Foreach de l'exemple suivant affiche les valeurs du 
      tableau $letterArray :

        
          $letterArray = "a","b","c","d"
          foreach ($letter in $letterArray)
          {
              Write-Host $letter
          }

      
      Dans cet exemple, le tableau $letterArray est créé et 
      initialisé avec les valeurs de chaîne " a ", " b ", " c " et 
      " d ". Lors de sa première exécution, l'instruction Foreach 
      affecte à la variable $letter la valeur du premier élément du 
      tableau $letterArray (" a "). Elle utilise ensuite l'applet de 
      commande Write-Host pour afficher la lettre a. Au passage 
      suivant dans la boucle, $letter prend la valeur " b ", et ainsi 
      de suite. Une fois que la boucle Foreach a affiché la lettre d, 
      Windows PowerShell quitte la boucle.


      L'instruction Foreach entière doit figurer sur une seule ligne pour 
      pouvoir être exécutée en tant que commande à l'invite de commandes de 
      Windows PowerShell. Cette condition n'est pas requise si vous placez 
      la commande dans un fichier de script .ps1. 


      Les instructions Foreach peuvent également être utilisées avec 
      des applets de commande qui retournent une collection d'éléments. 
      Dans l'exemple suivant, l'instruction Foreach parcourt la liste 
      d'éléments retournée par l'applet de commande Get-ChildItem :


          foreach ($file in Get-ChildItem)
          {
              Write-Host $file
          }


      Vous pouvez affiner l'exemple en utilisant une instruction If 
      afin de limiter les résultats retournés. Dans l'exemple suivant, 
      l'instruction Foreach exécute la même opération de bouclage que dans 
      l'exemple précédent, mais ajoute une instruction If pour limiter les 
      résultats aux fichiers dont la taille dépasse 100 kilo-octets (Ko) :


          foreach ($file in Get-ChildItem)
          {
              if ($file.length -gt 100k) 
              {
                  Write-Host $file
              }
          }


      Dans cet exemple, la boucle Foreach utilise une propriété de la 
      variable $file pour effectuer une comparaison ($file.length -gt 
      100k). La variable $file contient toutes les propriétés de l'objet 
      retourné par l'applet de commande Get-ChildItem. Par conséquent, 
      vous pouvez retourner plus qu'un simple nom de fichier. Dans 
      l'exemple suivant, Windows PowerShell retourne la longueur 
      et l'heure du dernier accès dans la liste d'instructions :


          foreach ($file in Get-ChildItem)
          {
              if ($file.length -gt 100k) 
              {
                  Write-Host $file
                  Write-Host $file.length
                  Write-Host $file.lastaccesstime }
          }

    
      Dans cet exemple, vous n'êtes pas limité à l'exécution d'une simple 
      commande dans une liste d'instructions. 

      
      Vous pouvez également utiliser une variable en dehors d'une 
      boucle Foreach et l'incrémenter dans la boucle. Dans l'exemple 
      suivant, les fichiers dont la taille est supérieure à 100 Ko sont 
      comptabilisés : 
      
  
          $i = 0
          foreach ($file in Get-ChildItem)
          {
              if ($file.length -gt 100k) 
              {
                  Write-Host $file "taille du fichier :" ($file.length / 
          1024).ToString("F0") KB
                  $i = $i + 1
              }
          }

          if ($i -ne 0)
          {
              Write-Host
              Write-Host $i " fichier(s) de plus de 100 Ko dans le 
          répertoire actif."}
          else 
          {
              Write-Host "Aucun fichier de plus de 100 Ko dans le 
          répertoire actif."
          }


      Dans l'exemple précédent, la variable $i est définie sur 0 en 
      dehors de la boucle et incrémentée dans la boucle pour chaque 
      fichier trouvé dont la taille est supérieure à 100 Ko. À la 
      sortie de la boucle, une instruction If évalue la valeur de la 
      variable $i pour afficher le nombre total de fichiers dont la taille 
      dépasse 100 Ko. Elle peut également afficher 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 longueur de fichier :


          ($file.length / 1024).ToString("F0")


      La valeur est divisée par 1 024 pour afficher le résultat en 
      kilo-octets plutôt qu'en octets et la valeur obtenue est 
      ensuite mise en forme à l'aide du spécificateur de format en 
      virgule fixe afin de supprimer les valeurs décimales du 
      résultat. Le 0 indique au spécificateur de format qu'il ne doit pas 
      afficher de décimales. 


  Instruction Foreach dans un pipeline de commande Lorsqu'une instruction 
      Foreach apparaît dans un pipeline de commande, Windows PowerShell 
      utilise l'alias foreach, qui appelle la commande ForEach-Object. 
      Lorsque vous employez l'alias foreach dans un pipeline de commande, 
      vous n'incluez pas la syntaxe ($<élément> in $<collection>) de la 
      même manière qu'avec l'instruction Foreach. En effet, la commande 
      antérieure dans le pipeline fournit cette information. Lorsque 
      l'alias foreach est utilisé dans un pipeline de commande, 
      sa syntaxe se présente comme suit :
        

          <commande> | foreach {<bloc_commandes>}
     

      Par exemple, la boucle Foreach du pipeline de commande 
      ci-dessous affiche tous les processus dont la plage de travail 
      (utilisation de la mémoire) est supérieure à 20 mégaoctets (Mo). Windows 
      PowerShell dirige la sortie de la commande Get-Process vers l'alias 
      foreach. Dans le bloc de commandes de l'alias foreach, la variable 
      $_.WS contient la valeur de la propriété WS (plage de travail) qui lui 
      est passée par l'applet de commande Get-Process. (La partie $_ de la 
      déclaration est une variable automatique WSH [Windows Script Host] et 
      la partie WS est une propriété.) L'instruction If utilise une instruction 
      conditionnelle pour déterminer si la plage de travail est supérieure 
      à 20 Mo (20 000 000 octets). Si tel est le cas, le nom du processus, 
      qui est stocké dans la variable $_.name, et la taille de la plage de 
      travail en mégaoctets sont affichés. Si aucune plage de travail ne 
      dépasse 20 Mo, aucune donnée ne s'affiche.


          Write-Host "Processus dont la plage de travail dépasse 
          20 Mo" Get-Process | foreach { 
              if ($_.WS -gt 20m)
              {
                  Write-Host $_.name ": " 
          ($_.WS/1m).ToString("F0") MB -Separator "" 
              }
          }


      L'alias foreach prend également en charge les blocs de 
      commandes de début, centraux et de fin. Les blocs de commandes 
      de début et de fin s'exécutent une fois, tandis que le bloc de 
      commandes central s'exécute chaque fois que la boucle Foreach 
      parcourt une collection ou un tableau. 
        

      Lorsque l'alias foreach est utilisé dans un pipeline de 
      commande avec des blocs de commandes de début, central et 
      de fin, sa syntaxe est la suivante :
        

          <commande> | foreach {<bloc de commandes de début>}{<bloc 
          de commandes central>}{<bloc de commandes de fin>}

 
      L'exemple suivant illustre l'utilisation des blocs de commandes 
      de début, central et de fin : 


          Get-ChildItem | foreach {
          $fileCount = $directoryCount = 0}{
          if ($_.PsIsContainer) {$directoryCount++} else 
          {$fileCount++}}{ "$directoryCount répertoires and $fileCount fichiers"}


      Le bloc de début crée deux variables et les initialise sur 0 :


          {$fileCount = $directoryCount = 0}
 

      Le bloc central évalue si chaque élément retourné par 
      Get-ChildItem est un répertoire ou un fichier :


          {if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}}


      Si l'élément retourné est un répertoire, la variable 
      $directoryCount est incrémentée d'une unité. Si l'élément n'est 
      pas un répertoire, la variable $fileCount est incrémentée d'une 
      unité. Le bloc de fin s'exécute lorsque le bloc central a 
      terminé son opération de boucle, puis retourne les résultats de 
      l'opération : 

       
          {"$directoryCount répertoires and $fileCount fichiers"}


      En utilisant la structure des blocs de commandes de début, 
      central et de fin, ainsi que l'opérateur de pipeline, vous 
      pouvez réécrire l'exemple précédent pour trouver les fichiers 
      dont la taille est supérieure à 100 Ko, comme suit :


          Get-ChildItem | foreach{
              $i = 0}{
              if ($_.length -gt 100k)
              {
                  Write-Host $_.name "taille du fichier :" ($_.length / 
          1024).ToString("F0") KB
                  $i++
              }
              }{
              if ($i -ne 0)
              {
                  Write-Host
                  Write-Host "$i fichier(s) de plus de 100 Ko dans le 
          répertoire actif."
              }
              else 
              {
              Write-Host "Aucun fichier de plus de 100 Ko dans le 
          répertoire actif."}
              }


VOIR AUSSI
    about_Automatic_Variables
    about_If
    Foreach-Object
    




Table des matières