Windows 有没有一种方法可以只将stderr重定向到stdout(而不是将两者结合起来),这样它就可以通过管道传输到其他程序?

Windows 有没有一种方法可以只将stderr重定向到stdout(而不是将两者结合起来),这样它就可以通过管道传输到其他程序?,windows,batch-file,Windows,Batch File,我在WindowsCMD.EXE环境中工作,希望将stdout的输出更改为与stderr的输出相匹配,这样我就可以将错误消息传递到其他程序,而无需文件中介 我知道2>&1符号,但它将stdout和stderr组合成一个流 我想的是这样的: program.exe 2>&1 | find " " 但它结合了stdout和stderr,就像: program.exe | find " " 2>&1 我意识到我可以 program 2>file type file

我在Windows
CMD.EXE
环境中工作,希望将
stdout
的输出更改为与
stderr
的输出相匹配,这样我就可以将错误消息传递到其他程序,而无需文件中介

我知道
2>&1
符号,但它将
stdout
stderr
组合成一个流

我想的是这样的:

program.exe 2>&1 | find " "
但它结合了stdout和stderr,就像:

program.exe | find " " 2>&1
我意识到我可以

program 2>file
type file | find " "
del file
但这并没有
程序| find”“
那种表示法的灵活性和威力。这样做需要
程序
完成其输出,然后才能处理该输出。

有趣的问题:-)

CMD处理从左到右的重定向。您希望首先将2(stderr)重定向到&1(stdout),然后将1(stdout)重定向到其他对象。此时,stderr仍将重定向到前面的stdout定义。管道仍将使用stdout的旧定义(现在包含stderr)

如果您不关心stdout,那么可以重定向到nul

program.exe 2>&1 1>nul | find " "

如果要将标准输出捕获到文件,请重定向到文件

program.exe 2>&1 1>yourFile | find " "

如果您仍希望在控制台上看到stdout,但只希望通过管道stderr查找,则可以将1重定向到con:

program.exe 2>&1 1>con: | find " "
请注意,stdout和con的原始定义之间存在细微差异:。例如,
cls>con:
不会清除屏幕,而是在屏幕上打印一个有趣的字符

如果使用第三个(最初未使用)文件句柄,则可以真正交换stdout和stderr。1和3将包含stderr的原始定义,2将包含stdout的原始定义

program.exe 3>&2 2>&1 1>&3 | find " "
实际上,每次执行重定向时都会定义一个额外的文件句柄。原始定义保存在第一个可用的未使用文件句柄中。假设在发出上述命令之前没有任何重定向<代码>3>&2不保存3的原始定义,因为之前未定义3。但是
2>&1
将stderr的原始定义保存在4中(3已被使用),而
1>&2
将stdout的原始定义保存在5中

因此,从技术上讲,交换stderr和stdout不需要显式重定向3

program.exe 2>&1 1>&3 | find " "
2>&1
将标准存储在3中,2被重定向到&1(标准存储)<代码>1>&3将标准输出保存在4中,1被重定向到&3(标准输出)

但是,只有当您确信在发出命令之前尚未定义3时,上述操作才能正常工作。在前面的代码示例中,显式定义3要安全得多

有关重定向的一些真正疯狂的冒险,请参见:-)

,从中可以看出,您似乎想要
2>&11>NUL
。因此,以下内容应该适用于您:

test.exe 2>&1 1>NUL | find "someErrorString"

@JamesK-添加了另一个可能比使用con更健壮的选项:但对我来说,
3>&22>&11>&3
2>&11>&3
组合
stdout
stderr
@JamesK-真的吗?它在Vista和Windows7上都适用。我还没有机会检查XP
DIR-DoesNotExist 2>&1 1>&3 | FIND”“
将空目录列表传递到屏幕,但会去除错误消息,而
DIR-DoesNotExist 2>&1 1>&3 | FIND”“
会同时传递空目录列表和错误消息。
DIR-DoesNotExist 2>&1 1>&3 | FIND”“
会去除错误消息,而
查找“”
同时显示这两个选项。我假设
DIR-DoesNotExist 2>&11>&3
DIR-DoesNotExist 2>&11>&3 | find”“
,因为
DIR-DoesNotExist 2>&11>nul
可以工作。另外,我不知道如何
标准
==“code>”,所以我不明白
是如何查找“”
works。(我使用的是Windows7Ultimate x64。)@JamesK-我想你的问题可能是测试<代码>…|查找“”将匹配包含空格的任何行<代码>…|FIND/V”“是一个匹配所有行的查找怪癖-我一直不明白为什么,但它很有用<代码>…|查找“”将不匹配任何行。我选择了这些表单,这样我就可以验证stderr是否被管道传输,stdout是否被管道传输。