web-dev-qa-db-fra.com

Comment créer un journal de toutes les commandes ECHO dans un fichier BATCH?

J'essaie d'utiliser un fichier BATCH pour choisir votre propre récit d'aventure dans lequel l'utilisateur peut créer un personnage et être appelé par son nom, et ainsi de suite par les personnages de l'histoire. Il y a une heure, je me suis dit qu'il serait cool que le ou après le traitement du fichier BATCH contenant l'historique soit créé un journal de toutes les commandes ECHO afin que le joueur puisse plus tard lire ce qu'il a joué lors de la lecture.

Je voudrais que le fichier journal se lise comme ceci:

% date%% time% (tout le texte affiché par les commandes echo pour la longueur du fichier)

Malheureusement, tout ce que je peux comprendre, c'est créer un fichier de consignation avec uniquement la date et l'heure. Mettre ">> StoryLog.txt" permet de créer le fichier .txt. La date et l’heure sont indiquées, mais le texte ">> StoryLog.txt" apparaît après le texte que je souhaite afficher dans le fichier de traitement en écho. dans "Vous allez au nord par le chemin >> StoryLog.txt" est affiché à l'écran. Naturellement, cela ne fonctionnera pas. Que fais-je?

11
Sean McLain

à cette fin, j'utilise les éléments suivants:

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

C'est un peu délicat. Alors démontons cette ligne en quatre parties:

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

L’idée est d’imprimer la ligne dans un fichier temporaire (nommé _) (deuxième partie) Puis de taper le contenu de ce fichier à l’écran (troisième partie) Puis de le saisir dans le fichier journal (quatrième partie).

Mettez tout cela dans une variable (première partie), afin que vous n'ayez pas à taper ce monsterstring à chaque ligne. (c’est la raison pour laquelle > et & sont échappés avec ^)

Donc, chaque fois que vous utilisez 

echo whatever %logg%

il apparaîtra sur l’écran ET écrivez dans %logfile%

Notez que cela fonctionnera également:

 %logg% echo whatever

Edit djangofan: Vous pouvez également le faire avec les fonctions suivantes:

@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: Si vous utilisez CALL, le %logg% serait excessif. Dans ce cas, je voudrais simplement utiliser:

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

C’est peut-être la meilleure solution à la question initiale, car la date/heure sera écrite dans le fichier journal, mais pas à l’écran. Btw: il n’est pas nécessaire de supprimer le fichier temporaire chaque fois que vous l’utilisez, il suffit de le supprimer une fois, juste avant la fin du lot. 

7
Stephan

Comme mon autre réponse a été assez longue à cause de certaines modifications, voici une nouvelle suggestion (Pas beaucoup de changement, mais cela rend le code assez facile à lire):

@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
Stephan

Vous ne pouvez pas faire cela littéralement dans un script batch, mais si vous définissez des fonctions, vous pouvez générer des données dans le bloc de fonctions qui écrit également dans un fichier journal avant le retour de la fonction, comme suit:

@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
djangofan

Chaque fois que vous echo pour que le joueur sache ce qui se passe, vous pouvez également echo dans votre fichier journal, en ajoutant la date et l'heure au début de votre ligne :) C'est aussi simple que cela pour moi. Je ne sais pas comment le script a l'air bien.

0
callisto