关于命令行:将Windows cmd stdout和stderr重定向到单个文件

Redirect Windows cmd stdout and stderr to a single file

我正在尝试将DOS命令的所有输出(stdout+stderr)重定向到单个文件:

1
2
C:\>dir 1> a.txt 2> a.txt
The process cannot access the file because it is being used by another process.

是否可能,或者我应该重定向到两个单独的文件?


你想要:

1
dir > a.txt 2>&1

语法2>&1将把2(stderr)重定向到1(stdout)。您还可以通过重定向到NUL,在msdn上提供更多的解释和示例来隐藏消息。


Anders Lindahl的回答是正确的,但是应该注意的是,如果您正在将stdout重定向到一个文件,并且还希望重定向stderr,那么您必须确保在1>重定向之后指定2>&1,否则它将不起作用。

1
2
REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt

正确的方法:dir > a.txt 2>&1。要附加,请使用>>


来自mskb的背景信息

虽然这个问题被接受的答案是正确的,但它并不能很好地解释为什么它会起作用,而且由于语法不清楚,我在谷歌上做了一个快速的搜索来找出到底发生了什么。为了希望这些信息对其他人有帮助,我把它贴在这里。

摘自MS支持知识库110930。

来自MSKB110930

Redirecting Error Messages from Command Prompt: STDERR/STDOUT

Summary

When redirecting output from an application using the '>' symbol, error messages still print to the screen. This is because error messages are often sent to the Standard Error stream instead of the Standard Out stream.

Output from a console (Command Prompt) application or command is often sent to two separate streams. The regular output is sent to Standard Out (STDOUT) and the error messages are sent to Standard Error (STDERR). When you redirect console output using the">" symbol, you are only redirecting STDOUT. In order to redirect STDERR you have to specify '2>' for the redirection symbol. This selects the second output stream which is STDERR.

Example

The command dir file.xxx (where file.xxx does not exist) will display the following output:

1
2
3
Volume in drive F is Candy Cane Volume Serial Number is 34EC-0876

File Not Found

If you redirect the output to the NUL device using dir file.xxx > nul, you will still see the error message part of the output, like this:

1
File Not Found

To redirect (only) the error message to NUL, use the following command:

1
dir file.xxx 2> nul

Or, you can redirect the output to one place, and the errors to another.

1
dir file.xxx > output.msg 2> output.err

You can print the errors and standard output to a single file by using the"&1" command to redirect the output for STDERR to STDOUT and then sending the output from STDOUT to a file:

1
dir file.xxx 1> output.msg 2>&1

要将stdout和stderr添加到脚本的常规日志文件,请执行以下操作:

1
dir >> a.txt 2>&1


正确,进程的文件句柄1是stdout,由1>>重定向(1可以省略,根据惯例,命令解释器[cmd.exe]知道如何处理)。文件句柄2是stderr,由2>重定向。

请注意,如果您使用这些文件来制作日志文件,那么除非您将输出发送到唯一命名的日志文件(例如日期和时间戳),否则如果您运行同一进程两次,重定向的将覆盖(替换)以前的日志文件。

>>(对于stdout或stderr)将追加而不是替换文件。所以您得到一个累积的日志文件,显示流程所有运行的结果——通常更有用。

快乐的足迹…


我把答案切掉了,因为@anders刚刚把它贴出来了,但是…

在Windows帮助中,我搜索了重定向(url ms-its:c:windowshelptcmds.chm::/redirection.htm)。

您可能还想阅读有关>>和(管道)。


但是,不能保证sdtout和stderr的输出是使用posix重定向合并语法,按行及时地交织在一起的。

如果应用程序使用缓冲输出,则可能会在缓冲边界处将一个流的文本插入另一个流中,该缓冲边界可能出现在文本行的中间。

一个专用的控制台输出记录器(比如"lord mulder"的"stdout/stderr记录器")对于这样的任务可能更可靠。参见:Mulder的开源项目