2013-03-21 7 views
11

Próbuję użyć pliku BATCH, aby wybrać własną historię przygodową, w której użytkownik może stworzyć postać i być nazwany imieniem i nazwiskiem przez postaci z opowieści. Uderzyło mnie to o godzinę, że byłoby fajnie, gdyby po uruchomieniu pliku BATCH zawierającego historię, zrobił on dziennik wszystkich poleceń ECHO, aby później mógł przeczytać, co zrobili w danej grze.Jak utworzyć dziennik wszystkich poleceń ECHO w pliku BATCH?

Chciałbym plik dziennika, aby odczytać tak:

% date%% time% (cały tekst wyświetlany przez echo poleceń dla długości plik działa)

Niestety wszystko co mogę wymyślić jak zrobić, to zrobić plik logu tylko z datą i godziną. Wstawienie ">> StoryLog.txt" służy do utworzenia pliku .txt, a otrzymam tam datę i godzinę, ale po prostu wyświetla się tekst ">> StoryLog.txt" po tym, co chcę, aby plik wsadowy wyświetlał w txt jako w "Idąc na północ ścieżką >> StoryLog.txt" pojawi się na ekranie. To oczywiście po prostu nie zadziała. Co ja robię?

+0

Można użyć 'tee' , dostępne również dla systemu Windows. – Endoro

Odpowiedz

0

Nie można tego zrobić w skrypcie dosłownie, ale jeśli definiować funkcje, można dane wyjściowe w bloku, który również pisze w pliku dziennika przed powrotem funkcyjnych, tak:

@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

Each czas, aby echo, aby gracz wiedział, co się dzieje, można również echo do pliku dziennika, dodając datę i godzinę na początku linii :) Proste jak dla mnie. Nie wiem, jak wygląda twój skrypt.

+0

Scruffy kodowanie, aby mieć pary linii wszędzie. Lepiej stworzyć nową procedurę LogEcho, którą Echos wyświetla na ekranie I loguje się do pliku. –

7

do tego celu używam następujący:

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

To jest trochę skomplikowane. Więc demontować tej linii na cztery części:

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

Idea jest, aby wydrukować linię do pliku tymczasowego (o nazwie „_”) (część druga) następnie wpisz zawartość tego pliku na ekranie (trzeci część) następnie wpisz go do pliku logu (część czwarta).

Połóż to wszystko na zmienną (pierwsza część), więc nie musisz wpisywać tego monstrulastru do każdej linii. (Jest to powód, dla którego „>” i „&” są uciekł z „^”)

Więc za każdym razem korzystać

echo whatever %logg% 

pojawi się na ekranie i zapisywać% logfile%

Należy pamiętać, że będzie to również działa:

%logg% echo whatever 

ponadto, można to zrobić z funkcji:

@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 

edytuj Stephan: Jeśli użyjesz CALL,% logg% będzie przesadą.W tym przypadku chciałbym po prostu użyć:

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

To może być najlepszym rozwiązaniem do pierwotnego pytania, ponieważ data/czas zostaną zapisane w pliku dziennika, ale nie na ekranie. Btw: nie musisz usuwać pliku tymczasowego za każdym razem, gdy go używasz, po prostu usuń go jeden raz, tuż przed zakończeniem partii.

+0

Ciekawa technika. Miałem nadzieję, że jest to fajna sztuczka z pliku tymczasowego w pamięci, ale zostanie zapisana na dysk jako plik z pojedynczą nazwą podkreślenia. Również w moich testach znalazłem, że tylko jedno '&' jest potrzebne ... tj. 'Set testout = ^> _^& type _' ... dir% testout%' –

+0

_ jest właśnie używany jako bufor - ponieważ ja potrzebujemy wyjścia (dane jednorazowo) dwa razy. Jest to w rzeczywistości plik i jest nadpisywany za każdym razem. I tak, ponieważ jest to plik, możesz go użyć tak, jak chcesz - dopóki go nie zastąpisz przy następnym "echo blablabla% logg%" I masz rację, jedno "i" powinno zrobić (Było późno w nocy, kiedy to wymyśliłem - i nigdy go więcej nie dotknąłem, gdy zadziałało) – Stephan

3

Jako drugi moja odpowiedź dostał dość długo ze względu na pewne modyfikacje, oto nowa propozycja (nie wiele zmieniło, ale to sprawia, że ​​kod dość łatwy do odczytu):

@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

+1, ale kończy się niepowodzeniem z tekstem podobnym do '% powiedz%" To powinno być jedną ostrożnością^nie dwoma "' i '% powiedzą%" Amperand^& zawiedzie "' – jeb

+0

również |, <, > zawiedzie. Każda sztuczka ma swoje ograniczenia. Ale myślę, że to w porządku dla pierwszego pytania. Myślę, że tekst-przygoda nie użyje tych specjalnych znaków. – Stephan

Powiązane problemy