2015-09-02 7 views

Antwort

10

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

+0

Dieser ist großartig –

+0

Die zweite Zeile des letzten Beispiels muss '$ Expr + = '; $?' Sein, um eine sofortige Interpretation von' $? 'Zu vermeiden. – letmaik

+0

@letmaik schön entdeckt, völlig übersehen, dass –

6

In Powershell Sie Ausführungsstatus durch Überprüfen der automatic variables

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

und/oder

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

Ersteres ist für Powershell-Cmdlets auswerten kann, %errorlevel% letztere für externe Befehle (wie in Batch-Skripte).

Hilft Ihnen das?

+1

'Invoke-Expression' setzt' $? 'Immer auf' $ true', egal was passiert, also hilft '$?' In diesem Fall nicht. – ForNeVeR

+0

$ LASTEXITCODE funktioniert. Vielen Dank! – Nicholas

Verwandte Themen