2013-03-21 14 views
11

Sto provando ad usare un file BATCH come scegliere la tua storia d'avventura in cui l'utente può creare un personaggio ed essere chiamato per nome e così dai personaggi nella storia. Mi ha colpito un'ora fa che sarebbe stato bello se come o dopo che il file BATCH contenente la storia fosse stato eseguito, ha fatto un log di tutti i comandi ECHO in modo che in seguito il giocatore potesse leggere ciò che ha fatto su ogni gioco dato.Come posso creare un registro di tutti i comandi ECHO in un file BATCH?

Vorrei che il file di log di leggere in questo modo:

% data%% time% (tutto il testo visualizzato da eco i comandi per la lunghezza del file viene eseguito)

Purtroppo tutto quello che riesco a capire come fare è creare un file loge con solo la data e l'ora. Mettere ">> StoryLog.txt" funziona per creare il file .txt e ottengo la data e l'ora, ma mostra solo il testo ">> StoryLog.txt" dopo quello che voglio che il file batch venga visualizzato in echo txt come in "Vai verso nord lungo il percorso >> StoryLog.txt" viene visualizzato sullo schermo. Questo naturalmente non funzionerà. Cosa faccio?

+0

È possibile utilizzare 'tee' , disponibile anche per Windows. – Endoro

risposta

0

Non si può fare che in script batch alla lettera, ma se si definisce funzioni, è possibile dati di uscita all'interno del blocco funzione che scrive anche in un file di log prima la funzione ritorna, in questo modo:

@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

Ogni tempo per il giocatore echo per sapere cosa succede, potresti anche echo nel tuo file di registro, aggiungendo data e ora all'inizio della linea :) Semplice come quello per me. Non so come appare il tuo script.

+0

Scruffy coding per avere coppie di linee ovunque. Meglio creare una nuova routine LogEcho che Echos sullo schermo E inoltre registra il file. –

7

per questo scopo Io uso il seguente:

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

Questo è un po 'complicato. Quindi cerchiamo di smontare quella linea a quattro parti:

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

L'idea è quella di stampare la linea in un file temporaneo (denominato "_") (seconda parte) quindi digitare il contenuto di tale file a schermo (terzo parte) quindi digitarlo nel file di registro (quarta parte).

Metti tutto su una variabile (prima parte), quindi non devi digitare quella monsterstring su ogni riga. (Questo è il motivo per cui il ">" e "&" sono scappati con "^")

Così, ogni volta che si utilizza

echo whatever %logg% 

apparirà sullo schermo e scrivere su% file di registro%

si noti che questo funziona anche:

%logg% echo whatever 

inoltre, si può fare con le funzioni:

@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 

modifica Stephan: Se si utilizza CALL, il% di registrazione% sarebbe eccessivo.In tal caso vorrei solo usare:

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

Questa potrebbe essere la soluzione migliore alla domanda iniziale, perché la data/ora sarà scritto nel file di log, ma non sullo schermo. Btw: non è necessario eliminare il tempfile ogni volta che lo si utilizza, è sufficiente eliminarlo una volta, subito prima della fine del batch.

+0

Tecnica interessante. Avevo sperato che fosse un trucco di file temporaneo in-memory, ma è stato scritto sul disco come un file con il singolo nome di sottolineatura. Anche nei miei test ho trovato che solo uno '&' è necessario ... cioè 'set testout = ^> _^& type _' ...' dir% testout% ' –

+0

_ è appena usato come buffer - perché io bisogno dell'output (dato una volta) due volte. In effetti è un file e viene sovrascritto ogni volta. E sì, dato che è un file, puoi usarlo come vuoi - fino a quando non lo sovrascrivi al successivo "echo blablabla% logg%" E hai ragione, un singolo "&" dovrebbe fare (era notte fonda, quando ho risolto questo problema - e non l'ho mai più toccato, una volta funzionato) – Stephan

3

Come la mia altra risposta è diventata molto lunga a causa di alcune modifiche, ecco un nuovo suggerimento (non è cambiato molto, ma rende il codice abbastanza facile da leggere):

@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, ma fallisce con il testo come% di pronuncia% "Questo dovrebbe essere un segno di omissione^non due" 'e'% dire% "Una e commerciale^& fail " – jeb

+0

anche |, <, > fallirà. Ogni trucco ha i suoi limiti. Ma penso, va bene per la domanda iniziale. Penso che un'avventura testuale non farà uso di quei caratteri speciali. – Stephan

Problemi correlati