我正在尝试将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.
是可能的,还是应该重定向到两个单独的文件?
我刚刚发布了@Anders刚刚发布的答案,但我......
在我的Windows帮助中,我搜索了重定向(URL ms-its:C:\WINDOWS\Help\ntcmds.chm::/redirection.htm) .
您可能想阅读>>和| (管)也是 .
但是,使用POSIX重定向合并语法无法保证SDTOUT和STDERR的输出按时间顺序交织 .
如果应用程序使用缓冲输出,则可能会发生一个流的文本在缓冲区边界中插入另一个流的文本,缓冲区边界可能出现在文本行的中间 .
专用控制台输出 Logger (如"StdOut/StdErr Logger" by 'LoRd MuldeR')对于此类任务可能更可靠 . 见:MuldeR's OpenSource Projects
Anders Lindahl的回答是正确的,但是应该注意的是,如果你将stdout重定向到一个文件并且想要重定向stderr那么你必须确保 2>&1 指定 AFTER 1> 重定向,否则它将无效 .
2>&1
1>
REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT **** dir 2>&1 > a.txt
正确的方式: dir > a.txt 2>&1 . 要追加,请使用 >> .
dir > a.txt 2>&1
>>
虽然这个问题的公认答案是正确的,但它解释为什么它的工作原理并没有多大帮助,而且由于语法不是很清楚,我做了一个快速谷歌找出实际发生的事情 . 希望这些信息对其他人有所帮助,我在这里发布 .
取自MS Support KB 110930 .
从命令提示符重定向错误消息: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添加到脚本的常规日志文件中:
dir >> a.txt 2>&1
你要:
语法 2>&1 将 2 (stderr)重定向到 1 (stdout) . 您还可以通过重定向到 NUL ,more explanation and examples on MSDN来隐藏消息 .
2
1
NUL
正确,进程的文件句柄1是STDOUT,由 1> 或 > 重定向(1可以省略,按照惯例,命令解释器[cmd.exe]知道处理它) . 文件句柄2是STDERR,由 2> 重定向 .
>
2>
请注意,如果您使用这些来制作日志文件,那么除非您将outut发送到_uniquely_named_(例如日期和时间戳)日志文件,否则如果您运行相同的过程两次,重定向将覆盖(替换)以前的日志文件 .
>> (对于STDOUT或STDERR)将APPEND不替换该文件 . 因此,您将获得一个累积日志文件,显示该过程的所有运行结果 - 通常更有用 .
快乐的小道......
7 回答
我刚刚发布了@Anders刚刚发布的答案,但我......
在我的Windows帮助中,我搜索了重定向(URL ms-its:C:\WINDOWS\Help\ntcmds.chm::/redirection.htm) .
您可能想阅读>>和| (管)也是 .
但是,使用POSIX重定向合并语法无法保证SDTOUT和STDERR的输出按时间顺序交织 .
如果应用程序使用缓冲输出,则可能会发生一个流的文本在缓冲区边界中插入另一个流的文本,缓冲区边界可能出现在文本行的中间 .
专用控制台输出 Logger (如"StdOut/StdErr Logger" by 'LoRd MuldeR')对于此类任务可能更可靠 . 见:MuldeR's OpenSource Projects
Anders Lindahl的回答是正确的,但是应该注意的是,如果你将stdout重定向到一个文件并且想要重定向stderr那么你必须确保
2>&1
指定 AFTER1>
重定向,否则它将无效 .正确的方式:
dir > a.txt 2>&1
. 要追加,请使用>>
.来自MSKB的背景信息
虽然这个问题的公认答案是正确的,但它解释为什么它的工作原理并没有多大帮助,而且由于语法不是很清楚,我做了一个快速谷歌找出实际发生的事情 . 希望这些信息对其他人有所帮助,我在这里发布 .
取自MS Support KB 110930 .
来自MSKB110930
文件未找到
如果使用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添加到脚本的常规日志文件中:
你要:
语法
2>&1
将2
(stderr)重定向到1
(stdout) . 您还可以通过重定向到NUL
,more explanation and examples on MSDN来隐藏消息 .正确,进程的文件句柄1是STDOUT,由
1>
或>
重定向(1可以省略,按照惯例,命令解释器[cmd.exe]知道处理它) . 文件句柄2是STDERR,由2>
重定向 .请注意,如果您使用这些来制作日志文件,那么除非您将outut发送到_uniquely_named_(例如日期和时间戳)日志文件,否则如果您运行相同的过程两次,重定向将覆盖(替换)以前的日志文件 .
>>
(对于STDOUT或STDERR)将APPEND不替换该文件 . 因此,您将获得一个累积日志文件,显示该过程的所有运行结果 - 通常更有用 .快乐的小道......