11

我正在尝试使用 BATCH 文件作为选择您自己的冒险故事,用户可以在其中创建一个角色并通过故事中的角色的名字等来调用。一个小时前我突然想到,如果在运行包含故事的 BATCH 文件时或之后它会记录所有 ECHO 命令,以便稍后玩家可以阅读他们在任何给定的游戏中所做的事情,那就太酷了。

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

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

不幸的是,我所能做的就是制作一个只有日期和时间的日志文件。放置“>> StoryLog.txt”可以制作.txt文件,我在那里得到日期和时间,但它只是在我希望批处理文件在回显的txt中显示之后显示文本“>> StoryLog.txt”在“你沿着小路往北走>> StoryLog.txt”中显示在屏幕上。这自然是行不通的。我该怎么办?

4

4 回答 4

7

为此,我使用以下内容:

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

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

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

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

将所有内容放入一个变量(第一部分),这样您就不必在每一行都输入那个怪物字符串。(这就是>and&被转义的原因^

所以每次使用

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

编辑斯蒂芬:如果你使用 CALL,那%logg%将是矫枉过正。在那种情况下,我只会使用:

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

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

于 2013-03-21T17:12:51.983 回答
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
于 2013-03-22T08:29:45.827 回答
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
于 2013-03-21T15:23:17.520 回答
0

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

于 2013-03-21T15:23:29.360 回答