我正在编写自动化脚本。我有一个函数,它接受命令或可执行文件。我必须等到命令或可执行文件完成运行,如果失败或通过则返回。我还想将输出写入文件。我正在尝试使用Start-Job
cmdlet。
我目前的代码:
$job = Start-Job -scriptblock {
Param($incmd)
$ret = Invoke-Expression $incmd -ErrorVariable e
if ($e) {
throw $e
} else {
return $ret
}
} -ArumentList $outcmd
Wait-Job $job.id
"write the output to file using receive-job and return if passed or failed"
这对命令完全正常,但对于可执行文件而言,无论错误代码如何,$e
的值都为空。即使错误代码为0,这也会错误地显示为已通过。
我使用$LASTEXISTCODE
和$?
尝试使用错误代码。但$?
对于可执行文件是正确的,而$LASTEXISTCODE
对于命令是null或垃圾值。我没有想法并且在这里打击。
答案 0 :(得分:1)
如有疑问,请阅读documentation:
<强> $吗
包含上次操作的执行状态。如果上一次操作成功则包含TRUE,如果失败则包含FALSE。[...]
<强> $ LASTEXITCODE 强>
包含已运行的最后一个基于Windows的程序的退出代码。
基本上,你需要检查两者。 $?
表示最后一个 PowerShell 命令/ cmdlet是否成功运行,而$LASTEXITCODE
包含上次执行的外部程序的退出代码。
if (-not $? -or $LASTEXITCODE -ne 0) {
throw '... whatever ...'
} else {
return $ret
}
但是,Invoke-Expression
不是执行命令的好方法。根据您实际想要执行的内容,可能有更好的方法,使用更好的错误处理方法。