Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Per Batch die letzte Zeile aus einer anderen Batch entfernen

Frage Entwicklung Batch & Shell

Mitglied: Bjoern909

Bjoern909 (Level 1) - Jetzt verbinden

02.02.2008, aktualisiert 03.02.2008, 10237 Aufrufe, 5 Kommentare

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
Mitglied: bastla
02.02.2008 um 17:03 Uhr
Hallo Bjoern909!

Soferne das die einzige Zeile mit dem Inhalt "goto :neu" wäre:
01.
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?
Bitte warten ..
Mitglied: bastla
02.02.2008 um 19:16 Uhr
... um aber tatsächlich die letzte Zeile zu entfernen (und auch etwas über "for" zu erfahren):
01.
@echo off & setlocal 
02.
set "Datei=D:\DeinBatch.bat" 
03.
 
04.
set "Bak=%Datei%.bak" 
05.
move "%Datei%" "%Bak%" 
06.
for /f "delims=:" %%i in ('findstr /n $ "%Bak%"') do set EntfZeile=%%i 
07.
for /f "tokens=1* delims=:" %%i in ('findstr /n $ "%Bak%"') do if %%i neq %EntfZeile% echo.%%j>>"%Datei%"
Erklärung: Mit
01.
findstr /n $ "%Bak%"
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 ...
Bitte warten ..
Mitglied: Bjoern909
02.02.2008 um 20:47 Uhr
Wenn ich den Code hier benutze, ...:

@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%"

... dann werden irgendwie alle meine Doppelpunkte aus der Batch entfernt.
wie kann man das verhindern?
Bitte warten ..
Mitglied: bastla
02.02.2008 um 21:53 Uhr
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:
01.
for /f "delims=[]" %%i in ('type "%Bak%"^|find /v /n "§§§§"') do set EntfZeile=%%i 
02.
for /f "tokens=1* delims=[]" %%i in ('type "%Bak%"^|find /v /n "§§§§"') do if %%i neq %EntfZeile% echo.%%j>>"%Datei%"
Anstelle von "§§§§" kannst Du auch jede andere in Deinem Batch sicher nicht enthaltene Zeichenfolge verwenden.

Grüße
bastla
Bitte warten ..
Mitglied: Bjoern909
03.02.2008 um 09:04 Uhr
okay das Funktioniert. Danke für die schnellen antworten Bastla.

MfG Bjoern
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Batch bestimme Zeile einer vorherigen batch einfügen (9)

Frage von Frensche zum Thema Batch & Shell ...

Batch & Shell
Bei copy aus FOR Schleife wird letzte Zeile abgeschnitten

Frage von miczar zum Thema Batch & Shell ...

Windows 7
Texte weisen Fehler auf letzte Zeile wie Barcod Striche (3)

Frage von Nemonautilus zum Thema Windows 7 ...

Neue Wissensbeiträge
Heiß diskutierte Inhalte
Windows Server
WIndows Server 2016 core auf dem Intel NUC NUC5i5RYK i5 5250U (17)

Frage von IxxZett zum Thema Windows Server ...

Windows Server
gelöst Einzelnes Windows Update über GPO deinstallieren (16)

Frage von lordofremixes zum Thema Windows Server ...