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

06 / Weiterführend

Auf diesem Zettel übst du die Werkzeuge für den nächsten Level: Fehler sauber abfangen mit try/catch, Daten in Hashtables organisieren, Strings mit Regex und Operatoren umbauen und die Pipeline mit Where-Object & Co. filtern.

9 Aufgaben Fehlerbehandlung, Hashtables, Regex & Pipeline-Tricks Fortschritt wird gespeichert
man 06-weiterfuehrend — das Wichtigste in Kürze
  • try { ... } catch { ... } fängt Fehler ab — Cmdlet-Fehler landen aber nur mit -ErrorAction Stop im catch-Block. Die Fehlermeldung steckt dort in $_.Exception.Message.
  • Hashtables speichern Schlüssel-Wert-Paare: $p = @{ Name = "Max"; Age = 25 }. Zugriff über $p.Name oder $p["Name"], neue Einträge per $p["City"] = "Wien", alle Schlüssel über $p.Keys.
  • -match prüft einen String gegen ein Regex-Muster und füllt bei Erfolg $Matches — in $Matches[0] steht der gefundene Text. -replace ersetzt per Muster, -split zerlegt einen String in ein Array, -join verbindet ein Array zu einem String.
  • Where-Object (Alias ?) filtert Objekte in der Pipeline, ForEach-Object (Alias %) verarbeitet jedes Objekt, Select-Object -First 3 nimmt nur die ersten drei. $_ ist dabei immer das aktuelle Objekt.
  • Strings sind Objekte mit Methoden: .ToUpper(), .Trim(), .Replace(), .Split() — Methoden lassen sich verketten.
  • Get-Date -Format 'dd.MM.yyyy HH:mm' formatiert Datum und Uhrzeit nach deinem Muster.
~/uebungen/06-weiterfuehrend.ps1 : aufgabe_01✓ gelöstoutput vorhersagen
01Hashtable im Einsatz
$person = @{ Name = "Max"; Age = 25 }
$person["City"] = "Wien"
Write-Host "$($person.Name) wohnt in $($person['City'])"
Was gibt die letzte Zeile aus?

Eine Hashtable speichert Schlüssel-Wert-Paare. Zeile 2 fügt einfach per Zuweisung einen neuen Key City hinzu. Beim Zugriff sind beide Schreibweisen gleichwertig: $person.Name (Punkt) und $person['City'] (eckige Klammern). Im String braucht es $(...), damit der Ausdruck ausgewertet wird — daher Max wohnt in Wien.

~/uebungen/06-weiterfuehrend.ps1 : aufgabe_02✓ gelöst1 aus N
02Was steckt in $Matches?
$ok = "Bestellung 12345 bestätigt" -match '\d+'
$ok ist danach $true. Was steht in $Matches[0]?

Bei einem erfolgreichen -match füllt PowerShell automatisch die Variable $Matches. In $Matches[0] steht der komplette gefundene Text — hier greift \d+ die zusammenhängende Ziffernfolge 12345. $Matches enthält also den Treffer selbst, nicht $true und auch keine Anzahl.

~/uebungen/06-weiterfuehrend.ps1 : aufgabe_03✓ gelöstcode vervollständigen
03Pipeline filtern
Welches Cmdlet filtert Objekte in der Pipeline nach einer Bedingung? (Alias zählt auch)
Get-ChildItem C:\Logs -File |  { $_.Length -gt 1MB }

Where-Object lässt nur die Objekte durch, für die der Skriptblock $true ergibt — $_ steht dabei für das gerade durchlaufende Objekt. Weil man so oft filtert, gibt es die Kurzformen ? und where: gci C:\Logs -File | ? { $_.Length -gt 1MB } macht exakt dasselbe.

~/uebungen/06-weiterfuehrend.ps1 : aufgabe_04✓ gelöstzuordnung
04String-Operatoren zuordnen
Ordne jedem Operator seine Aufgabe zu.
-match
-replace
-split
-join

"a,b" -split "," macht aus einem String ein Array, @("a","b") -join "-" den umgekehrten Weg. -match liefert $true/$false und füllt $Matches, -replace ersetzt dabei ALLE Stellen, auf die das Muster passt — nicht nur die erste.

~/uebungen/06-weiterfuehrend.ps1 : aufgabe_05✓ gelöstoutput vorhersagen
05String-Methoden verketten
$raw = "  monats bericht.txt  "
$name = $raw.Trim() -replace " ", "_"
Write-Host $name.ToUpper()
Was gibt die letzte Zeile aus?

