Как получить статус "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