2012-05-16 14 views
14

Powershell zwraca kod wyjścia 0, gdy wystąpił błąd, jeśli wywołany z argumentem -File. Co oznacza mój build jest zielony, gdy nie powinno być :(W jaki sposób można uzyskać powershell, aby zwracać prawidłowy kod wyjścia po wywołaniu z argumentem -File?

Na przykład:

(w 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 

jakieś pomysły ?

(Próbowałem prawie każdy pomysł z pierwszych 2 stron tego: https://www.google.co.uk/search?q=powershell+file+argument+exit+code już)

Odpowiedz

11

W skrypcie użyć słowa kluczowego wyjścia z numerem swojego wyboru:

exit 34 

Oto skrypt Kiedyś to sprawdzić:

## 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

Jeśli to błąd kończący, wyjście nigdy nie jest wywoływana :(A nawet gdybym try/catch i zjazd> 0, jeśli ja to nazywam z -file tracę kod wyjścia. – grahamrhay

+0

on pracował dla mnie , zaktualizowałem moją odpowiedź z przykładowym kodem –

+0

Hmm, twój przykład działa dla mnie, a mimo to moja kompilacja jest nadal zielona, ​​zobaczę, czy mogę wyliczyć, co jest różne – grahamrhay

7

Jest a known problem. Obejścia wywołują skrypt za pomocą opcji -File, używając parametru -Command (i dodając; exit $ lastexitcode, jeśli masz również własne kody wyjścia) lub zmieniając je w kody zakończenia, takie jak Shay, lub w przykładzie z użyciem pułapki poniżej. Aby uzyskać więcej informacji, patrz here.

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

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

To obejście działa dobrze w Jenkins. następujące polecenie Windows PowerShell: PowerShell -File "srcipt.ps1"; exit $ lastexitcode; –

Powiązane problemy