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

How to handle errors for the commands to run in Start-Job?

我正在编写自动化脚本。我有一个接受命令或可执行文件的函数。如果失败或通过,我必须等到命令或可执行文件完成 运行 和 return。我还想将输出写入文件。我正在尝试使用 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$? 来处理错误代码。但是 $? 对于可执行文件是正确的,而 $LASTEXISTCODE 对于命令是空值或垃圾值。我没思路,戳这里。

如有疑问,请阅读 documentation

$?
Contains the execution status of the last operation. It contains TRUE if the last operation succeeded and FALSE if it failed.

[…]

$LASTEXITCODE
Contains the exit code of the last Windows-based program that was run.

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

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

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