Aktualizovat :
if ($LASTEXITCODE -eq 0) ...
přístup bude i nadále robustně fungovat s externími programy.- Pokud a kdy starší verze než 7.2 experimentální funkce
s názvem
PSNotApplyErrorActionToStderr
se stává oficiální funkcí,if ($?) ...
bude také fungovat robustně – viz tato odpověď pro více informací.
Použijte $LASTEXITCODE -eq 0
spíše než $?
ke spolehlivé detekci nenulového výstupního kódu (obvykle signalizující selhání) hlášené externím programem.
Poté můžete použít *> $null
kategoricky potlačit veškerý výstup aniž byste se museli starat o dopad tohoto přesměrování na $?
:
mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
"Hooray!"
} else {
"Boo!"
}
Použití přesměrování, které zahrnuje chybový stream PowerShellu – buď explicitně přes 2>
nebo implicitně prostřednictvím *>
- znamená, že pokud jsou přes tento stream přijata nějaká data - což v případě volání externího programu znamená jakýkoli výstup z stderr - PowerShell nastaví $?
na $false
.
V oblasti externích konzolových / terminálových programů se však stderr nepoužívá pouze k výstupu chyby informace, ale všechny informace, které nejsou data , jako jsou informace o stavu. Proto nemůžete odvodit selhání z přítomnosti výstupu stderr .
Externí konzolové / terminálové programy sdělují svůj stav úspěchu pouze prostřednictvím svého výstupního kódu , což PowerShell odráží v automatickém $LASTEXITCODE
proměnná.
Z výše uvedeného vyplývá, že $?
může být $false
i když je výstupní kód 0
, takže to není spolehlivý indikátor úspěchu – na rozdíl od $LASTEXITCODE
.