协慌网

登录 贡献 社区

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

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

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

答案

你要:

dir > a.txt 2>&1

语法2>&12 (stderr) 1 (stdout)。您也可以通过重定向到NUL 隐藏消息,有关 MSDN 的更多说明和示例

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

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

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

如果使用dir file.xxx > nul将输出重定向到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