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
.