-fritz-
Goto Top

Batch textdatei die - letzten letzte zeilen zeile - löschen

HALLO

ich hab schon viel gesucht
und einiges gefunden face-wink

aber bei mir ist es so das ich bein einer textdatei per batch nur die letzten zeilen löschen will
ab zeile 5 oder 7.
nur die letzten !! face-monkey
oder bestimmte

wie wird das ausgeführt ?

1. ab zeile 5 alles löschen
2. eine bestimmte zeile löschen z.b zeile 7
_____

BTW:
kennt jemand eine gute seite (kostenlos) wo alle befehle batch/cmd (windows XP)
aufgeführt werden ?
aber wirklich alle und nicht nur die gängigen

auch z.b befehle wie
beispiel.exe c:\beispielvideo.avi

und ähnliche "allgemeine" befehle

und vielleicht mit kurzer beschreibung und syntax

Content-Key: 75417

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

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

Member: Biber
Biber Dec 06, 2007 at 19:36:01 (UTC)
Goto Top
Moin -FRITZ-,

willkommen im Forum.
Mit Batch kannst Du nicht bestimmte Zeilen in einer Textdatei aufgrund der Zeilennummer löschen.
Eigentlich.

Dieses Vorgehen können nur Editoren (oder andere Programme) machen, die als Strategie implementiert haben "Hey, ich lade ein bestehende oder auch neu zu erstellende Datei KOMPLETT. Und egal, ob da vorher keine Zeilen drin waren und nach dem Editieren 50000 oder umgekehrt - ich schreibe die Datei komplett wieder neu."
So kann es NotePad oder Word, so können es Skriptsprachen wie VBSkript, wenn sie Funktionen wie (sinngemäß) ReadAll()/WriteAll und einen Buffer reservieren können, in den 50000 Zeilen reinpassen.

Batch kann das nicht. Damit kannst Du traurigerweise nur:
  • jeweils ZEILENweise eine Zeile lesen AUS einer Datei (Input) und im gleichen Schritt Output erzeugen (z.B. in eine andere Datei).

Ende der harten Wahrheit. Tut mir Leid.
So, jetzt Tränchen abtrocknen, machen wir das Beste draus..

Was Batch nicht kann, ist eigentlich unwichtig, schauen wir lieber die Möglichkeiten an.
Batch kann erfreulicherweise andererseits:
  • jeweils ZEILENweise eine Zeile lesen AUS einer Datei (Input) und im gleichen Schritt Output erzeugen (z.B. in eine andere Datei).

Und das reicht doch vollkommen.
Somit kannst Du mit folgendem Einzeiler ziemlich flexibel alle Deine Wünsche fast erfüllen:
::---snipp ShowLines.bat Aufruf Showlines datei [LSS|EQU|GTR|NEQ...] lineNo 
@for /f "delims=: tokens=1,*" %%i in ('findstr /n $ "%~1"') do @If %%i %2 %3  @echo %%j  

Dieser Oneliner (der eigentlich nur ein etwas benutzerfreundlich gestaltetes CMD-Prompt-Kommando ist), der zeigt Dir bestimmte Zeilen, alle Zeilen außer.., alle Zeilen ab.. oder alle Zeilen bis Zeilennummer einer Textdatei.

Beispiel:
ShowLines test.txt EQU 7 ------> zeigt Zeile 7 der Textdatei test.txt.
ShowLines test.txt LSS 7 ------> zeigt Zeilen Kleiner 7 der Textdatei test.txt.
ShowLines test.txt GTR 7 ------> zeigt Zeilen größer 7 der Textdatei test.txt.
ShowLines test.txt NEQ 7 ------> zeigt Zeilen außer Zeile 7 der Textdatei test.txt.
usw.

Mit diesem Mini-Batch kannst Du also, um auf Deine Wünsche zurückzukommen, alle Zeilen bis Zeile x oder alle Zeilen ab Zeile y oder alle Zeilen außer z aus einen INPUT (test.txt) auf den Bildschirm oder in einen anderen Output (z.B. Datei testneu.txt) schreiben.

