If-Befehl um Zeile aus Batch-Datei zu entfernen?

Bild Nummer 1 - (Computer, PC, programmieren) Bild Nummer 2 - (Computer, PC, programmieren)

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Ok ...
was einige  so an Antworten von sich  geben  ist  haarstäubend.
...aber Hauptsache  was Antworten auch wenn es Stuss ist...

Mit etwas "if"  ist da  garnichts  zu tun.
Selbstmodfizierender Code ist  bei  Batch  schon  etwas  komplexer, da sich die Zeilenposition des nächsten Befehls nicht verändern darf während  die Batch abgearbeitet wird.  (Batchbefehle werden immer nur Zeile für Zeile aus der Datei gelesen und abgearbeitet!)
...Was weiter hinten kommt  ist Wurst...
Das zweite Problem, es gibt  keinen Befehl der einfach so eine bestimmte Zeile aus einer Datei herauslöscht. (egal in welcher Programmiersprache)
Also  bleibt  keine andere Möglickeit  als Zeile für Zeile einzulesen und neu zu schreiben. und die welche entfernt / hinzugefügt / modifiziert werden soll, wegzulassen oder entsprechend zu behandeln .

Um die Sache  nicht allzusehr zu verkomplizieren schreibe ich  die Änderungen in eine temporäre Datei und kopiere diese zurück ins Original. 

Das Problem bei deinem Ansatz ist das die zu ändernden  Zeilen mitten in der Datei stehen 
...und  sich somit beim Zeilenlöschen die Befehlsposition  verschiebt.
das Problem behebe ich indem ich  vor dem Zurückkopieren in die neu geschriebene Temporäre Batch  zum Label das  das die nächste Zeile markiert springe. (Damit spare ich  mir eine 3.temporäre Datei)
das Zurückkopieren erfolgt  dann schon aus dieser.
Danach löscht  die Hilfsddatei sich selbst.

Das  was verändert werden darf,  muss zwischen  den beiden Markren  :::::text  und ::::textend Zwei Suchschleifen ermitteln die Zeilen nummern der Marker.
und verhindern so das  bei  falscher Eingabe im wichtigen Code herumgelöscht wird.

es ist egal  welchen  Namen   du der Batch  gibst, sie  ist so intelligent zu wissen wie sie heißt. Das ist wichtig, wenn  man sich selbst verändert.

@echo off
setlocal EnableDelayedExpansion
if not .%1==. goto %1
color 0F
::mode 2000 keine ahnung was Du mit dem fehlerhafte mode-befehl erreichen möchtest?
::die folgende Zeile markiert ab wo gelöscht werden darf
:::::text
echo Frosch und Hase
echo Katz und maus
echo bla und blub
echo kotz und wuerg
::::textend
echo.
echo.
echo.
::ab hier darf nichts mehr gelöscht werden
::textanfang finden
for /f "usebackq delims=:" %%a in (`findstr /nic:":::::text" "%~0"`) do (set /a "text=%%a" & goto :break1)
:break1
::textende finden
for /f "usebackq delims=:" %%a in (`findstr /nic:"::::textend" "%~0"`) do (set /a "textend=%%a" & goto :break2)
:break2
set/p input=welche zeile soll ich löschen? :
set /a "exclude=%text%+%input%"
if %exclude% leq %text% goto fehler
if %exclude% geq %textend% goto fehler
echo Hallo von %~nx0 alt
::schreibe mich selbst in neue Batch
:copy_exlude_line
set /a "line=1"
for /f "delims=" %%a in ('type "%~0"') do (
rem fuege .tmp dem datienamen hinzu
if not !line!==%exclude% (
rem zwischdurch abschalten sonst wird wird im echo die Zeilennummer eingesetzt!
setlocal DisableDelayedExpansion
echo.%%a>>"%~n0_tmp%~x0"
endlocal
)
set /a "line+=1"
)
rem mache in neuer Batch beim label copy_back weiter
"%~n0_tmp%~x0" copy_back
:copy_back
echo Hallo von %~nx0
::entferne _tmp wieder aus dem Batchname
set "x=%~nx0"
set "resetname=%x:_tmp=%"
::geändertes Original ersetzten
copy /y "%~f0" "%~dp0%resetname%"
del /f "%~nx0" & echo fertig & pause
pause
exit /b
:fehler
echo Zeile %input% existiert nicht
pause

Bei der zweiten Variante ist  der Modifizierbare Code am Ende der Datei  deshalb besteht auch  keine Gefahr das sich die Befehlsposition verändert.
Um eine temporäre Datei zum zwischenspeichern  kommt  man aber auch  hier  nicht  vorbei  da das schreiben  der Modifizierungen in die Originaldatei mit einem einzigen Befehl erfolgen  muss!

