it-swarm.com.de

Beenden eines Skripts in PowerShell

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

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

Natürlich gibt es kein $Host.Exit(). Es gibt $Host.SetShouldExit(), aber dies schließt tatsächlich das Konsolenfenster, was ich nicht will. Was ich brauche, ist etwas, das Pythons sys.exit() entspricht und die Ausführung des aktuellen Skripts einfach ohne weiteres anhält.

Edit: Ja, es ist nur exit. Duh.

359
kprobst

Sie sollten das Schlüsselwort exit verwenden.

350
Michael Bray

Mir ist klar, dass dies ein alter Beitrag ist, aber ich komme häufig auf diesen Thread zurück, da er zu den Top-Suchergebnissen bei der Suche nach diesem Thema gehört. Ich lasse mich jedoch immer mehr verwirren, wenn ich aufgrund der widersprüchlichen Informationen komme. Letztendlich muss ich immer meine eigenen Tests durchführen, um es herauszufinden. Also werde ich diesmal meine Erkenntnisse veröffentlichen.

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

Exit vs Return vs Break

  • Exit: Hiermit wird der aktuell ausgeführte Kontext "verlassen". Wenn Sie diesen Befehl von einem Skript aus aufrufen, wird das Skript beendet. Wenn Sie diesen Befehl von der Shell aus aufrufen, wird die Shell beendet.

    Wenn eine Funktion den Befehl Beenden aufruft, wird der Kontext, in dem sie ausgeführt wird, beendet. Wenn diese Funktion also nur innerhalb eines ausgeführten 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 Exit enthält. Befehl läuft.

    Hinweis: Wenn Sie mit der rechten Maustaste auf ein Skript klicken, um es in PowerShell auszuführen, wird PowerShell nach Abschluss des Skripts automatisch geschlossen. Dies hat nichts mit dem Befehl Exit oder irgendetwas 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 Batch-Dateien und das Befehlszeilenfenster.

  • Return: Dies kehrt zum vorherigen Aufrufpunkt zurück. Wenn Sie diesen Befehl von einem Skript aus aufrufen (außerhalb von Funktionen), kehrt er zur Shell zurück. Wenn Sie diesen Befehl von der Shell aus aufrufen, kehrt er zur Shell zurück (dem vorherigen Aufrufpunkt für einen einzelnen Befehl, der von der Shell ausgeführt wurde). Wenn Sie diesen Befehl von einer Funktion aus aufrufen, kehrt er zu dem Punkt zurück, von dem aus die Funktion aufgerufen wurde.

    Die Ausführung von Befehlen nach dem Aufrufpunkt, an den sie zurückgegeben werden, wird an diesem Punkt fortgesetzt. Wenn ein Skript von der Shell aus aufgerufen wird und den Befehl Return außerhalb von Funktionen enthält, müssen bei der Rückkehr zur Shell keine weiteren Befehle ausgeführt werden, sodass ein Return auf diese Weise im Wesentlichen identisch verwendet wird als Exit.

  • Break: Dies bricht aus Schleifen aus und schaltet Fälle um. Wenn Sie diesen Befehl aufrufen, während Sie sich nicht in einer Schleife oder einem Switch befinden, wird das Skript beendet. Wenn Sie Break in einer Schleife aufrufen, die in einer Schleife verschachtelt ist, wird nur die Schleife verlassen, in der sie aufgerufen wurde.

    Es gibt auch eine interessante Funktion von Break, bei der Sie einer Schleife ein Label voranstellen und dann aus dieser beschrifteten Schleife ausbrechen können, selbst wenn der Befehl Break in mehreren verschachtelten Gruppen innerhalb dieser beschrifteten Schleife aufgerufen wird .

    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
    }
    
539
New Guy

Exit beendet auch PowerShell. Wenn Sie nur aus der aktuellen Funktion oder dem aktuellen Skript "ausbrechen" 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..."
}
79
EverydayNerd

Schreibfehler dient zum Beenden von Fehlern und Werfen dient zum Beenden von Fehlern

Das Cmdlet Write-Error deklariert einen nicht beendenden Fehler. Standardmäßig werden Fehler im Fehlerstrom an das Host-Programm gesendet, um zusammen mit der Ausgabe angezeigt zu werden.

Nicht beendende Fehler schreiben einen Fehler in den Fehlerstrom, stoppen jedoch nicht die Befehlsverarbeitung. Wenn für ein Element in einer Auflistung von Eingabeelementen ein nicht beendender Fehler deklariert wird, verarbeitet der Befehl die anderen Elemente in der Auflistung weiter.

Verwenden Sie das Throw-Schlüsselwort, um einen Abbruchfehler zu deklarieren. Weitere Informationen finden Sie unter about_Throw ( http://go.Microsoft.com/fwlink/?LinkID=14515 ).

47
Greg Bray

Beendet diesen Prozess und gibt dem zugrunde liegenden Betriebssystem den angegebenen Beendigungscode.

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.

26
gwinter

Ich denke, Sie suchen Return anstelle von Break. Break wird normalerweise für Schleifen verwendet und nur für Unterbrechungen vom innersten Codeblock. Verwenden Sie die Eingabetaste, um eine Funktion oder ein Skript zu beenden.

25
Rob

Das Auslösen einer Ausnahme ist besonders dann sinnvoll, wenn Sie den Fehlergrund klären möchten:

throw "Error Message"

Dies führt zu einem Abbruchfehler.

21
Amr Bahaa

Vielleicht ist es besser, "Trap" zu verwenden. Ein PowerShell-Trap gibt einen Codeblock an, der ausgeführt werden soll, wenn ein Abbruch oder ein Fehler auftritt. Art

Get-Help about_trap

um mehr über die Trap-Anweisung zu erfahren.

12
fpschultze

Ich habe zufällig herausgefunden, dass Break <UnknownLabel> (zB einfach Break Script, wo das Label Script nicht existiert) aus dem gesamten Skript auszubrechen scheint (sogar aus 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
} 
7
iRon

Ich habe dies zum erneuten Ausführen 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 funktionierte in Powershell für mich.

$rerun = Read-Host "Rerun report (y/n)?"

if($rerun -eq "y") { Show-MemoryReport }
if($rerun -eq "n") { Exit }

Ich weiß nicht, ob dies hilft, aber ich glaube, dass dies so aussieht, als würde man ein Programm beenden, nachdem Sie es ausgeführt haben. In diesem Fall erfordert jede definierte Eingabe eine aufgelistete und kategorisierte Ausgabe. Sie können auch vom Exit eine neue Prompt-Zeile aufrufen lassen und das Programm auf diese Weise beenden.

3
Michael Meli