Über Batch letzte Zeile in TXT ersetzen bzw löschen
Hi zusammen,
habe leider keine vergleichbaren Themen hier gefunden. Deswegen zu meiner Frage. Ich habe eine Textdatei bereits bearbeitet und möchte nur dass die letzte Zeile gelöscht wird bzw ersetzt. Das Problem hierbei ist, dass die Datei nicht mit einem Carriage Return enden soll, da sonst das Programm dass die Datei einliest Fehler bringt.
Bin sehr dankbar für jede Hilfe.
Gruß Sven
habe leider keine vergleichbaren Themen hier gefunden. Deswegen zu meiner Frage. Ich habe eine Textdatei bereits bearbeitet und möchte nur dass die letzte Zeile gelöscht wird bzw ersetzt. Das Problem hierbei ist, dass die Datei nicht mit einem Carriage Return enden soll, da sonst das Programm dass die Datei einliest Fehler bringt.
Bin sehr dankbar für jede Hilfe.
Gruß Sven
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 100029
Url: https://administrator.de/contentid/100029
Ausgedruckt am: 16.11.2024 um 03:11 Uhr
3 Kommentare
Neuester Kommentar
Hallo brainbug84!
Am saubersten bekommst Du das unter Verwendung von (temporärem) VBScript hin, etwa:
Da Du Dich in Deiner Beschreibung anscheinend nicht entscheiden konntest, ob nun die letzte Zeile gelöscht oder ersetzt werden soll, kannst Du dies im Batch über die Zuweisung zur Variablen %Zeile% in Zeile 3 steuern:
Wenn dort, wie im Beispiel, ein Text angegeben wird, so ersetzt dieser die derzeit letzte Zeile in der Datei.
Verwendest Du die Schreibweise
so wird die letzte Zeile der Datei entfernt.
Grüße
bastla
Am saubersten bekommst Du das unter Verwendung von (temporärem) VBScript hin, etwa:
@echo off & setlocal
set "Datei=D:\Deine Datei.txt"
set "Zeile=Neue letzte Zeile"
set D=%temp%\DelLastLine.vbs
>%D% echo Set fso=CreateObject("Scripting.FileSystemObject"):F=WScript.Arguments(0):If WScript.Arguments.Count^>1 Then E=WScript.Arguments(1)
>>%D% echo T=Split(fso.OpenTextFile(F).ReadAll, vbCrLF):Set O=fso.CreateTextFile(F,True):If E="" Then D=2 Else D=1
>>%D% echo For i = 0 To UBound(T)-D:O.WriteLine T(i):Next:If E="" Then O.Write T(i):Else:o.Write E:End If:O.Close
cscript //nologo %D% "%Datei%" "%Zeile%"
Wenn dort, wie im Beispiel, ein Text angegeben wird, so ersetzt dieser die derzeit letzte Zeile in der Datei.
Verwendest Du die Schreibweise
set Zeile=
Grüße
bastla
Hallo brainbug84!
Wenn die letzte Zeile nicht ersetzt, sondern gelöscht werden soll, einfach den "Ersatztext" weglassen und die Zeile 3 so schreiben:
<code type"=plain">set Zeile=
Falls Dich die VBS-Variante trotzdem interessieren sollte, hier die ausführliche Form (mit Kommentaren):
Grüße
bastla
Aber nur mit Batch-Befehlen funktioniert das dann nicht oder?
Unter Verwendung eines Nachbarthread dargestellten "Letzte-Zeilen-Lösch"-Batches) ließe sich das auch per native Batch realisieren:@echo off & setlocal
set "Datei=D:\Deine Datei.txt"
set "Zeile=Die ganz neue letzte Zeile"
set "Bak=bak"
set "Ret=%temp%\ret"
set Anzahl=0
for /f "delims=:" %%i in ('findstr /n "^" "%Datei%"') do set Anzahl=%%i
set /a MitCR=%Anzahl%-2
set /a OhneCR=%Anzahl%-1
if %MitCR% leq 0 (
echo Die Datei "%Datei%" enthaelt zu wenig Zeilen!
goto :eof
)
move "%Datei%" "%Datei%.%Bak%"
echo\>%Ret%
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%.%Bak%"') do (
if %%i leq %MitCR% (>>"%Datei%" echo\%%j)
if %%i equ %OhneCR% (
if defined Zeile (
set /p=%Zeile%<%Ret%>>"%Datei%"
) else (
set /p=%%j<%Ret%>>"%Datei%"
)
)
)
<code type"=plain">set Zeile=
Falls Dich die VBS-Variante trotzdem interessieren sollte, hier die ausführliche Form (mit Kommentaren):
'Für Dateizugriff benötigtes Objekt erzeugen
Set fso=CreateObject("Scripting.FileSystemObject")
'Ersten Aufrufparameter (=Dateiname) einlesen
F=WScript.Arguments(0)
'Falls es mehr als einen Parameter gibt: Zweiten Parameter (=Neue Zeile) einlesen
If WScript.Arguments.Count>1 Then E=WScript.Arguments(1)
'Gesamte Textdatei (lt Parameter 1) in ein Array einlesen
'Ergebnis: Zeilen befinden sich in T(0) bis T(Zeilenanzahl - 1)
T=Split(fso.OpenTextFile(F).ReadAll, vbCrLF)
'Ausgabe in Datei vorbereiten (vorhandene Datei dabei überschreiben)
Set O=fso.CreateTextFile(F,True)
'Abhängig davon, ob ein Ersetzen der letzten Zeile stattfinden soll,
'die Anzahl der am Ende nicht mit CR auszugebenden Zeilen festlegen
If E="" Then D=2 Else D=1
'Alle Zeilen vom Beginn der Datei bis zur letzten mit CR auszugebenden Zeile
(= vorletzte oder vorvorletzte, abhängig vom Inhalt der Variablen D) durchgehen ...
For i = 0 To UBound(T)-D
'... und in Datei schreiben (Abschluss mit CR)
O.WriteLine T(i)
Next
'Wenn die letzte Zeile nicht ersetzt werden soll ...
If E="" Then
'... vorletzte Zeile ohne CR schreiben,
O.Write T(i)
'ansonsten ...
Else
'... Ersatzzeile ohne CR schreiben
O.Write E
End If
'Datei schließen
O.Close
bastla