simmon
Goto Top

per Batch neuste Datei öffnen und bestimmtes Muster auslesen

Hallo zusammen,
meine Batch-Kenntnisse reichen leider für mein aktuelles Vorhaben nicht aus, daher hoffe ich, auf diesem Wege vielleicht ne Hilfestellung zu bekommen:

- In einem Ordner befinden sich mehrere log-Dateien mit dem Namensmuster 'XYZ_ZEITSTEMPEL.log' also z.B. 'XYZ_20080115_1024.log'
- In diesen Dateien befindet sich irgendwo ein bestimmtes Textsegment, welches ich gerne in eine neu anzulegende Datei verschieben würde. Den Beginn des Segmentes kann ich eindeutig identifizieren. Das Ende ebenfalls. Dazwischen befindet sich eine bestimmte Anzahl Zeilen (variabel), welche ich gerne in die andere Datei verschieben würde.

In Pseudocode ausgedrückt bräuchte ich also folgende Funktion

1. Identifiziere die neuste (anhand 'Date modified') aller Dateien im Verzeichnis, die mit 'XYZ' beginnen
2. Suche erstes Vorkommen von Muster 'ABC' in dieser Datei
3. Suche erstes Vorkommen von Muster 'DEF' nach dem ersten Vorkommen von 'ABC'
4. Kopiere die dazwischen liegenden Zeilen in neue Datei 'Neu.txt'


