如何处理 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
并不是执行命令的好方法。根据您实际想要执行的内容,可能有更好的方法来执行它,以及更好的错误处理方法。
我正在编写自动化脚本。我有一个接受命令或可执行文件的函数。如果失败或通过,我必须等到命令或可执行文件完成 运行 和 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
并不是执行命令的好方法。根据您实际想要执行的内容,可能有更好的方法来执行它,以及更好的错误处理方法。