Atualizar :
- O
if ($LASTEXITCODE -eq 0) ...
continuará a funcionar de forma robusta com programas externos. - No entanto, se e quando a versão anterior à v7.2 recurso experimental
chamado
PSNotApplyErrorActionToStderr
torna-se um recurso oficial,if ($?) ...
também funcionará de forma robusta - veja esta resposta para mais informações.
Usar
$LASTEXITCODE -eq 0
em vez de $?
para detectar de forma confiável um código de saída diferente de zero (normalmente sinalizando falha) relatada por um programa externo. Você pode então usar
*> $null
para suprimir categoricamente toda a saída sem ter que se preocupar com o impacto desse redirecionamento em $?
:mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
"Hooray!"
} else {
"Boo!"
}
Usando um redirecionamento que envolve o fluxo de erros do PowerShell - explicitamente por meio de
2>
ou implicitamente via *>
- significa que, se algum dado for recebido por meio desse fluxo - o que no caso de chamar um programa externo significa qualquer saída de stderr - PowerShell define $?
para $false
. No entanto, no domínio dos programas externos de console/terminal, stderr não é usado apenas para gerar erro informações, mas qualquer informação que não seja dados , como informações de status. Portanto, você não pode inferir falha da presença de saída stderr .
Programas de console/terminal externos comunicam seu status de sucesso apenas por meio de seu código de saída , que o PowerShell reflete no
$LASTEXITCODE
automático variável. Segue-se do exposto que
$?
pode ser $false
mesmo que o código de saída seja 0
, portanto, não é um indicador de sucesso confiável - ao contrário de $LASTEXITCODE
.