sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo suprimir la salida y verificar si un comando es exitoso o no?

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 .