- Das Muster 'DEF' kommt sehr oft in der Datei vor, daher ist es im Punkt 3 wichtig, das erste Vorkommen von 'DEF' NACH 'XYZ' zu finden
- Das Identifizieren der neusten Datei in Punkt 1 wäre sehr komfortabel für mich, falls das nicht möglich ist, wäre auch ein Schleifendurchlauf durch alle Dateien mit 'XYZ' im Ordner möglich (und dann halt irgendwie Kopieren in 'XYZ_ZEITSTEMPEL.new' oder so


Ich hoffe mal, das ist mit ner batch-Datei überhaupt möglich face-smile

Es wäre wirklich SUPER, wenn mir jemand helfen könnte. Ich hoffe, ich habe genügend Info gepostet.

Danke schon mal im Voraus,
Simmon

Content-Key: 78201

Url: https://administrator.de/contentid/78201

Ausgedruckt am: 29.03.2024 um 15:03 Uhr

Mitglied: bastla
bastla 15.01.2008 um 15:17:44 Uhr
Goto Top
Hallo Simmon und willkommen im Forum!

Ganz schematisch könnte das etwa so aussehen:
@echo off & setlocal
set "Ordner=D:\Temp"  
set "Muster=XYZ_*.log"  
set "Neu=D:\Neu.txt"  
set "Von=ABC"  
set "Bis=DEF"  

if exist "%Neu%" del "%Neu%  

for /f "delims=" %%i in ('dir /b /od "%Ordner%\%Muster%" 2^>nul') do set "Neueste=%Ordner%\%%~nxi"  
If not defined Neueste echo Keine passende Datei in %Ordner% gefunden! & goto :eof

for /f "delims=:" %%i in ('findstr /n "%Von%" "%Neueste%"') do if not defined ZVon set ZVon=%%i  
if not defined ZVon echo %Von% in %Neueste% nicht gefunden! & goto :eof

for /f "delims=:" %%i in ('more +%ZVon% "%Neueste%"^|findstr /n "%Bis%" ') do if not defined ZBis set ZBis=%%i  
if not defined ZBis echo %Bis% in %Neueste% nicht gefunden! & goto :eof

for /f "tokens=1,2 delims=:" %%i in ('more +%ZVon% "%Neueste%"^|findstr /n $') do if %%i lss %ZBis% echo.%%j>>"%Neu%"  
Die "dazwischen liegenden Zeilen" habe ich so interpretiert, dass die Zeilen mit den jeweiligen Kennzeichen ("ABC" bzw "DEF") nicht in die neue Datei geschrieben werden sollen.

Grüße
bastla

[Edit] Kleinere kosmetische Korrekturen bei Fehlermeldungen vorgenommen. [/Edit]
[Edit2] Durch Verwendung von "$" im letzten "findstr" Berücksichtigung ev Leerzeilen in der Ausgabe hinzugefügt. [/Edit2]
Mitglied: Simmon
Simmon 15.01.2008 um 15:42:07 Uhr
Goto Top
SUPER ! funktioniert schon mal ! Vielen Dank !

nur noch 2 Dinge fehlen mir zum Glück:

- die ersten 2 Zeilen des kopierten Textes beginnen mit ''. Dieses Muster würde ich gerne in ein Gnuplot-Kommentar ändern. Also muss in den ersten 2 Zeilen des kopierten Text aus dem '' ein '#' werden. Kannst du mir da noch schnell helfen?

- ich würde das ganze gerne mit relativen Pfadangaben machen. In deinem Quellcode hast du absolute Angaben gemacht. Die batch-Datei befindet sich immer in dem Verzeichnis, in dem auch die .log Dateien sind. Die Datei 'Neu.txt' soll auch in diesem Ordner erstellt werden. Kann ich da die Pfadangaben weglassen bzw. wie lautet der Befehl für den aktuellen Pfad?

Gruß,
Simmon
Mitglied: bastla
bastla 15.01.2008 um 15:59:13 Uhr
Goto Top
Hallo Simmon!

Die folgende Version bezieht das Verzeichnis aus dem Pfad der Batchdatei:
@echo off & setlocal
set "Ordner=%~dp0"  
set "Muster=XYZ_*.log"  
set "Neu=%~dp0\Neu.txt"  
set "Von=ABC"  
set "Bis=DEF"  

if exist "%Neu%" del "%Neu%  

for /f "delims=" %%i in ('dir /b /od "%Ordner%\%Muster%" 2^>nul') do set "Neueste=%Ordner%\%%~nxi"  
If not defined Neueste echo Keine passende Datei in %Ordner% gefunden! & goto :eof

for /f "delims=:" %%i in ('findstr /n "%Von%" "%Neueste%"') do if not defined ZVon set ZVon=%%i  
if not defined ZVon echo %Von% in %Neueste% nicht gefunden! & goto :eof
set /a Gr=2

for /f "delims=:" %%i in ('more +%ZVon% "%Neueste%"^|findstr /n "%Bis%" ') do if not defined ZBis set ZBis=%%i  
if not defined ZBis echo %Bis% in %Neueste% nicht gefunden! & goto :eof

for /f "tokens=1,2 delims=:" %%i in ('more +%ZVon% "%Neueste%"^|findstr /n $') do if %%i lss %ZBis% set "Zeile=%%j" & call :ProcessLine %%i  
goto :eof

:ProcessLine
if %1 leq %Gr% if "%Zeile:~0,2%"=="//" set "Zeile=#%Zeile:~2%"  
echo.%Zeile%>>"%Neu%"  
Das Ersetzen von "//" am Zeilenanfang durch "#" habe ich auf die ersten beiden Zeilen beschränkt.

Leerzeilen im Bereich der auszugebenden Zeilen können (noch) nicht verarbeitet werden - bei Bedarf lässt sich da noch etwas machen. Da ich eigentlich auch sonst so gut wie nichts über den Inhalt der Log-Datei weiß, kann ich nicht abschätzen, ob sich durch die für das Ersetzen nötigen Änderungen Probleme mit Sonderzeichen ergeben werden.

Grüße
bastla

[Edit] Festlegung der Zeilengrenze für Ersetzungen auf "set /a Gr=2" korrigiert. [/Edit]
Mitglied: Simmon
Simmon 15.01.2008 um 16:12:54 Uhr
Goto Top
nochmal danke.

das mit den relativen Angaben klappt wunderbar. Das Ersetzen allerdings nicht. In der neuen Datei steht immer noch '//' in den ersten beiden Zeilen.

Leerzeilen spielen keine Rolle
Mitglied: bastla
bastla 15.01.2008 um 16:16:49 Uhr
Goto Top
Hallo Simmon!

Mir ist eben schon aufgefallen, dass die Zeile
set /a Gr=%Von%+2
nur
set /a Gr=2
heißen sollte - ich ersetze das auch oben.

Grüße
bastla
Mitglied: Simmon
Simmon 15.01.2008 um 17:32:32 Uhr
Goto Top
Hi,

das mit dem Ersetzen funktioniert irgendwie immer noch nicht. Es hat sich aber mittlerweile ergeben, dass dies eigentlich nicht wichtig ist face-wink

Vielen dank für den super Support,
Simon
Mitglied: bastla
bastla 15.01.2008 um 17:49:10 Uhr
Goto Top
Hallo Simmon!

das mit dem Ersetzen funktioniert irgendwie immer noch nicht.
Sollte (nach meinen mittlerweile vorgenommenen Tests) aber eigentlich an den Daten liegen (es werden jeweils die ersten beiden Zeichen der ersten beiden Ausgabezeilen überprüft und ggf ersetzt) - aber wenn Du' s ohnehin nicht mehr brauchst ...

Grüße
bastla