有没有办法只redirectstderr标准输出(不结合这两个),所以它可以pipe道到其他程序?

我正在Windows CMD.EXE环境中工作,并希望更改stdout以匹配stderr这样我就可以将错误消息pipe道到其他程序,而无需中间文件。

我知道2>&1表示法,但是将stdoutstderr成一个stream。

我在想的是这样的:

 program.exe 2>&1 | find " " 

但是,结合stdout和stderr就像:

 program.exe | find " " 2>&1 

我意识到我可以做…

 program 2>file type file | find " " del file 

但是这并不具有程序的灵活性和强大function program | find " "符号的种类。 这样做要求program在输出可以被处理之前已经完成了输出。

有趣的问题:-)

CMD从左向右处理redirect。 你想先把2(stderr)redirect到&1(stdout),然后把1(stdout)redirect到别的东西。 在这一点上,stderr仍然会被redirect到标准输出的前一个定义。 pipe道仍然可以使用stdout的旧定义(现在包含stderr)。

如果你不关心标准输出,那么你可以redirect到nul

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

如果你想捕获到一个文件的标准输出然后redirect到一个文件

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

如果你仍然想在控制台上看到stdout,但是你只想pipe道stderr来查找,那么你可以将1redirect到con:

 program.exe 2>&1 1>con: | find " " 

请注意,标准输出和con:的原始定义之间存在细微的差异。 例如, cls >con:不会清除屏幕,而是在屏幕上打印一个有趣的字符。

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

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

实际上,每次执行redirect时都会定义一个额外的文件句柄。 原始定义保存在第一个可用的未使用的文件句柄中。 假设在发出上述命令之前没有任何redirect。 3>&2不保存3的原始定义,因为3以前没有定义。 但是2>&1将stderr的原始定义保存在4中(3已经被使用过了),并且1>&2将stdout的原始定义保存在5中。

所以在技术上,3的显式redirect不需要交换stderr和stdout

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

2>&1将标记保存在3中,2将被redirect到&1(标准输出)。 1>&3将标准输出保存在4中,1将被redirect到&3(标准错误)。

但是,如果你确信在发出命令之前还没有定义3,那么上述方法才能正常工作。 在我之前的代码示例中明确定义3更为安全。

请参阅为什么我的stderrredirect在命令完成后结束? 我该如何解决? 对于一些非常狂野的冒险与redirect:-)

从看http://support.microsoft.com/kb/110930看来,你想要;2>&1 1>NUL 。 所以像下面的东西应该为你工作:

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