Läuft die Schleife? ForEach-Erfahrungen mit einer leeren Variable
Eine überraschende PowerShell-Eigenheit: foreach und ForEach-Object verhalten sich mit null und leeren Variablen unterschiedlich. Was wirklich passiert.
Läuft eine leere Variable in PowerShell durch eine Schleife? Mein erster Instinkt war: nein. Die korrekte Antwort lautet aber: es kommt drauf an.
Nicht initialisierte Variable mit foreach
$keinWert -eq $null # True – eine nicht deklarierte Variable ist $null
foreach ($einWert in $keinWert) {
'Wird nicht ausgeführt.'
}
# Ergebnis: betritt die Schleife NICHT
Nicht initialisierte Variable mit ForEach-Object
$keinWert | ForEach-Object { 'Läuft' }
# Ergebnis: führt den Schleifenkörper AUS – überraschend!
Leeres Array mit foreach
$leereArray = @()
foreach ($einWert in $leereArray) {
'Wird nicht ausgeführt.'
}
# Ergebnis: betritt die Schleife NICHT
Leeres Array mit ForEach-Object
$leereArray | ForEach-Object { 'Läuft' }
# Ergebnis: führt den Schleifenkörper NICHT aus
Zusammenfassung
| Eingabe | foreach | ForEach-Object |
|---|---|---|
$null | ❌ überspringt | ✅ läuft einmal |
@() | ❌ überspringt | ❌ überspringt |
Um Überraschungen zu vermeiden: Variablen am Anfang des Skripts initialisieren.
Warum passiert das?
Bruce Payette (PowerShell-Miterfinder) hat es erklärt:
Die
foreach-Anweisung undForEach-Objectverhielten sich in Version 1 identisch und konsistent. Benutzer beschwerten sich jedoch über die Iteration vonforeachüber null. Daher haben wir das Verhalten in v2 (oder v3 – ich kann mich nicht mehr genau erinnern) geändert und eine bewusste Inkonsistenz eingeführt.