Как создать журнал всех команд ECHO в файле BATCH?

Я пытаюсь использовать файл BATCH как выбрать собственную историю приключений, в которой пользователь может создать персонажа и вызываться по имени и тому подобное персонажами в истории. Это ударило меня на час назад, что было бы здорово, если бы или после того, как файл BATCH, содержащий историю, был запущен, он сделал журнал всех команд ECHO, чтобы позже игрок мог прочитать, что они сделали в любой игре. /p >

Я хотел бы, чтобы файл журнала читался следующим образом:

% date%% time% (весь текст, отображаемый командами эха для длины файла)

К сожалению, все, что я могу понять, как сделать, это сделать файл loge с указанием только даты и времени. Ввод " → StoryLog.txt" работает, чтобы сделать .txt файл, и я получаю дату и время там, но он просто отображает текст " → StoryLog.txt" после того, что я хочу, чтобы командный файл отображался в эхом txt как в "Вы идете на север по пути → StoryLog.txt" отображается на экране. Это, естественно, просто не работает. Что мне делать?

Ответ 1

для этой цели я использую следующее:

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

редактировать Стефан: Если вы используете CALL,% logg% будет излишним. В этом случае я бы просто использовал:

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

Это может быть лучшим решением исходного вопроса, потому что дата/время будет записана в файл журнала, но не на экране. Btw: вам не нужно удалять временный файл каждый раз, когда вы его используете, просто удалите его один раз, незадолго до окончания партии.

Ответ 2

Поскольку мой другой ответ получил довольно много из-за некоторых изменений, вот новое предложение (мало что изменилось, но это делает код довольно легко читаемым):

@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

Ответ 3

Вы не можете делать это в пакетном script буквально, но если вы определяете функции, вы можете выводить данные в функциональном блоке, который также записывается в файл журнала до возвращения функции, например:

@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

Ответ 4

Каждый раз, когда вы echo, чтобы игрок знал, что происходит, вы также можете echo в свой файл журнала, добавляя дату и время в начале строки:) Простой, как это для меня. Не знаете, как выглядит ваш script.