Haben Sie jemals ein Skript oder ein PowerShell-Cmdlet ausgeführt und werden mit einer schreienden Textwand konfrontiert – in Rot – wie unten gezeigt?
Fehler können überwältigend und verwirrend werden. Und vor allem sind Fehler oft schwer zu lesen, was das Bestimmen, was und wo das Skript schief gelaufen ist, nahezu unmöglich macht.,
Glücklicherweise haben Sie in PowerShell einige Optionen, um dies durch Fehlerbehandlung zu verbessern. Mithilfe der Fehlerbehandlung können Fehler so gefiltert und angezeigt werden, dass sie leichter verständlich sind. Und das Verständnis des Fehlers macht es einfach, der Fehlerbehandlung mehr Logik hinzuzufügen.
In diesem Artikel erfahren Sie mehr über Fehler in PowerShell und wie sie abgefangen werden können, um die Fehlerbehandlung mit den PowerShell-Blöcken Try Catch
(und finally
) durchzuführen.,
Inhaltsverzeichnis
Verstehen Sie, wie Fehler in PowerShell funktionieren
Bevor Sie in die Fehlerbehandlung eintauchen, lassen Sie uns zunächst einige Konzepte rund um Fehler in PowerShell behandeln. Das Verständnis von Fehlern kann zu besseren Strategien zur Fehlerbehandlung führen.
Die automatische Variable $Error
In PowerShell gibt es viele automatische Variablen, und eine davon ist die automatische Variable $Error
. PowerShell verwendet die Variable $Error
, um alle Fehler zu speichern, die in der Sitzung auftreten., Die Variable $Error
ist ein Array von Fehlern, sortiert nach den neuesten.
Beim ersten Öffnen einer PowerShell-Sitzung ist die Variable $Error
leer. Sie können dies überprüfen, indem Sie die Variable $Error
aufrufen.
Wie Sie sehen können, beginnt die Variable $Error
leer., Sobald jedoch ein Fehler generiert wird, wird der Fehler hinzugefügt und in der Variablen $Error
gespeichert.
Im folgenden Beispiel wird der Fehler generiert, indem absichtlich ein Dienstname abgerufen wird, der nicht vorhanden ist.
PS> Get-Service xyzPS> $ErrorPS> $Error.Count
Wie Sie der obigen Ausgabe entnehmen können, wurde der generierte Fehler der $Error
Variable.,
Die Variable $Error enthält eine Sammlung von Fehlern, die in der PowerShell-Sitzung generiert wurden. Jeder Fehler kann durch Aufrufen seiner Array-Position behoben werden. Der letzte Fehler liegt immer bei Index 0.
Der letzte Fehler kann beispielsweise mit
$Error
abgerufen werden.
Die $Error Objekteigenschaften
Da alles in PowerShell ein Objekt ist, ist die $Error
Variable ein Objekt und Objekte haben Eigenschaften., Wenn Sie die Variable $Error
an das Cmdlet Get-Member
Get-Member
, sollten Sie die Liste der verfügbaren Eigenschaften sehen.
$Error | Get-Member
Um den Grund für den Fehler zu ermitteln, können Sie den Inhalt der InvocationInfo
Eigenschaft mit dem folgenden Befehl.,
$Error.InvocationInfo
Jetzt können Sie dasselbe mit den anderen Eigenschaften tun und herausfinden, welche anderen Informationen Sie finden können!
Beenden von Fehlern
Beenden von Fehlern stoppen Sie den Ausführungsfluss, wenn PowerShell-oder Nicht-Beenden-Fehler auftreten. Es gibt mehrere Möglichkeiten, wie ein Abschlussfehler auftreten kann. Ein Beispiel ist, wenn Sie ein Cmdlet mit einem Parameter aufrufen, der nicht vorhanden ist.,
Wie Sie im folgenden Screenshot sehen, ist der Befehl gültig, wenn der Befehl Get-Process notepad
ausgeführt wird und die Details des Notepad-Prozesses angezeigt werden.
Aber, wenn ein parameter, der nicht vorhanden ist, ist verwendet wie Get-Process notepad -handle 251
, die cmdlet zeigt einen fehler, dass die handle
Parameter ist nicht gültig. Anschließend wird das Cmdlet beendet, ohne die Details des Prozesses notepad
anzuzeigen.,
Nicht abschließende Fehler
Nicht abschließende Fehler sind Fehler, die die Ausführung des Skripts oder Befehls nicht stoppen. Schauen Sie sich beispielsweise den folgenden Code an. Dieser Code ruft die Liste der Dateinamen aus der Dateiliste ab.txt-Datei. Dann durchläuft das Skript jeden Dateinamen, liest den Inhalt jeder Datei und gibt sie auf dem Bildschirm aus.
$file_list = Get-Content .\filelist.txtforeach ($file in $file_list) { Write-Output "Reading file $file" Get-Content $file}
der Inhalt Der Dateiliste.,txt-Datei sind die Dateinamen zeigt in der Liste unten.
File_1.logFile_2.logFile_3.logFile_4.logFile_5.logFile_6.logFile_7.logFile_8.logFile_9.logFile_10.log
Aber was ist, wenn File_6.log existierte eigentlich nicht? Wenn Sie den Code ausführen, erwarten Sie, dass ein Fehler auftritt, da das Skript die Datei_6 nicht finden kann.log. Sie werden eine ähnliche Ausgabe unten sehen.
Wie Sie dem Screenshot des obigen Ergebnisses entnehmen können, konnte das Skript die ersten fünf Dateien in der Liste lesen, aber als es versuchte, die Datei File_6 zu lesen.,txt, ein Fehler wird zurückgegeben. Das Skript las dann den Rest der Dateien weiter, bevor es beendet wurde. Es wurde nicht beendet.
Die Variable $ErrorActionPreference
Bisher haben Sie die abschließenden und nicht abschließenden Fehler kennengelernt und wie sie sich voneinander unterscheiden. Wussten Sie jedoch, dass ein nicht abschließender Fehler gezwungen werden kann, als Abschlussfehler behandelt zu werden?
PowerShell hat ein Konzept namens preference variables. Diese Variablen werden verwendet, um das Verhalten von PowerShell auf viele verschiedene Arten zu ändern. Eine dieser Variablen heißt $ErrorActionPreference
.,
Die Variable $ErrorActionPreference
wird verwendet, um die Art und Weise zu ändern, wie PowerShell nicht abschließende Fehler behandelt. Standardmäßig ist der Wert $ErrorActionPreference
auf Continue
gesetzt. Wenn Sie den Wert der Variablen $ErrorActionPreference
in STOP
ändern, wird PowerShell gezwungen, alle Fehler als Abschlussfehler zu behandeln.
Verwenden Sie den folgenden Code, um den Wert $ErrorActionPreference
zu ändern.,
$ErrorActionPreference = "STOP"
Um mehr über andere gültige $ErrorActionPreference Variablenwerte zu erfahren, besuchen Sie PowerShell ErrorActionPreference.
Verweisen Sie nun auf das Beispiel, das im Abschnitt Nicht abschließende Fehler in diesem Artikel verwendet wird. Das Skript kann geändert werden, um die Änderung in $ErrorActionPreference
wie der unten gezeigte Code einzuschließen:
Wenn Sie den oben geänderten Code ausführen, verhält es sich anders als zuvor, wenn der $ErrorActionPreference
– Wert auf den Standardwert von Continue
.,
Wie Sie auf dem Screenshot des obigen Ergebnisses sehen können, konnte das Skript die ersten fünf Dateien in der liste, aber als es versuchte, die Datei File_6 zu lesen.txt, ein Fehler wird zurückgegeben, weil die Datei nicht gefunden wurde. Dann wird das Skript beendet und der Rest der Dateien wird nicht gelesen.,
Der Wert
$ErrorActionPreference
ist nur in der aktuellen PowerShell-Sitzung gültig. Es wird auf den Standardwert zurückgesetzt, sobald eine neue PowerShell-Sitzung gestartet wird.
Der gemeinsame Parameter ErrorAction
Wenn der Wert $ErrorActionPreference
auf die PowerShell-Sitzung angewendet wird, gilt der Parameter ErrorAction
für jedes Cmdlet, das gemeinsame Parameter unterstützt. Der Parameter ErrorAction
akzeptiert dieselben Werte wie die Variable $ErrorActionPreference
.,
Der Parameterwert ErrorAction
hat Vorrang vor dem Wert $ErrorActionPreference
.
Gehen wir zurück und verwenden denselben Code im vorherigen Beispiel. Diesmal wird jedoch der Parameter ErrorAction
zur Zeile Get-Content
hinzugefügt.
Nach dem Ausführen des geänderten Codes sehen Sie, dass das Skript immer noch beendet wird, sobald ein Fehler aufgetreten ist, obwohl $ErrorActionPreference
auf Continue
., Das Skript wurde beendet, weil der-ErrorAction
Parameterwert inGet-Content
aufSTOP
gesetzt ist.
Mit PowerShell Versuchen Sie Catch-Blöcke
An dieser Stelle haben Sie mehr über PowerShell-Fehler und wie die Variablen $ErrorActionPreference
und ErrorAction
funktionieren., Jetzt ist es an der Zeit, etwas über die guten Dinge zu lernen – die PowerShell Try Catch Finally
– Blöcke.
PowerShell Blöcke (und optional finally block
) sind eine Möglichkeit, ein Netz um ein Stück Code zu werfen und alle Fehler zu fangen, die zurückkehren.
Der folgende Code zeigt die Syntax derTry
Anweisung.
try { <statement list>}catch *]{ <statement list>}finally { <statement list>}
Der Try
– Block enthält den Code, den PowerShell“ ausprobieren “ und auf Fehler überwachen soll., Wenn der Code im Block Try
auf einen Fehler stößt,wird der Fehler zur Variablen $Error
hinzugefügt und dann an den Block Catch
übergeben.
DerCatch
– Block enthält die Aktionen, die ausgeführt werden sollen, wenn ein Fehler vomTry
– Block empfangen wird. Es können mehrereCatch
– Blöcke in einerTry
– Anweisung vorhanden sein.
DerFinally
– Block enthält den Code, der am Ende derTry
– Anweisung steht., Dieser Block wird ausgeführt, unabhängig davon, ob ein Fehler nicht gezählt wurde.
Abfangen unspezifischer Fehler (Catch-All)
Eine einfache Try
Anweisung enthält eine Try
und einen Catch
Block. Finally
– block ist optional.
Um beispielsweise eine unspezifische Ausnahme abzufangen, sollte der Parameter Catch
leer sein. Der folgende Beispielcode verwendet dasselbe Skript, das im Variablenabschnitt $ErrorActionPreference verwendet wurde,jedoch so geändert wurde, dass die Blöcke Try Catch
.,
Wie Sie dem folgenden Code entnehmen können, ist diesmal die foreach
– Anweisung im Try
– Block eingeschlossen. Dann enthält ein Catch
– Block den Code zum Anzeigen der Zeichenfolge An Error Occurred
wenn ein Fehler aufgetreten ist. Der Code imFinally
– Block löscht nur die Variable$Error
.
Der obige Code gibt Ihnen nach der Ausführung in PowerShell diese unten gezeigte Ausgabe.,
Die obige Ausgabe zeigt an, dass das Skript auf einen Fehler gestoßen ist, den Code innerhalb des Catch
Blocks ausgeführt und dann beendet hat.
Der Fehler wurde behandelt, was der Punkt der Fehlerbehandlung war. Der angezeigte Fehler war jedoch zu allgemein. Um einen aussagekräftigeren Fehler anzuzeigen, können Sie auf die Exception
– Eigenschaft des Fehlers zugreifen, der vom Try
– Block übergeben wurde.,
Der folgende Code wird geändert, insbesondere der Code innerhalb desCatch
– Blocks, um die Ausnahmenachricht aus dem aktuellen Fehler anzuzeigen, der an die Pipeline weitergegeben wurde – $PSItem.Exception.Message
Wenn der geänderte Code oben ausgeführt wird, ist die angezeigte Nachricht diesmal viel beschreibender.,
Catching Specific Errors
Es gibt Zeiten, in denen eine Catch-all-Fehlerbehandlung nicht der geeignetste Ansatz ist. Möglicherweise möchten Sie, dass Ihr Skript eine Aktion ausführt, die von der Art des aufgetretenen Fehlers abhängt.
Wie bestimmen Sie den Fehlertyp? Durch Überprüfen des TypeName
Werts der Exception
Eigenschaft des letzten Fehlers., Um beispielsweise den Fehlertyp aus dem vorherigen Beispiel zu finden, verwenden Sie diesen Befehl:
$Error.Exception | Get-Member
Das Ergebnis des obigen Codes würde wie im folgenden Screenshot aussehen. Wie Sie sehen, wird der Wert TypeName
angezeigt – System.Management.Automation.ItemNotFoundException
.
Nachdem Sie den Fehlertyp kennen, den Sie abfangen müssen, ändern Sie den Code, um ihn speziell abzufangen., Wie Sie aus dem modifizierten Code unten sehen, gibt es jetzt zweiCatch
Blöcke. Der ersteCatch
Block fängt einen bestimmten Fehlertyp ab (System.Management.Automation.ItemNotFoundException
). Im Gegensatz dazu enthält der zweite Catch
-Block die generische Catch-All-Fehlermeldung.
Der Screenshot unten zeigt die Ausgabe des modifizierten Codes oben.,
In diesem Artikel haben Sie über Fehler in PowerShell gelernt, seine Eigenschaften, und wie Sie einen bestimmten Fehlertyp bestimmen. Sie haben auch den Unterschied zwischen der Variablen $ErrorActionPreference
und dem Parameter ErrorAction
erfahren, wie PowerShell nicht abschließende Fehler behandelt.,
Sie haben auch gelernt, wie Sie die PowerShellTry Catch Finally
– Blöcke verwenden, um Fehlerbehandlung durchzuführen, sei es für bestimmte Fehler oder einen Catch-All-Ansatz.
Die Beispiele, die in diesem Artikel gezeigt werden, zeigen nur die Grundlagen, wie dieTry Catch Finally
Blöcke funktionieren. Das Wissen, das Sie hoffentlich in diesem Artikel erworben haben, sollte Ihnen die Startblöcke geben, um die Fehlerbehandlung in Ihren Skripten anzuwenden.,
Weiterlesen
- About_Try_Catch_Finally
- About_Automatic_Variables
- Zurück zu den Grundlagen: Die PowerShell-Foreach-Schleife
- Zurück zu den Grundlagen: PowerShell-Objekte verstehen