about_Foreach

Descripción breve

Describe un comando de lenguaje que puede usar para recorrer todos los elementos de una colección de elementos.

Descripción larga

La foreach instrucción es una construcción de lenguaje para recorrer en iteración un conjunto de valores de una colección.

El tipo de colección más sencillo y típico que se va a recorrer es una matriz. Dentro de un foreach bucle, es habitual ejecutar uno o varios comandos en cada elemento de una matriz.

Sintaxis

A continuación se muestra la foreach sintaxis:

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

La parte de la foreach instrucción entre paréntesis representa una variable y una colección que se va a iterar. PowerShell crea automáticamente la variable $<item> cuando se ejecuta el foreach bucle. Al principio de cada iteración, foreach establece la variable item en el siguiente valor de la colección. El {<statement list>} bloque contiene los comandos que se van a ejecutar para cada iteración.

Ejemplos

Por ejemplo, el foreach bucle del ejemplo siguiente muestra los valores de la $letterArray matriz.

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

En este ejemplo, $letterArray contiene los valores ade cadena , b, cy d. La primera vez que se ejecuta la foreach instrucción , establece la $letter variable igual al primer elemento de $letterArray (a). A continuación, usa Write-Host para mostrar el valor. La próxima vez a través del bucle , $letter se establece en b. El patrón se repite para cada elemento de la matriz.

También puede usar foreach instrucciones con cmdlets que devuelven una colección de elementos. En el ejemplo siguiente, la foreach instrucción recorre la lista de elementos devueltos por el Get-ChildItem cmdlet .

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

Puede refinar el ejemplo mediante una if instrucción para limitar los resultados que se devuelven. En el ejemplo siguiente, la if instrucción limita los resultados a los archivos que son mayores de 100 kilobytes (KB):

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

En este ejemplo, el foreach bucle usa una propiedad de la $file variable para realizar una operación de comparación ($file.length -gt 100KB). La $file variable tiene todas las propiedades del objeto devuelto por .Get-ChildItem

En el ejemplo siguiente, el script muestra la longitud y la hora de último acceso dentro de la lista de instrucciones:

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

También puede usar variables desde fuera de un foreach bucle. En el ejemplo siguiente se cuentan los archivos de más de 100 KB de tamaño:

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

En el ejemplo anterior, $i comienza con un valor de 0 fuera del bucle. A continuación, $i se incrementa dentro del bucle para cada archivo mayor que 100 KB. Cuando se cierra el bucle, una if instrucción evalúa el valor de $i para mostrar un recuento de archivos de más de 100 KB.

En el ejemplo anterior también se muestra cómo dar formato a los resultados de longitud de archivo:

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

El valor se divide en 1024 para mostrar los resultados en kilobytes en lugar de bytes y, a continuación, se da formato al valor resultante mediante el especificador de formato de punto fijo para quitar los valores decimales del resultado. 0 hace que el especificador de formato no muestre posiciones decimales.

La función siguiente analiza los scripts de PowerShell y los módulos de script y devuelve la ubicación de las funciones contenidas en . En el ejemplo se muestra cómo usar el MoveNext método y la Current propiedad de la $foreach variable dentro de un foreach bloque de script.

Para obtener más información, consulte Uso de 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
          }
          $addMemberSplat = @{
              InputObject = $functionPosition
              TypeName = 'FunctionPosition'
              PassThru = $true
          }
          Add-Member @addMemberSplat
        }
      }
    }
    catch {
      throw
    }
  }
}

Consulte también