92943
Goto Top

Per Batch alles über 5000 Zeilen in einer Textdatei löschen

Guten Morgen,

ich bin totaler Anfänger in Batchdateien.
Ich habe laufe letzter Woche eine Batchdatei mit Hilfe von google etc. geschrieben.
Diese Datei soll eine bestimmte Datei "Hilfsdatei.txt" überprüfen, wie alt diese ist.
Wenn diese Datei älter als 15 Minuten ist, wird eine "Alarm.txt" Datei erstellt. In dieser Datei stehen dann Datum, Uhrzeit und dass die Datei nicht mehr aktuell ist.
Das ganze Vorgehen, sprich, Datum, Uhrzeit und einfach nochmal ein Zusatz, ob die Hilfsdatei aktuell ist oder nicht, wird im log.txt festgehalten.
Mein Wunsch ist nun, dass alles was über 5000 Zeilen im log.txt steht, gelöscht wird.

Ich habe schon recherchiert und auch in diesem Forum was dazu gefunden, nur leider gab es keine Erklärungen dazu und konnte nicht viel damit anfangen face-sad
Falls noch irgendwelche Angaben benötigt werden, einfach melden face-smile

Noch eine Bitte, ob ihr bei euren Antworten Zeile für Zeile erklären könntet. Wie gesagt, ich bin Anfänger und möchte verstehen, was ich da mache.
Vielen Dank schonmal im Voraus und hier mein Skript:

ECHO ON

SET Zieldatei=C:\Test\Hilfsdatei.txt
SET LastModified=15 
SET LOGPATH="C:\XXX\Test1\log.txt"   
SET ALARMPATH="C:\XXX\Test1\Alarm.txt"  

ECHO Aktuelles Datum: >> %LOGPATH%
Date /t	>> %LOGPATH% 
ECHO ------------------ >> %LOGPATH% 
Echo Aktuelle Uhrzeit: >> %LOGPATH% 
Time /t >> %LOGPATH% 

IF NOT EXIST %Zieldatei% GOTO :FILEDOESNOTEXIST
"C:\XXX\Test1\WasFile" %Zieldatei% modified before now-%LastModified% >> %LOGPATH%   
if not errorlevel 1 goto TRUE >> %LOGPATH%
if not errorlevel 0 goto FALSE >> %LOGPATH%
 

:LASTMODIFICATION >> %LOGPATH% 
ECHO ==================================================================================== >> %LOGPATH%
EXIT 


:TRUE  
ECHO ==================================================================================== >> %ALARMPATH% 
ECHO Datei wurde NICHT innerhalb der letzten 15 Minuten aktualisiert. >> %ALARMPATH%
ECHO. >>%ALARMPATH%
ECHO Aktuelles Datum: >> %ALARMPATH% 
Date /t	>> %ALARMPATH% 
ECHO ------------------ >> %ALARMPATH% 
Echo Aktuelle Uhrzeit: >> %ALARMPATH% 
Time /t >> %ALARMPATH%
ECHO. >> %ALARMPATH%
ECHO ==================================================================================== >> %ALARMPATH%


ECHO. >>%LOGPATH%
ECHO Datei wurde NICHT innerhalb der letzten 15 Minuten aktualisiert. >> %LOGPATH% 
ECHO ==================================================================================== >> %LOGPATH% 
EXIT


:FALSE  
ECHO ==================================================================================== >> %LOGPATH% 
ECHO Datei wurde innerhalb der letzten 15 Minuten aktualisiert. >> %LOGPATH% 
ECHO ==================================================================================== >> %LOGPATH% 
EXIT
 

:ERROR 
ECHO Datei nicht gefunden
EXIT 



:FILEDOESNOTEXIST 
ECHO ==================================================================================== >> %LOGPATH% 
EXIT
Kommentar vom Moderator Biber am Jan 31, 2011 um 09:33:43 Uhr
Codeformatierung und verschoben von "Windows-weiss-nich'-genau" nach Bätchkrams".

Content-Key: 159774

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

Printed on: April 19, 2024 at 02:04 o'clock

Member: bastla
bastla Jan 31, 2011 at 13:42:19 (UTC)
Goto Top
Hallo fyrb38!

Das Kürzen der Logdatei ließe sich im einfachsten Fall (und nur mit Bordmitteln) etwa so realisieren:
set "LogTemp=%temp%\Log.txt"  
del "%LogTemp%" 2>nul  
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%LOGPATH%"') do if %%i leq 5000 >>"%LogTemp%" echo\%%j  
move "%LogTemp%" "%Log%"  
Kurze Erklärung:
Da der Name der temporären Logdatei öfter benötigt wird, ist es sinnvoll, ihn einer Variablen zuzuweisen.

Eigentlich sollte es die temporäre Logdatei nicht (mehr) geben, aber sicher ist sicher, und daher wird sie vorweg gelöscht. Die unschöne Fehlermeldung, falls sie erwartungsgemäß tatsächlich nicht vorhanden ist, kann man/frau per "2>nul" elegant verschwinden lassen. face-wink

