Используйте $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 используется не только для вывода информации error , но и любой информации, которая не является data , такой как status Информация. Следовательно, вы не можете вывести ошибку из-за наличия вывода stderr.
Внешние консольные / терминальные программы сообщают о своем статусе успеха исключительно через код выхода , который PowerShell отображает в автоматической переменной $LASTEXITCODE
.
Из вышесказанного следует, что $?
может быть $false
, даже если код выхода 0
, поэтому он не является надежным индикатором успеха - в отличие от $LASTEXTICODE
.