$ 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
может или не взорвать в зависимости от того, где вы запускаете]