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
PSNotApplyErrorActionToStderrse 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 .