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, 10202 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.
Mit freundlichen Grüßen 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.

Mit freundlichen Grüßen Bjoern
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung!

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

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

Frage von Nemonautilus zum Thema Windows 7 ...

Batch & Shell
gelöst Mittels Batch jede Zeile einer Textdatei prüfen (4)

Frage von Peter32 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...