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

标签 windows batch-file cmd io-redirection

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

我将所有命令组合在一个批处理文件中,然后运行,但我希望批处理文件在运行时将结果输出到文本文件(日志)。有没有我可以添加到批处理中的命令?

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

最佳答案

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

@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

您可能时不时地想要重复写入两个或多个文件。您可能还想在屏幕上显示不同的消息。通过重定向到带括号的 block 或子例程之外的未定义句柄,然后使用 & 符号引用已打开的文件,仍然可以有效地执行此操作。

call :sub 9>File1.txt 8>File2.txt
exit /b

:sub
echo Screen message 1
>&9 echo File 1 message 1
>&8 echo File 2 message 1
echo Screen message 2
>&9 echo File 1 message 2
>&8 echo File 2 message 2
exit /b

我选择以相反的顺序使用句柄 9 和 8,因为这样更有可能避免由于 Microsoft redirection implementation design flaw 而导致的潜在永久重定向在同一命令上执行多个重定向时。这是极不可能的,但如果您足够努力,即使是这种方法也可能会暴露错误。如果您进行重定向,则可以保证避免该问题。

3>File1.txt ( 4>File2.txt call :sub)
exit /b

:sub
etc.

关于windows - 从批处理文件中重定向输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20484151/

相关文章:

windows - 为什么我的应用程序在另一台电脑上启动时崩溃?

windows - regsvr32 和标准输出

java - 使用 Microsoft Crypto API(Windows 证书存储)时如何隐藏和使用对话框

batch-file - 扩展变量不求值

batch-file - ffmpeg使用drawtext并一起选择

python - 向arduino发送串行命令

c++ - 我将在哪个 Windows dll 中找到 afxwin/CFrameWnd?

windows - 如何找到当前批处理文件的名称并将其存储为变量?

windows - 在windows批处理文件中获取环境变量

windows - 如何在批处理脚本中更新 %time% 变量