:: Im Code der Batch dürfen bis :::::text keine Leerzeilen sein, sonst funktioniert das ganze  nicht!
::dafür kommt diese Variante ohne eine versteckten wechsel der Batch aus
@echo off
setlocal EnableDelayedExpansion
color 1F
::mode 2000 keine ahnung was Du mit dem fehlerhafte mode-befehl erreichen möchtest?
::textanfang finden
for /f "usebackq delims=:" %%a in (`findstr /nic:":::::text" "%~0"`) do (set /a "textbegin=%%a")
:: der bereich des zu modifizierenden codes muss am ende der Datei liegen und...
:: als subroutine aufgerufen werden!
call :textout
echo.
echo.
echo.
set/p input=welche zeile soll ich löschen? :
set /a "exclude=%textbegin%+%input%"
if %exclude% leq %textbegin% goto fehler
::schreibe mich selbst in neue Batch
:copy_exlude_line
set /a "line=1"
for /f "delims=" %%a in ('type "%~0"') do (
if not !line!==%exclude% (
rem zwischdurch abschalten sonst wird wird im echo die Zeilennummer eingesetzt!
setlocal DisableDelayedExpansion
echo.%%a>>"%temp%\_tmp.txt"
endlocal
)
set /a "line+=1"
)
:copy_back
copy /y "%temp%\_tmp.txt" "%~nx0"
del /f "%temp%\_tmp.txt"
echo fertig
pause
exit /b
:fehler
echo Zeile %input% existiert nicht
pause
exit /b
:textout
:::::text
echo Frosch und Hase
echo Katz und maus
echo bla und blub
echo kotz und wuerg

Aber  verrate mir  mal, was  jemand  der  keinen  blassen  Schimmer   vom  Programmieren hat,  mit  selbstmodifizierenden Code anfangen  möchte?

Das Du ein Anfänger  bist erkenne  ich schon an dem völlig sinnfreien und syntaktisch falschen Mode-Befehl.

Es wäre  doch viel einfacher den Text aus einer  externen Datei einzulesen. und die Änderungen zurück zu schreiben.
Das würde mindestens  die Hälfte an Code einsparen.

Der  meiste Code ist nötig, damit sich die Batch  bei der Aktion nicht selbst  umbringt.

Das Du den Code  überhaupt  begreifen wirst  bezweifle  ich.
Aber ich kenne  ein paar Leutchen die hier mitlesen  und sich über jede  einigermaßen schräge Problemlösung  freuen.

und  selbstmoding  hatten wir  bei  Batch  (glau ich) noch nicht.

Hat aber Spaß gemacht  :)

6

Hallo Erzesel! 

Vielen, vielen Dank für deine ausführliche Antwort!

Du liegst da ganz richtig: Ich bin noch sehr jung, interessiere mich aber schon sehr für Computer (Hard- und Software :D). Ich will mir lediglich etwas Wissen zum Programmieren aneignen, da mich das Thema wirklich fasziniert und ich mir vorstellen kann so etwas auch später beruflich zu  machen. Das ich das ganz einfach hätte zurückschreiben können war mir klar, wollte aber mal was anderes ausprobieren, so das das kleine Versuchsprogramm was ich gerade für mich selber programmieren will (zur Übung :P), etwas mehr nach einer fertigen Desktop-App aussieht, und nicht nach einem Programm, wo man erst noch im Script rumfummeln muss um eine Zeile zu löschen. Denke für so eine "Übungsapp" wäre Java auch sinnvoller aber was soll's °:). Ich habe die Codes größtenteils Verstanden, allerdings habe ich nicht genau verstanden wie du das mit den .tmp- Dateien und den ganzen Kopien meinst. Ich habe die Codes aus dem Text heraus gefiltert (also die Kommentare heraus gelassen) und in eine Batch-Datei kopiert. Beim ersten Fall war der Output zwar korrekt, also der von dir eingegebene Text ist ausgegeben worden, und auch das Eingabefeld war zu sehen. Jedoch war nach der Eingabe keine Veränderung, bzw. nur ein ,,Hallo von "Dateiname.bat" alt

Hallo von "Dateiname"_tmp.bat

1 Datei kopiert.

fertig"

zu sehen, aber auch nach Neustart war alles wieder beim Alten (also keine Textzeile wurde gelöscht [eigentliches Ziel ;)]) 

Ich gehe mal stark davon aus das ich dort einen Fehler gemacht habe, weil ich keine temporäre Datei angefertigt habe, aber vielleicht kannst du mir das ja noch einmal genauer erläutern.

P.S.: Hab mir dieses Mode-Ding damals mal in einem Tutorial abgeschaut, hab das seither immer reingeschrieben. Hab jetzt aber auch gemerkt das der Befehl an der Stelle totaler Stuss ist. Naja :D

LG Matrix910

0

Was willst du HINTERHER haben? Und wo - Batch-Datei oder eine andere Datei?

Aus einer laufenden Batch-Datei etwas zu löschen geht zwar, bringt die Ausführung aber möglicherweise durcheinander.

6

