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.
try { ... } catch { ... } fängt Fehler ab — Cmdlet-Fehler landen aber nur mit -ErrorAction Stop im catch-Block. Die Fehlermeldung steckt dort in $_.Exception.Message.$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..ToUpper(), .Trim(), .Replace(), .Split() — Methoden lassen sich verketten.Get-Date -Format 'dd.MM.yyyy HH:mm' formatiert Datum und Uhrzeit nach deinem Muster.$person = @{ Name = "Max"; Age = 25 } $person["City"] = "Wien" Write-Host "$($person.Name) wohnt in $($person['City'])"
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.
$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.
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.
"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.
$raw = " monats bericht.txt " $name = $raw.Trim() -replace " ", "_" Write-Host $name.ToUpper()
.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.
-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.
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.
$line = "anna;bernd;carla;dora" $names = $line -split ";" $found = $names | ? { $_ -match 'a$' } | Select-Object -First 2 Write-Host (($found | % { $_.ToUpper() }) -join ",")
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.
$server mit den Einträgen Name = "web01" und Port = 8080 an und ergänze danach den Key Status mit dem Wert "online"., (Tipp: $server.Keys und -join).try/catch die Datei C:\GibtEsNicht\config.txt mit Get-Content — denk an -ErrorAction Stop! Gib im Fehlerfall Fehler: plus die Fehlermeldung aus.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).