Beispiel:
ShowLines test.txt LSS 7>testneu.txt
------> schreibt alle Zeilen kleiner Zeile 7 der Textdatei test.txt in eine neue Datei.

Für den Sonderfall, dass Du nicht absolute Zeilen "löschen" willst, sondern relative ("die letzten 5") musst Du erst mit "findstr /n $ test.tst" nachschauen, wieviele Zeilen denn in Deiner Datei sind.

Mehr geht nicht mit Batch. Bzw. ich habe es noch nicht herausgefunden.

Grüße
Biber
P.S. und wie man/frau mit Batch Simpson-Videos startet, das weiß ich auch nicht.
Member: bastla
bastla Dec 06, 2007 at 19:44:40 (UTC)
Goto Top
Hallo -FRITZ- und willkommen im Forum!

Wenn's denn tatsächlich Batch (und nicht etwa VBS) sein soll, etwa so:
1. ab zeile 5 alles löschen
@echo off & setlocal
set "InFile=Z:\Text.txt"  
set "OutFile=Z:\Erg.txt"  
set /a LineToDeleteFrom=5

if exist "%OutFile%" del "%OutFile%"  
for /f "tokens=1* delims=:" %%i in ('findstr /n $ "%InFile%"') do if %%i lss %LineToDeleteFrom% if "%%j"=="" (echo.>>"%OutFile%") else echo %%j>>"%OutFile%"  

2. eine bestimmte zeile löschen z.b zeile 7
@echo off & setlocal
set "InFile=Z:\Text.txt"  
set "OutFile=Z:\Erg.txt"  
set LineToDelete=7

if exist "%OutFile%" del "%OutFile%"  
for /f "tokens=1* delims=:" %%i in ('findstr /n $ "%InFile%"^|findstr /b "%LineToDelete%:"') do findstr /v /b /c:"%%j" "%InFile%">>"%OutFile%"  
In beiden Fällen dient "findstr /n $" dem Suchen aller Zeilen (die ein Zeilenende haben face-wink), um diese nummeriert weitergeben zu können.

Im ersten Fall wird die Nummer als Entscheidungskriterium, ob die jeweilige Zeile noch auszugeben ist, verwendet. Falls ja (da Zeilennummer in %%i < %LineToDeleteFrom%) muss noch untersucht werden, ob es sich um eine Leerzeile handelt (um ggf mit "echo." wieder eine solche zu erzeugen).

Im zweiten Fall wird anhand der Zeilennummer der Inhalt der zu löschenden Zeile (= %%j) gesucht und mit "findstr /v" diese Zeile herausgefiltert (= alle übrigen werden ausgegeben).

Grüße
bastla

[Edit] @Biber - Na ja, mit eleganten Onelinern kann man/frau leicht schnell sein ... face-wink Außerdem musste ich noch eine Kirche um's Kreuz befördern. face-sad [/Edit]
Member: Biber
Biber Dec 06, 2007 at 20:02:39 (UTC)
Goto Top
@bastla
Was schreibst Du denn da alles? Heb Dir noch ein paar Zeilen auf für den Wunschzettel...

Er hat doch nur gefragt, ob wir gute Seiten lau für dau kennen, nicht ob wir mal eben welche hinschrubbeln können vor dem Abendessen.. face-wink

Grüße
Biber
Member: -FRITZ-
-FRITZ- Dec 08, 2007 at 21:51:27 (UTC)
Goto Top
*sorry für die verspätete rückmeldung

wieso gibts hier kein BBCode face-wink

also erstmal DANKE

sind beides nützliche lösungen

@bastla

O.K das beispiel hab ich so grob verstanden //syntax/ablauf
funktioniert auch >> ohne probleme

und ist für diesen fall praktisch gesehen die bessere alternative
dazu bei biber mehr

