Müde vom Jonglieren mit der PowerShell-Fehlerbehandlung? Hier kommt ein Überblick über verschiedene Strategien, mit Fehlern umzugehen. Vereinfache dir die Arbeit! So werden aus Fehler-Objekten Daten-Objekte, mit denen Fehlerbehebung reibungsloser denn je wird.
Wandle Fehler (error objects) in hilfreiche Daten
In unserer Miniserie sind wir auf verschiedene Weise mit Ausnahmen in Berührung gekommen: über $_ in einem Catch-Block oder einer Trap, über $error oder separate Fehlervariablen, die mit -ErrorVariable definiert werden, oder durch Umleitung des Fehlerstroms in die Pipeline.
In all diesen Fällen erhalten Sie Fehlerobjekte. Hier ist eine generische Funktion, die Sie verwenden können, um alle diese Fehlerdatensätze einfach in praktische Datenobjekte zu konvertieren:
filter Convert-ErrorRecord
{
[PSCustomObject]@{
Exception = $_.Exception.Message
Reason = $_.CategoryInfo.Reason
Target = $_.CategoryInfo.TargetName
Script = $_.InvocationInfo.ScriptName
Line = $_.InvocationInfo.ScriptLineNumber
Column = $_.InvocationInfo.OffsetInLine
}
}
Diese Funktion ist in allen in dieser Serie besprochenen Fehlerbehandlungsprogrammen vorhanden.
Zusammenfassend kann man sagen, dass alle vier, in diesem Monat behandelten Fehlerbehandlungsstrategien Convert-ErrorRecord verwenden, um die Ausnahmen in einfach zu handhabende Datenobjekte umzuwandeln. Stelle sicher, dass die obige Convert-ErrorRecord-Funktion definiert ist. Nachdem du sie ausgeführt hast, kannst du eines der folgenden Beispiele ausprobieren:
Mit try/catch:
try
{
Write-Host 'Previous Command'
$result = Get-ChildItem -Path $env:windir -Depth 1 -Filter *.log -ErrorAction Stop
Write-Host 'Next Command'
}
catch
{
$_ | Convert-ErrorRecord
}
Mit Trap:
Write-Host 'Previous Command'
$result = Get-ChildItem -Path $env:windir -Depth 1 -Filter *.log -ErrorAction Stop
Write-Host 'Next Command'
trap
{
$_ | Convert-ErrorRecord
continue
}
Mit $Fehler:
$error.Clear()
# Fehlermeldungen für den Benutzer ausblenden
$ErrorActionPreference = 'SilentlyContinue'
# Cmdlet-Aktionen ausführen, d.h. Protokolldateien finden
$result = Get-ChildItem -Path $env:windir -Depth 1 -Filter *.log
# weitere Aktionen durchführen, z.B. auf einen Dienst zugreifen, der nicht existiert
$service = Get-Service -Name notThere
# Standard-Fehleraktion wiederherstellen
$ErrorActionPreference = 'Continue'
# Fehler im Nachhinein überprüfen
$errorCount = $error.Count
Write-Host "Es gab $errorCount Fehler."
# Fehlerdetails ausgeben
$error | Convert-ErrorRecord
Mit Fehlerstrom (error strom):
Get-ChildItem -Path c:\windows -Depth 1 -Filter *.log 2>&1 | ForEach-Object {
if ($_ -is [System.Management.Automation.ErrorRecord])
{
$text = $_ | Convert-ErrorRecord | Out-String
Write-Host $text
}
else
{
$_
}
}
Das waren also alle vier Blogbeiträge im Oktober:
- Nutze Trap-Anweisungen – so helfen sie dir
- Fehlerbehandlung ohne Abbruch des Cmdlets
- Leite Fehler direkt zum passenden Handler
- Wandle Fehler (error objects) in hilfreiche Daten
Dein ultimativer PowerShell-Spickzettel
Entfessele das volle Potenzial von PowerShell mit unserem praktischen Poster. Egal, ob frischer Einsteiger oder erfahrener Profi, dieser Spickzettel ist so konzipiert, dass du schnell die wichtigsten und am häufigsten verwendeten Cmdlets findest.
Das Poster ist zum Download und in Papierform erhältlich.

Weiterführende Links
- ScriptRunner ActionPacks helfen dir, Aufgaben zu automatisieren
- Teste ScriptRunner!
- Erlebe ScriptRunner in Aktion – Buche jetzt eine Demo