Answers:
一种简单的天真方法,它很慢,因为它多次打开和定位指向文件尾的文件指针。
@echo off
command1 >output.txt
command2 >>output.txt
...
commandN >>output.txt
更好的方法-更容易编写,并且速度更快,因为文件仅打开和定位一次。
@echo off
>output.txt (
command1
command2
...
commandN
)
另一种好又快的方法是只打开和定位文件一次
@echo off
call :sub >output.txt
exit /b
:sub
command1
command2
...
commandN
编辑2020-04-17
您可能不时地要反复写入两个或更多文件。您可能还希望屏幕上显示不同的消息。通过重定向到带括号的块或子例程之外的未定义句柄,然后使用该&
符号引用已打开的文件,仍然可以有效地做到这一点。
call :sub 9>File1.txt 8>File2.txt
exit /b
:sub
echo Screen message 1
>&9 File 1 message 1
>&8 File 2 message 1
echo Screen message 2
>&9 File 1 message 2
>&8 File 2 message 2
exit /b
我选择以相反的顺序使用句柄9和8,因为在同一命令上执行多个重定向时,由于Microsoft重定向实现设计缺陷,这种方式更有可能避免潜在的永久重定向。这是极不可能的,但是如果您尝试足够的话,即使采用这种方法也可能会暴露该错误。如果您进行重定向,则可以避免该问题。
3>File1.txt ( 4>File2.txt call :sub)
exit /b
:sub
etc.
%~f0
即使在CALLed:subroutine中,也始终提供批处理脚本的完整路径。
>output.txt 2>&1
cmd /?
或help cmd
从控制台命令行获取文档。第三种方法的窍门是CALL上的重定向适用于CALLed子例程中的所有命令。
如果要同时重定向出流和错误流
dir >> a.txt 2>&1
我知道这是一篇较旧的文章,但是有人会在Google搜索中偶然发现它,而且看来OP在评论中提出的一些问题并未得到特别解决。另外,请放轻松,因为这是我在SO上发布的第一个答案。:)
为了使用动态生成的文件名将输出重定向到文件,@ dbenham提供的第二种解决方案是我的常用方法(阅读:快速又肮脏)。因此,例如:
@echo off
> filename_prefix-%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log (
echo Your Name Here
echo Beginning Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
REM do some stuff here
echo Your Name Here
echo Ending Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
)
将创建一个类似于您在此看到的文件 在目标目录屏幕快照中
这将包含以下输出:
Your Name Here
Beginning Date/Time: 2016-09-16_141048.log
Your Name Here
Ending Date/Time: 2016-09-16_141048.log
另外请记住,此解决方案取决于语言环境,因此请谨慎使用方式。
@echo OFF
[your command] >> [Your log file name].txt
我在批处理文件中使用了上面的命令,它可以正常工作。在日志文件中,它显示了我的命令的结果。
将这两行添加到批处理文件顶部附近,之后的所有stdout和stderr都将重定向到log.txt:
if not "%1"=="STDOUT_TO_FILE" %0 STDOUT_TO_FILE %* >log.txt 2>&1
shift /1