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.

PowerShell ErrorAction $ErrorActionPreference

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.

Johannes Huber
 

In seiner Freizeit macht Johannes nichts lieber, als für ITnator Beiträge zu schreiben. Input bekommt er hierfür von Problemen in der IT Administration von Servern, Clients und vielen weiteren IT Komponenten.

Click Here to Leave a Comment Below 0 comments