Per Batch die letzte Zeile aus einer anderen Batch entfernen
Hallo an alle.
Ich brauche inen Befehl der die letzte Zeile aus einer Batch datei löscht. DIe letzte Zeile dieser batch datei ist immer "goto :neu" (falls ihr das braucht)
Falls dies nur durch den Befehl FOR funktioniert. >> Kann mir einer das mit den For erklären? Ich hab mir in cmd >> help schon FOR/? angeguckt aber ich werde daraus nicht dichtig schlau.
Also nochmal kurzfassend:
1. Befhel für das löschen der letzten Zeile aus einer Batch datei.
2. Erklärung von For
Ich sage schon mal im Vorraus DANKE.
MfG Bjoern
Ich brauche inen Befehl der die letzte Zeile aus einer Batch datei löscht. DIe letzte Zeile dieser batch datei ist immer "goto :neu" (falls ihr das braucht)
Falls dies nur durch den Befehl FOR funktioniert. >> Kann mir einer das mit den For erklären? Ich hab mir in cmd >> help schon FOR/? angeguckt aber ich werde daraus nicht dichtig schlau.
Also nochmal kurzfassend:
1. Befhel für das löschen der letzten Zeile aus einer Batch datei.
2. Erklärung von For
Ich sage schon mal im Vorraus DANKE.
MfG Bjoern
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 79750
Url: https://administrator.de/contentid/79750
Ausgedruckt am: 22.11.2024 um 22:11 Uhr
5 Kommentare
Neuester Kommentar
Hallo Bjoern909!
Soferne das die einzige Zeile mit dem Inhalt "goto :neu" wäre:
Grüße
bastla
P.S.: Was hast Du eigentlich mit diesen ganzen "Batch-Veränderungen" vor? Wäre es nicht ev einfacher, die vorhandenen Batches durch gänzlich neue Versionen zu ersetzen?
Soferne das die einzige Zeile mit dem Inhalt "goto :neu" wäre:
findstr /v /c:"goto :neu" D:\DeinBatch.bat > D:\DeinKuerzererBatch.bat
Grüße
bastla
P.S.: Was hast Du eigentlich mit diesen ganzen "Batch-Veränderungen" vor? Wäre es nicht ev einfacher, die vorhandenen Batches durch gänzlich neue Versionen zu ersetzen?
... um aber tatsächlich die letzte Zeile zu entfernen (und auch etwas über "for" zu erfahren):
Erklärung: Mit
wird die gesamte Textdatei %Bak% (also die umbenannte Ausgangsdatei) mit vorangestellter Zeilennummer (und ":" als Trennzeichen) ausgegeben.
Die erste "for /f"-Schleife liest diese Ausgabe zeilenweise aus und zerlegt sie anhand des mit "delims=" angegebenen Trennzeichens, hier also ":". Ohne spezielle Angabe der gewünschten Teilstücke ("tokens") wird nur der jeweils erste Teil verwendet, in diesem Fall also die Zeilennummer. Diese steht für jede einzelne Zeile in der Schleifenvariablen %%i und wird jeweils in die Variable %EntfZeile% geschrieben. Der vorherige Wert dieser Variablen wird dabei immer durch den neuen Wert überschrieben - als Endergebnis steht nach der Schleife die Zeilennummer der letzten Zeile in %EntfZeile%.
Die zweite "for /f"-Schleife erhält ebenfalls als "Eingabe" die nummerierte Ausgabe der Textzeilen, zerlegt allerdings jede dieser Zeilen in die Teile ("tokens") 1 (= alles vor dem ersten ":") und * (= der Rest der Zeile bzw alle übrigen "tokens" ohne Unterteilung durch ev vorhandene zusätzliche Trennzeichen und somit die ursprüngliche Zeile).
Die angegebene Schleifenvariable %%i steht dann für den ersten verwendeten Teil, und die (alphabetisch) folgende Variable %%j für den zweiten Teil dieser Zerlegung.
Der Vergleich der in %EntfZeile% abgelegten Zeilennummer der letzten Zeile und der in %%i stehenden Nummer der aktuellen Zeile sorgt dafür, dass in allen Fälle, in welchen diese Nummern nicht übereinstimmen (also "not equal" = "neq" sind) die Zeile (= Teil 2 und daher %%j) in die Ausgabedatei geschrieben wird. Erst bei der letzten Zeile stimmen die Zeilennummern überein und daher wird diese Zeile nicht geschrieben.
Der "." in "echo.%%j" dient übrigens dazu, auch Leerzeilen wieder in die Ausgabedatei zu bekommen - ein "echo %%j" alleine würde für eine Leerzeile zur unschönen Ausgabe "ECHO ist eingeschaltet (ON)." führen. Bei einem Durchlaufen der Datei mit der "for /f"-Schleife ohne Verwendung von "findstr /n" (zur Zeilennummerierung) würden Leerzeilen einfach ignoriert und wären dann in der Ausgabedatei gar nicht mehr vorhanden.
Du kannst das Ganze übrigens besser nachvollziehen, wenn Du auf das "@echo off" verzichtest - dann werden die einzelnen Befehle (mit aufgelösten Variableninhalten) angezeigt.
Grüße
bastla
P.S.: Anstatt "im Vorraus DANKE." zu sagen fände ich es sinnvoller, Du würdest im Voraus Deinen Beitrag ein weiteres Mal lesen und zumindest die offensichtlichsten Fehler daraus entfernen ...
@echo off & setlocal
set "Datei=D:\DeinBatch.bat"
set "Bak=%Datei%.bak"
move "%Datei%" "%Bak%"
for /f "delims=:" %%i in ('findstr /n $ "%Bak%"') do set EntfZeile=%%i
for /f "tokens=1* delims=:" %%i in ('findstr /n $ "%Bak%"') do if %%i neq %EntfZeile% echo.%%j>>"%Datei%"
findstr /n $ "%Bak%"
Die erste "for /f"-Schleife liest diese Ausgabe zeilenweise aus und zerlegt sie anhand des mit "delims=" angegebenen Trennzeichens, hier also ":". Ohne spezielle Angabe der gewünschten Teilstücke ("tokens") wird nur der jeweils erste Teil verwendet, in diesem Fall also die Zeilennummer. Diese steht für jede einzelne Zeile in der Schleifenvariablen %%i und wird jeweils in die Variable %EntfZeile% geschrieben. Der vorherige Wert dieser Variablen wird dabei immer durch den neuen Wert überschrieben - als Endergebnis steht nach der Schleife die Zeilennummer der letzten Zeile in %EntfZeile%.
Die zweite "for /f"-Schleife erhält ebenfalls als "Eingabe" die nummerierte Ausgabe der Textzeilen, zerlegt allerdings jede dieser Zeilen in die Teile ("tokens") 1 (= alles vor dem ersten ":") und * (= der Rest der Zeile bzw alle übrigen "tokens" ohne Unterteilung durch ev vorhandene zusätzliche Trennzeichen und somit die ursprüngliche Zeile).
Die angegebene Schleifenvariable %%i steht dann für den ersten verwendeten Teil, und die (alphabetisch) folgende Variable %%j für den zweiten Teil dieser Zerlegung.
Der Vergleich der in %EntfZeile% abgelegten Zeilennummer der letzten Zeile und der in %%i stehenden Nummer der aktuellen Zeile sorgt dafür, dass in allen Fälle, in welchen diese Nummern nicht übereinstimmen (also "not equal" = "neq" sind) die Zeile (= Teil 2 und daher %%j) in die Ausgabedatei geschrieben wird. Erst bei der letzten Zeile stimmen die Zeilennummern überein und daher wird diese Zeile nicht geschrieben.
Der "." in "echo.%%j" dient übrigens dazu, auch Leerzeilen wieder in die Ausgabedatei zu bekommen - ein "echo %%j" alleine würde für eine Leerzeile zur unschönen Ausgabe "ECHO ist eingeschaltet (ON)." führen. Bei einem Durchlaufen der Datei mit der "for /f"-Schleife ohne Verwendung von "findstr /n" (zur Zeilennummerierung) würden Leerzeilen einfach ignoriert und wären dann in der Ausgabedatei gar nicht mehr vorhanden.
Du kannst das Ganze übrigens besser nachvollziehen, wenn Du auf das "@echo off" verzichtest - dann werden die einzelnen Befehle (mit aufgelösten Variableninhalten) angezeigt.
Grüße
bastla
P.S.: Anstatt "im Vorraus DANKE." zu sagen fände ich es sinnvoller, Du würdest im Voraus Deinen Beitrag ein weiteres Mal lesen und zumindest die offensichtlichsten Fehler daraus entfernen ...
Hallo Bjoern909!
Auch wenn "alle meine Doppelpunkte" denn doch etwas übertrieben sein dürfte (betroffen sind nur jene am Zeilenanfang), ist eine Korrektur aber natürlich trotzdem erforderlich ...
Ersetze die beiden "for"-Zeilen durch:
Anstelle von "§§§§" kannst Du auch jede andere in Deinem Batch sicher nicht enthaltene Zeichenfolge verwenden.
Grüße
bastla
Auch wenn "alle meine Doppelpunkte" denn doch etwas übertrieben sein dürfte (betroffen sind nur jene am Zeilenanfang), ist eine Korrektur aber natürlich trotzdem erforderlich ...
Ersetze die beiden "for"-Zeilen durch:
for /f "delims=" %%i in ('type "%Bak%"^|find /v /n "§§§§"') do set EntfZeile=%%i
for /f "tokens=1* delims=" %%i in ('type "%Bak%"^|find /v /n "§§§§"') do if %%i neq %EntfZeile% echo.%%j>>"%Datei%"
Grüße
bastla