Compartilhar via


about_Foreach

Descrição breve

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

Descrição longa

A foreach instrução (também conhecida como foreach loop) é um constructo de linguagem para percorrer (iterar) uma série de valores em uma coleção de itens.

O tipo de coleção mais simples e típico a ser percorrido é uma matriz. Dentro de um foreach loop, é comum executar um ou mais comandos em cada item em uma matriz.

Syntax

O seguinte mostra a foreach sintaxe:

foreach ($<item> in $<collection>){<statement list>}

A parte da instrução foreach entre parênteses representa uma variável e uma coleção para iterar. O PowerShell cria a variável $<item> automaticamente quando o foreach loop é executado. Antes de cada iteração por meio do loop, a variável é definida como um valor na coleção. O bloco após uma foreach instrução {<statement list>} contém um conjunto de comandos a serem executados em cada item em uma coleção.

Exemplos

Por exemplo, o foreach loop no exemplo a seguir exibe os valores na $letterArray matriz.

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

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

foreach As instruções também podem ser usadas junto com cmdlets que retornam uma coleção de itens. No exemplo a seguir, a instrução Foreach percorre a lista de itens retornados pelo Get-ChildItem cmdlet .

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 foreach instrução executa a mesma operação de loop que o exemplo anterior, mas adiciona uma instrução if para limitar os resultados a arquivos com mais de 100 KB (kilobytes):

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

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

foreach ($file in Get-ChildItem)
{
  if ($file.length -gt 100KB)
  {
    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 foreach loop e incrementar a variável dentro do loop. O exemplo a seguir conta arquivos com mais de 100 KB de tamanho:

$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."
}

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

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

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

O valor é dividido por 1.024 para mostrar os resultados em quilobytes em vez de bytes, e o valor resultante é formatado usando o especificador de formato de ponto fixo para remover quaisquer valores decimais do resultado. O 0 faz com que o especificador de formato não mostre casas decimais.

No exemplo a seguir, a função definida analisa os scripts do PowerShell e os módulos de script e retorna o local das funções contidas no . O exemplo demonstra como usar o MoveNext método (que funciona de forma semelhante a skip X em um For loop) e a Current propriedade da $foreach variável dentro de um bloco de script foreach. A função de exemplo pode encontrar funções em um script mesmo se houver definições de função espaçadas de forma incomum ou inconsistente que abrangem várias linhas.

Para obter mais informações, consulte Usando enumeradores.

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

Confira também

about_Automatic_Variables

about_If

ForEach-Object