我正在尝试将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.
是可能的,还是应该重定向到两个单独的文件?
#1楼
你要:
dir > a.txt 2>&1
语法2>&1将2 (stderr)重定向到1 (stdout)。 您还可以通过重定向到NUL来隐藏消息, MSDN上有更多解释和示例 。
#2楼
我刚刚发布了@Anders刚刚发布的答案,但是......
您可能想阅读>>和| (管)也是。
#3楼
Anders Lindahl的回答是正确的,但是应该注意的是,如果你将stdout重定向到文件并且想要重定向stderr那么你必须确保在1>重定向之后指定2>&1 ,否则它将不起作用。
REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt
#4楼
要将stdout和stderr添加到脚本的常规日志文件中:
dir >> a.txt 2>&1
#5楼
MSKB的背景信息
虽然这个问题的公认答案是正确的,但它解释原因并没有多大帮助,而且由于语法不是很明确,我做了一个快速谷歌找出实际发生的事情。 希望这些信息对其他人有所帮助,我在这里发布。
来自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