2013-03-21 5 views
11

Ich versuche eine BATCH-Datei zu verwenden, um eine eigene Abenteuergeschichte auszuwählen, in der der Benutzer einen Charakter erstellen und durch die Charaktere in der Geschichte namentlich genannt werden kann. Es traf mich eine Stunde zurück, dass es cool wäre, wenn oder nachdem die BATCH-Datei, die die Geschichte enthielt, ausgeführt wurde, ein Protokoll aller ECHO-Befehle zu machen, damit der Spieler später lesen konnte, was sie bei einem gegebenen Wurf getan hatten.Wie kann ich alle ECHO-Befehle in einer BATCH-Datei protokollieren?

Ich mag die Log-Datei wie folgt zu lesen:

% date%% time% (alle Texte angezeigt durch Befehle für die Länge der Datei läuft Echo)

Leider kann ich nur herausfinden So erstellen Sie eine Loge-Datei mit Datum und Uhrzeit. Mit ">> StoryLog.txt" wird die .txt-Datei erstellt, und ich bekomme das Datum und die Uhrzeit dort, aber es zeigt nur den Text ">> StoryLog.txt" nach dem, was ich will, dass die Batch-Datei in echoed txt angezeigt wird In "Sie gehen nach Norden auf dem Weg nach unten >> StoryLog.txt" wird auf dem Bildschirm angezeigt. Das funktioniert natürlich nicht. Was mache ich?

+0

Sie können 'tee' , auch für Windows verfügbar. – Endoro

Antwort

0

Sie können tun, dass nicht im Batch-Skript wahrsten Sinne des Wortes, aber wenn Sie definieren Funktionen, können Sie Ausgangsdaten innerhalb des Funktionsblocks, der auch vor die Funktion zurückkehrt in eine Protokolldatei schreibt, etwa 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

Jeder Zeit Sie echo für den Spieler zu wissen, was passiert, könnten Sie auch echo in Ihre Protokolldatei, Datum und Uhrzeit am Anfang Ihrer Zeile hinzufügen :) Einfach wie das für mich. Ich weiß nicht, wie Ihr Skript aussieht.

+0

Scruffy Codierung, um überall Linienpaare zu haben. Es ist besser, eine neue LogEcho-Routine zu erstellen, die Echos auf dem Bildschirm UND auch in der Datei protokolliert. –

7

für diesen Zweck verwende ich folgendes:

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

Dies ist ein bisschen schwierig. Also lassen Sie uns diese Linie vier Teile zerlegen:

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

Die Idee ist es, die Linie in eine temporäre Datei (mit dem Namen „_“) (zweiter Teil) geben Sie dann den Inhalt dieser Datei zu Bildschirm drucken (Dritt Teil) dann geben Sie es in die Logdatei (vierter Teil).

Setzen Sie das alles auf eine Variable (erster Teil), so dass Sie diesen Monsterstring nicht in jede Zeile eingeben müssen. (Dies ist der Grund, warum die „>“ und „&“ mit „^“ entkommen sind)

Also jedes Mal, wenn Sie

verwenden
echo whatever %logg% 

es auf dem Bildschirm angezeigt wird und auf% Logfile% schreiben

Beachten Sie, dass dies auch funktionieren:

%logg% echo whatever 

auch können Sie es mit Funktionen tun:

@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 

bearbeiten Stephan: Wenn Sie CALL verwenden, wäre% logg% übertrieben.In diesem Fall würde verwende ich nur:

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

Dies könnte die beste Lösung auf die ursprüngliche Frage, weil das Datum/Uhrzeit wird in Log-Datei geschrieben werden, aber nicht auf dem Bildschirm. Btw: Sie müssen die Tempdatei nicht jedes Mal löschen, wenn Sie sie verwenden, löschen Sie sie einfach einmal, kurz bevor die Stapelverarbeitung beendet ist.

+0

Interessante Technik. Ich hatte gehofft, dass es sich um einen raffinierten In-Memory-Trick für temporäre Dateien handelte, aber er wird als Datei mit dem Namen des einzelnen Unterstrichs auf die Festplatte geschrieben. Auch in meinen Tests habe ich festgestellt, dass nur ein '&' benötigt wird ... dh 'set testout = ^> _^& type _' ... 'dir% testout%' –

+0

_ wird nur als Puffer verwendet - weil ich brauche die Ausgabe (einmal gegeben) zweimal. Es ist in der Tat eine Datei und wird jedes Mal überschrieben. Und ja, da es sich um eine Datei handelt, kannst du sie beliebig verwenden - bis du sie beim nächsten "echo blablabla% logg%" überschreibst Und du hast recht, ein einziges "&" sollte tun (es war spät in der Nacht, als ich das ausgearbeitet habe - und es nie wieder berührt habe, sobald es funktioniert hat) – Stephan

3

Als meine andere Antwort bekam ziemlich lange wegen einiger Änderungen, hier ist ein neuer Vorschlag (nicht viel geändert, aber es macht den Code ganz einfach lesen):

@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, aber es scheitert mit Text wie '% say%" Dies sollte ein Caret sein^nicht zwei "' und '% say%" Ein kaufmännisches Und^& fails " – jeb

+0

auch |, <, > wird fehlschlagen. Jeder Trick hat seine Grenzen. Aber ich denke, es ist ok für die erste Frage. Ich denke, ein Text-Abenteuer wird diese speziellen Zeichen nicht nutzen. – Stephan