有没有办法只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"