2010-12-16 5 views
3

Ich habe ein Powershell-Skript geschrieben, das in einem automatisierten Build-Prozess verwendet wird.Verwenden von Skript im automatisierten Build-Prozess

Muss ich den Exit-Code 0 schreiben, wenn das Skript den richtigen Pfad verwendet (z. B. geht es nicht in die if-Blöcke, die eine Fehlerbedingung anzeigen)?

Auch, was ist der Unterschied zwischen Exit (mit Code) und $ host.SetShouldExit()?

Antwort

4

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.

Verwandte Themen