foreach

Die Automatik-Schleife für unsere Arrays und Objekte: foreach ($var in $menge) {…}

MS Technet foreach

Wir starten mit einmem einfachen nummerischen Array

$menge = 1,2,3,4,5
foreach ($i in $menge)
{ $i }

Beispiele aus PowerShell-Hilfe:

Beispiel foreach
 1$letterArray = "a","b","c","d"
 2foreach ($letter in $letterArray)
 3{
 4    Write-Host $letter
 5}
 6
 7foreach ($file in Get-ChildItem)
 8{
 9    if ($file.length -gt 100KB)
10    {
11    Write-Host $file
12    Write-Host $file.length
13    Write-Host $file.lastaccesstime
14    Write-Host ""
15    }
16}
17
18foreach ($file in Get-ChildItem)
19{
20    if ($file.length -gt 100KB)
21    {
22# ToString mit F0 meint 0 Dezimalstellen; F2 also mit 2 Dezimalstellen
23    Write-Host $file "file size:" ($file.length / 1024).ToString("F0") KB
24    }
25}

Array/Objekt aus Get-Service

$dienste = Get-Service
foreach ($dienst in $dienste)
{
    "{0,-20}: {1}" -f $dienst.Name , $dienst.Status
}  # Nutzung eines Ausgabeoperator -f

Natürlich kann man sich nach dem Unterschied zum Cmdlet ForEach-Object in Pipelines fragen. Hier eine kurze Darstellung zum Thema „ForEach-Object in Pipeline vs. „foreach im Skript“ [1]

# Pipeline-basierter Befehl ForEach-Object (asynchron)
Get-ChildItem c:\Windows -Recurse -Filter "*.txt" |
ForEach-Object { "{0,-20}: {1}" -f $_.Name , $_.length }

# vs. skriptbasierten Befehlsfolge (foreach-Schleife erst nach Get-ChildItem)
$Dateien = Get-ChildItem c:\Windows -Recurse -Filter "*.txt"
foreach ($datei in $Dateien)
{
    "{0,-20}: {1}" -f $datei.Name , $dienst.length
}

Zusammenfassung: Der Pipeline-Befehl beginnt sofort mit der Ausgabe der Dateiliste.

Die skriptbasierte Lösung braucht einige Zeit vor der ersten Ausgabe.

Der Pipeline-Befehl meldet zwischen den Ausgaben Fehler über Pfade, für die es kein Zutrittsrecht gibt. Die skriptbasierte Lösung zeigt erst alle Fehlermeldungen, die ja von Get-ChildItem kommen, und dann erst die Dateiausgabe, die aus der ForEach-Schleife stammt.