有没有办法只redirectstderr标准输出(不结合这两个),所以它可以pipe道到其他程序?
我正在Windows CMD.EXE环境中工作,并希望更改stdout以匹配stderr这样我就可以将错误消息pipe道到其他程序,而无需中间文件。 
 我知道2>&1表示法,但是将stdout和stderr成一个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"