Ich will das hinterher so haben, dass wenn die Eingabe ist Delete Beispiel 1, dass Beispiel eins beim nächsten Starten aus der Liste gestrichen ist, also das dann nur noch Beispiel 2 und Beispiel 3 da steht. Kann's sein, dass das wirklich nicht mit 'nem Befehl, sondern nur indem man die Zeile aus der Textdatei löscht, funktioniert? Die 2. Frage verstehe ich nicht so ganz. 

Vielen Dank schonmal :)

0
51
@Matrix910

Wie gesagt, ich würde aus der Batch-Datei selber nichts herausnehmen - wenn die gelöschten oder eingefügten Zeilen vor der aktuell ausgeführten Zeile liegen, kann das mächtig schiefgehen.

Wenn die Liste in der Datei "LISTE.TXT" ist, zum auflisten folgender Code in der Batch-Datei:

FOR /F "delims=" %%A in (LISTE.TXT) DO @ECHO %%A

löschen einer einzelnen Zeile durch Auslassen (auszulassende Zeile in Variable LOESCHZEILE):

IF EXIST LISTE.TMP DEL LISTE.TMP
FOR /F "delims=" %%A in (LISTE.TXT) DO
(
IF NOT "%%A"=="%LOESCHZEILE%" (
ECHO.%%A>>LISTE.TMP
)
)
IF EXIST LISTE.BAK DEL LISTE.BAK
REN LISTE.TXT LISTE.BAK
REN LISTE.TMP LISTE.TXT
1
6

Hab's dir unten nochmal genauer erklärt. Hab 'ne Antwort mit Bild verfasst

0

Soweit ich weiß geht das nicht. Musste wohl mit CLS clearen und dann neu  ausgeben.

set except=0

:PRINTTABLE
CLS
if %exept%!=1 @echo Beispiel 1
if %exept%!=2 @echo Beispiel 2
if %exept%!=3 @echo Beispiel 3

usw.

set /p except=Element streichen:   
if %except%!=0 goto PRINTTABLE

Irgendwie sowas, leider gibts hier kein Switch

6

OK, ich probier's nachher mal, dann schreib ich ob's funzt :)

0

Eine Batch per Mail verschicken?

Ich habe die Batch Datei als .exe durch winrar auch schon versucht. Klappt auch nicht... Kennt ihr eine Möglichkeit Batch Dateien per Mail versenden zu können, ohne dass gefiltert werden?

...zur Frage

CMD Variable aus bestimmten Teil des Namens einer Datei erstellen?

HI!

Ich möchte dass meine CMD eine Variable aus einen bestimmten Teil des Namens einer Datei erstellt.

Die Dateien die diese Funktion benutzen soll haben alle dasselbe Muster beim Namen:

Episodennummer Episodenname_s00e00

Beispiel:

1 Die Kündigung_s01e01

Nun soll die CMD die Zahl der Staffel als Variable speichern, indem Fall also "1". Die Variable darf nur eine Zahl enthalten, sobald nur ein Buchstabe oder Sonderzeichen drin ist kann ich sie nicht mehr zum rechnen benutzen. Mein Problem ist, dass ich nicht weiß wie man genau diese Zahl auslesen kann. Man müsste der CMD irgendwie erklären dass es die Stelle nach dem "s" ist. Allerdings müsste die "0" Stelle ausgelassen werden wenn dort eine 0 steht.

Kann mir hierbei irgendjemand einen kleinen Code erstellen?

Ich bin dankbar für jeden Tipp und für jeden Versuch mir zu helfen!

...zur Frage

CMD Befehl per Batch Datei ausführen

Wie sieht eine Batch Datei aus die automatisch CMD öffnet und folgenden Befehl ausführt: netsh wlan show networks mode=bssid

...zur Frage

Batch Befehl zum AutoRun

Ich bin gerade ein bisschen mit cmd und bat Dateien am Spielen und wollte euch mal fragen, ob es ein Command gibt, mit dem die Batch datei automatisch auf einem anderen PC startet. Bsp.: Ich lade die Datei bei einem Freund auf den PC und nach 5 min führt sich die Datei automatisch aus. Der Ordner soll halt nicht in den Autostart oder sowas deshalb Frage ich euch, ob es ein Command dafür gibt.

Danke ich Vorraus :)

...zur Frage

wlan karte per cmd / batch aktivieren/deaktivieren befehl

ich wollte meine wlan schnittstelle in meinem laptop per batch oder cmd datei aktivieren und deaktivieren.

ich weiß nur leider nicht welchen befehl ich benutzen soll.

ich zähle auf euch, danke für jede hilfreiche antwort :::::::)))))

...zur Frage

Text Datei per batch/cmd drucken

Guten Tag, kann mir jemand vielleicht ohne überschüssiges Fachchinesisch erklären, wie man eine .txt Datei per Batch- und/oder cmd-Befehl ausdrucken kann?

Sprich,man greift auf die Datei zu - dementsprechend eine CMD/Batch die dann automatisch den Befehl an den Drucker abschickt,eine LEERE SEITE - zu drucken

mfg

...zur Frage

Was möchtest Du wissen?