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