从批处理文件中重定向输出

use*_*030 98 windows cmd batch-file io-redirection

我正在创建一个批处理文件,其中包含一些简单的命令来从系统中收集信息.批处理文件包含获取时间,IP信息,用户等的命令.

我在批处理文件中组装了所有命令,然后运行,但是我希望批处理文件在运行时将结果输出到文本文件(日志).是否有可以添加到批处理中的命令?

请记住,我不想从cmd运行批处理,然后重定向输出; 如果可能,我想重定向批处理内部的输出.

dbe*_*ham 145

简单的天真方式很慢,因为它打开并多次将文件指针定位到文件结束.

@echo off
command1 >output.txt
command2 >>output.txt
...
commandN >>output.txt
Run Code Online (Sandbox Code Playgroud)

更好的方法 - 更容易编写,更快,因为文件只打开和定位一次.

@echo off
>output.txt (
  command1
  command2
  ...
  commandN
)
Run Code Online (Sandbox Code Playgroud)

另一种只打开文件并定位文件的好方法

@echo off
call :sub >output.txt
exit /b

:sub
command1
command2
...
commandN
Run Code Online (Sandbox Code Playgroud)

  • 请注意,**call**解决方案会更改您的**%0**(在这种情况下为**sub**),这可能是您想要的,也可能不是. (3认同)
  • @Jannes - 是的,但是如果添加修饰符,您始终可以获得有关正在运行的批处理脚本的信息。例如,`%~f0` 总是给出批处理脚本的完整路径,即使在 CALLed :subroutine 中也是如此。 (3认同)
  • @ThariqNugrohotomo - "> output.txt 2>&1` (3认同)
  • 喜欢可以在文件的其余部分设置的解决方案 (2认同)
  • @dbenham 你的回答很好,但是如果我还想将 stderr(错误)重定向到文件怎么办?谢谢你。 (2认同)
  • @Moondra - 这是在同一脚本中调用带标签子程序的标准批处理语法.从控制台命令行执行`cmd /?`或`help cmd`以获取文档.第三种方法的技巧是CALL上的重定向适用于CALLed子例程中的所有命令. (2认同)

Kal*_*oni 60

如果你想要重定向out和错误的流

dir >> a.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

  • +1.值得指出的是,使用`>>`将附加到`a.txt`.要改写`a.txt`,请使用`>`.http://stackoverflow.com/q/4458231/1098302 (25认同)

小智 15

我知道这是一篇较旧的帖子,但有人会在谷歌搜索中偶然发现它,看起来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
)
Run Code Online (Sandbox Code Playgroud)

将创建一个文件,就像您在目标目录中的文件屏幕截图中看到的那样

这将包含此输出:

Your Name Here
Beginning Date/Time: 2016-09-16_141048.log
Your Name Here
Ending Date/Time: 2016-09-16_141048.log
Run Code Online (Sandbox Code Playgroud)

另请注意,此解决方案依赖于区域设置,因此请谨慎使用它.


小智 9

@echo off
>output.txt (
echo Checking your system infor, Please wating...

systeminfo | findstr /c:"Host Name" 
systeminfo | findstr /c:"Domain"

ipconfig /all | find "Physical Address" 

ipconfig | find "IPv4" 
ipconfig | find "Default Gateway"

)

@pause
Run Code Online (Sandbox Code Playgroud)


Mag*_*goo 8

echo some output >"your logfile"
Run Code Online (Sandbox Code Playgroud)

要么

(
 echo some output
 echo more output
)>"Your logfile"
Run Code Online (Sandbox Code Playgroud)

应该填写账单.

如果要APPEND输出,请使用>>而不是>.>将启动一个新的日志文件.


Aqu*_*lex 5

有一个很酷的小程序可以用来将输出重定向到文件和控制台

some_command  ^|  TEE.BAT  [ -a ]  filename 
Run Code Online (Sandbox Code Playgroud)

some_command  ^|  TEE.BAT  [ -a ]  filename 
Run Code Online (Sandbox Code Playgroud)


ilg*_*ano 5

在批处理文件顶部附近添加这两行,之后的所有 stdout 和 stderr 都将重定向到 log.txt:

if not "%1"=="STDOUT_TO_FILE"  %0 STDOUT_TO_FILE %*  >log.txt 2>&1
shift /1
Run Code Online (Sandbox Code Playgroud)