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?
à 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.
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
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
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.