如何将Windows cmd stdout和stderr重定向到单个文件?

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

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

这是可能的,还是我应该重定向到两个单独的文件?

594990 次浏览

您想要:

dir > a.txt 2>&1

语法2>&12(stderr)重定向到1(stdout)。您还可以通过重定向到NUL来隐藏消息。更多解释和示例在Microsoft留档页面从命令提示符重定向错误消息:STDERR/STDOUT上。

Anders Lindahl的答案是正确的,但应该注意的是,如果您将stdout重定向到文件并希望重定向stderr,那么您必须确保2>&1指定为之后1>重定向,否则它将无法工作。

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

要将stdout和stderr添加到脚本的常规日志文件中:

dir >> a.txt 2>&1

来自Microsoft留档的背景信息

虽然这个问题的公认答案是正确的,但它确实不能解释为什么 it works,并且由于语法不是很清楚,我做了一个快速的www搜索以找出实际发生的事情。希望这些信息对其他人有所帮助,我在这里发布它。

取自Microsoft留档页面:
从命令提示符重定向错误消息:STDERR/STDOUT

总结

使用>符号重定向应用程序的输出时,错误消息仍会打印到屏幕上。这是因为错误消息通常发送到标准错误流而不是标准输出流。

控制台(命令提示符)应用程序或命令的输出通常发送到两个单独的流。常规输出发送到标准输出(STDOUT),错误消息发送到标准错误(STDERR)。当您使用>符号重定向控制台输出时,您只是重定向STDOUT。为了重定向STDERR,您必须为重定向符号指定2>。这会选择第二个输出流STDERR。

示例

命令dir file.xxx(file.xxx不存在)将显示以下输出:

驱动器F中的音量是Candy Cane音量序列号是34EC-0876
未找到文件

如果您使用dir file.xxx > nul将输出重定向到NUL设备,您仍然会看到错误消息:

未找到文件

要将错误消息重定向到NUL,请使用以下命令:

dir file.xxx 2> nul

或者,您可以将输出重定向到一个位置,并将错误重定向到另一个位置。

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

您可以使用&1命令将STDERR的输出重定向到STDOUT,然后将STDOUT的输出发送到文件,从而将错误和标准输出打印到单个文件:

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

正确,进程的文件句柄1是STDOUT,由1>>重定向(1可以省略,按照惯例,命令解释器[cmd.exe]知道处理它)。文件句柄2是STDERR,由2>重定向。

请注意,如果您使用这些日志文件,那么除非您将outut发送到_uniquely_named_(例如日期和时间戳)日志文件,否则如果您运行两次相同的进程,重定向将覆盖(替换)先前的日志文件。

>>(对于STDOUT或STDERR)将APPEND而不是REPLACE文件。因此,您会得到一个累积日志文件,显示流程所有运行的结果-通常更有用。

快乐小径…

但是,不能保证SDTOUTSTDERR的输出使用POSIX重定向合并语法按及时顺序逐行交织。

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

专用控制台输出记录器(即"StdOut/StdErr Logger" by'LoRd MuldeR')对于此类任务可能更可靠。

见:MuldeR的开源项目

在批处理文件(Windows 7及以上)中,我发现这种方法最可靠

Call :logging >"C:\Temp\NAME_Your_Log_File.txt" 2>&1:loggingTITLE "Logging Commands"ECHO "Read this output in your log file"ECHO ..Prompt $_COLOR 0F

显然,使用任何你想要的命令,输出将被定向到文本文件。使用这种方法可靠,但是屏幕上没有输出。