如何将 Windows cmd 标准输出和标准错误重定向到单个文件?

问题描述 投票:0回答:7

我正在尝试将 Windows 命令的所有输出(标准输出标准错误)重定向到单个文件:

C:\
cd \
dir 1> a.txt 2> a.txt

输出:

The process cannot access the file because it is being used by another process.

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

windows command-line cmd pipe
7个回答
1343
投票

你想要:

dir > a.txt 2>&1

语法

2>&1
会将
2
(stderr) 重定向到
1
(stdout)。您还可以通过重定向到
NUL
来隐藏消息。更多说明和示例位于 Microsoft 文档页面从命令提示符重定向错误消息:STDERR/STDOUT


241
投票

Anders Lindahl 的答案是正确的,但应该注意的是,如果您将 stdout 重定向到文件并且也想重定向 stderr,那么您必须确保在

2>&1
重定向之后指定 1>,否则它会不工作。

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



100
投票

虽然这个问题的公认答案是正确的,但它确实没有太多解释为什么

它有效,并且由于语法并不立即清晰,所以我快速进行了 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,请使用以下命令:

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


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

45
投票
dir >> a.txt 2>&1

正确,进程的文件句柄 1 是 STDOUT,由 

15
投票

>

 重定向(1 可以省略,按照惯例,命令解释器 [cmd.exe] 知道如何处理它)。
文件句柄 2 是 STDERR,由 
2>
 重定向。
请注意,如果您使用这些来制作日志文件,那么除非您将输出发送到_uniquely_named_(例如日期和时间戳)日志文件,否则如果您运行相同的进程两次,重定向将覆盖(替换)以前的日志文件。

>>

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

快乐的足迹...

但是,不能保证

5
投票

STDERR

 的输出使用 
POSIX
 重定向合并语法按及时顺序逐行交织。
如果应用程序使用缓冲输出,则可能会发生一个流的文本在缓冲区边界插入另一个流的情况,这可能出现在文本行的中间。

专用控制台输出记录器(即

"StdOut/StdErr Logger"

by

'LoRd MuldeR'

)对于此类任务可能更可靠。
参见:
MuldeR 的开源项目

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

4
投票
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

显然,使用任何你想要的命令,输出都会定向到文本文件。 使用此方法
可靠,但屏幕上没有输出。

© www.soinside.com 2019 - 2024. All rights reserved.