constricta
Goto Top

Per Batch Zeilen in txt datei löschen

Hallo
Mehrer User schreiben per Batch in eine gemeinsame txt datei.
Diese wird wiederrum mit einer anderen Batch datei ausgegeben.
Jz möchte ich, wenn die txt datei zu lange ist (zb über 30 Zeilen) immer die erste/n löschen, damit es nie mehr wie zb. 30 Zeilen sind!

Grüße
Kommentar vom Moderator Biber am 10.12.2009 um 11:29:59 Uhr
Zitat von @5t8d1e:
Du kannst die Ausgabe der 2. Schleife pipen und danach die Dateien umbennen.
#rgc = 630

Content-ID: 131295

Url: https://administrator.de/forum/per-batch-zeilen-in-txt-datei-loeschen-131295.html

Ausgedruckt am: 28.12.2024 um 11:12 Uhr

Snowman25
Snowman25 09.12.2009 um 11:14:33 Uhr
Goto Top
hallo,

benutz edlin dazu:
edlin lawl.txt<commd
wobei in der Datei 'commd' (Ohne Dateierweiterung!) die commandos stehen. z.B.:
1D
E
beachte die Leerzeile!

nachteil bei Edlin: du bekommst ein SUB-Sonderzeichen bzw. ein  ans ende der Datei gesetzt...
Lässt sich aber mit z.B.
Echo. >>lawl.txt
beheben, wobei du dann aber 'ne 2. leerzeile unten dran bekommst
TsukiSan
TsukiSan 09.12.2009 um 15:01:22 Uhr
Goto Top
Falls es in VBS sein darf, dann eventuell so:
Pfad = "C:\Test.txt"  
ZeilenMax = 30

Set FSO = CreateObject("Scripting.FileSystemObject")  

Set Zeilen = FSO.OpenTextFile(Pfad,1)
	ZeilenEinzel = Split(Zeilen.ReadAll,vbCrLf)
Zeilen.Close

If Ubound(Zeileneinzel) > (ZeilenMax -1) then
	For i = Ubound(Zeileneinzel) - 30 to Ubound(Zeileneinzel)
		If not i = Ubound(Zeileneinzel) Then
			 ZeilenNeu = ZeilenNeu & Zeileneinzel(i) & vbCrLf
		Else
			ZeilenNeu = ZeilenNeu & Zeileneinzel(i)
		End If
	next
	
	Set Zeilen = FSO.CreateTextFile(Pfad, True)
	Zeilen.Write (ZeilenNeu)
	Zeilen.Close
End If

Gruss
Tsuki
5t8d1e
5t8d1e 09.12.2009 um 16:11:33 Uhr
Goto Top
Hallo,

hier ein kleines Beispiel:

SET Counter=0
SET File=admin.txt
for /f %%i in (%File%) do @set /a Counter+=1
SET last30=%counter%
SET /a last30-=30
for /f "skip=%last30%" %%i in (%File%) do @echo %%i  

Du kannst die Ausgabe der 2. Schleife pipen und danach die Dateien umbennen.
bastla
bastla 09.12.2009 um 18:39:35 Uhr
Goto Top
@5t8d1e
Wenn Leerzeilen unter den Tisch fallen dürfen, würde ich das auch so ähnlich machen - ansonsten:
@echo off & setlocal
set "File=D:\admin.txt"  
set /a Lines=30

set /a Counter=0
set "TmpFile=%temp%\tail.txt"  
for /f "delims=:" %%i in ('findstr /n "^" "%File%"') do set Counter=%%i  
set /a Latest=Counter-Lines
if %Latest% gtr 0 (
    more +%Latest% "%File%">"%TmpFile%"  
    move "%TmpFile%" "%File%"  
)
Da es hier nur um wenige Zeilen zu gehen scheint und "more +n", falls ich das richtig im Hinterkopf habe, erst ab 65.536 Zeilen zu zicken beginnt, sollte das eigentlich funktionieren ...

Grüße
bastla
bastla
bastla 09.12.2009 um 22:06:58 Uhr
Goto Top
@tsuki
Als Alternative zum Vermeiden der Zeilenschaltung nach der letzten Zeile könntest Du auch folgende Vorgangsweise (erspart die Abfrage in jedem Schleifendurchlauf) verwenden:
For i = UBound(Zeileneinzel) - 29 to UBound(Zeileneinzel) 
    ZeilenNeu = ZeilenNeu & vbCrLf & Zeileneinzel(i)
Next
ZeilenNeu = Mid(ZeilenNeu, 3) 'CrLf am Anfang der ersten Zeile entfernen  
Grüße
bastla
TsukiSan
TsukiSan 09.12.2009 um 22:52:17 Uhr
Goto Top
@bastla,

das ist natürlich auch 'ne Idee, das Progrämmchen schneller zu bekommen face-wink

Danke!

Gruss
Tsuki
ConsTricTa
ConsTricTa 09.12.2009 um 23:20:45 Uhr
Goto Top
dankeschön an allle für die lösungen! werd mir das bei nächster gelgenheit genauer ansehen und versuchen durchzublicken ;)

grüße
ConsTricTa
ConsTricTa 16.12.2009 um 16:31:09 Uhr
Goto Top
ok danke hab alles durchprobiert und danke euch alle für die vielen vorschläge!!!
echt klasse

gruß
julian