TÓPICO
    about_Foreach

DESCRIÇÃO RESUMIDA
    Descreve um comando de linguagem que você pode usar para 
    percorrer todos os itens em uma coleção de itens.


DESCRIÇÃO LONGA
    A instrução Foreach (também conhecida como loop Foreach) é uma 
    construção de linguagem para percorrer (iterando) uma série de 
    valores de uma coleção de itens. 


    O tipo mais simples e o mais comum de coleção a ser percorrida é 
    uma matriz.
    Dentro de um loop Foreach, é comum a execução de um ou mais 
    comandos para cada item de uma matriz. 


  Sintaxe        
      Esta é a sintaxe de Foreach:

        
          foreach ($<item> in $<coleção>){<lista de instruções>}


  A instrução Foreach fora de um pipeline de comandos A parte da instrução 
      Foreach entre parênteses representa uma variável e uma coleção a ser 
      iterada. O Windows PowerShell cria a variável ($<item>) 
      automaticamente quando o loop Foreach é executado. Antes de 
      cada repetição através do loop, a variável é definida como um valor 
      da coleção. O bloco a seguir à instrução Foreach {<lista de 
      instruções>} contém um conjunto de comandos a ser executado para 
      cada item de uma coleção.
 

  Exemplos
      Por exemplo, o loop Foreach a seguir mostra os valores na matriz 
      $letterArray:

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

      
      Neste exemplo, a matriz $letterArray é criada e inicializada com os 
      valores de cadeia de caracteres "a", "b", "c" e "d". A primeira vez 
      em que a instrução Foreach é executada, ela define a variável $letter 
      como sendo igual ao primeiro item de $letterArray ("a"). Em seguida, 
      ela usa o cmdlet Write-Host para exibir a letra a. Na próxima vez que 
      o loop é percorrido, $letter é definida como "b", e assim por diante. 
      Depois que o loop Foreach exibe a letra d, o Windows PowerShell sai 
      do loop.


      Toda a instrução Foreach precisa aparecer em uma única linha 
      para ser executada como um comando no prompt de comando do Windows 
      PowerShell. A instrução Foreach inteira não precisa aparecer em uma 
      única linha se você colocar o comando em um arquivo de script .ps1. 


      As instruções Foreach também podem ser usadas em conjunto com 
      cmdlets para retornar uma coleção de itens. No exemplo a seguir, a 
      instrução Foreach percorre a lista de itens retornada pelo cmdlet 
      Get-ChildItem.


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


      Você pode refinar o exemplo usando uma instrução If para limitar os 
      resultados retornados. No exemplo a seguir, a instrução Foreach 
      executa a mesma operação de loop do exemplo anterior, mas adiciona 
      uma instrução If para limitar os resultados aos arquivos com tamanho 
      maior do que 100 kilobytes (KB):


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


      Neste exemplo, o loop Foreach usa uma propriedade da variável 
      $file para executar uma operação de comparação ($file.length 
      -gt 100k). A variável $file contém todas as propriedades do objeto 
       retornado pelo cmdlet Get-ChildItem. Portanto, você pode retornar 
      mais do que apenas um nome de arquivo. No próximo exemplo, o Windows 
      PowerShell retorna o tamanho e o último horário de acesso na lista de 
      instruções:


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

    
      Neste exemplo, você não está limitado a executar um único 
      comando em uma lista de instruções. 

      
      Você também pode usar uma variável fora de um loop Foreach e 
      incrementar a variável dentro do loop. O exemplo a seguir conta 
      arquivos de mais de 100 KB de tamanho: 
      
  
          $i = 0
          foreach ($file in Get-ChildItem)
          {
              if ($file.length -gt 100k) 
              {
                  Write-Host $file "tamanho do arquivo:" ($file.length / 
          1024).ToString("F0") KB
                  $i = $i + 1
              }
          }

          if ($i -ne 0)
          {
              Write-Host
              Write-Host $i " arquivo(s) com mais de 100 KB no 
          diretório atual."}
          else 
          {
              Write-Host "Nenhum arquivo maior do que 100 KB no 
	  diretório atual."
          }


      No exemplo anterior, a variável $i foi definida como 0 fora do 
      loop e incrementada dentro dele para cada arquivo encontrado 
      maior do que 100 KB. Quando o loop termina, uma instrução If 
      avalia o valor de $i para exibir uma contagem de todos os 
      arquivos com mais de 100 KB. Ou exibe uma mensagem declarando 
      que nenhum arquivo acima de 100 KB foi encontrado.


      O exemplo anterior também demonstra como formatar os resultados 
      de tamanho do arquivo:


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


      O valor é dividido por 1.024 para mostrar os resultados em 
      kilobytes, e não em bytes, e o valor resultante é então 
      formatado com o uso do especificador de formato de ponto fixo, 
      que remove valores decimais do resultado. O 0 faz com que o 
      especificador de formato não mostre casas decimais. 


  A instrução Foreach dentro de um pipeline de comandos Quando 
      Foreach aparece em um pipeline de comandos, o Windows PowerShell 
      utiliza o alias foreach, que chama o comando ForEach-Object. Ao 
      usar o alias foreach em um pipeline de comandos, você não inclui a 
      sintaxe ($<item> in $<coleção>) como faz com a instrução Foreach. Isso 
      acontece porque o comando anterior no pipeline fornece essas 
      informações. A sintaxe do alias foreach quando usado em um pipeline 
      de comandos é a seguinte:
        

          <comando> | foreach {<bloco_de_comando>}
     

      Por exemplo, o loop Foreach no seguinte pipeline de comandos exibe 
      qualquer processo cujo conjunto de trabalho (uso de memória) seja 
      maior do que 20 megabytes (MB). O Windows PowerShell envia a saída do 
      comando Get-Process para o alias foreach. Dentro do bloco de comandos 
      do alias foreach, a variável $_.WS contém o valor da propriedade WS 
      (conjunto de trabalho) passada pelo cmdlet Get-Process. (O trecho 
      $_ da declaração é uma variável automática WSH (Windows Script Host), 
      e o trecho WS é uma propriedade). A instrução If utiliza uma instrução 
      condicional para determinar se o conjunto de trabalho é maior do que 
      20 MB (20.000.000 bytes). Caso seja, o nome do processo armazenado na 
      variável $_.name e o tamanho do conjunto de trabalho em megabytes são 
      exibidos.Se nenhum conjunto de trabalho de processo for maior do que 
      20 MB, nada será exibido.


          Write-Host "Processos com conjuntos de trabalho maiores do 
          que 20 MB" Get-Process | foreach { 
              if ($_.WS -gt 20m)
              {
                  Write-Host $_.name ": " 
          ($_.WS/1m).ToString("F0") MB -Separator "" }
          }


      O alias foreach também oferece suporte a blocos de comandos 
      iniciais, blocos de comandos intermediários e blocos de 
      comandos finais. Os blocos de comandos inicial e final são 
      executados uma vez, enquanto o intermediário é executado sempre 
      que o loop Foreach percorre uma coleção ou uma matriz. 
        

      A sintaxe do alias foreach quando usado em um pipeline de 
      comandos com um conjunto inicial, intermediário e final de blocos de 
      comandos é a seguinte:
        

          <comando> | foreach {<bloco_de_comando inicial>}{<bloco_de_c
          omando intermediário>}{<bloco_de_comando final>}

 
      O exemplo a seguir demonstra o uso dos blocos de comandos inicial, 
      intermediário e final. 


          Get-ChildItem | foreach {
          $fileCount = $directoryCount = 0}{
          if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}}{ 
          "$directoryCount diretórios e $fileCount arquivos"}


      O bloco inicial cria e inicializa duas variáveis como 0:


          {$fileCount = $directoryCount = 0}
 

      O bloco intermediário avalia se cada item retornado por 
      Get-ChildItem é um diretório ou um arquivo:


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


      Se o item retornado for um diretório, a variável $directoryCount
      será incrementada em 1. Se o item não for um diretório, a variável 
      $fileCount será incrementada em 1. O bloco final será executado 
      depois que o bloco intermediário concluir sua operação de loop e 
      retornar os resultados da operação: 

       
          {"$directoryCount diretórios e $fileCount arquivos"}


      Usando a estrutura de blocos de comandos inicial, intermediário 
      e final e o operador pipeline, você pode reescrever o primeiro 
      exemplo para encontrar qualquer arquivo que seja maior do que 
      100 KB, da seguinte forma.


          Get-ChildItem | foreach{
              $i = 0}{
              if ($_.length -gt 100k)
              {
                  Write-Host $_.name "tamanho do arquivo:" ($_.length / 
          1024).ToString("F0") KB
                  $i++
              }
              }{
              if ($i -ne 0)
              {
                  Write-Host
                  Write-Host "$i arquivo(s) com mais de 100 KB no 
          diretório atual."
              }
              else 
              {
              Write-Host "Nenhum arquivo maior do que 100 KB no 
	  diretório atual."}
              }


CONSULTE TAMBÉM
    about_Automatic_Variables
    about_If
    Foreach-Object
    




Sumário