$ 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]