Freigeben über


about_Foreach

Kurze Beschreibung

Beschreibt einen Sprachbefehl, den Sie verwenden können, um alle Elemente in einer Auflistung von Elementen zu durchlaufen.

Lange Beschreibung

Die foreach -Anweisung ist ein Sprachkonstrukt zum Durchlaufen eines Wertesatzes in einer Auflistung.

Der einfachste und am häufigsten zu durchlaufende Sammlungstyp ist ein Array. Innerhalb einer foreach Schleife ist es üblich, einen oder mehrere Befehle für jedes Element in einem Array auszuführen.

Syntax

Im Folgenden wird die foreach Syntax veranschaulicht:

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

Der Teil der foreach Anweisung in Klammern stellt eine Variable und eine Auflistung dar, die durchlaufen werden soll. PowerShell erstellt die Variable $<item> automatisch, wenn die foreach Schleife ausgeführt wird. Legt zu Beginn jeder Iteration foreach die Elementvariable auf den nächsten Wert in der Auflistung fest. Der {<statement list>} Block enthält die Befehle, die für jede Iteration ausgeführt werden sollen.

Beispiele

Die Schleife im folgenden Beispiel zeigt beispielsweise foreach die Werte im $letterArray Array an.

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

In diesem Beispiel enthält der $letterArray die Zeichenfolgenwerte a, b, cund d. Bei der ersten Ausführung der foreach Anweisung wird die $letter Variable gleich dem ersten Element in $letterArray (a) festgelegt. Anschließend wird Write-Host verwendet, um den Wert anzuzeigen. Das nächste Mal, wenn die Schleife durchläuft, $letter ist auf bfestgelegt. Das Muster wird für jedes Element im Array wiederholt.

Sie können Anweisungen auch mit Cmdlets verwenden foreach , die eine Auflistung von Elementen zurückgeben. Im folgenden Beispiel durchläuft die foreach Anweisung die Liste der vom Get-ChildItem Cmdlet zurückgegebenen Elemente.

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

Sie können das Beispiel mithilfe einer if -Anweisung verfeinern, um die zurückgegebenen Ergebnisse zu begrenzen. Im folgenden Beispiel beschränkt die Anweisung die if Ergebnisse auf Dateien, die größer als 100 KB sind:

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

In diesem Beispiel verwendet die foreach Schleife eine Eigenschaft der $file Variablen, um einen Vergleichsvorgang ($file.length -gt 100KB) auszuführen. Die $file Variable verfügt über alle Eigenschaften des -Objekts, das Get-ChildItemvom zurückgegeben wird.

Im nächsten Beispiel zeigt das Skript die Länge und die letzte Zugriffszeit in der Anweisungsliste an:

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

Sie können auch Variablen außerhalb einer foreach Schleife verwenden. Das folgende Beispiel zählt Dateien mit einer Größe von mehr als 100 KB:

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

Im vorherigen Beispiel $i beginnt mit einem Wert außerhalb der 0 Schleife. Anschließend wird innerhalb der Schleife für jede Datei erhöht, $i die größer als 100 KB ist. Wenn die Schleife beendet wird, wertet eine if Anweisung den Wert von $i aus, um eine Anzahl von Dateien über 100 KB anzuzeigen.

Im vorherigen Beispiel wird auch veranschaulicht, wie die Dateilängenergebnisse formatiert werden:

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

Der Wert wird durch 1.024 geteilt, um die Ergebnisse in Kilobyte statt in Bytes anzuzeigen, und der resultierende Wert wird dann mit dem Festpunktformatbezeichner formatiert, um alle Dezimalwerte aus dem Ergebnis zu entfernen. Dadurch 0 wird der Formatbezeichner ohne Dezimalstellen angezeigt.

Die folgende Funktion analysiert PowerShell-Skripts und Skriptmodule und gibt den Speicherort der darin enthaltenen Funktionen zurück. Im Beispiel wird veranschaulicht, wie die MoveNext -Methode und die Current -Eigenschaft der $foreach Variablen in einem foreach Skriptblock verwendet werden.

Weitere Informationen finden Sie unter Verwenden von Enumeratoren.

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

Weitere Informationen