$ LastExitCode = 0, но $? = False в PowerShell. Перенаправление stderr в stdout дает NativeCommandError

Почему PowerShell демонстрирует удивительное поведение во втором примере ниже?

Во-первых, пример вменяемого поведения:

PS C:\> & cmd /c "echo Hello from standard error 1>&2"; echo "`$LastExitCode=$LastExitCode and `$?=$?"
Hello from standard error
$LastExitCode=0 and $?=True

Без сюрпризов. Я печатаю сообщение со стандартной ошибкой (используяcmd& APOS; secho). Я проверяю переменные$? а также$LastExitCode, Они равны Истине и 0 соответственно, как и ожидалось.

Однако, если я прошу PowerShell перенаправить стандартную ошибку на стандартный вывод по первой команде, я получу NativeCommandError:

PS C:\> & cmd /c "echo Hello from standard error 1>&2" 2>&1; echo "`$LastExitCode=$LastExitCode and `$?=$?"
cmd.exe : Hello from standard error
At line:1 char:4
+ cmd <<<<  /c "echo Hello from standard error 1>&2" 2>&1; echo "`$LastExitCode=$LastExitCode and `$?=$?"
    + CategoryInfo          : NotSpecified: (Hello from standard error :String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

$LastExitCode=0 and $?=False

Мой первый вопрос, почему NativeCommandError?

Во-вторых, почему$? Ложь, когдаcmd бежал успешно и$LastExitCode это 0? Документация PowerShellоб автоматических переменных явно не определяет$?, Я всегда предполагал, что это правда, если и только если$LastExitCode 0, но мой пример противоречит этому.

Вот как я сталкивался с таким поведением в реальном мире (упрощенно). Это действительно FUBAR. Я вызывал один сценарий PowerShell из другого. Внутренний скрипт:

cmd /c "echo Hello from standard error 1>&2"
if (! $?)
{
    echo "Job failed. Sending email.."
    exit 1
}
# Do something else

Запуск это просто как.\job.ps1, он работает нормально, и электронная почта не отправляется. Тем не менее, я вызывал его из другого скрипта PowerShell, входя в файл.\job.ps1 2>&1 > log.txt, В этом случае письмо отправляется! То, что вы делаете вне скрипта с потоком ошибок, влияет на внутреннее поведение скрипта.Observing a phenomenon changes the outcome. Это похоже на квантовую физику, а не на сценарии!

[Что интересно:.\job.ps1 2>&1 может или не взорвать в зависимости от того, где вы запускаете]

Ответы на вопрос(4)

Ваш ответ на вопрос