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


688

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

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

是否可以,还是应该仅重定向到两个单独的文件?


14
TechNet:使用命令重定向运算符(比这里的任何答案都更好的回答)。
Martin Prikryl

1
2>&1,因为它无法重新打开同一文件
路加福音

Answers:


1089

你要:

dir > a.txt 2>&1

语法2>&1会将2(stderr)重定向到1(stdout)。您还可以通过重定向到隐藏的信息NUL在MSDN上更多的解释和例子


32
谢谢,不知道这个unix shell语法也适用于DOS!
链司机2012年

20
这非常适合隐藏所有输出net stop w3svc >NUL 2>&1。..谢谢!
wasatchwizard

3
@wasatchwizard Ithink我对此有麻烦,但> NUL 2> NUL运作良好
FrinkTheBrave 2014年

13
如果有一个句柄,则在句柄(即2)和重定向运算符(即>)之间不能有空格。因此,2> 2.txt作品(或2> &12 > 2.txt不起作用;2 > &1才不是。
红豌豆

9
我是如此的爱。“嗯,这个小小的一次性问题将需要一个小时的时间”。输入此评论所花的时间比找到此答案所花的时间更长。
布兰登

195

Anders Lindahl的答案是正确的,但应注意的是,如果要将stdout重定向到文件,并且也要重定向stderr,则必须确保在重定向2>&1指定该文件,否则将不起作用。1>

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

10
之后,我花了几个小时才弄清楚出了什么问题,DelboyJay!谢谢!
Nam G VU 2013年

4
是否在任何地方解释了为什么将2>&1放在1>之前不会达到预期的效果?我强烈怀疑这与“ cmd”解析命令的方式有关,该命令根据指定重定向的顺序给出两种不同的含义。但是语义规则是否在任何地方都有记录,因为我认为这是值得学习的东西,因为它可能会浪费数小时。
igbgotiz 2014年

12
@igbgotiz 2>&1表示“将流2重定向到流1”。因此,您需要先设置流1
FrinkTheBrave 2014年

3
@FrinkTheBrave,但流1是标准输出(例如,控制台)(如果未明确指定)。那仍然不能解释它恕我直言。
MarioDS 2015年

1
@MDeSchaepmeester,如果这样做dir 2>&1 > a.txt,您首先要将(>)流2(stderr)重定向到流1(stdout)。然后,在将它们都连接在一起之后,将stdout(>没有指定符)重定向到文件。如果要让stderr转到其他地方,则不能先将其与stdout结合使用。
cp.engr '16

80

MSKB的背景信息

虽然接受这个问题的答案是正确的,它确实没有做太多解释为什么它的工作原理,以及因为语法不立即清除我做了一个快速谷歌,以找出究竟是怎么回事。希望这些信息对其他人有帮助,我在这里发布。

摘自MS Support KB 110930


从MSKB110930

从命令提示符重定向错误消息:STDERR / STDOUT

摘要

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

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

该命令dir file.xxxfile.xxx不存在的地方)将显示以下输出:

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

File Not Found

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

File Not Found

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

dir file.xxx 2> nul

或者,您可以将输出重定向到一个地方,将错误重定向到另一个地方。

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

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

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


13

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

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

>>(对于stdout或stderr)将追加不替换该文件。因此,您将获得一个累积日志文件,展示流程所有运行过程中的结果-通常更有用。

快乐的足迹...


2

但是,不能保证使用重定向合并语法及时将行SDTOUT和的输出STDERR逐行交织在一起POSIX

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

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

请参阅:MuldeR的开源项目


0

在批处理文件(Windows 7及更高版本)中,我发现此方法最可靠

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

显然,使用所需的任何命令,输出将定向到文本文件。使用此方法可靠,但是屏幕上没有输出。


(基本上与几年前给出的答案相同。)您可以使用强制输出到屏幕。>con echo This goes to screen对用户输入也有用。>con set /p "var="Input: "注意:这些行显示在屏幕上,而不会重定向到文件。
斯蒂芬
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.