How do I make a log of all ECHO commands in a BATCH file?

后端 未结 4 1796
猫巷女王i
猫巷女王i 2020-12-03 11:39

I am trying to use a BATCH file as a choose your own adventure story in which the user can create a character and be called by name and such by the characters in the story.

相关标签:
4条回答
  • 2020-12-03 12:15

    You cannot do that in batch script literally, but if you define functions, you can output data within the function block that also writes to a log file before the function returns, like so:

    @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 讨论(0)
  • 2020-12-03 12:24

    Each time you echo for the player to know what happens, you could also echo into your log file, adding date and time at the beginning of your line :) Simple as that for me. Don't know how your script looks though.

    0 讨论(0)
  • 2020-12-03 12:30

    As my other answer got quite long due to some edits, here is a new suggestion (not much changed, but it makes the code quite easy to read):

    @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
    
    0 讨论(0)
  • 2020-12-03 12:33

    for this purpose I use the following:

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

    This is a bit tricky. So let's disassemble that line to four parts:

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

    The Idea is to print the line to a temporary file (named _) (second part) then type the contents of that file to screen (third part) then type it to the logfile (fourth part).

    Put that all to a variable (first part), so you don't have to type that monsterstring to every line. (this is the reason why the > and & are escaped with ^)

    So every time you use

    echo whatever %logg%
    

    it will appear on the screen AND write to %logfile%

    Note that this will also work:

     %logg% echo whatever
    

    Edit djangofan: Also, you can do it with functions:

    @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
    

    Edit Stephan: If you use CALL, the %logg% would be overkill. In that case I would just use:

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

    This might be the best solution to the original question, because the Date/Time will be written into logfile, but not on the screen. Btw: you don't have to delete the tempfile every time you use it, just delete it one time, just before the batch ends.

    0 讨论(0)
提交回复
热议问题