问题 如何记录BATCH文件中的所有ECHO命令?


我正在尝试使用BATCH文件作为一个选择你自己的冒险故事,用户可以在其中创建一个角色,并通过名称和故事中的角色进行调用。一个小时后我才知道如果在包含故事的BATCH文件中或之后运行它会记录所有ECHO命令,以便稍后玩家可以阅读他们在任何给定游戏中所做的事情。

我希望日志文件如下所示:

%约会时间% (echo命令显示文件运行长度的所有文本)

不幸的是,我只能弄明白如何制作一个只有日期和时间的loge文件。把“>> StoryLog.txt”用于制作.txt文件,我在那里得到日期和时间,但它只是显示文本“>> StoryLog.txt”之后我希望批处理文件在echoed txt中显示为在“你往北走的路上>> StoryLog.txt”显示在屏幕上。这自然不会起作用。我该怎么办?


11338
2018-03-21 15:16


起源

您可以使用 tee,也适用于Windows。 - Endoro


答案:


为此我使用以下内容:

set LogFile=somepath\logfile.txt
set logg=^> _^&^& type _^&^&type _^>^>%LogFile%
echo this goes to screen AND file! %logg%

这有点棘手。 那么让我们将该行拆解为四个部分:

set logg=      ^> _          ^&^& type _           ^&^&type _^>^>%LogFile%

想法是将行打印到临时文件(名为“_”)(第二部分) 然后键入该文件的内容到屏幕(第三部分) 然后将其键入日志文件(第四部分)。

将所有内容都放在一个变量(第一部分)中,这样就不必为每一行输入那个monsterstring。 (这就是为什么“>”和“&”用“^”转义的原因)

所以每次使用

echo whatever %logg%

它将出现在屏幕上并写入%logfile%

请注意,这也将起作用:

%logg% echo whatever

此外,您可以使用以下功能:

@ECHO off
:: do not enable delayed expansion since it will break this method
SETLOCAL ENABLEEXTENSIONS
SET LogFile=logfile.out
SET Logg=^> tmp.out^&^& type tmp.out^&^&type tmp.out^>^>%LogFile%

CALL :logit "This is my message!"
CALL :logit "Hear my thunder?"

GOTO :end
:logit
ECHO %~1 %Logg%
DEL /Q tmp.out
EXIT /B 0
:end
pause

编辑斯蒂芬: 如果使用CALL,%logg%将是过度杀伤。在那种情况下,我会使用:

:logit
echo %~1
echo %date%,%time% - %~1 >>logfile
exit /b 0

这可能是原始问题的最佳解决方案,因为日期/时间将写入日志文件,但不会写入屏幕。 顺便说一下:每次使用时都不必删除临时文件,只需在批处理结束前删除一次即可。


7
2018-03-21 17:12



有趣的技巧。我原本希望这是一个漂亮的内存临时文件技巧,但它会被写入磁盘作为具有单个下划线文件名的文件。在我的测试中,我发现只有一个 & 需要...即 set testout=^>_ ^& type _ ... dir %testout% - AjV Jsy
_仅用作缓冲区 - 因为我需要两次输出(给定一次)。它实际上是一个文件,每次都被覆盖。是的,因为它是一个文件,你可以随意使用它 - 直到你在下一个覆盖它“echo blablabla%logg%”而你是对的,一个“&”应该做(这是深夜,当我解决这个问题 - 一旦它工作,再也没有碰过它 - Stephan


由于一些编辑,我的另一个答案很长,这是一个新的建议 (没有太大的改变,但它使代码很容易阅读):

@ECHO off
SET LogFile=logfile.out
set "say=call :logit "

%say% "This is my message!"
%say% "Hear my thunder?"

GOTO :end
:logit
ECHO %~1 
echo %date% %time% - %~1 >>%logfile%
EXIT /B 0
:end

3
2018-03-22 08:29



+1,但它失败的文字就像 %say% "This should be one caret ^ not two" 和 %say% "An ampersand ^& fails" - jeb
也|,<,>会失败。每个技巧都有它的局限性。但我想,最初的问题是可以的。我认为文本冒险不会利用那些特殊的字符。 - Stephan


您不能在批处理脚本中按字面意思执行此操作,但是如果定义函数,则可以在函数块中输出数据,该函数也会在函数返回之前写入日志文件,如下所示:

@ECHO off
SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
echo. 2>outfile.log

CALL :functionPerson "Jon Doe" jump
GOTO :END
:functionPerson fullname action
  ECHO fullname is ^"%~1^"
  ECHO action is %2
  ECHO %1 performs action %2>> outfile.log
EXIT /B 0
:END
pause

0
2018-03-21 15:23





每次你 echo 为了让玩家知道会发生什么,你也可以 echo 进入你的日志文件,在行的开头添加日期和时间:)对我来说简单。 不知道你的剧本看起来如何。


0
2018-03-21 15:23



邋sc的编码,到处都有成对的线条。最好创建一个新的LogEcho例程,将Echos发送到屏幕并记录到文件中。 - AjV Jsy