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 |
语法
Anders Lindahl的回答是正确的,但是应该注意的是,如果您正在将stdout重定向到一个文件,并且还希望重定向stderr,那么您必须确保在
1 2 | REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT **** dir 2>&1 > a.txt |
正确的方法:
来自mskb的背景信息
虽然这个问题被接受的答案是正确的,但它并不能很好地解释为什么它会起作用,而且由于语法不清楚,我在谷歌上做了一个快速的搜索来找出到底发生了什么。为了希望这些信息对其他人有帮助,我把它贴在这里。
摘自MS支持知识库110930。
来自MSKB110930Redirecting 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 (wherefile.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 FoundIf you redirect the output to the
NUL device usingdir file.xxx > nul , you will still see the error message part of the output, like this:
1 File Not FoundTo redirect (only) the error message to
NUL , use the following command:
1 dir file.xxx 2> nulOr, you can redirect the output to one place, and the errors to another.
1 dir file.xxx > output.msg 2> output.errYou 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,由
请注意,如果您使用这些文件来制作日志文件,那么除非您将输出发送到唯一命名的日志文件(例如日期和时间戳),否则如果您运行同一进程两次,重定向的将覆盖(替换)以前的日志文件。
快乐的足迹…
我把答案切掉了,因为@anders刚刚把它贴出来了,但是…
在Windows帮助中,我搜索了重定向(url ms-its:c:windowshelptcmds.chm::/redirection.htm)。
您可能还想阅读有关>>和(管道)。
但是,不能保证sdtout和stderr的输出是使用posix重定向合并语法,按行及时地交织在一起的。
如果应用程序使用缓冲输出,则可能会在缓冲边界处将一个流的文本插入另一个流中,该缓冲边界可能出现在文本行的中间。
一个专用的控制台输出记录器(比如"lord mulder"的"stdout/stderr记录器")对于这样的任务可能更可靠。参见:Mulder的开源项目