批处理中如何仅在控制台显示错误输出(将STDOUT重定向到NUL,STDERR重定向到CON)
批处理中如何仅在控制台显示错误输出(将STDOUT重定向到NUL,STDERR重定向到CON)
别着急,这个问题其实挺常见的,批处理的重定向有时候确实容易绕晕人,我来给你理清楚:
首先说核心的实现方式:
单个命令的情况:你只需要把标准输出(STDOUT,句柄1)重定向到
NUL就行,因为默认情况下标准错误(STDERR,句柄2)本来就是输出到控制台(CON)的。写法很简单:your_command >NUL如果你想更明确地写出错误输出的指向,也可以写成:
your_command >NUL 2>CON不过
2>CON其实是冗余的,因为系统默认就是这个配置,写出来只是为了更清晰而已。调用函数的情况:重定向规则同样适用,只要把重定向符号加在
CALL命令的后面就行,比如:CALL :FunctionName arg1 arg2 >NUL这样函数内部所有的标准输出都会被抑制,只有错误输出会显示在控制台。要是函数内部自己加了重定向,那会优先覆盖外部的设置,这点要注意。
然后你提到的那个疑问——有些错误信息会出现在STDOUT里,比如SC query BadServiceName,这个判断是完全准确的!因为控制台程序的输出流是由开发者决定的,有些程序会把错误信息写到标准输出而不是标准错误流里,这就导致常规的重定向区分不了。比如你运行SC query BadServiceName >NUL,会发现错误提示也被一起抑制了,因为它根本就没走STDERR。
这种特殊情况处理起来就麻烦一些,没法用简单的流重定向解决,只能通过其他方式变通:比如检查命令执行后的%errorlevel%退出码(大部分命令执行失败会返回非0值),或者用findstr之类的工具过滤输出内容,但这种方法通用性不强,得根据具体命令的错误提示来调整。
举两个实际例子对比一下:
- 正常走STDERR的错误:
dir non_existent_folder >NUL,会显示找不到路径的错误提示; - 错误走STDOUT的情况:
SC query BadServiceName >NUL,错误提示会被完全隐藏,这时候就得靠其他方法判断是否出错了。
备注:内容来源于stack exchange,提问作者Paul π
相关产品推荐
相关产品推荐

