Подтвердить что ты не робот

Код выхода команды не совпадает с кодом выхода script

Мне нужно запустить script с помощью PowerShell -Command "& scriptname", и мне бы очень хотелось, чтобы код выхода, который я получил от PowerShell, был таким же, как и код выхода, который сам вернул script. К сожалению, PowerShell возвращает 0, если script возвращает 0 и 1, если 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>

Использование [Environment]:: Exit (42) почти работает:

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>

Кроме того, когда script запускается интерактивно, он выходит из всей оболочки. Любые предложения?

4b9b3361

Ответ 1

Если вы посмотрите на часть, которую вы отправляете в -Command как скрипт, вы увидите, что он никогда не будет работать. Сценарий, выполняющий сценарий 'foo.ps1', не имеет вызова для выхода, поэтому он не возвращает код завершения.

Если вы вернете код выхода, он будет делать то, что вы хотите. Также измените его с "на", иначе $ lastexitcode будет разрешен до того, как вы "отправите" строку во второй PowerShell, если вы запустите его из PowerShell.

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

PS: Также проверьте параметр -File, если вы просто хотите запустить скрипт. Но также знайте, что он не возвращает 1, если у вас есть ошибка завершения, как -Command. Смотрите здесь для получения дополнительной информации по этой последней теме.

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

Ответ 2

CAVEAT: Если ваш PowerShell script возвращает коды выхода ВЫШЕ ЧЕРЕЗ 65535, они перекатываются:

$exitCode = 65536
Exit $exitCode

Если следующий CMD вызывает этот PS1 script выше, ваш получит% errorlevel% от 0

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

и код выхода 65537 даст вам% errorlevel% из 1 и т.д.

Между тем, если CMD вызывает другого, а дочерний script возвращает уровень ошибок выше 65535, он проходит через только штраф.

Cmd /c exit 86666

CMD вернет% errorlevel% из 86666, как ожидалось.

CAVEAT ко всему этому: теперь это происходит без каких-либо видимых причин.

Ответ 3

Как вы вызываете ваш script в интерактивном режиме?

Я пробовал это и, похоже, работает нормально, но я вызываю его из приглашения DOS, а не из 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>