我正在尝试将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.
这是可能的,还是我应该重定向到两个单独的文件?
我正在尝试将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.
这是可能的,还是我应该重定向到两个单独的文件?
当前回答
正确,进程的文件句柄1是STDOUT,由1>或>重定向(1可以省略,按照惯例,命令解释器[cmd.exe]知道如何处理)。文件句柄2是STDERR,由2>重定向。
请注意,如果您使用这些来生成日志文件,那么除非您将输出发送到_uniquely_named_(例如日期和时间戳)日志文件,否则如果您运行两次相同的进程,重定向的日志文件将覆盖(替换)上一个日志文件。
>>(对于STDOUT或STDERR)将APPEND而不是REPLACE文件。因此,您将得到一个累积日志文件,显示流程所有运行的结果-通常更有用。
快乐小径。。。
其他回答
要将stdout和stderr添加到脚本的常规日志文件,请执行以下操作:
dir >> a.txt 2>&1
然而,不能保证SDTOUT和STDERR的输出使用POSIX重定向合并语法按时间顺序逐行交织。
如果应用程序使用缓冲输出,可能会发生一个流的文本插入另一个流中的缓冲区边界,该边界可能出现在文本行的中间。
专用控制台输出记录器(即“LoRd MuldeR”的“StdOut/StdErr记录器”)可能更可靠。
参见:MuldeR的OpenSource项目
Anders Lindahl的答案是正确的,但需要注意的是,如果您正在将stdout重定向到一个文件,并且希望重定向stderr,那么您必须确保在1>重定向之后指定2>&1,否则它将无法工作。
REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt
Microsoft文档中的背景信息
虽然这个问题的公认答案是正确的,但它确实没有太大的作用来解释为什么它会起作用,而且由于语法不是很清楚,我做了一个快速的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,请使用以下命令:目录文件.xxx 2>nul或者,您可以将输出重定向到一个位置,将错误重定向到另一个位置。目录文件.xxx 1>输出消息2>&1通过使用&1命令将STDERR的输出重定向到STDOUT,然后将STDOUT的输出发送到一个文件,可以将错误和标准输出打印到一个单独的文件:目录文件.xxx 1>输出消息2>&1
正确,进程的文件句柄1是STDOUT,由1>或>重定向(1可以省略,按照惯例,命令解释器[cmd.exe]知道如何处理)。文件句柄2是STDERR,由2>重定向。
请注意,如果您使用这些来生成日志文件,那么除非您将输出发送到_uniquely_named_(例如日期和时间戳)日志文件,否则如果您运行两次相同的进程,重定向的日志文件将覆盖(替换)上一个日志文件。
>>(对于STDOUT或STDERR)将APPEND而不是REPLACE文件。因此,您将得到一个累积日志文件,显示流程所有运行的结果-通常更有用。
快乐小径。。。