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
PSNotApplyErrorActionToStderr
se 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
.