Обычно используется $?
для проверки статуса последнего выполненного оператора:
PS C:\> Write-Output 123 | Out-Null; $?
True
PS C:\> Non-ExistingCmdlet 123 | Out-Null; $?
False
Однако, это не будет работать с Invoke-Expression
, потому что даже если заявление внутри выражения передается Invoke-Expression
может потерпеть неудачу, Invoke-Expression
называют это само преуспеет (то есть. выражение, хотя недопустимый/нефункциональные был вызван тем не менее)
с Invoke-Expression
вы будете должны использовать попробовать:
try {
Invoke-Expression "Do-ErrorProneAction -Parameter $argument"
} catch {
# error handling go here, $_ contains the error record
}
или ловушку:
trap {
# error handling goes here, $_ contains the error record
}
Invoke-Expression "More-ErrorProneActions"
Альтернативой является Append ";$?"
к выражению вы хотите вызвать:
$Expr = "Write-Host $SomeValue"
$Expr += ';$?'
$Success = Invoke-Expression $Expr
if(-not $Success){
# seems to have failed
}
, но полагается на там нет выхода трубопровода
Это замечательно –
Вторая строка последнего примера должна быть '$ Expr + = '; $?'', Чтобы избежать непосредственной интерпретации '$?'. – letmaik
@letmaik красиво заметил, полностью упустил из виду, что –