Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment supprimer la sortie et vérifier si une commande réussit ou non ?

Mettre à jour :

  • Le if ($LASTEXITCODE -eq 0) ... l'approche continuera à fonctionner de manière robuste avec les programmes externes.
  • Cependant, si et quand la pré-v7.2 fonctionnalité expérimentale nommé PSNotApplyErrorActionToStderr devient une fonctionnalité officielle, if ($?) ... fonctionnera également de manière robuste - voir cette réponse pour plus d'informations.

Utilisez $LASTEXITCODE -eq 0 plutôt que $? pour détecter de manière fiable un code de sortie différent de zéro (signalant généralement un échec) signalé par un programme externe.

Vous pouvez alors utiliser *> $null pour supprimer catégoriquement toutes les sorties sans avoir à vous soucier de l'impact de cette redirection sur $? :

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

Utiliser une redirection qui implique le flux d'erreurs de PowerShell - soit explicitement via 2> ou implicitement via *> - signifie que si des données sont reçues via ce flux - ce qui, dans le cas de l'appel d'un programme externe, signifie toute sortie de stderr - PowerShell définit $? à $false .

Cependant, dans le domaine des programmes de console/terminal externes, stderr n'est pas seulement utilisé pour afficher error informations, mais toute information qui n'est pas des données , telles que les informations d'état. Par conséquent, vous ne pouvez pas déduire l'échec de la présence de la sortie stderr .

Les programmes de console/terminal externes communiquent leur statut de réussite uniquement via leur code de sortie , que PowerShell reflète dans le $LASTEXITCODE automatique variables.

Il découle de ce qui précède que $? peut être $false même si le code de sortie est 0 , ce n'est donc pas un indicateur de succès fiable - contrairement à $LASTEXITCODE .