2015-09-02 13 views

risposta

10

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

+0

Questo è ottimo –

+0

La seconda riga dell'ultimo esempio deve essere '$ Espr + = '; $?'' Per evitare l'interpretazione immediata di '$?'. – letmaik

+0

@letmaik ben chiazzato, completamente trascurato –

6

In PowerShell è possibile valutare lo stato di esecuzione controllando la automatic variables

$? 
    Contains True if last operation succeeded and False otherwise. 

e/o

$LASTEXITCODE 
    Contains the exit code of the last Win32 executable execution. 

Il primo è per i cmdlet PowerShell, quest'ultimo per comandi esterni (come %errorlevel% in script batch).

Questo ti aiuta?

+1

'Invoke-Expression' imposta sempre' $? 'Su' $ true 'a prescindere da cosa, quindi '$?' Non sarà di aiuto in questo caso. – ForNeVeR

+0

$ LASTEXITCODE funziona. Grazie! – Nicholas