将Windows cmd标准输出和stderr重定向到单个文件

时间:2009-09-14 11:20:41

标签: windows command-line cmd pipe

我正在尝试将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.

是否可以,或者我应该只重定向到两个单独的文件?

8 个答案:

答案 0 :(得分:973)

你想:

dir > a.txt 2>&1

语法2>&1会将2(stderr)重定向到1(stdout)。您还可以通过重定向到NULmore explanation and examples on MSDN来隐藏消息。

答案 1 :(得分:181)

Anders Lindahl的回答是正确的,但应该注意的是,如果您将stdout重定向到文件并想要重定向stderr,那么您必须确保指定2>&1 AFTER 1>重定向,否则无效。

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

正确方式:dir > a.txt 2>&1。要追加,请使用>>

答案 2 :(得分:74)

来自MSKB的背景信息

虽然这个问题的接受答案是正确的,但它解释为什么它的工作原理并没有太大作用,而且由于语法不是很明确,我做了一个快速谷歌找出了什么实际上是在继续。希望这些信息对其他人有所帮助,我在这里发布。

取自MS Support KB 110930


来自MSKB110930

  

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

     

摘要

     

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

     

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

     

实施例

     

命令dir file.xxx(其中file.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

答案 3 :(得分:28)

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

dir >> a.txt 2>&1

答案 4 :(得分:12)

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

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

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

快乐的小道......

答案 5 :(得分:5)

我刚刚发布了@Anders刚刚发布的答案,但是......

在我的Windows帮助中,我搜索了重定向(URL ms-its:C:\WINDOWS\Help\ntcmds.chm::/redirection.htm)。

您可能需要阅读>>和| (管)也是。

答案 6 :(得分:1)

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

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

专用控制台输出记录器(如" StdOut / StdErr记录器"' LoRd MuldeR')对于此类任务可能更可靠。请参阅:MuldeR's OpenSource Projects

答案 7 :(得分: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

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