Как получить статус "Invoke-Expression", успешно или неудачно?

Invoke-Expression вернет весь текст вызываемой команды.

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

3 ответов


как правило, вы должны использовать $? для проверки состояния последнего выполненного оператора:

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:

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

или a ловушка:

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

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

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

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

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


в PowerShell вы можете оценить состояние выполнения, проверив автоматические переменные

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

и/или

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

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

вам это помогает?


$LASTEXITCODE нельзя использовать с Invoke-Expression, так как он будет равен нулю независимо от того, будет ли вызванное выражение успешным или неудачным:

PS C:\Users\myUserAccount> touch temp.txt
PS C:\Users\myUserAccount> Invoke-Expression "Remove-Item .\temp.txt"
PS C:\Users\myUserAccount> echo $LASTEXITCODE
0

PS C:\Users\myUserAccount> Invoke-Expression "Remove-Item .\temp.txt"
Remove-Item : Cannot find path 'C:\Users\myUserAccount\temp.txt' because it does not 
exist.
At line:1 char:1
+ Remove-Item .\temp.txt
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\Users\myUserAccount\temp.txt:String) [Remove-Item], ItemNotFoundException
   + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand

PS C:\Users\myUserAccount> echo $LASTEXITCODE
0