2012-05-16 10 views
14

Powershell está devolviendo un código de salida 0, cuando se produjo un error, si se invocó con el argumento -File. Lo que significa que mi construcción es de color verde cuando no debería ser :(¿Cómo puedo obtener que PowerShell devuelva el código de salida correcto cuando se lo llama con el argumento -File?

Por ejemplo:

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

Todas las ideas ?

(He intentado casi todas las ideas de las primeras 2 páginas de esto: https://www.google.co.uk/search?q=powershell+file+argument+exit+code ya)

Respuesta

11

En la secuencia de comandos, utilice la palabra clave de salida con un número de su elección:

exit 34 

Aquí está la escritura que utilicé para probar esto:

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

Si se trata de un error de terminación, la salida no se llama a :(Y, aunque lo intento/captura y salida> 0, si yo lo llamo con -File pierdo el código de salida. – grahamrhay

+0

Funcionó para mí , actualicé mi respuesta con el código de muestra. –

+0

Hmm, tu ejemplo funciona para mí. Y, sin embargo, mi construcción aún está verde. Veré si puedo averiguar qué es diferente. – grahamrhay

7

Es a known problem. Las soluciones están llamando a la secuencia de comandos con -File, utilizando el parámetro -Command (y agregando; exit $ lastexitcode si también tiene sus propios códigos de salida) o convirtiéndolos en códigos de salida como Shay o en el ejemplo que utiliza la captura a continuación. Consulte here para obtener más información.

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

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

Esta solución funciona bien en Jenkins. Simplemente usé el siguiendo el comando de Windows PowerShell: PowerShell -File "srcipt.ps1"; exit $ lastexitcode; –

Cuestiones relacionadas