我正在编写自动化脚本。我有一个需要命令或可执行文件的函数。我不得不等到命令或可执行文件完成运行,如果失败或通过则返回。我也想将输出写入文件。我正在尝试使用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的值为null。即使错误代码为0,也会错误地显示已通过。

我尝试使用$LASTEXISTCODE$?使用errorcode。但是$?对于可执行文件是正确的,而$LASTEXISTCODE对于命令来说是null或垃圾值。我没有主意,被打到这里。

最佳答案

如有疑问,请阅读documentation:



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

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

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

关于powershell - 如何处理要在Start-Job中运行的命令的错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45738707/

10-14 13:22
查看更多