und alles sehr praktisch erklärt >> face-smile DANKE

@Biber

O.K das beispiel funktioniert auch

also showlines.bat erstellt und
dann entweder EQU 7, LSS 7, GTR 7, NEQ 7,

das unpraktische ist nur, das dieser oneliner(selbst) mit in die original .bat (batch) miteingebaut
werden müsste, da es ein batch ist welches sich ein benutzer herunterlädt
und ausführt >> alles ohne konkrete verzeichnisangaben
alles wird am "verwendeten ort" (verzeichnis) gespeichert

so richtig verstanden hab ich das beispiel noch nicht //ablauf/syntax
muss mich da noch ein bißchen reindenken

BTW: für was sind eigentlich diese "befehle" (/ for -optionen ?) equ, lss, gtr, neq

BTW2: ein video starten mit einer .bat (batch) funktioniert z.b so
wenn z.b der vlc media player im verzeichnis C:\vlc installiert ist //die vlc.exe

dann das video starten mit
c:\vlc\vlc.exe c:\simpsons\simpsonsvideo.avi

funktioniert auch mit anderen orten (streams z.b)

c:\vlc\vlc.exe http://stream.de/streamvideo.asx

PS:
Er hat doch nur gefragt, ob wir gute Seiten
lau für dau kennen,
nicht ob wir mal eben welche hinschrubbeln
können vor dem
Abendessen.. face-wink

schnell hingeschrubbelt wär für mich auch O.K

>>
vielleicht hat aber auch jemand ein paar (sites) empfehlungen
Member: Biber
Biber Dec 09, 2007 at 10:50:06 (UTC)
Goto Top
Moin -FRITZ-,

mein Einzeiler sollte auch kein fertiges produktiv einsetzbares Skript sein, sondern nur das grundsätzliche Wesen des Arbeitens mit den CMD-Befehlen aufzeigen.
Und dort ist es eben so, dass Du eben nicht so mächtige "Bausteine" wie eine Funktion "Zeige mir ein explorerähnliches Auswahlfenster zum Wählen der Zieldatei" als kombinierbare Objekte zur Verfügung hast, sondern Dir schon eine Ebene tiefer erst mal ein paar wiederverwendbare Minimodule basteln musst.

Und gerade das (nicht abgesprochene) Zusammenspiel mit bastlas gepostetem Kommentar zeigt dann die möglichen Strategien:
  • entweder kommt eine kurze Lösung raus für einen genau abgegrenzten Spezialfall
  • oder es kommen eben nur ein paar etwas flexiblere wiederverwendbare Puzzlesteine raus, aus denen es sich vielleicht schneller zusammenkombinieren lässt - aber es ist nicht fertig.

Die Vergleichoperatoren EQU, LSS, GTR,... sind in der Hilfe zu IF ("IF /?" am CMD-Prompt) beschrieben.

Links zu ein paar Seiten, die Batch/CMD-Feinheiten diskutieren findest Du unter "Links" im Bereich "Batch & Shell". Mehr Tipps dazu haben wir hier im Forum wahrscheinlich nicht, da wir hier eigentlich auch nur gelegentlich ein paar Gebrauchsbätche quick & dirty zusammenschroten und das Ganze eher spielerisch denn zu Lehrzwecken betreiben.

Grüße
Biber
Member: -FRITZ-
-FRITZ- Dec 09, 2007 at 15:55:52 (UTC)
Goto Top
nochmals DANKE

also beide lösungen sind für mich sehr hilfreich
praktisch und theoretisch (zur verständnis)

um die hilfe zu FOR /? SET /? IF /? hab ich erstmal(kurzfristig) einen bogen gemacht face-wink
________________________________________________________

  • den oneliner zu integrieren funktioniert auch //aber

z.b einfach in die erste zeile der original batch (die sich ein benutzer runterlädt)
ein
echo "//oneliner zeile//" >showlines.bat   

