将Windows cmd stdout和stderrredirect到单个文件
我试图将DOS命令的所有输出(stdout + stderr)redirect到单个文件:
C:\>dir 1> a.txt 2> a.txt The process cannot access the file because it is being used by another process.
这是可能的,或者我应该只是redirect到两个单独的文件?
你要:
dir > a.txt 2>&1
语法2>&1
会将2
(stderr)redirect到1
(stdout)。 您也可以通过redirect到NUL
隐藏邮件, 更多的解释和MSDN上的示例 。
Anders Lindahl的回答是正确的,但是应该注意的是,如果你将stdoutredirect到一个文件并且想redirectstderr,那么你必须确保在1>
redirect之后指定2>&1
,否则它将不起作用。
REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT **** dir 2>&1 > a.txt
正确的方法: dir > a.txt 2>&1
。 要追加,使用>>
。
尽pipe对这个问题的接受答案是正确的,但是解释它为什么起作用并没有多大意义,而且由于语法不是很清楚,所以我做了一个快速的谷歌来找出实际发生的事情。 希望这些信息对他人有帮助,我在这里发布。
采取从MS支持KB 110930 。
使用'>'符号redirect应用程序的输出时,错误消息仍会打印到屏幕上。 这是因为错误消息通常发送到标准错误stream而不是标准输出stream。
控制台(命令提示符)应用程序或命令的输出通常发送到两个单独的stream。 常规输出发送到标准输出(STDOUT),并将错误消息发送到标准错误(STDERR)。 当您使用“>”符号redirect控制台输出时,您只是redirectSTDOUT。 为了redirectSTDERR,你必须为redirect符号指定'2>'。 这将select第二个输出stream是STDERR。
例
命令dir file.xxx
(其中file.xxx
不存在)将显示以下输出:
驱动器F中的卷是Candy Cane卷序列号是34EC-0876
文件未find
如果使用dir file.xxx > nul
将输出redirect到NUL
设备,您仍然会看到输出的错误消息部分,如下所示:
文件未find
要将(仅)错误消息redirect到NUL
,请使用以下命令:
dir file.xxx 2> nul
或者,您可以将输出redirect到一个地方,并将错误redirect到另一个地方。
dir file.xxx > output.msg 2> output.err
您可以使用“&1”命令将错误和标准输出打印到单个文件,将STDERR的输出redirect到STDOUT,然后将输出从STDOUT发送到文件:
dir file.xxx 1> output.msg 2>&1
将stdout和stderr添加到脚本的常规日志文件中:
dir >> a.txt 2>>&1
正确的,进程的文件句柄1是STDOUT,通过1>
或者>
(通过惯例,命令解释器[cmd.exe]知道处理该文件可以忽略1)。 文件句柄2是STDERR,由2>
redirect。
请注意,如果您正在使用这些日志文件来创build日志文件,那么除非您将outut发送给_uniquely_named_(例如date和时间戳)日志文件,否则如果您运行相同的进程两次,redirect将覆盖(replace)以前的日志文件。
>>
(对于STDOUT或STDERR)将APPEND不replace文件。 所以你得到了一个累积的日志文件,显示了整个过程的结果 – 通常更有用。
快乐的小道…
@Anders刚刚发布了这个答案,只是把答案剔除了,但是…
从我的Windows帮助中,我search了redirect(URL ms-its:C:\ WINDOWS \ Help \ ntcmds.chm :: / redirection.htm )。
你可能想阅读关于>>和| (pipe)。