Normalmente si usa $?
per ispezionare lo stato dell'ultima istruzione eseguita:
PS C:\> Write-Output 123 | Out-Null; $?
True
PS C:\> Non-ExistingCmdlet 123 | Out-Null; $?
False
Tuttavia, questo non funzionerà con Invoke-Expression
, perché anche se una dichiarazione all'interno della espressione passata a Invoke-Expression
potrebbe non riuscire, il Invoke-Expression
chiamata è di per sé avrà avuto successo (cioè. l'espressione, anche se non valida/non-funzionali nessuno è stato richiamato il meno)
Con Invoke-Expression
Avrete è necessario utilizzare prova:
try {
Invoke-Expression "Do-ErrorProneAction -Parameter $argument"
} catch {
# error handling go here, $_ contains the error record
}
o una trappola:
trap {
# error handling goes here, $_ contains the error record
}
Invoke-Expression "More-ErrorProneActions"
L'alternativa è l'append ";$?"
all'espressione che si desidera richiamare:
$Expr = "Write-Host $SomeValue"
$Expr += ';$?'
$Success = Invoke-Expression $Expr
if(-not $Success){
# seems to have failed
}
, ma si basa su non ci sono uscite di tubature
fonte
2015-09-02 09:09:08
Questo è ottimo –
La seconda riga dell'ultimo esempio deve essere '$ Espr + = '; $?'' Per evitare l'interpretazione immediata di '$?'. – letmaik
@letmaik ben chiazzato, completamente trascurato –