561 Stimmen

Beenden eines Skripts in PowerShell

Ich habe nach einer Möglichkeit gesucht, ein PowerShell (PS1)-Skript zu beenden, wenn ein nicht behebbarer Fehler innerhalb einer Funktion auftritt. Zum Beispiel:

function foo() {
    # Do stuff that causes an error
    $host.Exit()
}

Natürlich gibt es nicht so etwas wie $host.Exit() . Es gibt $host.SetShouldExit() aber dadurch wird das Konsolenfenster geschlossen, was ich nicht will. Was ich brauche, ist etwas Äquivalentes zu Pythons sys.exit() die einfach die Ausführung des aktuellen Skripts ohne weiteres beenden wird.

Bearbeiten: Ja, es ist nur exit . Duh.

34voto

Amr Bahaa Punkte 917

Das Auslösen einer Ausnahme ist vor allem dann sinnvoll, wenn Sie die Fehlerursache klären wollen:

throw "Error Message"

Dies führt zu einem Abbruchfehler.

26voto

Rob Punkte 3212

Ich denke, Sie suchen nach Return anstelle von Break . Break wird normalerweise für Schleifen verwendet und bricht nur im innersten Codeblock ab. Verwenden Sie Return, um eine Funktion oder ein Skript zu beenden.

18voto

iRon Punkte 14477

Ich habe zufällig herausgefunden, dass Break _<UnknownLabel>_ (z.B. einfach Break **Script** , wobei das Etikett Script gibt es nicht ) scheint aus dem gesamten Skript auszubrechen (sogar innerhalb einer Funktion) und hält den Host am Leben.
Auf diese Weise können Sie eine Funktion erstellen, die das Skript von einer beliebigen Stelle aus unterbricht (z. B. eine rekursive Schleife), ohne den aktuellen Bereich zu kennen (und Labels zu erstellen):

Function Quit($Text) {
    Write-Host "Quiting because: " $Text
    Break Script
}

14voto

fpschultze Punkte 153

Möglicherweise ist es besser, "Trap" zu verwenden. Ein PowerShell-Trap gibt einen Codeblock an, der beim Auftreten eines Abbruchs oder Fehlers ausgeführt wird. Typ

Get-Help about_trap

um mehr über die Fallenerklärung zu erfahren.

7voto

Vopel Punkte 438

Ich habe mir einen netten kleinen Trick ausgedacht, um genau das zu tun, wenn ich wollte, dass eine Funktion ein Skript verlässt, ohne einen Fehler auszulösen, aber die Konsole nicht verlässt, wenn die Funktion von dort aus verwendet wurde. Er beinhaltet die $PSScriptRoot automatische Variable, die nur bei der Ausführung eines Skripts definiert wird.

if($PSScriptRoot){exit}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X