2

我正在编写一个调用命令的批处理文件,并且我想处理可能导致的任何错误。我的要求是只使用本机 CLI 命令;换句话说,我知道如果我使用 PowerShell 或其他任何东西,我可以轻松完成此任务,但我不是。

我想要的是如果发生错误,检查输出,如果错误是预期的,继续处理,否则中止。但是,我无法以有用的方式解析输出。

这似乎与我能得到的一样接近:

command | (find /i "valid" >NUL && goto :okay || goto :stop)

在这里,我将命令的输出通过管道传输到find. 问题是,无论命令的退出状态如何,都会发生这种情况 - 它同时发送成功和失败消息。一种选择是:

command 1>NUL 2>(find /i "valid" >NUL && goto :okay || goto :stop)

但是,这不起作用,因为它试图重定向到文件;该find命令不接收输入。

(出于测试目的,command是一个回显消息的 cmd 文件,并exit /b 1用于错误)

有任何想法吗?

4

1 回答 1

2

根据您列出的已知内容

  • 成功时,errorlevel = 0
  • 出错时,errorlevel = 1。
  • 出错时,将一条错误消息写入 STDERR (2) 流。
  • 在出现“预期”错误时,会输出“有效”一词。

试试这个:

command 2>&1 1>nul | ( find /i "valid" >nul && goto okay || goto stop )

注意:输出重定向发生的顺序很重要!

CMD 从左到右解析重定向。这是将 STDERR 定向到 STDOUT,然后将 STDOUT 定向到 NUL。把它们想象成指针。在我们将 STDOUT 设置为 NULL 之前,STDERR 正在获取 STDOUT 的地址。

更新

  • 出错时,将一条错误消息写入 STDOUT (1) 流。

选项 A:

call command > "%Temp%\out.txt" && goto okay || ( find /i "valid" "%Temp%\out.txt" >nul && goto okay || goto stop )

选项 B:

( call command && echo valid ) | find /i "valid" >nul && goto okay || goto stop
于 2013-10-10T18:20:50.057 回答