einfügen funktioniert nicht // %% usw. gehen verloren
zur info

deshalb muss der oneliner als kommentar eingefügt werden und dann ausgelesen werden

::@for /f "delims=: tokens=1,*" %%i in ('findstr /n $ "%~1"') do @If %%i %2 %3  @echo %%j   

set "InFile=original.bat"  
set "OutFile=showlines.bat"  
set /a LineToDeleteFrom=2

for /f "tokens=1* delims=:" %%i in ('findstr /n $ "%InFile%"') do if %%i lss %LineToDeleteFrom% if "%%j"=="" (echo.>>"%OutFile%") else echo %%j>>"%OutFile%"  

dadurch wird dann die showlines.bat erzeugt mit "oneliner" inhalt
und kann danach von der original.bat aus "angesprochen" werden

am schluss können dann zur "bereinigung" alle nicht mehr benötigten erzeugten dateien gelöscht
werden >>
wenn das schnell genug geht bekommt der benutzer das eigentlich sowieso nicht mit
Member: Xalimeo
Xalimeo Jan 01, 2008 at 18:20:12 (UTC)
Goto Top
[quote]BTW:
kennt jemand eine gute seite (kostenlos) wo alle befehle batch/cmd (windows XP)
aufgeführt werden ?
aber wirklich alle und nicht nur die gängigen

auch z.b befehle wie
beispiel.exe c:\beispielvideo.avi

und ähnliche "allgemeine" befehle

und vielleicht mit kurzer beschreibung und syntax[/quote]

Also ich lese im Normalfall eigentlich immer die Hilfedatei des jeweiligen Programms (Oft unter Stichwort "Aufruf", "CMD", "Commandline" oder ähnlich im Index der Hilfe zu finden). Dort sind dann auch meistens die jeweiligen CMD-Befehle, etc des Programms beschrieben (wenn sie existieren).
Ansonsten hilft meist auch "Google->[Name des Programms] commandline->Suchen" gut weiter.

Ich bezweifle, dass es eine einzige Seite gibt, die sich mit der ganzen Masse an Programmen beschäftigt und für jedes einzelne Program die CMD-Befehle dokumentiert hat, da es wie schon gesagt sehr viel einfacher ist, einfach mal die Hilfe-Datei zu lesen.
Member: Alme123
Alme123 May 02, 2012 at 16:14:45 (UTC)
Goto Top
hallo Xalimeo,

schon lange her dein Beitrag, aber ich habe eine Seite gefunden!

Sogar vom Hersteller selbst: http://technet.microsoft.com/de-de/library/cc778084%28v=ws.10%29.aspx face-smile

Ich hoffe, dass ist das richtige!

Alme123
Mitglied: 106009
106009 May 02, 2012 at 16:26:13 (UTC)
Goto Top
Herr, lass Hirn regnen. Und bitte, bitte sorge dafür, dass Alme123 wenigstens diesmal was davon abbekommt!
Member: Alme123
Alme123 May 02, 2012 at 16:47:53 (UTC)
Goto Top
...

Was ist an dem Link auszusetzen?
Member: Biber
Biber May 02, 2012 at 17:01:54 (UTC)
Goto Top
Moin Alme123,


Zitat von @Alme123:
...

Was ist an dem Link auszusetzen?
Ich sach mal so...

in anderen Lebensbereichen -z.B. in Scheidungsprozessen - könnte ein solcher Dialog
"Kannst du mir mal das Salz reichen, Schatz?"
"Gerne, Liebling"
fatale Konsequenzen haben, wenn er sich uber fünf Jahre hinzieht.

Zum anderen ist diese Webseite in einer stilisierten, aber erkennbaren Version auch Offline verfügbar auf vielen Windows-Rechnern.

Aber ist auch egal - ihr braucht das Thema bitte hier nicht vertiefen.

Fragt mich einfach per PN, wenn irgendetwas unklar sein sollte. face-wink

Grüße
Biber