$ LastExitCode = 0, mas $? = False no PowerShell. Redirecionando stderr para stdout dá NativeCommandError

Por que o PowerShell mostra o comportamento surpreendente no segundo exemplo abaixo?

Primeiro, um exemplo de comportamento são:

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

Sem surpresas. Eu imprimo uma mensagem para erro padrão (usandocmd'secho). Eu inspeciono as variáveis$? e$LastExitCode. Eles são iguais a True e 0, respectivamente, conforme esperado.

No entanto, se eu pedir ao PowerShell para redirecionar o erro padrão para a saída padrão sobre o primeiro comando, recebo um 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

Minha primeira pergunta, por que o NativeCommandError?

Em segundo lugar, por que$? Falso quandocmd correu com sucesso e$LastExitCode é 0? Documentação do PowerShellsobre variáveis ​​automáticas não define explicitamente$?. Eu sempre pensei que é verdade se e somente se$LastExitCode é 0, mas meu exemplo contradiz isso.

Eis como me deparei com esse comportamento no mundo real (simplificado). É realmente FUBAR. Eu estava chamando um script do PowerShell de outro. O script interno:

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

Correndo isso simplesmente como.\job.ps1, funciona bem e nenhum email é enviado. No entanto, eu estava chamando de outro script do PowerShell, registrando em um arquivo.\job.ps1 2>&1 > log.txt. Neste caso, um email é enviado! O que você faz fora do script com o fluxo de erros afeta o comportamento interno do script.Observando um fenômeno muda o resultado. Isso parece uma física quântica ao invés de um script!

[Curiosamente:.\job.ps1 2>&1 pode ou não explodir dependendo de onde você o executa]

questionAnswers(4)

yourAnswerToTheQuestion