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.

815voto

New Guy Punkte 7926

Mir ist klar, dass dies ein alter Beitrag ist, aber ich komme immer wieder auf diesen Thread zurück, da er bei der Suche nach diesem Thema zu den wichtigsten Suchergebnissen gehört. Allerdings verlasse ich diesen Thread aufgrund der widersprüchlichen Informationen immer noch verwirrter, als ich ihn aufgesucht habe. Letztendlich muss ich immer meine eigenen Tests durchführen, um es herauszufinden. Dieses Mal werde ich also meine Ergebnisse posten.

TL;DR Die meisten Menschen werden Folgendes verwenden wollen Exit um ein laufendes Skript zu beenden. Wenn Ihr Skript jedoch lediglich Funktionen deklariert, die später in einer Shell verwendet werden sollen, dann sollten Sie Return in den Definitionen der genannten Funktionen.

Ausstieg vs. Rückkehr vs. Unterbrechung

  • Ausstieg: Dadurch wird der aktuell laufende Kontext "beendet". Wenn Sie diesen Befehl aus einem Skript heraus aufrufen, wird das Skript beendet. Wenn Sie diesen Befehl von der Shell aus aufrufen, wird die Shell beendet.

    Wenn eine Funktion den Exit-Befehl aufruft, verlässt sie den Kontext, in dem sie gerade läuft. Wenn die Funktion also nur innerhalb eines laufenden Skripts aufgerufen wird, wird das Skript beendet. Wenn Ihr Skript die Funktion jedoch lediglich so deklariert, dass sie von der aktuellen Shell aus verwendet werden kann, und Sie die Funktion von der Shell aus ausführen, wird sie die Shell verlassen, da die Shell der Kontext ist, in dem die Funktion, die den Befehl Exit Befehl ausgeführt wird.

    Nota: 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 anderes in Ihrem Skript. Es handelt sich lediglich um ein standardmäßiges PowerShell-Verhalten für Skripts, die mit dieser speziellen Methode zur Ausführung eines Skripts ausgeführt werden. Das Gleiche gilt für Batch-Dateien und das Befehlszeilenfenster.

  • Rückkehr: Damit kehren Sie zur vorherigen Aufrufstelle zurück. Wenn Sie diesen Befehl aus einem 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 (das ist der vorherige Aufrufpunkt für einen einzelnen Befehl, der von der Shell aus ausgeführt wird). Wenn Sie diesen Befehl aus einer Funktion heraus aufrufen, kehrt er dorthin zurück, von wo aus die Funktion aufgerufen wurde.

    Die Ausführung aller Befehle nach der Aufrufstelle, zu der er zurückkehrt, wird ab dieser Stelle fortgesetzt. Wird ein Skript von der Shell aufgerufen und enthält es die Return Befehl außerhalb von Funktionen ausführt, dann gibt es bei der Rückkehr zur Shell keine weiteren Befehle mehr, die ausgeführt werden können, so dass ein Return auf diese Weise verwendet, im Wesentlichen dasselbe wie Exit .

  • Pause: Dadurch werden Schleifen und Wechselfälle unterbrochen. Wenn Sie diesen Befehl aufrufen, während Sie sich nicht in einer Schleife oder einem Schaltfall befinden, wird das Skript abgebrochen. Wenn Sie den Befehl Break innerhalb einer Schleife, die in einer Schleife verschachtelt ist, wird nur aus der Schleife, in der sie aufgerufen wurde, ausgebrochen.

    Ein weiteres interessantes Merkmal ist die Break wo man einer Schleife ein Label voranstellen kann und dann aus dieser Schleife ausbrechen kann, auch wenn die Break wird in mehreren verschachtelten Gruppen innerhalb dieser beschrifteten Schleife aufgerufen.

    While ($true) {
        # Code here will run
    
        :myLabel While ($true) {
            # Code here will run
    
            While ($true) {
                # Code here will run
    
                While ($true) {
                    # Code here will run
                    Break myLabel
                    # Code here will not run
                }
    
                # Code here will not run
            }
    
            # Code here will not run
        }
    
        # Code here will run
    }

482voto

Michael Bray Punkte 14660

Sie sollten Folgendes verwenden die exit Stichwort .

92voto

EverydayNerd Punkte 923

Exit wird PowerShell ebenfalls beendet. Wenn Sie nur die aktuelle Funktion oder das Skript verlassen möchten, verwenden Sie Break :)

If ($Breakout -eq $true)
{
     Write-Host "Break Out!"
     Break
}
ElseIf ($Breakout -eq $false)
{
     Write-Host "No Breakout for you!"
}
Else
{
    Write-Host "Breakout wasn't defined..."
}

62voto

Greg Bray Punkte 14059

Schreibfehler ist für nicht-beendende Fehler und werfen ist für die Beendigung von Fehlern

Das Cmdlet "Write-Error" deklariert einen nicht abschließenden Fehler. Standardmäßig, werden Fehler im Fehlerstrom an das Hostprogramm gesendet und anzuzeigen, zusammen mit der Ausgabe.

Nicht terminierende Fehler schreiben einen Fehler in den Fehlerstrom, aber sie stoppen die Befehlsverarbeitung nicht. Wenn ein nicht-beendender Fehler für ein Element in einer Sammlung von Eingabeelementen gemeldet wird, wird der Befehl mit der Verarbeitung der anderen Elemente in der Sammlung fort.

Zur Erklärung einer beendenden Fehler zu deklarieren, verwenden Sie das Schlüsselwort Throw. Für weitere Informationen, siehe about_Throw ( http://go.microsoft.com/fwlink/?LinkID=145153 ).

39voto

gabriwinter Punkte 536

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)

So können Sie sich mit einem bestimmten Exit-Code, der vom Anrufer abgefragt werden kann, abmelden.

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