Mit der "for /f"-Schleife kann ein Dateiinhalt (oder auch, wie hier, die Ausgabe eines Befehles) zeilenweise abgearbeitet werden, wobei durch die Angabe eines Trennzeichens ("delimiter", hier: ":") und die Festlegung der benötigten Teilstücke ("tokens", hier: Teil 1 vor dem ersten ":" und der Rest = alles nach dem ersten ":") eine Zerlegung dieser Zeile vorgenommen werden kann. Die entstehenden Teile werden anhand des vorgegebenen Anfangsbuchstaben der "Laufvariablen" benannt - hier entstehen also die Teile "%%i" und "%%j".

Die angesprochenen Einzelzeilen entstehen aufgrund der Ausgabe des Befehles "findstr /n "^" "%LOGPATH%". Durch die Suche nach "^" (entspricht einem Zeilenanfang, und den hat sogar eine ansonsten leere Zeile) werden alle Zeilen der Logdatei gefunden und (wegen "/n") nummeriert im Format
1:Das ist die erste Zeile
...
5000:Hier hätten wir Zeile 5000 ...
5001:... und 5001
...
18267:Endlich am Ende!
ausgegeben. Wenn diese Zeilen nun am ":" geteilt werden, steht im ersten Teil die Zeilennummer und im zweiten Teil der gesamte Zeileninhalt.

Das für jede Zeile ausgeführte "if %%i leq 5000" prüft nun die Zeilennummer darauf hin, ob sie <= ("less or equal") 5000 ist und gibt nur in diesem Fall die Zeile in die temporäre Logdatei aus.

Die Schreibweise "echo\%%j" sorgt durch den "\" dafür, dass im Falle, dass %%j keinen Inhalt hat (= Leerzeile), nicht die Statusinformation "ECHO ist eingeschaltet (ON).", sondern tatsächlich eine Leerzeile in die temporäre Logdatei geschrieben wird.

Nach der Schleife enthält die temporäre Logdatei nur die ersten 5000 Zeilen und kann nun die Originaldatei ersetzen. Durch die Verwendung von "move" wird dabei gleichzeitig die Temporärdatei de facto gelöscht.

Grüße
bastla

P.S.: Die Zeilen 5, 6 und 15 würde ich etwas anonymer gestalten ...
Mitglied: 92943
92943 Jan 31, 2011 at 14:02:05 (UTC)
Goto Top
Hallo Bastla,

Vielen Dank schonmal, auch für den den Hinweis auf Zeile 5, 6 und 15.
Ich bin mittlerweile weiter gekommen und das Problem ist vielleicht schon gelöst.
Ich werd mir bei Zeit deinen Beitrag nochmal in Ruhe durchlesen, da es mir wichtig ist mehr und mehr dazu zu lernen.
Auf jeden Fall, werd ich mich melden, sobald das Produkt fertig ist oder noch Fragen offen sind.

Grüße
Member: pieh-ejdsch
pieh-ejdsch Jan 31, 2011 at 19:52:50 (UTC)
Goto Top
moin Ihr beiden,
das mit dem 5000 Zeilen ist ja schon OK --- ABER,
Zitat von @92943:
Das ganze Vorgehen, sprich, Datum, Uhrzeit und einfach nochmal ein Zusatz, ob die Hilfsdatei aktuell ist oder nicht, wird im log.txt festgehalten.
Mein Wunsch ist nun, dass alles was über 5000 Zeilen im log.txt steht, gelöscht wird.
15."C:\XXX\Test1\WasFile" %Zieldatei% modified before now-%LastModified% >> %LOGPATH%
usw...
wenn in diese Log.txt neue Informationen drangeschrieben werden kannst Du die 5000 Zeilen auch ausdrucken und an die Wand hängen - ist genauso Aktuell wie immer!! face-wink

um der Allgemeinen Betriebsblindheit etwas beizutragen:
move "%logpath%" "%logpath%00"  
for /f "delims=:" %%j in ('findstr /n "^" "%logpath%00" ^|find /c ":"') do for /f %%k in ('set /a "Lines=%%j-5000"') do if %%k gtr 0 (more +%%k "%logpath%00">"%logpath%") else move  "%logpath%00" "%logpath%"  
Erklärung:
log.txt wird in log.txt00 Umbenannt
die Anweisung in der 1. Forschleife holt die Zeilenanzahl in %%j.
deswegen wird in der Zweiten Forschleife die zu Überspringenden Zeilen=(Zeilenanzahl)-(zu Überspringende Zeilen) ausgerechnet.
wenn das Ergebnis kleiner als 1 ist wird die log.txt zurückbewegt, sonst werden die max letzten 5000 Zeilen in die log.txt geschrieben.

Gruß Phil