Ich habe nach einer Möglichkeit gesucht, ein PowerShell (PS1) -Skript zu beenden, wenn innerhalb einer Funktion ein nicht behebbarer Fehler auftritt. Zum Beispiel:
function foo() {
# Do stuff that causes an error
$host.Exit()
}
Natürlich gibt es so etwas nicht $host.Exit()
. Es gibt $host.SetShouldExit()
, aber dies schließt tatsächlich das Konsolenfenster, was nicht das ist, was ich will. Was ich brauche, ist etwas Äquivalentes zu Pythons sys.exit()
, das einfach die Ausführung des aktuellen Skripts ohne weiteres beendet.
Edit: Ja, es ist nur so exit
. Duh.
powershell
kprobst
quelle
quelle
Antworten:
Sie sollten das
exit
Schlüsselwort verwenden .quelle
Mir ist klar, dass dies ein alter Beitrag ist, aber ich komme häufig auf diesen Thread zurück, da er eines der besten Suchergebnisse bei der Suche nach diesem Thema ist. Ich bin jedoch immer verwirrter, als wenn ich aufgrund der widersprüchlichen Informationen gekommen bin. Letztendlich muss ich immer meine eigenen Tests durchführen, um es herauszufinden. Also werde ich diesmal meine Ergebnisse veröffentlichen.
TL; DR Die meisten Benutzer möchten
Exit
ein laufendes Skript beenden. Wenn Ihr Skript jedoch lediglich Funktionen deklariert, die später in einer Shell verwendet werden sollen, sollten Sie dieseReturn
in den Definitionen dieser Funktionen verwenden.Exit vs Return vs Break
Beenden: Dadurch wird der aktuell ausgeführte Kontext "beendet". Wenn Sie diesen Befehl über ein Skript aufrufen, wird das Skript beendet. Wenn Sie diesen Befehl über die Shell aufrufen, wird die Shell beendet.
Wenn eine Funktion den Befehl Beenden aufruft, wird der Kontext beendet, in dem sie ausgeführt wird. Wenn diese Funktion also nur innerhalb eines laufenden Skripts aufgerufen wird, wird das Skript beendet. Wenn Ihr Skript die Funktion jedoch nur deklariert, damit sie von der aktuellen Shell aus verwendet werden kann, und Sie diese Funktion von der Shell aus ausführen, wird die Shell beendet, da die Shell der Kontext ist, in dem die Funktion ausgeführt wird, die den
Exit
Befehl enthält.Hinweis: Wenn Sie mit der rechten Maustaste auf ein Skript klicken, um es in PowerShell auszuführen, wird PowerShell standardmäßig automatisch geschlossen, sobald das Skript ausgeführt wurde. Dies hat nichts mit dem
Exit
Befehl oder etwas anderem in Ihrem Skript zu tun . Dies ist nur ein Standardverhalten von PowerShell für Skripts, die mit dieser speziellen Methode zum Ausführen eines Skripts ausgeführt werden. Gleiches gilt für Batchdateien und das Befehlszeilenfenster.Zurück: Hiermit kehren Sie zum vorherigen Anrufpunkt zurück. Wenn Sie diesen Befehl über ein Skript (außerhalb von Funktionen) aufrufen, kehrt er zur Shell zurück. Wenn Sie diesen Befehl von der Shell aus aufrufen, kehrt er zur Shell zurück (dies ist der vorherige Aufrufpunkt für einen einzelnen Befehl, der von der Shell ausgeführt wird). Wenn Sie diesen Befehl von einer Funktion aus aufrufen, kehrt er dorthin zurück, von wo aus die Funktion aufgerufen wurde.
Die Ausführung von Befehlen nach dem Aufrufpunkt, an den sie zurückgegeben werden, wird ab diesem Punkt fortgesetzt. Wenn ein Skript von der Shell aufgerufen wird und den
Return
Befehl außerhalb von Funktionen enthält, müssen bei der Rückkehr zur Shell keine Befehle mehr ausgeführt werden, sodass einReturn
auf diese Weise verwendetes Skript im Wesentlichen dasselbe ist wieExit
.Pause: Dies wird aus Schleifen ausbrechen und Fälle wechseln. Wenn Sie diesen Befehl aufrufen, während Sie sich nicht in einer Schleife oder einem Schalter befinden, wird er aus dem Skript ausbrechen. Wenn Sie
Break
in einer Schleife aufrufen, die in einer Schleife verschachtelt ist, bricht diese nur aus der Schleife aus, in der sie aufgerufen wurde.Es gibt auch eine interessante Funktion,
Break
bei der Sie einer Schleife eine Bezeichnung voranstellen und dann aus dieser beschrifteten Schleife ausbrechen können, selbst wenn derBreak
Befehl innerhalb mehrerer verschachtelter Gruppen innerhalb dieser beschrifteten Schleife aufgerufen wird.quelle
Exit
ein Rückkehrcode als Parameter verwendet werden kann (standardmäßig 0) - zExit 3
.Get-Command Exit
undGet-Alias Exit
ohne Ergebnisse gemacht. Ich habe dann nachgesehen, ob es sich um ein Schlüsselwort handelt, und keine offizielle Dokumentation dazu gefunden. Wenn ich es jetzt betrachte, weiß ich nicht, wie ich zu diesem Schluss gekommen bin. Dies ist eindeutig ein Schlüsselwort ( technet.microsoft.com/en-us/library/hh847744.aspx ). Vielleicht, weil Exit eines der wenigen Schlüsselwörter ist, das kein eigenes about_ help-Thema hat und daher in der Liste der Themen in der linken Seitenleiste nicht enthalten ist.Exit
beendet auch PowerShell. Wenn Sie nur aus der aktuellen Funktion oder dem aktuellen Skript "ausbrechen" möchten, verwenden SieBreak
:)quelle
break
wenn Sie nur aus der aktuellen Funktion ausbrechen möchten ... das Aufrufen von Skripten kann ebenfalls unterbrochen werden!Write-Error ist für nicht terminierende Fehler und throw für terminierende Fehler
quelle
powershell -command "& module-function ..."
. Ich musste diese Funktionen konvertieren, um sie in einen Wrapping-Try-Catch zu werfen und diesen Wrapping-Catch zu verlassen, um tatsächlich einen Fehler-Exit-Code auszugeben.$PSCmdlet.ThrowTerminatingError()
für jene Fälle, in denen der Wurf den Job einfach nicht erledigen kann (bekanntes Problem, bei dem keine Fehler beim Beenden von auftretenthrow
)Beendet diesen Prozess und gibt dem zugrunde liegenden Betriebssystem den angegebenen Exit-Code.
https://msdn.microsoft.com/en-us/library/system.environment.exit%28v=vs.110%29.aspx
[Environment]::Exit(1)
Auf diese Weise können Sie mit einem bestimmten Beendigungscode beenden, der vom Anrufer abgeholt werden kann.
quelle
Exit 1
.[Environment]::Exit(1)
hat den Nebeneffekt, dass ich mein Powershell-Fenster verlasse, wenn ich es in einem Skript aufrufe, woexit
dies anscheinend nicht der Fall ist.Ich denke du suchst
Return
stattBreak
. Break wird normalerweise für Schleifen verwendet und nur vom innersten Codeblock. Verwenden Sie die Eingabetaste, um eine Funktion oder ein Skript zu beenden.quelle
Return
wird einfach von der Funktion zurückkehren, nicht vom Skript. (Return
Auf der obersten Ebene eines Skripts wird das Skript beendet, aber das war nicht die Frage.)Das Auslösen einer Ausnahme ist besonders dann gut, wenn Sie den Fehlergrund klären möchten:
Dies erzeugt einen Beendigungsfehler.
quelle
Vielleicht ist es besser, "Falle" zu verwenden. Ein PowerShell-Trap gibt einen Codeblock an, der ausgeführt werden soll, wenn ein Abschluss oder ein Fehler auftritt. Art
um mehr über die Trap-Anweisung zu erfahren.
quelle
Ich habe zufällig herausgefunden, dass (z. B. einfach , wo das Label nicht existiert ) aus dem gesamten Skript auszubrechen scheint (sogar innerhalb einer Funktion) und den Host am Leben hält. 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 Beschriftungen zu erstellen):
Break <UnknownLabel>
Break Script
Script
quelle
Ich habe dies für eine Wiederholung eines Programms verwendet. Ich weiß nicht, ob es helfen würde, aber es ist eine einfache if-Anweisung, die nur zwei verschiedene Einträge erfordert. Es hat in Powershell für mich funktioniert.
Ich weiß nicht, ob dies hilft, aber ich glaube, dies würde dazu führen, dass ein Programm beendet wird, nachdem Sie es ausgeführt haben. In diesem Fall erfordert jedoch jede definierte Eingabe eine aufgelistete und kategorisierte Ausgabe. Sie können den Exit auch eine neue Eingabeaufforderungszeile aufrufen lassen und das Programm auf diese Weise beenden.
quelle