In ähnlichen Szenario verlasse ich mich auf Ausnahmen (werfen) und andere Art von Terminierungsfehler: Der Exit Code der PowerShell ist in diesem Fall 1. Wenn ein Skript sich selbst beendet (auch wenn Fehler nicht beendet werden), ist der Beendigungscode von PowerShell 0, und wir müssen exit 0
nicht aufrufen. Wenn wir etwas außer 0 und 1 brauchen, dann müssen wir tatsächlich 10 oder SetShouldExit
verwenden (aber siehe unten).
Werfen wir einen Blick auf die Skripte.
test1.ps1
'before2'
.\test2
'after2'
'before3'
.\test3
'after3'
'before4'
.\test4
'after4'
test2.ps1
'inner before 2'
exit 2
'inner after 2'
test3.ps1
'inner before 3'
$host.SetShouldExit(3)
'inner after 3'
test4.ps1
throw 'Oops'
Ausgabe der test1.ps1:
before2
inner before 2
after2
before3
inner before 3
inner after 3
after3
before4
Oops
At ...
+ throw <<<< 'Oops'
In diesem Testszenario der test4.ps1 Art der Arbeiten und test2.ps1 und test3.ps1 Art funktioniert nicht (wenn zu arbeiten bedeutet, die Sitzung zu scheitern und beenden sofort).
Die Ausgabe zeigt, dass das aktuelle Skript beendet und SetShouldExit
nicht.
Der Exit-Code powershell.exe .\test1
ist 3 aufgrund $host.SetShouldExit(3)
. Ich habe versucht, diese Zeile zu deaktivieren, um zu überprüfen, ob exit 2
den Exit-Code zu 2 macht. Nein, tut es nicht, der Exit-Code ist 1 aufgrund des Fehlers in test4.
Ich habe einen weiteren Unterschied bemerkt. Wenn ich ein Skript von der interaktiven PowerShell-Konsole aus als $host.SetShouldExit
in einem Skript aufruft, wird die Konsole nach dem Aufruf geschlossen. nicht.
Ein Gedanke. Das Verhalten von $host.SetShouldExit
kann von der Implementierung eines Hosts abhängen. In einem Beispiel wird mein eigener Host-Exit überhaupt nicht unterstützt (es ist nicht erlaubt, die Hosting-Anwendung einfach so zu schließen) und meine Implementierung von SetShouldExit
tut im Grunde gar nichts.