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 einer Gruppe von Werten in einer Auflistung.

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

Syntax

Die folgende Syntax zeigt foreach :

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

Der Teil der Anweisung innerhalb einer foreach Klammer 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 am Anfang 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 die $letterArray Zeichenfolgenwerte a, b, , cund d. Wenn die foreach Anweisung zum ersten Mal ausgeführt wird, wird die $letter Variable auf das erste Element in $letterArray (a) festgelegt. Anschließend wird Write-Host der Wert angezeigt. Das nächste Mal durch die Schleife $letter wird auf b. Das Muster wird für jedes Element im Array wiederholt.

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

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

Sie können das Beispiel mithilfe einer if Anweisung verfeinern, um die zurückgegebenen Ergebnisse einzuschränken. Im folgenden Beispiel beschränkt die if Anweisung die 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 zum Ausführen eines Vergleichsvorgangs ($file.length -gt 100KB). Die $file Variable verfügt über alle Eigenschaften des Objekts, das von der Get-ChildItem.

Im nächsten Beispiel zeigt das Skript die Länge und die uhrzeit des letzten Zugriffs innerhalb 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 variablen auch außerhalb einer foreach Schleife verwenden. 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 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 0 der Schleife. Anschließend wird innerhalb der Schleife für jede Datei, die größer als 100 KB ist, $i erhöht. Wenn die Schleife beendet wird, wertet eine if Anweisung den Wert aus $i , um eine Anzahl von Dateien über 100 KB anzuzeigen.

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 dividiert, um die Ergebnisse in Kilobyte anstelle von Bytes anzuzeigen, und der resultierende Wert wird dann mit dem Festkommaformatbezeichner formatiert, um alle Dezimalwerte aus dem Ergebnis zu entfernen. Der 0 Formatbezeichner zeigt keine Dezimalstellen an.

Die folgende Funktion analysiert PowerShell-Skripts und Skriptmodule und gibt den Speicherort der darin enthaltenen Funktionen zurück. Das Beispiel veranschaulicht, wie die MoveNext Methode und die Current Eigenschaft der $foreach Variablen innerhalb eines foreach Skriptblocks 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