Im Automator

Haben Sie jemals ein Skript oder ein PowerShell-Cmdlet ausgeführt und werden mit einer schreienden Textwand konfrontiert – in Rot – wie unten gezeigt?

Beispiel für Fehler in PowerShell

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.

Die Variable $Error ist leer

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
Der Fehler wird der $Error Variable hinzugefügt

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 $Errorabgerufen 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
Die $Error Objekteigenschaften

Um den Grund für den Fehler zu ermitteln, können Sie den Inhalt der InvocationInfo Eigenschaft mit dem folgenden Befehl.,

$Error.InvocationInfo
Die InvocationInfo-Eigenschaft

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.

Die notizblock prozess details

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.,

Der Fehler wird ausgelöst, weil der Parameter ungültig ist

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.

Beispiel für einen nicht abschließenden Fehler

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 Continuegesetzt. 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.,

Erzwingen eines Abschlussfehlers mit der $ErrorActionPreference Variable

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 aufSTOPgesetzt ist.

Erzwingen eines Beendigungsfehlers mit dem ErrorAction Parameter

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.,

Skript beendet, wenn ein Fehler aufgetreten ist

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.,

Script beendet mit einer beschreibenden Fehlermeldung

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.

Getting the error TypeName value

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.,

Skript mit einer bestimmten Fehlermeldung beendet

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.