Fehlerbehandlung mit ErrorAction in PowerShell
Beim Entwickeln von PowerShell Skripten ist ein aktives Error Handling sehr wichtig. Denn diese sollen nicht einfach abbrechen, sondern kontrolliert zu Ende laufen. In Windows PowerShell hat man mehrere Möglichkeiten Fehler behandeln zu können. Zum einen mit dem Parameter ErrorAction, mit der Variable ErrorActionPreference oder mit einem Try Catch Block.
Mit diesen Optionen lassen sich Fehler in PowerShell behandeln:
- Parameter
-ErrorAction
- Variable
$ErrorActionPreference
- Try-Catch Block mit PowerShell
Zwei verschiedene Arten von Fehler in PowerShell
In Windows PowerShell wird generell zwischen zwei verschiedenen Arten von Fehlern unterschieden:
- Terminating Errors
- Non-Terminating Errors
Die terminating Errors beenden das PowerShell Script sofort, beispielsweise bei einem Syntax-Fehler. Die non-terminating Errors lassen eine Fortsetzung der Aufgabe zu. Dies sind oft Fehler wie beispielsweise eine fehlende Schreib-Berechtigung in ein Verzeichnis. Genau diese Non-Terminating Fehler kann man mit PowerShell Error Handling abfangen.
-ErrorAction und $ErrorActionPreference in PowerShell
Bei den Non-Terminating-Errors, also bei denen, die das Script nicht komplett abbrechen lassen, kann aktives Error Handling betrieben werden. Hier hilft bei vielen PowerShell Cmdlets der Parameter -ErrorAction. Beispielsweise lassen sich Fehler unterdrücken mit -ErrorAction SilentlyContinue
.
Get-ChildItem C:\Windows\ -Recurse -Filter *.txt -ErrorAction SilentlyContinue
Mit folgendem Befehl und dem Parameter -ErrorAction SilentlyContinue werden alle Verzeichnisse nach .txt-Dateien durchsucht, allerdings keine Fehler ausgegeben, falls ein Verzeichnis nicht gelesen werden kann.
Wenn man das allerdings nicht auf ein einzelnes Cmdlet anwenden möchte, sondern global in den nachfolgenden Zeilen, so kann man die globale Variable $ErrorActionPreference
verwenden.
$ErrorActionPreference = "SilentlyContinue"
Hier wird die Einstellung nicht auf den einzelnen Befehl angewendet, sondern auf das komplette Skript, beziehungsweise für die nachfolgenden Zeilen.
Verfügbare Optionen für ErrorAction und ErrorActionPreference
Natürlich kann nicht nur SilentlyContinue zum Unterdrücken der Fehlermeldungen verwendet werden. Auch andere Optionen sind für das Error Handling in PowerShell verfügbar.
Mit diesen Optionen könnt ihr Fehler behandeln:
- SilentlyContinue
Der Fehler wird unterdrückt und PowerShell führt den Code weiter aus. - Ignore
Der Fehler wird komplett ignoriert und wird auch nicht in den Error Stream geschrieben. - Continue
Continue ist der Standard-Wert. PowerShell gibt den Fehler in roter Schrift aus, arbeitet allerdings den Code weiterhin ab. - Stop
Bei Stop wird (gleich einem terminierenden Fehler) das Script komplett abgebrchen. - Inquire
Inquire ist sehr selten. Hier wird bei jedem Fehler gefragt, ob mit der Abarbeitung fortgefahren werden soll.
Try Catch Finally verwenden
Entwickler kennen das Try-Catch-Finally definitiv in der Anwendungsentwicklung. Diese Art von Fehler behandeln ist aber auch in der Scriptsprache PowerShell möglich und wird gerne eingesetzt. Vor allem bei terminierenden Fehlern, welche mit ErrorAction und ErrorActionPreference nicht abgefangen werden können nutzt man gerne Try Catch.
Ein Try-Catch-Finally Block ist in PowerShell folgendermaßen strukturiert:
try{ <# Im Try-Block befindet sich der Code, welcher einen Fehler verursachen könnte. #> } catch{ <# Im Catch-Block befindet sich der Code, welcher bei einem Fehler ausgeführt wird. Beispiel: "Fehler $_.Exception.Message" #> } finally{ <# Der Finally-Block ist optional. Jedoch wird er immer ausgeführt, egal ob PowerShell in Try oder Catch springt. #> }
Powershell erlaubt auch ein ErrorHandling mit mehreren Catch-Blocken im Try-Catch-Finally Statement. Das Könnte in etwa so aussehen:
try{ # code } catch [System.Management.Automation.ItemNotFoundException]{ # code } catch [System.Management.Automation.PropertyNotFoundException]{ # code } catch [System.Management.Automation.SetValueException]{ # code } finally{ # code }
Hier werden mehrere Catch-Blöcke verwendet. Je nach dem, welchen Fehler man mit PowerShell behandeln möchte muss man verschieden vorgehen. Wird beispielsweise eine Datei nicht gefunden, springt PowerShell in den Catch Block, welcher für die ItemNotFoundException zuständig ist.