script run ise ejemplos ejecutar desde crear comandos bat basicos aprender powershell exit-code

ise - run powershell script



-el código de salida del comando no es lo mismo que el código de salida de un script (3)

Necesito ejecutar un script con PowerShell -Command "& scriptname", y realmente me gustaría que el código de salida que obtuve de PowerShell fuera el mismo que el código de salida devuelto por el script. Desafortunadamente, PowerShell devuelve 0 si la secuencia de comandos devuelve 0 y 1 si la secuencia de comandos devuelve un valor distinto de cero como se ilustra a continuación:

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>

Usar [Environment] :: Exit (42) casi funciona:

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>

Excepto que cuando el script se ejecuta de forma interactiva, sale de todo el shell. ¿Alguna sugerencia?


¿Cómo llamas tu guión de manera interactiva?

He intentado esto y parece funcionar bien, pero lo llamo desde el prompt de DOS, no dentro de 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>


CAVEAT: Si su secuencia de comandos de PowerShell devuelve códigos de salida SUPERIORES A 65535, se transfieren:

$exitCode = 65536 Exit $exitCode

Si el siguiente CMD llama a este script PS1 anterior, obtendrá un% errorlevel% de 0

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

y un código de salida de 65537 le daría un% errorlevel% de 1, etc.

Mientras tanto, si una CMD llama a otra y la secuencia de comandos secundaria devuelve un nivel de error superior a 65535, pasa muy bien.

Cmd /c exit 86666

El CMD devolverá un% errorlevel% de 86666 como se esperaba.

CAVEAT a todo esto: ahora esto sucede de forma intermitente sin motivo aparente.


Si miras la parte que estás enviando a -Command como script, verás que nunca funcionará. La secuencia de comandos que ejecuta la secuencia de comandos ''foo.ps1'' no tiene una llamada para salir, por lo que no devuelve un código de salida.

Si devuelve un código de salida, hará lo que quiera. También cámbielo de "a", de lo contrario $ lastexitcode se resolverá antes de ''enviar'' la cadena a la segunda PowerShell si la ejecuta desde PowerShell.

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

PD: También puedes ver el parámetro -File si solo quieres ejecutar un script. Pero también sabe que no devuelve 1 si tiene un error de terminación como -comando. Vea here para más sobre el último tema.

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