2012-05-16 10 views
14

Powershell gibt einen 0-Exit-Code zurück, wenn ein Fehler aufgetreten ist, wenn er mit dem Argument -File aufgerufen wird. Was bedeutet mein Build grün ist, wenn es nicht :(Wie bekomme ich Powershell, um den richtigen Exit-Code zurückzugeben, wenn mit dem Argument -File aufgerufen?

Zum Beispiel sollte:

(in wtf.ps1)

$ErrorActionPreference = "Stop"; 
$null.split() 

(cmd)

powershell -file c:\wtf.ps1 
You cannot call a method on a null-valued expression. 
At C:\wtf.ps1:3 char:12 
+ $null.split <<<<() 
    + CategoryInfo   : InvalidOperation: (split:String) [], ParentConta 
    insErrorRecordException 
    + FullyQualifiedErrorId : InvokeMethodOnNull 


echo %errorlevel% 
0 

powershell c:\wtf.ps1 
You cannot call a method on a null-valued expression. 
At C:\wtf.ps1:3 char:12 
+ $null.split <<<<() 
    + CategoryInfo   : InvalidOperation: (split:String) [], ParentConta 
    insErrorRecordException 
    + FullyQualifiedErrorId : InvokeMethodOnNull 


echo %errorlevel% 
1 

Irgendwelche Ideen

(Ich habe so ziemlich jede Idee aus den ersten 2 Seiten davon: https://www.google.co.uk/search?q=powershell+file+argument+exit+code bereits)

Antwort

11

Im Skript verwenden, um die Ausfahrt Schlüsselwort mit einer Nummer Ihrer Wahl:

exit 34 

Hier ist das Skript, das ich diese verwendet testen:

## D:\Scripts\Temp\exit.ps1 ## 
try{ 
    $null.split() 
} 
catch 
{ 
    exit 34 
} 

exit 2 
############################# 

# launch powershell from cmd 
C:\> powershell -noprofile -file D:\Scripts\Temp\exit.ps1 
C:\>echo %errorlevel% 
34 
+0

Wenn es einen Fehler mit Abbruch ist, wird der Ausgang nie genannt :(Und selbst wenn ich try/catch und Ausgang> 0, wenn ich es mit -File nenne ich den Exit-Code verlieren. – grahamrhay

+0

Es funktionierte für mich , aktualisierte meine Antwort mit Beispielcode –

+0

Hmm, dein Beispiel funktioniert für mich. Und dennoch, mein Aufbau ist immer noch grün. Ich werde sehen, wenn ich herausfinden kann, was anders ist. – grahamrhay

7

Es ist a known problem. Workarounds rufen das Skript mit -File auf, verwenden den Parameter -Command (und fügen hinzu; exit $ lastexitcode, wenn Sie auch eigene Exit-Codes haben) oder wandeln sie in Exit-Codes um, wie Shay oder das Beispiel unter Verwendung von Trap zeigt. Weitere Informationen finden Sie unter here.

trap 
{ 
    $ErrorActionPreference = "Continue"; 
    Write-Error $_ 
    exit 1 
} 

$ErrorActionPreference = "Stop"; 
$null.split() 
+2

Diese Abhilfe funktioniert gut in Jenkins folgenden Windows PowerShell-Befehl: PowerShell -Datei "sript.ps1"; exit $ lastexitcode; –