我正在编写一个自动化脚本。我有一个接受命令或可执行文件的函数。我不得不等到命令或可执行文件完成运行并在失败或通过时返回。我也想将输出写入文件。我正在尝试使用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
对于命令是空值或垃圾值。我的想法和打击在这里。
如有疑问,请阅读文档:
$?
包含上次操作的执行状态。如果上次操作成功,则包含 TRUE,如果失败则包含 FALSE。[…]
$LASTEXITCODE
包含最后运行的基于 Windows 的程序的退出代码。
基本上,您需要检查两者。$?
指示最后一个PowerShell命令/cmdlet 是否成功运行,而$LASTEXITCODE
包含上次执行的外部程序的退出代码。
if (-not $? -or $LASTEXITCODE -ne 0) {
throw '... whatever ...'
} else {
return $ret
}
但是,Invoke-Expression
这不是执行命令的好方法。根据您实际想要执行的内容,可能有更好的方法来执行此操作,以及更好的错误处理方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句