2015-09-02 1 views
7

Invoke-Expression вернет весь текст вызываемой команды.Как получить статус «Invoke-Expression», успешно или неудачно?

Но как я могу получить возвращаемое системой значение того, была ли эта команда выполнена успешно или сбой? В CMD я мог бы использовать %errorlevel%, чтобы получить состояние выполнения внешней команды. Как насчет PowerShell?

ответ

10

Обычно используется $? для проверки статуса последнего выполненного оператора:

PS C:\> Write-Output 123 | Out-Null; $? 
True 
PS C:\> Non-ExistingCmdlet 123 | Out-Null; $? 
False 

Однако, это не будет работать с Invoke-Expression, потому что даже если заявление внутри выражения передается Invoke-Expression может потерпеть неудачу, Invoke-Expression называют это само преуспеет (то есть. выражение, хотя недопустимый/нефункциональные был вызван тем не менее)


с Invoke-Expression вы будете должны использовать попробовать:

try { 
    Invoke-Expression "Do-ErrorProneAction -Parameter $argument" 
} catch { 
    # error handling go here, $_ contains the error record 
} 

или ловушку:

trap { 
    # error handling goes here, $_ contains the error record 
} 
Invoke-Expression "More-ErrorProneActions" 

Альтернативой является Append ";$?" к выражению вы хотите вызвать:

$Expr = "Write-Host $SomeValue" 
$Expr += ';$?' 

$Success = Invoke-Expression $Expr 
if(-not $Success){ 
    # seems to have failed 
} 

, но полагается на там нет выхода трубопровода

+0

Это замечательно –

+0

Вторая строка последнего примера должна быть '$ Expr + = '; $?'', Чтобы избежать непосредственной интерпретации '$?'. – letmaik

+0

@letmaik красиво заметил, полностью упустил из виду, что –

6

В PowerShell можно оценить состояние выполнения путем проверки automatic variables

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

и/или

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

Первое для командлетов PowerShell, последний для внешних команд (например, %errorlevel% в пакетные скрипты).

Вам это поможет?

+1

'Invoke-Expression' всегда устанавливает' $? 'В' $ true', несмотря ни на что, поэтому '$?' В этом случае не поможет. – ForNeVeR

+0

$ LASTEXITCODE работает. Благодаря! – Nicholas