Uppdatera :
if ($LASTEXITCODE -eq 0) ...tillvägagångssätt kommer att fortsätta att fungera robust med externa program.- Men om och när pre-v7.2 experimentell funktion
heter
PSNotApplyErrorActionToStderrblir en officiell funktion,if ($?) ...kommer att fungera robust också - se det här svaret för mer information.
Använd $LASTEXITCODE -eq 0 istället för $? för att tillförlitligt upptäcka en utgångskod som inte är noll (vanligtvis signaleringsfel) rapporterad av ett externt program.
Du kan sedan använda *> $null för att kategoriskt undertrycka all utdata utan att behöva oroa dig för effekten av den omdirigeringen på $? :
mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
"Hooray!"
} else {
"Boo!"
}
Använda en omdirigering som involverar PowerShells felström - antingen explicit via 2> eller implicit via *> - betyder att om någon data tas emot via den strömmen - vilket i fallet med anrop av ett externt program betyder alla utdata från stderr - PowerShell sätter $? till $false .
Men inom området för externa konsol-/terminalprogram används stderr inte bara för att mata ut fel information, men all information som inte är data , såsom statusinformation. Därför kan du inte sluta dig till misslyckande från närvaron av stderr-utdata .
Externa konsol-/terminalprogram kommunicerar sin framgångsstatus enbart via sin utgångskod , som PowerShell återspeglar i den automatiska $LASTEXITCODE variabel.
Det följer av ovanstående att $? kan vara $false även om utgångskoden är 0 , så det är inte en pålitlig framgångsindikator - till skillnad från $LASTEXITCODE .