.Trim() entfernt nur die Leerzeichen am Anfang und Ende — das Leerzeichen MITTEN im Namen bleibt. Genau das ersetzt dann -replace " ", "_" durch einen Unterstrich (und zwar jedes Vorkommen). .ToUpper() macht zum Schluss alles groß: MONATS_BERICHT.TXT.

~/uebungen/06-weiterfuehrend.ps1 : aufgabe_06✓ gelöstcode vervollständigen
06Fehler wirklich fangen
Welcher Wert für -ErrorAction sorgt dafür, dass der Fehler im catch-Block landet?
try {
    Get-Item "C:\GibtEsNicht" -ErrorAction 
} catch {
    Write-Host "Fehler: $($_.Exception.Message)"
}

Cmdlets wie Get-Item erzeugen standardmäßig nur non-terminating Errors: PowerShell meckert rot, läuft aber weiter — und catch wird NIE ausgeführt. Erst -ErrorAction Stop macht daraus einen terminierenden Fehler, den try/catch fangen kann. Im catch liefert $($_.Exception.Message) dann den Meldungstext.

~/uebungen/06-weiterfuehrend.ps1 : aufgabe_07✓ gelöstmehrfachauswahl
07Wahr oder falsch?
Welche Aussagen stimmen? Kreuze zwei an.

Richtig sind die erste und die dritte Aussage: Non-terminating Errors überspringen catch, solange kein -ErrorAction Stop gesetzt ist, und $_.Exception.Message ist der Standardweg an die Fehlermeldung. Falsch: $Matches[0] enthält den gefundenen TEXT (nicht eine Anzahl), catch reicht völlig (finally ist optional), und bei Hashtables funktionieren $h.Key und $h["Key"] beide.

~/uebungen/06-weiterfuehrend.ps1 : aufgabe_08✓ gelöstoutput vorhersagen
08Pipeline-Kette komplett
$line = "anna;bernd;carla;dora"
$names = $line -split ";"
$found = $names | ? { $_ -match 'a$' } | Select-Object -First 2
Write-Host (($found | % { $_.ToUpper() }) -join ",")
Was gibt die letzte Zeile aus?

Schritt für Schritt: -split ";" ergibt anna, bernd, carla, dora. Das Regex a$ verlangt ein a am STRING-ENDE — durch kommen anna, carla, dora (nicht bernd). Select-Object -First 2 behält davon nur anna und carla. % (= ForEach-Object) macht per .ToUpper() Großbuchstaben daraus, -join "," klebt sie mit Komma zusammen: ANNA,CARLA.

~/uebungen/06-weiterfuehrend.ps1 : aufgabe_09✓ gelösthands-on
09Mini-Skript: Server-Check
Öffne eine echte PowerShell und arbeite die Schritte durch:
  1. Lege eine Hashtable $server mit den Einträgen Name = "web01" und Port = 8080 an und ergänze danach den Key Status mit dem Wert "online".
  2. Gib alle Keys der Hashtable in einer Zeile aus, verbunden mit , (Tipp: $server.Keys und -join).
  3. Lies in einem try/catch die Datei C:\GibtEsNicht\config.txt mit Get-Content — denk an -ErrorAction Stop! Gib im Fehlerfall Fehler: plus die Fehlermeldung aus.
  4. Gib zum Schluss das aktuelle Datum im Stil 07.07.2026 14:30 aus (Tipp: Get-Date -Format).
# 1) Hashtable anlegen und erweitern
$server = @{ Name = "web01"; Port = 8080 }
$server["Status"] = "online"

# 2) Alle Keys in einer Zeile ausgeben
Write-Host ($server.Keys -join ", ")

# 3) Datei lesen mit Fehlerbehandlung
try {
    Get-Content "C:\GibtEsNicht\config.txt" -ErrorAction Stop
} catch {
    Write-Host "Fehler: $($_.Exception.Message)"
}

# 4) Zeitstempel formatiert ausgeben
Write-Host (Get-Date -Format 'dd.MM.yyyy HH:mm')

Der neue Key kommt einfach per Zuweisung $server["Status"] = "online" dazu. $server.Keys -join ", " verbindet alle Schlüssel zu einer Zeile. Weil die Datei nicht existiert, springt das Skript dank -ErrorAction Stop in den catch-Block und gibt die Meldung aus $_.Exception.Message aus — ohne Stop würde catch nie ausgeführt. Get-Date -Format 'dd.MM.yyyy HH:mm' bestimmt das Ausgabeformat selbst (dd = Tag, MM = Monat, HH = 24h-Stunde).