2013-08-23 12 views
21

Ho bisogno di eseguire uno script con PowerShell -Command "& scriptname", e mi piacerebbe molto se il codice di uscita che ho ricevuto da PowerShell fosse lo stesso di il codice di uscita restituito dallo script stesso. Purtroppo, PowerShell restituisce 0 se lo script restituisce 0 e 1 se lo script restituisce qualsiasi valore diverso da zero come illustrato di seguito:-il codice di uscita del comando non è uguale al codice di uscita di uno script

PS C:\test> cat foo.ps1 
exit 42 
PS C:\test> ./foo.ps1 
PS C:\test> echo $lastexitcode 
42 
PS C:\test> powershell -Command "exit 42" 
PS C:\test> echo $lastexitcode 
42 
PS C:\test> powershell -Command "& ./foo.ps1" 
PS C:\test> echo $lastexitcode 
1 
PS C:\test> 

Usando [Ambiente] :: Exit (42) funziona quasi:

PS C:\test> cat .\baz.ps1 
[Environment]::Exit(42) 
PS C:\test> powershell -Command "& ./baz.ps1" 
PS C:\test> echo $lastexitcode 
42 
PS C:\test> 

Tranne che quando lo script viene eseguito in modo interattivo, esce dall'intera shell. Eventuali suggerimenti?

+1

Penso che tu voglia uscire con 'exit $ lastexitcode' nel tuo script' -command' – ProfessionalAmateur

risposta

26

Se si guarda la parte che si sta inviando a -Command come script si vedrà che non funzionerà mai. Lo script che esegue lo script "foo.ps1" non ha una chiamata per uscire, quindi non restituisce un codice di uscita.

Se si restituisce un codice di uscita, farà ciò che si desidera. Anche cambiare da "all', altrimenti $ lastexitcode saranno risolti prima di 'inviare' la stringa alla seconda PowerShell se lo si esegue da PowerShell

PS C:\test> powershell -Command './foo.ps1; exit $LASTEXITCODE' 
PS C:\test> echo $lastexitcode 
42 

PS:. Verificate anche il parametro -File se vogliono solo per eseguire uno script. ma anche sapere che non ritornare 1 se si dispone di un errore fatale, come -Command fa. Vedi here per più su questo ultimo tema.

PS C:\test> powershell -File './foo.ps1' 
PS C:\test> echo $lastexitcode 
42 
+0

Grazie per il tuo aiuto! Questo quasi risolve il mio problema. Questa soluzione funziona sulla riga di comando, che originariamente rappresentava il problema, quindi accetterò la risposta. Sfortunatamente, in realtà sto attivando un processo PowerShell da un processo Java utilizzando Runtime.exec, e non importa come lo cito, sto ottenendo un codice di uscita pari a zero. Ho anche provato a scappare con $ in $ lastexitcode con un backtick ('), e anche questo non funziona. – ediven

+0

Grazie. Hai provato a usare -File invece di -Command come nel mio secondo esempio? –

+0

Usare -File non funzionerà senza altri interventi chirurgici perché usiamo lo stesso codice per avviare i processi non-powershell. Sembra che il quoting stia venendo storpiato dal codice Java che tenta di quotare automaticamente le cose secondo necessità. Penso che dovrebbe funzionare una volta che l'ho risolto. Grazie ancora! – ediven

1

come si sta chiamando lo script in modo interattivo?

Ho provato questo e sembra funzionare OK, ma io lo chiamo dal prompt di DOS, non all'interno di PowerShell

C:\Temp>type foo.ps1 
exit 42 


C:\Temp>powershell -noprofile -nologo -noninteractive -executionpolicy Bypass -file .\foo.ps1 

C:\Temp>echo %errorlevel% 
42 

c:\Temp> 
+0

Funziona perché si utilizza -File invece di -Command come nella domanda –

4

avvertimento: Se lo script PowerShell restituisce exitcodes SUPERIORE 65535, rotolano sopra:

$exitCode = 65536 
Exit $exitCode 

Se la seguente CMD chiama questo PS1 script di cui sopra, la tua volontà ottenere un% errorlevel% del

Powershell.exe "& 'MyPowershellScript.ps1' "; exit $LASTEXITCODE 
SET ERR=%ERRORLEVEL% 

ed un ExitCode di 65537 darebbe un% errorlevel% di 1, ecc.

Nel frattempo, se un CMD chiama un altro e lo script figlio restituisce un errore superiore a 65535, passa correttamente.

Cmd /c exit 86666 

Il CMD restituirà un% errorlevel% di 86666 come previsto.

CAVEAT a tutto questo: Ora questo sta succedendo e si spegne senza una ragione apparente.

Problemi correlati