Freigeben über


Über 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 (auch als Foreach Schleife bezeichnet) ist ein Sprachkonstrukt zum Durchlaufen (Durchlaufen) einer Reihe von Werten in einer Auflistung von Elementen.

Der einfachste und typischste Typ der zu durchlaufenden Sammlung 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 in Klammern eingeschlossene Teil der ForEach Anweisung stellt eine Variable und eine zu durchlaufende Auflistung dar. PowerShell erstellt die Variable $<item> automatisch, wenn die Foreach Schleife ausgeführt wird. Vor jeder Iteration durch die Schleife wird die Variable auf einen Wert in der Auflistung festgelegt. Der Block, der auf eine Foreach Anweisung {<statement list>} folgt, enthält eine Reihe von Befehlen, die für jedes Element in einer Auflistung 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 wird das $letterArray Array erstellt und mit den Zeichenfolgenwerten "a", "b", "c"und "d"initialisiert. Bei der ersten Ausführung der Foreach Anweisung wird die $letter Variable gleich dem ersten Element in $letterArray ("a") festgelegt. Anschließend wird das Write-Host Cmdlet verwendet, um den Buchstaben a anzuzeigen. Wenn die Schleife das nächste Mal durchläuft, $letter wird auf "b"festgelegt usw. Nachdem die Foreach Schleife den Buchstaben d angezeigt hat, beendet PowerShell die Schleife.

Die gesamte Foreach Anweisung muss in einer einzigen Zeile angezeigt werden, um sie als Befehl an der PowerShell-Eingabeaufforderung auszuführen. Die gesamte Foreach Anweisung muss nicht in einer einzigen Zeile angezeigt werden, wenn Sie den Befehl stattdessen in einer .ps1-Skriptdatei platzieren.

Foreach -Anweisungen können auch zusammen mit Cmdlets verwendet werden, die eine Auflistung von Elementen zurückgeben. Im folgenden Beispiel durchläuft die Foreach-Anweisung die Liste der Elemente, die Get-ChildItem vom Cmdlet zurückgegeben wird.

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

Sie können das Beispiel verfeinern, indem Sie eine If -Anweisung verwenden, um die zurückgegebenen Ergebnisse einzuschränken. Im folgenden Beispiel führt die Foreach -Anweisung den gleichen Schleifenvorgang wie im vorherigen Beispiel aus, fügt jedoch eine If Anweisung hinzu, um die Ergebnisse auf Dateien zu beschränken, 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 enthält alle Eigenschaften im Objekt, das vom Get-ChildItem Cmdlet zurückgegeben wird. Daher können Sie mehr als nur einen Dateinamen zurückgeben. Im nächsten Beispiel gibt PowerShell die Länge und den Zeitpunkt des letzten Zugriffs in der Anweisungsliste zurück:

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

In diesem Beispiel sind Sie nicht darauf beschränkt, einen einzelnen Befehl in einer Anweisungsliste auszuführen.

Sie können auch eine Variable außerhalb einer Foreach Schleife verwenden und die Variable innerhalb der Schleife inkrementieren. Im folgenden Beispiel werden Dateien mit einer Größe von mehr als 100 KB zählt:

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

Im vorherigen Beispiel wird die $i Variable auf 0 außerhalb der Schleife festgelegt, und die Variable wird innerhalb der Schleife für jede gefundene Datei erhöht, die größer als 100 KB ist. Wenn die Schleife beendet wird, wertet eine If -Anweisung den Wert von $i aus, um die Anzahl aller Dateien über 100 KB anzuzeigen. Oder es wird eine Meldung angezeigt, die besagt, dass keine Dateien über 100 KB gefunden wurden.

Im vorherigen Beispiel wird auch veranschaulicht, wie die Ergebnisse der Dateilänge formatiert werden:

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

Der Wert wird durch 1.024 geteilt, um die Ergebnisse in Kilobyte anstelle von Bytes anzuzeigen, und der resultierende Wert wird dann mit dem Festpunktformatbezeichner formatiert, um alle Dezimalwerte aus dem Ergebnis zu entfernen. 0 bewirkt, dass für den Formatbezeichner keine Dezimalstellen angezeigt werden.

Im folgenden Beispiel analysiert die definierte Funktion PowerShell-Skripts und Skriptmodule und gibt den Speicherort der darin enthaltenen Funktionen zurück. Im Beispiel wird veranschaulicht, wie die MoveNext -Methode (die ähnlich wie skip X bei einer For Schleife funktioniert) und die Current -Eigenschaft der $foreach Variablen in einem foreach-Skriptblock verwendet wird. Die Beispielfunktion kann Funktionen in einem Skript auch dann finden, wenn es ungewöhnlich oder inkonsistente Funktionsdefinitionen gibt, die sich über mehrere Zeilen erstrecken.

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 {
        $filesToProcess = 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
    }
  }
}

SIEHE AUCH

about_Automatic_Variables

about_If

ForEach-Object