Batch Suchen Ersetzen

Hallo liebe/-r Expert/-e/-in,

Ich möchte per Batch eine *.txt Datei Durchsuchen und
einen Ganzen Absatz dann ersetzen.
Ich habe auch schon überall gesucht, aber nicht das Richtige gefunden.
Ich versuche, dass noch anschaulicher zu beschreiben:
Also ich möchte eine Batch Datei schreiben, die eine *.txt Datei nach „lastServer:91.97.88.132“ durchsucht.
Da aber die IP Dynamisch ist und wechselt, möchte ich
immer die aktuelle IP eintragen.
Deswegen habe ich mir gedacht, man könnte doch einfach
"lastServer:"suchen und dann einfach den ganzen Absatz
ersetzen mit „lastServer:IP“, oder kann man auch einfach nur die IP ersetzen? - das wäre auch sehr nett.

Danke für Ihre Hilfe schon einmal im Voraus,

LG Lucas

Hi,

Du kannst einfach die Textdatei durchsuchen und mit „echo textdatei | findstr /v lastserver“ alles ausgeben, was nicht so heißt. Als letztes setzt ein „Echo lastserver:neueip >> Textdatei“ die neue ip ein. Ist das was für dich?

Cu
Cjmatsel

Der ganze Inhalt der Datei ist :
music:1.0
sound:1.0
invertYMouse:false
mouseSensitivity:0.5
viewDistance:0
guiScale:0
bobView:true
anaglyph3d:false
advancedOpengl:false
limitFramerate:false
difficulty:2
fancyGraphics:true
ao:true
skin:smiley:efault
lastServer:91.97.88.132
key_key.forward:17
key_key.left:30
key_key.back:31
key_key.right:32
key_key.jump:57
key_key.sneak:42
key_key.drop:16
key_key.inventory:23
key_key.chat:20
key_key.fog:33
deswegen verstehe ich nicht, wie ich da die neue ip einfach einfügen kann, danke für deine schnelle antwort

Ja, das geht. Ich schlage vor, nur die IP-Adresse zu aktualisieren. Könnte ich eine Beispieldatei bekommen, damit ich genauer weiß, wie die Textdatei aussieht?

LG Michael

Ja, die datei, in der das geändert werden sollte sieht so aus:
music:1.0
sound:0.0
invertYMouse:false
mouseSensitivity:0.5
viewDistance:0
guiScale:0
bobView:true
anaglyph3d:false
advancedOpengl:false
limitFramerate:false
difficulty:2
fancyGraphics:true
ao:true
skin:smiley:efault
lastServer:5.80.95.15
key_key.forward:17
key_key.left:30
key_key.back:31
key_key.right:32
key_key.jump:57
key_key.sneak:42
key_key.drop:16
key_key.inventory:23
key_key.chat:20
key_key.fog:33

und die ip - die datei, die die ip rausfiltert - lautet momentan noch so:
@echo off
@FOR /F „tokens=2 delims=][“ %%i in (‚ping newrockstation.dyndns.org‘) do @echo %%i
pause

Hallo Lucas,

ich komme das Wochenende wahrscheinlich nicht mehr dazu eine Lösung zu finden, aber ich meine dass ich ein ähnliches Problem schon mal gelöst hatte…

Nur eine Frage am Rande: Warum mit Batch? Ich bekomme so viele Anfragen für Probleme die mit anderen Sprachen so viel einfacher gelöst werden können :smiley:

Liebe Grüße,
Patrick

Warum Batch?:
ich dachte batch wäre das einfachste bzw. in batch kenne ich mich besser aus, als mit den anderen sprachen , bin zwar neu einsteiger darin, aber ich verstehe es, es kann aber auch gut und gerne eine andere sprache sein

@setlocal
@for /f „tokens=2 delims=][“ %%i in (‚ping newrockstation.dyndns.org‘) do _
@echo %%i>"%temp%\updateip_ip.tmp"
@set /p ip="%temp%\updateip_textdatei.tmp"
@set z=1
@if exist „%temp%\updateip_textdatei_neu.tmp“ del „%temp%\updateip_textdatei_neu.tmp“

:lesezeile
@type „%temp%\updateip_textdatei.tmp“|find „[%z%]“> _
„%temp%\updateip_textdatei_zeile.tmp“
@if %errorlevel% neq 0 goto ende
@set /p zeile=> _
„%temp%\updateip_textdatei_neu.tmp“
) else (
@echo %zeile%>>"%temp%\updateip_textdatei_neu.tmp"
)
@set /a z=z+1
@goto lesezeile

:ende
@endlocal
@copy „%temp%\updateip_textdatei_neu.tmp“ textdatei.txt>Nul
@del „%temp%\updateip_*.*“

Das funktioniert so:

  • neue IP ermitteln
  • Datei durchnummerieren
  • Datei zeilenweise einlesen
  • IP-Adresse aktualisieren
  • neue Datei schreiben
  • alte Datei ersetzen

Die Datei muss nur noch etwas an die eigene Umgebung angepasst werden

Falls es noch Probleme gibt, melden Sie sich einfach noch mal.

Viel Erfolg,
Michael

Danke für deine Hilfe, aber er gibt mir nur Fehlermeldungen aus:
Der Befehl „_“ ist entweder falsch geschrieben…
find: zeilen durchnummerieiren : No such file or directory
find: /v : „“
find: /n : „“
find: [1]: „“
Der Befehl … updateip_textdatei_zeile.tmp ist entweder falsch geschrieben…

