12

Quando si esegue uno script PowerShell (in 2.0) utilizzando l'interruttore di linea -File di comando, e definendo in modo esplicito i parametri di input in Param, il codice di uscita è sempre "0" (non manca mai) invece di restituire correttamente il codice di errore definito o previsto.
questo non avviene quando si utilizzano le definizioni dei parametri espliciti e l'interruttore -Command, ma per scopi estranei, ho bisogno di mantenere l'interruttore -File nei miei scritti.PowerShell non riesce a restituire il corretto codice di uscita

Qualsiasi assistenza con una soluzione alternativa (che non comporta la rimozione delle definizioni esplicite dei parametri) sarebbe estremamente utile.

PowerShell "non riesce a restituire il codice di uscita corretto":

exit1.ps1: Call script che definisce esplicitamente i parametri. Errorlevel è sempre 0, anche se vi sono parti dello script che falliscono in modo insensato.

param(
    [Parameter(mandatory=$true)][string]$arg1, 
    [Parameter(mandatory=$true)][string]$arg2, 
    [Parameter(mandatory=$true)][string]$arg3 
); 
exit 1; 

uscita:

C:\temp\testnant>powershell -noprofile -nologo -noninteractive -executionpolicy Bypass -file .\exit1.ps1 "one" "two" "three" 

C:\temp\testnant>echo %errorlevel% 
0 




Ora, consente di provare la stessa cosa quando si modifica la funzione param ad essere meno esplicito:

Exit1LooseParam.ps1:

param(
    $arg1, 
    $arg2, 
    $arg3 
); 
exit 1; 

uscita (con tre parametri):

C:\temp\testnant>powershell -noprofile -nologo -noninteractive -executionpolicy Bypass -file .\Exit1looseParam.ps1 "one" "two" "three" 

C:\temp\testnant>echo %errorlevel% 
1 




Sembra che quando si definisce in modo esplicito i parametri di input, PowerShell sembra "perdere la sua mente uno straccio" per qualche motivo e non riesce a tornare il codice di uscita corretto.

Qualcuno ha una soluzione alternativa o essere in grado di spiegare perché questo sta accadendo?

risposta

14

Hmm che è strano, mi aspetto exit 1 di lavorare in entrambi i casi. Almeno è possibile utilizzare questo per entrambi:

[Environment]::Exit(1)

+0

che non sembra riportare il codice di uscita in modo corretto. Grazie! – JonnyG

+0

Grazie per questo, ho risolto un problema anche per me :) –

+0

senza questo ho potuto ottenere solo l'uscita per restituire 0 o 1 – cmcginty

Problemi correlati