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

时间:2013-03-21 15:16:20

标签: windows batch-file command-prompt

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

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

%date %% time% (echo命令显示文件运行长度的所有文本)

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

4 个答案:

答案 0 :(得分:7)

为此我使用以下内容:

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
  

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

@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

修改 Stephan: 如果您使用CALL,则%logg%将是过度杀伤。在那种情况下,我只会使用:

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

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

答案 1 :(得分:3)

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

@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

答案 2 :(得分:0)

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

@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

答案 3 :(得分:0)

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