Ein Fehler in einem PowerShell-Skript verhindert, dass es erfolgreich abgeschlossen wird. Die Verwendung der Fehlerbehandlung mit Try-Catch-Blöcken ermöglicht die Verwaltung und Reaktion auf diese abschließenden Fehler. In diesem Beitrag werde ich die Grundlagen von Try/Catch-Blöcken und das Finden und Behandeln bestimmter Ausnahmemeldungen behandeln.
Syntax verstehen
Die Syntax des try catch Blocks ist sehr einfach., Es besteht aus zwei Abschnitten, die in geschweiften Klammern eingeschlossen sind, wobei der erste als Try-Block und der zweite als Catch-Block identifiziert wird.
try { # Statement to try}catch { # What to do with terminating errors}
Der try-Block kann so viele Anweisungen enthalten, wie ich möchte; Ich würde jedoch empfehlen, ihn so wenig wie möglich beizubehalten, wahrscheinlich nur eine einzige Anweisung. Der Punkt der Fehlerbehandlung besteht darin, jeweils mit einer Anweisung zu arbeiten und mit allem umzugehen, was damit auftritt.
Hier ist ein Beispiel für einen Fehler in der PowerShell-Konsole., Hier erstelle ich eine neue Datei mit dem Cmdlet New-Item und gebe einen nicht vorhandenen Ordner für Path an:
Wenn dies in einem Skript war, würde die Ausgabe auf dem Bildschirm etwas Platz verschwenden und das Problem ist möglicherweise nicht sofort sichtbar. Mit einem Try Catch-Block kann ich beginnen, die Fehlerausgabe zu manipulieren und sie administrationsfreundlicher zu machen.
Hier ist derselbe New-Item-Befehl in einem Try-catch-Block. Beachten Sie, dass ich in Zeile 2 dem Befehl den Parameter ErrorAction mit dem Wert Stop hinzufügen musste., Nicht alle Fehler werden als „beendet“ betrachtet, daher muss ich manchmal dieses Code-Bit hinzufügen, um den Catch-Block ordnungsgemäß zu beenden.
Jetzt habe ich anstelle eines Blocks roten wütend aussehenden Textes eine einfache Warnmeldung, dass ein Problem aufgetreten ist. Der nicht vorhandene Pfadname zusammen mit dem forcing-ErrorAction Stop lässt die Logik in den Catch-Block fallen und zeigt meine benutzerdefinierte Warnung an.
Die Verwendung der $Error Variable
ist zwar besser lesbar, aber nicht sehr hilfreich., Ich weiß nur, dass der Befehl nicht erfolgreich ausgeführt wurde, aber ich weiß nicht warum. Anstatt meine benutzerdefinierte Nachricht anzuzeigen, kann ich die spezifische Fehlermeldung anzeigen, die anstelle des gesamten Ausnahmeblocks für roten Text aufgetreten ist. Wenn ein Fehler im try-Block auftritt, wird er in der Variablen $Error gespeichert. Die Variable $Error enthält ein Array der letzten Fehler, und ich kann auf den letzten Fehler im Array bei Index 0 verweisen.,
Die Warnausgabe ist jetzt beschreibender und zeigt an, dass der Befehl fehlgeschlagen ist, da er keinen Teil des Pfads finden konnte. Diese Nachricht war Teil unserer ursprünglichen Fehlermeldung, ist aber jetzt prägnanter.
Mit Ausnahmemeldungen
kann ich auch mehrere Catch-Blöcke verwenden, falls ich bestimmte Fehler anders behandeln möchte. Hier werde ich zwei verschiedene benutzerdefinierte Nachrichten anzeigen, eine, wenn der Pfad nicht vorhanden ist, und eine, wenn ein illegales Zeichen im Namen verwendet wird., Beachten Sie, dass ich im folgenden Screenshot das Skript zweimal mit zwei verschiedenen Befehlen im try-Block ausgeführt habe. Jeder Befehl, jeder Fangblock und jede endgültige Ausgabe werden durch die orangefarbenen und grünen Pfeile angezeigt.
Mit Blick auf die Zeilen 14-16 gibt es einen dritten catch-Block ohne Ausnahmemeldung. Dies ist ein Catch-All-Catch-Block, der ausgeführt wird, wenn der Fehler nicht mit einer anderen Catch-Block-Ausnahme übereinstimmt., Wenn ich dieses Skript ausführe und die Nachricht im letzten Catch-Block sehe, weiß ich, dass der Fehler nicht mit einem illegalen Zeichen im Dateinamen oder einem Teil des Pfads zusammenhängt, der nicht gültig ist.
Woher kannte ich nun die Ausnahmenachrichten, die in den ersten beiden Catch-Blöcken verwendet werden sollen? Dies kann durch Betrachten der verschiedenen Informationen gefunden werden, die an die Variable $Error angehängt sind. Nachdem ein fehlgeschlagener Befehl aufgetreten ist, kann ich $Error ausführen.Ausnahme.GetType().FullName, um die Ausnahmemeldung für den letzten aufgetretenen Fehler anzuzeigen.,
Wenn ich zur PowerShell-Konsole zurückkehre, führe ich den Befehl New-Item mit einem nicht vorhandenen Pfad erneut aus und führe dann meinen Befehl $Error aus, um die Ausnahmenachricht zu finden.
Der rote Text unmittelbar nach dem fehlgeschlagenen Befehl enthält auch die Ausnahmemeldung, enthält jedoch nicht das Modul, aus dem es stammt. Ein Blick auf die Variable $Error zeigt die vollständige Nachricht, die für einen Catch-Block verwendet werden soll.,
Die Verwendung von try / catch-Blöcken gibt zusätzliche Leistung beim Umgang mit Fehlern in einem Skript und beim Ausführen verschiedener Aktionen basierend auf dem Fehler. Der Catch-Block kann mehr als nur eine Fehlermeldung anzeigen. Es kann Logik enthalten, die den Fehler behebt und den Rest des Skripts ausführt.