2012-05-16 8 views
14

Powershell restituisce un codice di uscita 0, quando si è verificato un errore, se chiamato con l'argomento -File. Il che significa che la mia generazione è verde quando non dovrebbe essere :(Come posso ottenere che PowerShell restituisca il codice di uscita corretto quando viene chiamato con l'argomento -File?

Ad esempio:

(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 

Tutte le idee ?

(Ho provato praticamente ogni idea dalle prime 2 pagine di questo: https://www.google.co.uk/search?q=powershell+file+argument+exit+code già)

risposta

11

Nello script, utilizzare la parola chiave di uscita con un numero a tua scelta:

exit 34 

Ecco lo script che ho usato per testare questo:

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

Se si tratta di un errore fatale, l'uscita non viene chiamato :(E, anche se cerco/catch e uscire> 0, se io lo chiamo con -File perdo il codice di uscita. – grahamrhay

+0

Ha funzionato per me , ho aggiornato la mia risposta con il codice di esempio –

+0

Hmm, il tuo esempio funziona per me Eppure la mia build è ancora verde Vedrò se riesco a capire cosa è diverso – grahamrhay

7

È a known problem. I workaround chiamano lo script con -File, usando il parametro -Command (e aggiungendo; exit $ lastexitcode se si hanno anche i propri codici di uscita) o trasformandoli in codici di uscita come Shay o l'esempio usando trap sotto. Vedere here per ulteriori informazioni.

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

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

Questa soluzione funziona bene in Jenkins. seguente comando di Windows PowerShell: PowerShell -File "srcipt.ps1"; exit $ lastexitcode; –

Problemi correlati