我正在编写一个调用命令的批处理文件,我想处理可能导致的任何错误。我要求我只使用 native 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
)
有什么想法吗?
最佳答案
根据您列出的已知信息
- 成功时,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
关于windows - 仅在出错时解析命令的输出,并且仅使用 native 批处理命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19302985/