Aktualizuj :
if ($LASTEXITCODE -eq 0) ...podejście będzie nadal działać solidnie z programami zewnętrznymi.- Jednak, jeśli i kiedy wersja sprzed wersji 7.2 funkcja eksperymentalna
o nazwie
PSNotApplyErrorActionToStderrstaje się oficjalną funkcją,if ($?) ...będzie również działać solidnie — zobacz tę odpowiedź aby uzyskać więcej informacji.
Użyj $LASTEXITCODE -eq 0 zamiast $? do niezawodnego wykrywania niezerowego kodu wyjścia (zazwyczaj sygnalizuje awarię) zgłaszane przez zewnętrzny program.
Następnie możesz użyć *> $null kategorycznie pominąć wszystkie dane wyjściowe bez martwienia się o wpływ tego przekierowania na $? :
mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
"Hooray!"
} else {
"Boo!"
}
Używanie przekierowania, które obejmuje strumień błędów programu PowerShell — jawnie za pośrednictwem 2> lub niejawnie przez *> - oznacza, że jeśli jakiekolwiek dane są odbierane przez ten strumień - co w przypadku wywołania zewnętrznego programu oznacza dowolne wyjście z stderr - PowerShell ustawia $? na $false .
Jednak w sferze zewnętrznych programów konsoli / terminala stderr nie jest używany tylko do wyświetlania błędu informacje, ale wszelkie informacje, które nie są danymi , takie jak informacje o stanie. Dlatego nie można wywnioskować niepowodzenia z obecności wyjścia stderr .
Zewnętrzne programy konsoli / terminala informują o swoim powodzeniu wyłącznie za pomocą kodu wyjścia , który PowerShell odzwierciedla w automatycznym $LASTEXITCODE zmienna.
Z powyższego wynika, że $? może być $false nawet jeśli kod wyjścia to 0 , więc nie jest wiarygodnym wskaźnikiem sukcesu — w przeciwieństwie do $LASTEXITCODE .