我正在尝试使用BATCH文件作为一个select你自己的冒险故事,用户可以在其中创build一个angular色,并通过故事中的angular色名称等来调用。 这让我想起了一个小时,如果在包含故事的BATCH文件运行之后,它会很酷,logging所有的ECHO命令,以便以后玩家可以读取他们在任何给定游戏中所做的事情。
我希望日志文件如下所示:
%date%%时间百分比(通过echo命令显示文件运行长度的所有文本)
不幸的是,我能想出的办法是只用date和时间创build一个loge文件。 把“>> StoryLog.txt”工作,使.txt文件,我在那里得到的date和时间,但它只是显示文本“>> StoryLog.txt”后我想batch file显示在回显txt在“您沿着path向北走去>> StoryLog.txt”显示在屏幕上。 这自然不会工作。 我该怎么办?
为此我使用以下内容:
set LogFile=somepath\logfile.txt set logg=^> _^&^& type _^&^&type _^>^>%LogFile% echo this goes to screen AND file! %logg%
这有点棘手。 所以让我们把这一行分解成四个部分:
set logg= ^> _ ^&^& type _ ^&^&type _^>^>%LogFile%
想法是将行打印到一个临时文件(名为“_”)(第二部分),然后输入该文件的内容到屏幕(第三部分),然后将其输入到日志文件(第四部分)。
把这一切都放到一个变量(第一部分),所以你不必输入每一行的怪物字符串。 (这是“>”和“&”用“^”转义的原因)
所以每次使用
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
编辑Stephan:如果你使用CALL,那么%logg%就会过度。 在这种情况下,我只会使用:
:logit echo %~1 echo %date%,%time% - %~1 >>logfile exit /b 0
这可能是原始问题的最佳解决方案,因为日期/时间将被写入日志文件中,而不是在屏幕上。 顺便说一下:每次使用时都不必删除临时文件,只需要在批次结束之前将其删除一次即可。
由于我的其他答案由于一些编辑而变得相当长,这是一个新的建议(没有太大的改变,但它使代码很容易阅读):
@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
在批处理脚本中,你不能这样做,但是如果你定义了函数,你可以在函数块内输出数据,也可以在函数返回之前写入日志文件,如下所示:
@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
每次你echo
玩家知道发生了什么,你也可以echo
到你的日志文件,在你的行开头添加日期和时间:)对我来说简单。 不知道你的脚本看起来如何。