foreach¶
Die Automatik-Schleife für unsere Arrays und Objekte: foreach ($var in $menge) {…}
Wir starten mit einmem einfachen nummerischen Array
$menge = 1,2,3,4,5
foreach ($i in $menge)
{ $i }
Beispiele aus PowerShell-Hilfe:
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.