如何处理在 Start-Job 中运行的命令的错误?

斯里坎特·皮萨

我正在编写一个自动化脚本。我有一个接受命令或可执行文件的函数。我不得不等到命令或可执行文件完成运行并在失败或通过时返回。我也想将输出写入文件。我正在尝试使用Start-Jobcmdlet。

我目前的代码:

$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对于命令是空值或垃圾值。我的想法和打击在这里。

安斯加·威彻斯

如有疑问,请阅读文档

$?
包含上次操作的执行状态。如果上次操作成功,则包含 TRUE,如果失败则包含 FALSE。

[…]

$LASTEXITCODE
包含最后运行的基于 Windows 的程序的退出代码。

基本上,您需要检查两者。$?指示最后一个PowerShell命令/cmdlet 是否成功运行,而$LASTEXITCODE包含上次执行外部程序的退出代码

if (-not $? -or $LASTEXITCODE -ne 0) {
    throw '... whatever ...'
} else {
    return $ret
}

但是,Invoke-Expression这不是执行命令的好方法。根据您实际想要执行的内容,可能有更好的方法来执行此操作,以及更好的错误处理方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章