批处理文件同时输出到控制台和文本文件

3

如何将批处理文件的输出保存到文本文件中,并在控制台上显示输出。

例如:

@ECHO OFF
ECHO Hello World 
@pause

它将在控制台上显示“Hello World”

@ECHO OFF
ECHO Hello World >text.txt
@pause

它将把“Hello World”保存到text.txt文件中。

我如何同时实现这两个操作?

提前感谢。


我是一个新手,对于控制台应用程序还不太熟悉。如果我的理解有误,请见谅。我查看了上面的链接。通过使用该链接,我可以将所有日志直接定向到同一个文件中。但是在执行此操作时,控制台上没有任何消息显示。我需要的是控制台应该显示消息,并且同时将出现在控制台上的消息记录到文件中。 - user3647205
@user3647205 你应该仔细阅读现有问题的所有内容。jeb他的答案中解释说,仅使用Windows命令处理器无法同时将文本输出到控制台窗口并重定向到文件。但 jeb 在他的答案下面还发布了一条评论,介绍了用于此任务的JScript/Batch混合__tee__。rojo 再次在这里发布了这个解决方案的链接。其他答案也包含各种__tee__解决方案。 - Mofi
https://dev59.com/dHRA5IYBdhLWcg3w4R_o 不能满足我的需求。它只是将控制台的stdout和/或stderr重定向到日志文件中。但是,只有记录或在控制台中观看两种情况之一发生。http://stackoverflow.com/questions/11239924/windows-batch-tee-command指导如何同时满足这两种情况。但是当我尝试时,它并不一致。有时它会记录并显示消息。但是对于相同的命令,有时它不会。我不知道发生了什么。 - user3647205
我的确切目标是从VBA Excel运行批处理文件,并等待它执行完毕,检查错误日志以查看是否成功执行,然后再继续进行。我也想查看控制台消息。任何建议都将很有帮助。我正在使用Wscript从VBA运行bat文件。 - user3647205
重复的“tee”命令已被删除。 - amegyoushi
2个回答

0

如果你想要获取命令的输出:

if exist "file.txt" del file.txt /f /q
for /f "delims=" %%k in ('command here') do (
  echo %%k
  echo %%k>>file.txt
)
  1. 注意使用>>而不是>。如果使用>,它会删除文件中的所有文本,然后在命令中写入第一行输出的内容,如果有多行将被FOR“echo-ed”,这样做并不好。而>>会创建一个新行而不是像>那样替换行。
  2. DELIMS=的作用类似于TOKENS=*,但DELIMS=不包括执行的命令。

我添加了if exist "file.txt" del file.txt /f /q,以便不追加新的输出行。如果要将行追加到文件中,则可以删除该行。

对于自定义的ECHO输出:

@echo off
echo TEXTHERE & echo TEXTHERE >>file.txt
echo TEXTHERE2 & echo TEXTHERE >>file.txt
rem ...and so on
  1. <command1> & <command2> 的意思是“先执行 <command1>然后再 执行 <command2>
  2. 如果你不想追加,可以使用 > 代替 >>

1
"tokens=*" 可以去除前导空格。因此,我会使用 "delims=" 代替它。(观察与像 dir 这样的命令的区别)在这里查看其他一些实现方法。 - Stephan
现在我将使用 delims=,因为如果我使用 tokens=*,则会包含 dir 命令。 - amegyoushi

0

如果您想要使用'FOR'命令:(是的,这个命令只执行一个命令)

For /f "tokens=*" %%a in ('ECHO Hello world') do (
  echo %%a
  echo %%a >text.txt
)

但是下面的解决方案只有在您想要将输出发送到控制台和文件,以及显示大量文本的命令(如“SET”命令)时才有用。

那么你可以创建一个外部批处理文件,然后在主文件中使用它呢?
例如:'printBoth.bat' 的代码。
@echo off
setlocal ENABLEDELAYEDEXPANSION
set string=
:loop
set string=!string!%1
shift
if not "%1"=="" goto loop

For /f "tokens=*" %%a in ('!string!') do (
  echo %%a
  echo %%a >text.txt
)

现在,如果您想要同时将内容打印到控制台和文件中,请输入以下代码:call printBoth.bat [在此处输入命令]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接