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
PSNotApplyErrorActionToStderr
blir 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
.