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

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.

Leave a Comment