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

Powershell не возвращает правильный код выхода

При выполнении Powershell script (в версии 2.0) с помощью командной строки -File и явно определяющего входные параметры в Param, код выхода всегда "0" (никогда не сбой) вместо правильного возврата определенного или ожидаемого кода ошибки.
Этого не происходит при использовании явных определений параметров и переключателя -Command, однако для посторонних целей мне нужно сохранить ключ -File в моих сценариях.

Любая помощь с обходным путем (не связанная с удалением явных определений параметров) была бы чрезвычайно полезна.

Powershell "не возвращает правильный код выхода":

exit1.ps1: Вызов script, который явно определяет параметры. Errorlevel всегда равно 0, даже если есть части script, которые нечестно терпят неудачу.

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

Вывод:

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

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




Теперь давайте попробуем сделать то же самое, если модификация функции param будет менее явной:

Exit1LooseParam.ps1:

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

Выход (с тремя параметрами):

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

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




Похоже, что когда вы явно определяете входные параметры, Powershell по какой-то причине "теряет свой причудливый ум" и не может вернуть правильный код выхода.

Есть ли у кого-нибудь обходной путь или можно объяснить, почему это происходит?

4b9b3361

Ответ 1

Хм, это странно, я бы ожидал, что exit 1 будет работать в обоих случаях. По крайней мере, вы можете использовать это для обоих:

[Environment]::Exit(1)