Auf diesem Zettel übst du, wie PowerShell Entscheidungen trifft und Dinge wiederholt: Vergleichsoperatoren, if/elseif/else, die Schleifen foreach, while und for sowie break, continue und switch.
-eq, -ne, -lt, -le, -gt, -ge — denn < und > sind in der Shell für Umleitungen reserviert.-like vergleicht mit Wildcards ("report.txt" -like "*.txt"), -match mit regulären Ausdrücken ("123" -match "^\d+").if / elseif / else verzweigt dein Skript; Bedingungen kombinierst du mit -and, -or und -not.foreach läuft über Sammlungen, while prüft die Bedingung vor jedem Durchlauf, for zählt selbst mit: for ($i = 0; $i -lt 5; $i++).continue überspringt nur den aktuellen Durchlauf, break beendet die ganze Schleife sofort.1..10 erzeugt einen Zahlenbereich (Range); $n % 2 -eq 0 erkennt gerade Zahlen — % liefert den Divisionsrest (Modulo).$(...): "Size: $($file.Length)" — ohne die Klammern wird nur $file ersetzt und .Length bleibt wörtlich stehen.$age genau 18 ist. Welcher Vergleich ist in PowerShell korrekt?PowerShell nutzt Buchstaben-Operatoren wie -eq (equals), weil Zeichen wie < und > für Umleitungen reserviert sind. = ist eine Zuweisung (kein Vergleich!), == gibt es in PowerShell nicht, und ohne den Bindestrich (eq) erkennt PowerShell den Operator nicht — das gibt einen Syntaxfehler.
-eq = equals, -gt = greater than. -like versteht nur Wildcards (* = beliebig viele Zeichen, ? = genau eins): "log.txt" -like "*.txt". -match kann volle Regex: "123" -match "^\d+" ist $true.
$n = 42 if ($n % 2 0) { Write-Host "$n ist gerade" } else { Write-Host "$n ist ungerade" }
Der Modulo-Operator % liefert den Rest einer Division. Bei geraden Zahlen ist $n % 2 gleich 0 — das prüfst du mit -eq. Brauchst du mehr als zwei Fälle, hängst du einfach elseif-Blöcke dazwischen.
$words = @("PowerShell", "Loop") foreach ($w in $words) { Write-Host "$w hat $($w.Length) Zeichen" }
In doppelten Anführungszeichen werden Variablen ersetzt — aber für Properties wie .Length brauchst du $(...). Das Wort PowerShell hat 10 Zeichen. Ohne die Klammern würde PowerShell nur $w ersetzen und .Length wörtlich stehen lassen: PowerShell.Length hat ....
$counter = 1 while ($counter -le 5) { Write-Host "Runde $counter" }
while prüft die Bedingung vor jedem Durchlauf. Ohne $counter++ bliebe $counter für immer 1, die Bedingung $counter -le 5 wäre immer wahr — Endlosschleife (Abbruch nur mit Strg+C). Deshalb: Zähler im Schleifenkörper immer verändern!
for ($i = 0; $i -lt 5; $i++) { Write-Host "Iteration $i" }
$i startet bei 0 und läuft, solange $i -lt 5 gilt (kleiner als — nicht kleiner-gleich!). Die Werte sind also 0, 1, 2, 3, 4: fünf Durchläufe, der letzte gibt Iteration 4 aus. Bei $i = 5 ist die Bedingung falsch und die Schleife stoppt.
foreach ($n in 1..10) { if ($n -eq 3) { continue } if ($n -eq 7) { break } $n }
1..10 erzeugt die Zahlen 1 bis 10. Bei 3 überspringt continue nur den Rest dieses Durchlaufs — die 3 wird nicht ausgegeben, aber die Schleife läuft weiter. Bei 7 beendet break die komplette Schleife, 7 bis 10 erscheinen also nie. Übrig bleiben: 1 2 4 5 6.
1..5 ist der Range-Operator, und default ist der Auffangfall von switch. Die anderen sind falsch: continue überspringt nur den aktuellen Durchlauf (die Schleife beendet break), -like nutzt Wildcards (Regex ist -match), und while prüft die Bedingung schon vor dem ersten Durchlauf — sie kann also auch 0-mal laufen.
$days = @("Monday", "Wednesday", "Friday").foreach über das Array.switch ($day): Bei "Monday" gib Wochenstart! aus, bei "Friday" gib Fast geschafft! aus.default-Block Normaler Tag: <Tagname> ausgeben.$days = @("Monday", "Wednesday", "Friday") foreach ($day in $days) { switch ($day) { "Monday" { Write-Host "Wochenstart!" } "Friday" { Write-Host "Fast geschafft!" } default { Write-Host "Normaler Tag: $day" } } }
switch vergleicht $day der Reihe nach mit jedem Fall; default fängt alles Übrige ab. Kombiniert mit foreach prüfst du so bequem jedes Element eines Arrays — deutlich übersichtlicher als eine lange if/elseif/else-Kette. Erwartete Ausgabe: Wochenstart!, Normaler Tag: Wednesday, Fast geschafft!.