PS/ÜBUNGSZETTEL ~/02-kontrollfluss.ps1 0 / 9 gelöst
PS C:\pollhammer> .\uebungszettel\02-kontrollfluss.ps1

02 / Kontrollfluss

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.

9 Aufgaben Vergleiche, if/else, Schleifen & switch Fortschritt wird gespeichert
man 02-kontrollfluss — das Wichtigste in Kürze
  • Vergleiche schreibst du mit Buchstaben-Operatoren: -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.
  • Schleifen: 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).
  • Properties in Strings brauchen $(...): "Size: $($file.Length)" — ohne die Klammern wird nur $file ersetzt und .Length bleibt wörtlich stehen.
~/uebungen/02-kontrollfluss.ps1 : aufgabe_01✓ gelöst1 aus N
01Gleichheit prüfen
Du willst prüfen, ob $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.

~/uebungen/02-kontrollfluss.ps1 : aufgabe_02✓ gelöstzuordnung
02Operatoren zuordnen
Ordne jedem Vergleichsoperator seine Aufgabe zu.
-eq
-gt
-like
-match

-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.

~/uebungen/02-kontrollfluss.ps1 : aufgabe_03✓ gelöstcode vervollständigen
03Gerade oder ungerade?
Welcher Operator gehört in die Lücke, damit gerade Zahlen erkannt werden?
$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.

~/uebungen/02-kontrollfluss.ps1 : aufgabe_04✓ gelöstoutput vorhersagen
04foreach mit Property im String
$words = @("PowerShell", "Loop")
foreach ($w in $words) {
    Write-Host "$w hat $($w.Length) Zeichen"
}
Was gibt die erste Iteration der Schleife aus?

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 ....

~/uebungen/02-kontrollfluss.ps1 : aufgabe_05✓ gelöstcode vervollständigen
05Endlosschleife verhindern
Welche Zeile fehlt in der Lücke, damit die Schleife nach 5 Runden endet?
$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!

~/uebungen/02-kontrollfluss.ps1 : aufgabe_06✓ gelöst1 aus N
06Wie oft läuft der for-Loop?
for ($i = 0; $i -lt 5; $i++) {
    Write-Host "Iteration $i"
}
Wie oft läuft die Schleife — und wie lautet die letzte Ausgabe?

$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.

~/uebungen/02-kontrollfluss.ps1 : aufgabe_07✓ gelöstoutput vorhersagen
07break und continue
foreach ($n in 1..10) {
    if ($n -eq 3) { continue }
    if ($n -eq 7) { break }
    $n
}
Welche Zahlen werden ausgegeben? Schreibe sie in eine Zeile, getrennt durch Leerzeichen.

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.

~/uebungen/02-kontrollfluss.ps1 : aufgabe_08✓ gelöstmehrfachauswahl
08Wahr oder falsch?
Welche zwei Aussagen stimmen? Kreuze zwei an.

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.

~/uebungen/02-kontrollfluss.ps1 : aufgabe_09✓ gelösthands-on
09Tages-Check mit foreach und switch
Öffne eine echte PowerShell und arbeite die Schritte durch:
  1. Lege ein Array an: $days = @("Monday", "Wednesday", "Friday").
  2. Loope mit foreach über das Array.
  3. Nutze im Loop ein switch ($day): Bei "Monday" gib Wochenstart! aus, bei "Friday" gib Fast geschafft! aus.
  4. Für alle anderen Tage soll der 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!.