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é
PSNotApplyErrorActionToStderrdevient 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 .