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

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

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


当前回答

您需要:

dir > a.txt 2>&1

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

其他回答

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

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

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

快乐小径。。。

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

dir >> a.txt 2>&1

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

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

显然,使用您想要的任何命令,输出将直接指向文本文件。使用此方法是可靠的,但屏幕上没有输出。

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

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

然而,不能保证SDTOUT和STDERR的输出使用POSIX重定向合并语法按时间顺序逐行交织。

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

专用控制台输出记录器(即“LoRd MuldeR”的“StdOut/StdErr记录器”)可能更可靠。

参见:MuldeR的OpenSource项目