2010-11-22 34 views
4

J'ai un fichier qui contient la sortie d'un fichier comparer des thats écrits dans un fichier texte:
Comparing files C:\LOGS\old.txt and C:\LOGS\NEW.TXT
***** C:\LOGS\old.txt
***** C:\LOGS\NEW.TXT
folder_thats_different
*****

Je dois tirer le côté de la dernière ligne « folder_thats_different "et mettre dans une nouvelle chaîne:
folder contains a file that is different: folder_thats_differentfichier batch pour revenir à côté de la dernière ligne de fichier texte

Oui, je sais que je peux utiliser une autre langue, mais je suis coincé avec les fichiers batch pour le moment.

Répondre

3

Vous pouvez essayer de le lire avec une boucle for et prendre la ligne actuelle, et toujours enregistrer la ligne précédente

@echo off 
setlocal EnableDelayedExpansion 
for /f "delims=" %%x in (myFile.txt) do (
    set "previous=!last!" 
    set "last=%%x" 
) 
echo !previous! 
+0

pour une raison quelconque, la dernière ligne ne fonctionne pas. J'obtiens 'ECHO is off' au lieu d'imprimer la ligne. –

+0

Alors! Précédent! est vide ou manqué tapé, ou le mauvais fichier est pris, remplacez myFile.txt et vous pouvez ajouter un echo dans la boucle for pour déboguer le code – jeb

0

Voici un exemple que vous pouvez utiliser comme point de départ. Remplacez simplement le nom de fichier de la ligne set command= par le nom approprié (ou remplacez la commande par celle qui gèrera la liste des journaux).

@echo off 
@setlocal 

(set command=type test.txt) 

for /f "usebackq tokens=*" %%i in (`%command%`) do call :process_line %%i 
echo next to last line: %old_line% 
goto :eof 

:process_line 
(set old_line=%new_line%) 
(set new_line=%*) 
goto :eof 

Bien sûr, vous voudrez probablement faire autre chose que de simplement faire écho à la ligne trouvée.

+0

Merci pour ce qui est bon. Comment puis-je utiliser cette ligne et le mettre dans une chaîne de caractères à utiliser plus tard? –

+0

'old_line' est juste une variable d'environnement - vous pouvez l'utiliser comme n'importe quel autre. 'set my_string_var =% old_line%', par exemple. –

+0

Cela fonctionne, mais les appels sont extrêmement longs. 20fois plus lent que la variante DelayedExpansion. – jeb

0

La première réponse fonctionne pour moi. J'ai également ajouté 2 lignes après la fin pour lui permettre de répéter afin que je puisse regarder un fichier journal actif sans avoir à le fermer et le rouvrir. Je fais beaucoup de débogage pour les mods utilisés dans le jeu Space Engineers. Ma version ressemble à ceci:

@echo off 
setlocal EnableDelayedExpansion 
for /f "delims=" %%x in (SpaceEngineers.log) do (
    set "previous=!last!" 
    set "last=%%x" 
) 
echo !previous! 
timeout 15 /nobreak 
se_log 

La ligne ci-dessous arrête le fichier de commandes de boucle trop rapide et arrêter la dérivation clé. Pour changer la durée en secondes il suffit de changer le nombre "15" pour tout ce que vous voulez. Pour arrêter le fichier batch, appuyez simplement sur ctrl + c.

timeout 15 /nobreak 

La ligne ci-dessous est le nom du fichier de traitement par lots que j'ai créé. Il demandera à CMD de l'exécuter à nouveau.

se_log