Behandeln von Fehlern mit dem Try-Catch-Block in PowerShell

  1. die $ErrorActionPreference-Variable in PowerShell
  2. der gemeinsame Parameter ErrorAction in PowerShell
  3. Verwenden Sie den PowerShell-Block try-catch.
Behandeln von Fehlern mit dem Try-Catch-Block in PowerShell

Codefehler sind häufig schwer zu lesen, was es nahezu unmöglich macht, festzustellen, was und wo das Skript schief gelaufen ist. PowerShell bietet einige Optionen zur Verbesserung der Fehlerbehandlung.

In diesem Artikel werden die Einstellungen für Fehleraktionen in PowerShell erläutert und erläutert, wie wir sie abfangen können, um eine Fehlerbehandlung mit den PowerShell-Blöcken Try-Catch (und Finally) durchzuführen.

die $ErrorActionPreference-Variable in PowerShell

Präferenzvariablen sind ein Begriff in PowerShell, und diese Variablen werden verwendet, um das Verhalten von PowerShell auf verschiedene Weise zu ändern. Die Variable $ErrorActionPreference ist eine dieser Variablen.

Die Variable $ErrorActionPreference steuert, wie PowerShell mit nicht terminierenden Fehlern umgeht. Der Wert $ErrorActionPreference ist standardmäßig auf "Continue" gesetzt.

Wenn die Variable $ErrorActionPreference auf "Stop" gesetzt ist, behandelt PowerShell alle Fehler als Fehler mit Abbruch. Verwenden Sie das folgende Snippet, um den Wert $ErrorActionPreference zu ändern.

$ErrorActionPreference = "Stop"

der gemeinsame Parameter ErrorAction in PowerShell

Der Parameter ErrorAction gilt für jeden Befehl, der allgemeine Parameter unterstützt, wenn der Wert $ErrorActionPreference auf die PowerShell-Sitzung angewendet wird. Die Werte für das Argument ErrorAction sind dieselben wie für die Variable $ErrorActionPreference.

Der Wert des Parameters ErrorAction hat Vorrang vor dem Wert des Parameters $ErrorActionPreference.

Beispielcode:

$ErrorActionPreference = "Continue"
$files = Get-Content .\files.txt
foreach ($file in $files) {
    Write-Output "Reading file $file"
    # Use the -ErrorAction common parameter
    Get-Content $file -ErrorAction STOP
}

Nachdem wir den geänderten Code ausgeführt haben, sehen wir, dass das Skript beendet wird, wenn es auf einen Fehler stößt, obwohl $ErrorActionPreference auf "Continue" gesetzt ist. Das Skript wurde beendet, weil der PowerShell-Parameterwert ErrorAction in Get-Content auf "Stop" gesetzt wurde.

Verwenden Sie den PowerShell-Block try-catch.

Jetzt ist es an der Zeit, etwas über die Try-Catch-Finally-Blöcke von PowerShell zu lernen. Mit den PowerShell-Blöcken 'Try-Capture' (und optional 'Finally') können Sie einen Block um ein Stück Code wickeln und alle Probleme erkennen.

Beispielcode:

try {
    <statement list>
}
catch [[<error type>][',' <error type>]*]{
    <statement list>
}
finally {
    <statement list>
}

Der Code, den PowerShell ausprobieren und auf Fehler überwachen soll, befindet sich im Try-Block. Tritt beim Ausführen des Codes im Try-Block ein Fehler auf, wird der Fehler in der $Error-Variable gespeichert und an den Catch-Block weitergeleitet.

Wenn der Try-Block einen Fehler zurückgibt, stellt der Catch-Block die zu unternehmenden Schritte bereit. Eine Try-Anweisung kann mehrere Catch-Blöcke enthalten.

Dieser Code befindet sich am Ende der Try-Anweisung im Finally-Block. Unabhängig davon, ob das Skript einen Fehler gezählt hat oder nicht, wird dieser Block ausgeführt.

Eine einfache Try-Anweisung besteht aus zwei Blöcken: einem Try und einem Catch. Finally ist ein optionaler Block.

Die Option Capture sollte leer sein, um eine unspezifische Ausnahme abzufangen. Das Skript im Variablenteil $ErrorActionPreference des Beispielcodes unten ist so angepasst, dass es die Try Catch-Blöcke verwendet.

Die foreach-Anweisung ist nun im Try-Block darunter enthalten. Ein 'Catch'-Block enthält den Code zum Anzeigen der Zeichenfolge "An Error Occurred", wenn ein Fehler auftritt.

Zuletzt löscht der Blockcode Finally die Variable $Error.

Beispielcode:

$files = Get-Content .\files.txt
try {
    foreach ($file in $files) {
        Write-Output "Reading file $file"
        Get-Content $file -ErrorAction STOP
    }
}
catch {
    Write-Host "An Error Occured" -ForegroundColor RED
}
finally {
    $Error.Clear()
}

Ausgang:

An Error Occured
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn