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

时间:2017-08-17 15:04:18

标签: powershell error-handling start-job

我正在编写自动化脚本。我有一个函数,它接受命令或可执行文件。我必须等到命令或可执行文件完成运行,如果失败或通过则返回。我还想将输出写入文件。我正在尝试使用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或垃圾值。我没有想法并且在这里打击。

1 个答案:

答案 0 :(得分:1)

如有疑问,请阅读documentation

  

<强> $吗
  包含上次操作的执行状态。如果上一次操作成功则包含TRUE,如果失败则包含FALSE。

     

[...]

     

<强> $ LASTEXITCODE
  包含已运行的最后一个基于Windows的程序的退出代码。

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

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

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