Try/Catch Block in PowerShell ist es, die Fehler zu behandeln, die im Skript erzeugt werden. Um genau zu sein, sollten die Fehler abschließende Fehler sein. Der Finally-Block in der PowerShell muss nicht jedes Mal zusammen mit Try/Catch geschrieben werden, wird jedoch unabhängig davon ausgeführt, ob der Fehler auftritt oder nicht.
Wenn Sie also den Try-Block verwenden, ist der Catch-Block obligatorisch, aber nicht endgültig blockiert.
-
Try / Catch block with Terminating error-Unten ist das Beispiel für das Beenden von error ohne finally block.,
Beispiel
try{ This is not allowed "This is Allowed"}catch{ Write-Host "Error occured" -BackgroundColor DarkRed}
Ausgabe
Im obigen Beispiel haben wir etwas zurückgegeben, das nicht erlaubt ist, aber die nächste Zeile war echt, obwohl sie aufgrund des Abschlussfehlers nicht ausgeführt werden konnte.
Unser Ziel ist es, die im Try-Block generierte Ausnahme-und Fehlermeldung abzufangen. Wie wir wissen, wird der Fehler in der Variablen $Error gespeichert. Wenn Sie die Ausgabe der Variablen $error überprüfen, können Sie die gesamte Ansicht abrufen, aber wenn Sie ein Skript ausführen und die Fehler behandeln, stellen Sie sicher, dass Sie die alten Fehler mit $error löschen.,clear () Befehl oder verwenden Sie die neue Powershell-Konsole. Falls Sie die spezifische Fehlervariablenposition in einem Array kennen, können Sie diese direkt verwenden. Zum Beispiel, $error
Wir können sehen, was alle Eigenschaften der $Error Variable sind.
PS C:\WINDOWS\system32> $Error | Get-Member | Select Name, MemberTypeName MemberType---- ----------Equals MethodGetHashCode MethodGetObjectData MethodGetType MethodToString MethodCategoryInfo PropertyErrorDetails PropertyException PropertyFullyQualifiedErrorId PropertyInvocationInfo PropertyPipelineIterationInfo PropertyScriptStackTrace PropertyTargetObject PropertyPSMessageDetails ScriptProperty
Es gibt nur wenige Eigenschaften von oben sind hilfreich, um die Ausnahme und Fehlerdetails zu finden. Lass sie sehen und wir können sie auch im Fangblock nutzen.
Erste InvocationInfo Eigenschaft., Sie können auch $Error aber dies ist der einzige Fehler, der bisher generiert wurde, also verwenden wir direkt $Error aber Sie können das AutoSuggestion-Popup mit $error Variable nicht direkt erhalten.
PS C:\WINDOWS\system32> $Error.InvocationInfoMyCommand :BoundParameters : {}UnboundArguments : {}ScriptLineNumber : 3OffsetInLine : 5HistoryId : 50ScriptName :Line : This is not allowedPositionMessage : At line:3 char:5 + This is not allowed + ~~~~PSScriptRoot :PSCommandPath :InvocationName : ThisPipelineLength : 0PipelinePosition : 0ExpectingInput : FalseCommandOrigin : InternalDisplayScriptPosition :
Sie können die spezifischen Informationen von Line und PositionMessage wie unten gezeigt abrufen.
Überprüfen Sie nun die Ausnahmeeigenschaften.
PS C:\WINDOWS\system32> $Error.ExceptionThe term 'This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
Ausnahmemeldung
PS C:\WINDOWS\system32>$error.Exception.MessageThe term 'This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
Sie können die anderen Eigenschaften verwenden, die Ihrer Meinung nach hilfreich sind, um die Fehlermeldung anzuzeigen. Wir werden einige davon im Catch-Block verwenden, um den Fehler abzufangen., Da wir mit dem aktuellen Fehler arbeiten, verwenden wir $_. um den aktuellen Fehler/die aktuelle Ausnahme zu behandeln.
Ausgabe
Error Message: The term 'This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.Error in Line: This is not allowedError in Line Number: 3Error Item Name:
Wie wir oben gesehen haben, gab es keinen Finally block, aber Try/Catch funktionierte weiter. Sie können den Finally-Block hinzufügen, um Ihre Variablen und Fehler zu löschen und jede Nachricht anzuzeigen.
-
Try/Catch-block mit Nicht-Terminierende Fehler.,
Wie wir im obigen Beispiel gesehen haben, können Beendigungsfehler mit dem Try/Catch-Block gesteuert werden, aber Nicht Beendigungsfehler nicht, da es sich um integrierte Cmdlets und Funktionen handelt generierte Fehler und die Standardeinstellung für die Fehleraktion ist Continue und daher wird der nächste Befehl auch dann weiter ausgeführt, wenn der Fehler nicht behandelt wird.
PS C:\WINDOWS\system32> $ErrorActionPreferenceContinue
Um den nicht abschließenden Fehler auf den Abschlussfehler zu erzwingen, müssen wir entweder die Variable $ErrorActionPreference ändern, um zu stoppen, oder den Parameter ErrorAction mit dem Stoppwert verwenden., Hier verwenden wir den Parameter ErrorAction so, wie wir ihn für einen bestimmten Befehl und nicht für das gesamte Skript benötigen.
Beispiel
Ausgabe
Error Message: Cannot find any service with service name 'WhichService'.Error in Line: Get-Service WhichService -ErrorAction StopError in Line Number: 4Error Item Name:This is going to run anyway
Wie Sie im obigen Beispiel sehen können, erzeugt Get-Service den nicht abschließenden Fehler und wir können ihn in den Stop-Parameter zum Beenden von error by –ErrorAction konvertieren und dieselbe Ausnahme wurde vom Catch-Block abgefangen.
-
Manuelles Behandeln einer bestimmten Ausnahme
Wenn Sie einen bestimmten Ausnahmetyp behandeln möchten, können Sie den Ausnahmenamen im catch-Block angeben., Um den Namen der Ausnahme zu kennen, müssen Sie die Eigenschaft der Variablen $Error GetType () GetType (). Im folgenden Beispiel müssen wir den Ausnahmenamen aus der Fehlerausgabe unten finden.
Beispiel
Angenommen, Ihr Fehler wird in der Variablen $Error gespeichert, müssen Sie den folgenden Befehl ausführen, um den Ausnahmenamen für den catch-Block abzurufen.
$Error.Exception.GetType().FullName
PS C:\WINDOWS\system32> $Error.Exception.GetType().FullNameSystem.Management.Automation.MethodInvocationException
Sie haben den Namen des Ausnahmetyps mit dem obigen Befehl erhalten.,
Output
-
Mehrere Catch-Ausnahme PowerShell.
Sie können auch die mehreren Ausnahmen in PowerShell abfangen. Dazu können Sie einen einzelnen Try-Block und mehrere Catch-Blöcke verwenden.
Beispiel
Ausgabe
Cannot find path 'C:\temp\cominfo1.html' because it does not exist.Setting up ErrorActionPreference to the Default value
Hier wird im ersten Befehl selbst ein Fehler generiert, sodass der nächste Befehl nicht ausgeführt wird. Wenn der erste Befehl keinen Fehler generiert, wird der nächste Befehl überprüft und wenn die Ausnahme auftritt, wird Catch mit diesem bestimmten Ausnahmeblock ausgeführt.,
Wenn Sie nicht mehrere Ausnahmen behandeln möchten und dennoch einige Befehle benötigen, können Fehler ignoriert werden, sollten aber den catch-Block nicht durchlaufen, damit der nächste Befehl ausgeführt werden kann, dann können Sie Ignore oder SilentlyIgnore im Parameter ErrorAction.