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 Dec 10, 2009 um 10:29:59 Uhr
Zitat von @5t8d1e:
Du kannst die Ausgabe der 2. Schleife pipen und danach die Dateien umbennen.
#rgc = 630

Content-Key: 131295

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

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

Member: Snowman25
Snowman25 Dec 09, 2009 at 10:14:33 (UTC)
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
Member: TsukiSan
TsukiSan Dec 09, 2009 at 14:01:22 (UTC)
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
Member: 5t8d1e
5t8d1e Dec 09, 2009 at 15:11:33 (UTC)
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.
Member: bastla
bastla Dec 09, 2009 at 17:39:35 (UTC)
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
Member: bastla
bastla Dec 09, 2009 at 21:06:58 (UTC)
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
Member: TsukiSan
TsukiSan Dec 09, 2009 at 21:52:17 (UTC)
Goto Top
@bastla,

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

Danke!

Gruss
Tsuki
Member: ConsTricTa
ConsTricTa Dec 09, 2009 at 22:20:45 (UTC)
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
Member: ConsTricTa
ConsTricTa Dec 16, 2009 at 15:31:09 (UTC)
Goto Top
ok danke hab alles durchprobiert und danke euch alle für die vielen vorschläge!!!
echt klasse

gruß
julian