有没有办法只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从左向右处理重定向。 你想先把2(stderr)重定向到&1(stdout),然后把1(stdout)重定向到别的东西。 在这一点上,stderr仍然会被重定向到标准输出的前一个定义。 管道仍然可以使用stdout的旧定义(现在包含stderr)。

如果你不关心标准输出,那么你可以重定向到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 " " 

请注意,标准输出和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保存了5中stdout的原始定义。

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

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

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

但是,如果您确信在发出命令之前尚未定义3,则以上方法才能正常工作。 在我之前的代码示例中明确定义3更为安全。

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

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

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