【问题标题】:Handle command prompt error within PowerShell script处理 PowerShell 脚本中的命令提示符错误
【发布时间】:2016-04-17 18:25:09
【问题描述】:

我正在尝试在 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
  • 是的,但是如果命令抛出错误,powershell 脚本也会显示该错误,我想避免看到该错误消息。
  • 要抑制命令的标准错误输出,请将2>NUL 直接附加到相关命令(在单引号内);例如'schtasks /Query /TN xx 2>NUL'。要同时抑制 stdout 输出,请添加 >NUL

标签: powershell cmd powershell-2.0


【解决方案1】:

如果外部命令因错误终止,通常会设置一个非零退出代码,因此您可以检查 automatic variable $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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多