Актуализиране :
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
.