ja, stimmt, sorry. Ich habe in manchen Zeilen einen Zeilenumbruch eingefügt, damit das hier besser dargestellt wird. Leider akzeptiert der Interpreter an dieser Stelle das nicht.
Bitte entferne in der Datei in den Zeilen, die mit Leerzeichen und Unterstrick enden, dieses Leerzeichen incl. Unterstrich und dem nachfolgenden Zeilenumbruch.

Wie sieht es dann aus?

Viel Erfolg,
Michael

Hi,

Es ist egal, an welcher Position dein Eintrag steht. Diesen Umstand solltest du dir zu nutze machen. Du liest die alte Datei mit meinen befehlen aus und schreibst das gelesene in eine neue Datei. Dann löschst du die alte und benennst die neue um, so dass sie genauso heißt wie die alte…
Probier doch einfach mal meine Zeilen aus und schreib mir dein Ergebnis, dann können wir sehen wo es klemmt…
Aber mal ein ganz anderer Vorschlag: was haelst du davon statt einer sich ändernden ip einfach einen sich nicht ändernden namen zu wählen bei einem Provider wie dyndns zum Beispiel?

wenn ich das so habe, gibt der nichts aus :
@setlocal
@for /f „tokens=2 delims=][“ %%i in (‚ping newrockstation.dyndns.org‘) do
@echo %%i>"%temp%\updateip_ip.tmp"
@set /p ip="%temp%\updateip_textdatei.tmp"
@set z=1
@if exist „%temp%\updateip_textdatei_neu.tmp“ del „%temp%\updateip_textdatei_neu.tmp“

lesezeile

@type „%temp%\updateip_textdatei.tmp“|find „[%z%]“>"%temp%\updateip_textdatei_zeile.tmp"
@if %errorlevel% neq 0 goto ende
@set /p zeile=>"%temp%\updateip_textdatei_neu.tmp"
) else (
@echo %zeile%>>"%temp%\updateip_textdatei_neu.tmp"
)
@set /a z=z+1
@goto lesezeile

ende

@endlocal
@copy „%temp%\updateip_textdatei_neu.tmp“ textdatei.txt>Nul
@del „%temp%\updateip_*.*“

Das wäre auch ganz gut, dennoch wollte ich das selber einschreiben lassen.
Also den Dyndns Namen lautet in meinem Fall: newrockstation.dyndns.org
Ich wollte die Datei nämlich eigentlich für ein programm schreiben, damit man das nicht manuell eingaben muss,
und der Befehl echo textdatei | findstr /v lastserver klappt irgendwie nicht, denn ergibt nur den Pfad der Textdatei aus

Danke für deine Hilfe

Ah, sorry! "Type Textdatei " ist bestimmt besser! :wink: mein Fehler!

sorry, verstehe nicht ganz, was Sie meinen:

Ah, sorry! "Type Textdatei " ist bestimmt besser! :wink: mein
Fehler!

Probier doch bitte mal aus, was ich schreibe oder schlag in der Windows-Hilfe nach! Wenn Deine Textdatei „textdatei.txt“ heißt, dann gibt

type textdatei.txt | findstr /v lastserver \> textdateuneu.txt

alles außer den Eintrag lastserver aus und schreibt es in die „textdateineu.txt“. Als nächstes wird die neue IP ermittelt (das lässt sich mit dem Ping auf den dyndns-Namen leicht filtern) und wird mit einem

echo lastserver:%neueip% \>\> textdateineu.txt

als letztes unten eingefügt…

Wenn Fragen da sind, möchte ich gern einen konkreten Ansatz sehen und was das Ergebnis war…

cu,
cjmatsel

sorry, verstehe nicht ganz, was Sie meinen:

Ah, sorry! "Type Textdatei " ist bestimmt besser! :wink: mein
Fehler!

Ok ich habe das jetzt so:
@echo off
@FOR /F „tokens=2 delims=][“ %%i in (‚ping newrockstation.dyndns.org‘) do @echo %%i
pause
type C:\Users\User\AppData\Roaming.minecraft\options.txt | findstr /v lastserver > C:\Users\User\AppData\Roaming.minecraft\optionss.txt
pause
Echo lastserver:%i% >> C:\Users\User\AppData\Roaming.minecraft\optionss.txt
pause Aber er will die IP nicht in die datei schreiben, da steht jetzt nur lastServer: mehr nicht

das stimmt, eine Ausgabe ist nicht enthalten. Es wird lediglich die IP-Adresse aktualisiert. Leider ist es hier sehr schwierig, Zeilenumbrüche zu kontrollieren und auch die Labels mit ihrem führenden Doppelpunkt werden hier nicht richtig dargestellt.

Das Zurückschreiben der aktualisierten Datei funktioniert so natürlich nicht. Bitte in der vorletzten Zeile textdatei.txt durch C:\Users\User\AppData\Roaming.minecraft\options.txt ersetzen.

Verstehst du, was da in der Batchdatei abläuft?
Ansonsten frage einfach, welche Zeile dir von der Funktion her unklar ist.

VG,
Michael

ja jetzt klappt es, Danke

Hi,

das sieht doch schonmal ganz gut aus! Ich hab die for-Schleife mal getestet und bekomme die IP sauber als Variable mit echo geliefert. Dein Fehler versteckt sich in der Variable %%i; die wird nämlich NICHT außerhalb der for-Schleife verarbeitet, weshalb Du nicht einfach später %i% einsetzen kannst! Setz in der for-Schleife am Ende einfach eine neue Variable %neueip%, anstatt mit echo zu arbeiten:

@FOR /F "tokens=2 delims=][" %%i in ('ping newrockstation.dyndns.org') do set neueip=%%i

Dann kannste auch mit

echo %neueip% \>\> textdatei

problemlos arbeiten…

Klappt das jetzt besser?

cu,
cjmatsel