Actualizar :
- El
if ($LASTEXITCODE -eq 0) ...seguirá funcionando sólidamente con programas externos. - Sin embargo, siempre y cuando la versión anterior a v7.2 función experimental
llamado
PSNotApplyErrorActionToStderrse convierte en una característica oficial,if ($?) ...también funcionará de manera robusta:vea esta respuesta para más información.
Use $LASTEXITCODE -eq 0 en lugar de $? para detectar de forma fiable un código de salida distinto de cero (por lo general, indica un error) notificado por un programa externo.
Luego puede usar *> $null para suprimir categóricamente toda la salida sin tener que preocuparse por el impacto de esa redirección en $? :
mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
"Hooray!"
} else {
"Boo!"
}
Usando una redirección que involucra el flujo de errores de PowerShell, ya sea explícitamente a través de 2> o implícitamente a través de *> - significa que si se recibe algún dato a través de ese flujo, que en el caso de llamar a un programa externo significa cualquier salida de stderr - PowerShell establece $? a $false .
Sin embargo, en el ámbito de los programas de consola / terminal externa, stderr no solo se usa para generar error información, pero cualquier información que no sea datos , como la información de estado. Por lo tanto, no puede inferir una falla por la presencia de salida estándar .
Los programas de consola/terminal externos comunican su estado de éxito únicamente a través de su código de salida , que PowerShell refleja en el $LASTEXITCODE automático variables.
De lo anterior se deduce que $? puede ser $false incluso si el código de salida es 0 , por lo que no es un indicador de éxito fiable, a diferencia de $LASTEXITCODE .