By Patrick Wahlmueller

KI und Automatisierung in der Praxis

PowerShell 2 Min. Lesezeit

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

EingabeforeachForEach-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 und ForEach-Object verhielten sich in Version 1 identisch und konsistent. Benutzer beschwerten sich jedoch über die Iteration von foreach ü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.