【问题标题】:Batch file out put to both console and text批处理文件输出到控制台和文本
【发布时间】:2016-01-05 17:02:38
【问题描述】:

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

例如:

@ECHO OFF
ECHO Hello World 
@pause

它将在控制台上显示 Hello World

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

它将Hello World保存到text.txt

我怎样才能让这两者同时发生?

提前致谢

【问题讨论】:

  • 是控制台应用程序的新手。如果我的理解有误请见谅。我检查了上面的链接。通过使用链接,我可以将所有日志定向到同一个文件。但是在执行此操作时,控制台上不会出现任何消​​息。我需要的是控制台应该显示消息,同时控制台上出现的消息应该登录到一个文件中。
  • @user3647205 您应该非常仔细地阅读所有现有问题。 jebhis answer 中解释说,不可能将文本输出到控制台窗口,同时仅使用 Windows 命令处理器重定向到文件。但是 jeb 在他对 JScript/Batch 混合 tee 的回答下方也发表了评论,该 tee 是为此任务编写的。 rojo 再次在此处发布了此解决方案的链接。其他答案还包含各种 tee 解决方案。
  • stackoverflow.com/questions/796476/… 不满足我的要求。它正在将控制台标准输出和/或标准错误定向到日志文件。但是只有在控制台中记录或观看才会发生。stackoverflow.com/questions/11239924/windows-batch-tee-command 指导满足这两种情况。但是当我尝试时它并不一致。有时它会记录并显示消息。但有时它不是针对同一个命令。不知道怎么回事
  • 。我的确切目标是从 vba excel 运行批处理文件并等待它完成执行并检查错误日志以查看执行是否成功,然后再继续。我还想查看控制台消息。任何建议都会有所帮助。我正在使用 Wscript 从 vba 运行 bat 文件。

标签: batch-file logging console output


【解决方案1】:

如果需要,请使用“FOR”命令:(是的,这个只执行 1 个命令)

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 [type command in here]

【讨论】:

    【解决方案2】:

    如果你想得到命令的输出:

    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“回显”,这将是不好的。 >> 创建一个新行,而不是像 > 那样替换行。
    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. 如果您不想追加,请使用> 而不是>>

    【讨论】:

    • "tokens=*" 删除前导空格。因此我会改用"delims="。 (使用dir 之类的命令观察差异)请参阅here 了解其他一些想法。
    • 现在我将改用delims=,因为如果我使用tokens=*,将包含dir 命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多