Normalerweise würden Sie $?
, um den Status der letzten Anweisung ausgeführt zu inspizieren:
PS C:\> Write-Output 123 | Out-Null; $?
True
PS C:\> Non-ExistingCmdlet 123 | Out-Null; $?
False
Dies wird jedoch nicht mit Invoke-Expression
arbeiten, denn auch wenn eine Anweisung innerhalb des zu Invoke-Expression
gab Ausdruck fehlschlagen, die Invoke-Expression
es selbst Anruf gelungen (dh. die Expression, obwohl ungültig/nicht-funktionale aufgerufen wurde nichtsdestoweniger)
Mit Invoke-Expression
Sie werde verwenden Versuch haben:
try {
Invoke-Expression "Do-ErrorProneAction -Parameter $argument"
} catch {
# error handling go here, $_ contains the error record
}
oder eine Falle:
trap {
# error handling goes here, $_ contains the error record
}
Invoke-Expression "More-ErrorProneActions"
Die Alternative ist die append ";$?"
zum Ausdruck, den Sie aufrufen möchten:
$Expr = "Write-Host $SomeValue"
$Expr += ';$?'
$Success = Invoke-Expression $Expr
if(-not $Success){
# seems to have failed
}
sondern stützt sich auf es gibt keinen Pipeline-Ausgang
Dieser ist großartig –
Die zweite Zeile des letzten Beispiels muss '$ Expr + = '; $?' Sein, um eine sofortige Interpretation von' $? 'Zu vermeiden. – letmaik
@letmaik schön entdeckt, völlig übersehen, dass –