Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie unterdrücke ich die Ausgabe und überprüfe, ob ein Befehl erfolgreich ist oder nicht?

Aktualisieren :

  • Der if ($LASTEXITCODE -eq 0) ... wird weiterhin zuverlässig mit externen Programmen funktionieren.
  • Allerdings, ob und wann die Version vor v7.2 experimentelle Funktion namens PSNotApplyErrorActionToStderr wird ein offizielles Feature, if ($?) ... wird auch robust funktionieren - siehe diese Antwort für weitere Informationen.

Verwenden Sie $LASTEXITCODE -eq 0 statt $? um zuverlässig einen Nicht-Null-Exit-Code zu erkennen (typischerweise Signalisierungsfehler) von einem externen Programm gemeldet.

Sie können dann *> $null verwenden alle Ausgaben kategorisch zu unterdrücken ohne sich Gedanken über die Auswirkungen dieser Umleitung auf $? machen zu müssen :

mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
  "Hooray!"
} else {
  "Boo!"
}

Verwendung einer Umleitung, die den Fehlerstream von PowerShell umfasst – entweder explizit über 2> oder implizit über *> - bedeutet, dass Daten über diesen Stream empfangen werden - was im Fall des Aufrufs eines externen Programms jede Ausgabe von stderr bedeutet - PowerShell setzt $? zu $false .

Im Bereich externer Konsolen-/Terminalprogramme wird stderr jedoch nicht nur zur Ausgabe von error verwendet Informationen, sondern alle Informationen, die keine Daten sind , wie z. B. Statusinformationen. Daher können Sie nicht vom Vorhandensein der stderr-Ausgabe auf einen Fehler schließen .

Externe Konsolen-/Terminalprogramme teilen ihren Erfolgsstatus ausschließlich über ihren Exit-Code mit , die PowerShell im automatischen $LASTEXITCODE widerspiegelt Variable.

Daraus folgt, dass $? kann $false sein auch wenn der Exit-Code 0 ist , ist also kein zuverlässiger Erfolgsindikator - im Gegensatz zu $LASTEXITCODE .