在PowerShell脚本中处理命令提示符错误

14

我正在尝试在PowerShell脚本中运行一些命令提示符命令,例如schtasks。 我想知道如何在PowerShell中处理命令抛出的错误。

我尝试过:

  • & cmd.exe /c 'schtasks /Query /TN xx || echo ERROR'
  • & cmd.exe /c 'ping.exe 122.1.1.1 && exit 0 || exit 1'
  • Invoke-Expression -Command:$command

我无法运行这些命令并忽略或捕获PowerShell脚本的try..catch块中的异常。 我知道有库,但我受限于PowerShell v2.0。


在每次调用 cmd.exe 后检查 $LASTEXITCODE - 非零值表示命令失败。通常情况下,您可以让命令本身报告其退出代码,而无需使用 || 子句。但是,如果您确实使用了一个,请确保它以 exit 1(或不同的非零退出代码)结束;在您的第一个命令中,因为您在 || 子句中执行 echo(作为唯一的命令),所以整体退出代码将错误地为 0 - mklement0
是的,但如果命令抛出错误,PowerShell脚本也会显示该错误,我想避免看到该错误消息。 - semantic_c0d3r
为了抑制命令的stderr输出,请直接将2>NUL附加到相关命令中(在单引号内);例如:'schtasks /Query /TN xx 2>NUL'。如果还要抑制stdout输出,请添加>NUL - mklement0
1个回答

21

如果外部命令因错误而终止,通常会设置一个非零的退出代码,因此您可以检查自动变量$LASTEXITCODE是否具有非零值:

& cmd /c 'schtasks /Query /TN xx'
if ($LASTEXITCODE -ne 0) {
  'an error occurred'
}

需要注意的是,有些程序会将非零退出码用于非错误信息(例如,robocopy 将小于 8 的退出码用于状态信息,或者 choice 使用退出码来指示所选选项)。

可以通过在 CMD 中重定向错误输出流来抑制外部命令的错误消息:

& cmd /c 'schtasks /Query /TN xx 2>nul'

或者在PowerShell中:

& cmd /c 'schtasks /Query /TN xx' 2> $null

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接