Актуализиране :
if ($LASTEXITCODE -eq 0) ...подходът ще продължи да работи стабилно с външни програми.- Въпреки това, ако и когато пред-v7.2 експериментална функция
с име
PSNotApplyErrorActionToStderrстава официална функция,if ($?) ...също ще работи стабилно - вижте този отговор за повече информация.
Използвайте $LASTEXITCODE -eq 0 вместо $? за надеждно откриване на ненулев код за изхода (обикновено сигнализиращ отказ), докладван от външна програма.
След това можете да използвате *> $null за категорично потискане на всички изходи без да се притеснявате за въздействието на това пренасочване върху $? :
mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
"Hooray!"
} else {
"Boo!"
}
Използване на пренасочване, което включва потока за грешки на PowerShell - или изрично чрез 2> или имплицитно чрез *> - означава, че ако някакви данни бъдат получени чрез този поток - което в случай на извикване на външна програма означава всякакъв изход от stderr - PowerShell задава $? до $false .
Въпреки това, в сферата на външните конзолни/терминални програми, stderr не се използва само за извеждане на грешка информация, но всяка информация, която не е данни , като информация за състоянието. Следователно, не можете да заключите неизправност от наличието на изход stderr .
Външните конзолни/терминални програми съобщават състоянието си на успех единствено чрез своя изходен код , което PowerShell отразява в автоматичния $LASTEXITCODE променлива.
От горното следва, че $? може да бъде $false дори ако изходният код е 0 , така че не е надежден индикатор за успех - за разлика от $LASTEXITCODE .