
92943
31.01.2011, aktualisiert um 14:55:16 Uhr
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
Falls noch irgendwelche Angaben benötigt werden, einfach melden
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:
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
Falls noch irgendwelche Angaben benötigt werden, einfach melden
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Biber am 31.01.2011 um 10:33:43 Uhr
Codeformatierung und verschoben von "Windows-weiss-nich'-genau" nach Bätchkrams".
Content-ID: 159774
Url: https://administrator.de/forum/per-batch-alles-ueber-5000-zeilen-in-einer-textdatei-loeschen-159774.html
Ausgedruckt am: 22.04.2025 um 19:04 Uhr
3 Kommentare
Neuester Kommentar
Hallo fyrb38!
Das Kürzen der Logdatei ließe sich im einfachsten Fall (und nur mit Bordmitteln) etwa so realisieren:
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 "
Mit der "
Die angesprochenen Einzelzeilen entstehen aufgrund der Ausgabe des Befehles "
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 "
Die Schreibweise "
Nach der Schleife enthält die temporäre Logdatei nur die ersten 5000 Zeilen und kann nun die Originaldatei ersetzen. Durch die Verwendung von "
Grüße
bastla
P.S.: Die Zeilen 5, 6 und 15 würde ich etwas anonymer gestalten ...
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%"
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. 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 Format1:Das ist die erste Zeile
...
5000:Hier hätten wir Zeile 5000 ...
5001:... und 5001
...
18267:Endlich am Ende!
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 ...
moin Ihr beiden,
das mit dem 5000 Zeilen ist ja schon OK --- ABER,
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!! 
um der Allgemeinen Betriebsblindheit etwas beizutragen:
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
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.
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...
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%"
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