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
PSNotApplyErrorActionToStderrtorna-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 .