How to get status ""Invoke-Expression", erfolgreich oder gescheitert?
Invoke-Expression
zurück der text des Befehls aufgerufen wird.
Aber wie bekomme ich das system zurück Wert, ob dieser Befehl ausgeführt wurde, erfolgreich oder mit einem Fehler? In CMD konnte ich verwenden %errorlevel%
auf externe Befehlsausführung Zustand. Was ist PowerShell?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Normalerweise würden Sie verwenden
$?
prüfen des status der letzten Anweisung ausgeführt:Jedoch funktioniert es nicht mit
Invoke-Expression
, denn auch wenn eine Anweisung innerhalb des Ausdrucks übergebenInvoke-Expression
fehlschlagen, dieInvoke-Expression
nennen es selbst gelungen ist, (dh. der Ausdruck, obwohl ungültig/nicht-funktionale aufgerufen wurde, nichts weniger als das)Mit
Invoke-Expression
Sie verwenden müssen, versuchen Sie:oder eine Falle:
Die alternative ist die append -
";$?"
zu dem Ausdruck, den Sie aufrufen möchten:sondern setzt auf, dass es keine pipeline-Ausgang
$Expr += ';$?'
zu vermeiden, unmittelbaren interpretation von$?
.In der PowerShell können Sie auswerten status der Ausführung durch Einsichtnahme in die automatische Variablen
und/oder
Erstere ist für PowerShell-cmdlets, die letztere für externe Befehle (wie
%errorlevel%
im batch-Skripte).Ist dies für Sie?
Invoke-Expression
setzt immer$?
zu$true
egal was, so$?
wird nicht helfen in diesem Fall.$?
funktioniert für meine Anrufung wie&'path/to/exe' -params
es gibtTrue
für exit-code 0 undFalse
für alle anderen exit-code.$LASTEXITCODE nicht mit Invoke-Expression, so wird es null sein, unabhängig davon, ob der Ausdruck aufgerufen wird, erfolgreich ist oder fehlschlägt:
Wenn die ausführbare Datei mit der Bezeichnung von
Invoke-Expression
unterstützt, können Sie verwenden$LASTEXITCODE
. Sie müssen vorsichtig sein, über variable scoping, obwohl.Wenn Sie es ausführen, wird die Ausgabe:
Beachten Sie die 1 am Ende bezeichnen, von null verschiedenen exit-code.
Wenn Sie vergessen, die
global:
Präfix, sondern der Ausgang wäre 0. Ich glaube, das ist, weil Ihre Funktion-bereichsbezogene definition vonLASTEXITCODE
verbergen würde die Global-set ein.