aktuelle IP an bestimmte Stelle in INI-Datei schreiben
Hallo,
folgendes würde ich gern machen.
Ich möchte die IP des jeweiligen Rechners auslesen und dann einen bestimmten Sting in einer .ini Datei durch diese IP ersetzen.
Die IP auslesen funktioniert schon.
@for /F "tokens=13,*" %i in ('ipconfig^|find "IP-Ad"') do (
@echo %i >>c:\test3.txt
)
allerding weiß ich nicht, wie ich in der .ini Datei einen bestimmten Wert durch diese IP ersetzen kann.
Beispielstring wäre:
serverpath=abcdse1,xxx.xxx.xx.xx,9521/*
xxx.xxx.xx.xx müßte durch die IP ersetzt werden.
Kann mir vielleicht jemand behilflich sein.
Vielen Dank schon mal.
folgendes würde ich gern machen.
Ich möchte die IP des jeweiligen Rechners auslesen und dann einen bestimmten Sting in einer .ini Datei durch diese IP ersetzen.
Die IP auslesen funktioniert schon.
@for /F "tokens=13,*" %i in ('ipconfig^|find "IP-Ad"') do (
@echo %i >>c:\test3.txt
)
allerding weiß ich nicht, wie ich in der .ini Datei einen bestimmten Wert durch diese IP ersetzen kann.
Beispielstring wäre:
serverpath=abcdse1,xxx.xxx.xx.xx,9521/*
xxx.xxx.xx.xx müßte durch die IP ersetzt werden.
Kann mir vielleicht jemand behilflich sein.
Vielen Dank schon mal.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 74515
Url: https://administrator.de/forum/aktuelle-ip-an-bestimmte-stelle-in-ini-datei-schreiben-74515.html
Ausgedruckt am: 24.12.2024 um 00:12 Uhr
17 Kommentare
Neuester Kommentar
Hallo Kn0cki17 und willkommen im Forum!
Einige Fragen vorweg:
Grüße
bastla
Einige Fragen vorweg:
- Sind die Zeilenblöcke vor und nach dem Beispielstring konstant, oder müssen diese jeweils ausgelesen und in das Ergebnis übernommen werden?
- Welche Teile Deines Beispielstrings sind konstant bzw zum Auffinden der Zeile geeignet (vermutlich nur "serverpath=")?
- Ist die IP-Adresse immer (bei Delimiter ",") das zweite Token in der Zeile?
- Ich nehme mal nicht an, dass sich tatsächlich "xxx.xxx.xx.xx" in der betreffenden Zeile befindet - richtig?
- Spricht etwas gegen den Einsatz von VBScript?
Grüße
bastla
Hallo Kn0cki17!
Wenn wirklich der ganze Rest konstant ist, könntest Du einfach die Zeilen vorher in eine "ini1.txt" und die Zeilen nachher in eine "ini2.txt" packen und damit etwa so verfahren:
Falls das Leerzeichen vor der IP nicht stören sollte, könntest Du sogar noch die Zeile "set IP=%IP: =%" einsparen ...
Grüße
bastla
Wenn wirklich der ganze Rest konstant ist, könntest Du einfach die Zeilen vorher in eine "ini1.txt" und die Zeilen nachher in eine "ini2.txt" packen und damit etwa so verfahren:
@echo off & setlocal
set "Ziel=D:\Irgendeine.ini"
set "Teil1=D:\ini1.txt"
set "Teil2=D:\ini2.txt"
set IP=
for /f "tokens=2 delims=:" %%i in ('ipconfig^|find "IP-Ad"') do set "IP=%%i"
if not defined IP echo Keine IP-Adresse gefunden! & goto :eof
set IP=%IP: =%
type "%Teil1%">"%Ziel%"
echo serverpath=abcdse1,%IP%,9521/*>>"%Ziel%"
type "%Teil2%">>"%Ziel%"
Grüße
bastla
Hallo Kn0cki17,
Dein IP-Auslesen-Script funktionier bei mir nicht.
Wenn alles konstant ist, ausser der IP, dann kannst Du doch auch die komplette Datei per Batch generieren, dann musst Du nichts austauschen.
Das hat nur die Einschränkung, dass einige Sonderzeichen nicht durch echo ausgegeben werden können, z.B.: <, | und >
Alternativ kannst Du auch die Inhalte splitten und per copy zusammenfügen.
copy anfang.txt + variable.txt + ende.txt fertig.ini
Erklärung:
Hier sind zwei Methoden in einer Batch genutzt.
Die schlechtere Methode kann auskommentiert oder gelöscht werden.
Bei IP-Config ergibt sich das Problem, dass mehrere IP-Nummern vorhanden sein können.
1. Alle Zeilen mit "IP-Ad" werden in a.tmp abgelegt
2. Die Zeilen von a.tmp werden durchnummeriert und in b.tmp gespeichert.
3. Die zweite Zeile ("[2]") von b.tmp wir in c.tmp abgelegt.
Es wird unterstellt, dass die interessante IP sich immer in Zeile 2 befindet.
4. Der Inhalt von c.tmp wird in ipnummer_a gespeichert.
5. ipnummer_a wird getrimmt, ab der Position 47 werden 15 Zeichen genommen.
Bei ping wird hier die Systemvariable %computername% genutzt.
Was das bei Rechnern ausgibt, die mit mehreren Karten in unterschiedlichen Netzwerken stecken, weiß ich nicht.
1. Die Zeile mit der IP von einem ping mit nur einem Packet ( /n 1) wird in d.tmp gespeichert.
2. Der Inhalt von d.tmp wird in ipnummer_b gespeichert.
3. ipnummer_b wird getrimmt, ab der Position 19 werden alle Zeichen bis zum Vorletzten genommen.
Daraus solltest Du Dir was Passendes basteln können.
Gruß Frank
Dein IP-Auslesen-Script funktionier bei mir nicht.
Wenn alles konstant ist, ausser der IP, dann kannst Du doch auch die komplette Datei per Batch generieren, dann musst Du nichts austauschen.
Das hat nur die Einschränkung, dass einige Sonderzeichen nicht durch echo ausgegeben werden können, z.B.: <, | und >
Alternativ kannst Du auch die Inhalte splitten und per copy zusammenfügen.
copy anfang.txt + variable.txt + ende.txt fertig.ini
@echo off
:ipconfig-lesen
ipconfig | find "IP-Ad" > %temp%\a.tmp
type %temp%\a.tmp | find /n " " > %temp%\b.tmp
type %temp%\b.tmp | find "[2]" > %temp%\c.tmp
set /p ipnummer_a= < %temp%\c.tmp
set ipnummer_a=%ipnummer_a:~47,15%
:ping-lesen
ping %computername% /n 1 | find "Ping-Sta" > %temp%\d.tmp
set /p ipnummer_b= < %temp%\d.tmp
set ipnummer_b=%ipnummer_b:~19,-1%
rem set ipnummer_b=%ipnummer_b:~0,-1%
:ini-generieren
echo zeile 1 > dings.ini
echo zeile 2 >> dings.ini
echo zeile 3 >> dings.ini
echo texttexttext %ipnummer_a% texttexttext >> dings.ini
echo texttexttext %ipnummer_b% texttexttext >> dings.ini
echo zeile 5 >> dings.ini
echo zeile 6 >> dings.ini
:aufraeumen
del %temp%\a.tmp
del %temp%\b.tmp
del %temp%\c.tmp
del %temp%\d.tmp
set ipnummer_a=
set ipnummer_b=
:ende
exit
Erklärung:
Hier sind zwei Methoden in einer Batch genutzt.
Die schlechtere Methode kann auskommentiert oder gelöscht werden.
Bei IP-Config ergibt sich das Problem, dass mehrere IP-Nummern vorhanden sein können.
1. Alle Zeilen mit "IP-Ad" werden in a.tmp abgelegt
2. Die Zeilen von a.tmp werden durchnummeriert und in b.tmp gespeichert.
3. Die zweite Zeile ("[2]") von b.tmp wir in c.tmp abgelegt.
Es wird unterstellt, dass die interessante IP sich immer in Zeile 2 befindet.
4. Der Inhalt von c.tmp wird in ipnummer_a gespeichert.
5. ipnummer_a wird getrimmt, ab der Position 47 werden 15 Zeichen genommen.
Bei ping wird hier die Systemvariable %computername% genutzt.
Was das bei Rechnern ausgibt, die mit mehreren Karten in unterschiedlichen Netzwerken stecken, weiß ich nicht.
1. Die Zeile mit der IP von einem ping mit nur einem Packet ( /n 1) wird in d.tmp gespeichert.
2. Der Inhalt von d.tmp wird in ipnummer_b gespeichert.
3. ipnummer_b wird getrimmt, ab der Position 19 werden alle Zeichen bis zum Vorletzten genommen.
Daraus solltest Du Dir was Passendes basteln können.
Gruß Frank
@Pedant
Grüße
bastla
Das hat nur die Einschränkung, dass einige Sonderzeichen nicht durch echo ausgegeben werden können, z.B.: <, | und >
Kurze Anmerkung: Wenn Du diese Sonderzeichen mit ^ maskierst, klappt auch die Ausgabe mit "echo":echo ^<^|^> >Sonderzeichen.txt
Grüße
bastla
Hallo basla,
vielen Dank für die Anmerkung, das war sehr hilfreich.
Apropos Nachhilfe:
In vielen Batches finden sich relativ kryptische for-Konstruktionen.
for /? half mir, Deine Konstruktion zu verstehen, aber für ein tiefes Verstehen der for-Syntax ist es nicht geeignet. Google brachte mich da auch nicht weiter.
Kennst Du eine Seite, die mit veranschaulichenden Beispielen, "for" erklärt?
Ich versuch mal Deine for-Anweisung zu erklären:
Führe ipconfig aus und übergebe die Ausgabe des Befehls an find.
Find sucht in jeder Zeile nach der Zeichenfolge "IP-Ad" und gibt alle Zeilen, die die Zeichenfolge enthalten aus.
/f ermöglicht die Angabe von weiteren Optionen. Die Optionen sorgen dafür, dass der Text jeder Zeile gesplittet wird, in diesem Fall am Doppelpunkt. delims=:
tokens=2 weist an, nur den zweiten Teilstring in der Variablen %%i zu speichern, die dann in der weiteren Verarbeitung in der do-Anweisung verwendet wird.
Wenn also von find drei Zeilen mit "IP-Ad" gefunden werden, wird die Variable IP dreimal mit dem Wert von %%i neu belegt. Das Ergebnis ist, dass in IP die zuletzt ausgegebene IP-Adresse von ipconfig gespeichert wird.
Interessiert man sich für die zweite von drei IP-Adressen, so müsste man den Code variiren.
Vermutlich reicht es in den meisen Fällen nach dem Netzwerk-Teil der erwünschten IP-Adresse suchen zu lassen, statt allgemein nach "IP-Ad", also nach z.B. "192.168.0."
Jetzt zu Deiner Set-Anweisung:
Diese Zeile hat mich auch einen Moment beschäftigt, bis ich sie verstand.
%Var:Optionen% ist im allgemeinen eine String-Operation, beispielsweise die Extrahierung eines Teilstrings. In Deinem Fall ist es ein "Suchen und Ersetzen", was ich bisher nicht kannte und zwar ersetze alle " " durch "".
Beispiel:
Gruß Frank
vielen Dank für die Anmerkung, das war sehr hilfreich.
Apropos Nachhilfe:
In vielen Batches finden sich relativ kryptische for-Konstruktionen.
for /? half mir, Deine Konstruktion zu verstehen, aber für ein tiefes Verstehen der for-Syntax ist es nicht geeignet. Google brachte mich da auch nicht weiter.
Kennst Du eine Seite, die mit veranschaulichenden Beispielen, "for" erklärt?
Ich versuch mal Deine for-Anweisung zu erklären:
for /f "tokens=2 delims=:" %%i in ('ipconfig^|find "IP-Ad"') do set "IP=%%i"
Führe ipconfig aus und übergebe die Ausgabe des Befehls an find.
Find sucht in jeder Zeile nach der Zeichenfolge "IP-Ad" und gibt alle Zeilen, die die Zeichenfolge enthalten aus.
/f ermöglicht die Angabe von weiteren Optionen. Die Optionen sorgen dafür, dass der Text jeder Zeile gesplittet wird, in diesem Fall am Doppelpunkt. delims=:
tokens=2 weist an, nur den zweiten Teilstring in der Variablen %%i zu speichern, die dann in der weiteren Verarbeitung in der do-Anweisung verwendet wird.
Find "IP-Ad" liefert
" IP-Adresse. . . . . . . . . . . . : 192.168.0.100"
delims=: splittet am Doppelpunkt in
" IP-Adresse. . . . . . . . . . . ." und " 192.168.0.100"
tokens=2 wählt für %%i
" 192.168.0.100"
do set "IP=%%i" bewirkt
set "IP= 192.168.0.100"
und das Alles für jede Zeile die find "IP-Ad" in der Ausgabe von ipconfig findet.
Wenn also von find drei Zeilen mit "IP-Ad" gefunden werden, wird die Variable IP dreimal mit dem Wert von %%i neu belegt. Das Ergebnis ist, dass in IP die zuletzt ausgegebene IP-Adresse von ipconfig gespeichert wird.
Interessiert man sich für die zweite von drei IP-Adressen, so müsste man den Code variiren.
Vermutlich reicht es in den meisen Fällen nach dem Netzwerk-Teil der erwünschten IP-Adresse suchen zu lassen, statt allgemein nach "IP-Ad", also nach z.B. "192.168.0."
Jetzt zu Deiner Set-Anweisung:
set IP=%IP: =%
%Var:Optionen% ist im allgemeinen eine String-Operation, beispielsweise die Extrahierung eines Teilstrings. In Deinem Fall ist es ein "Suchen und Ersetzen", was ich bisher nicht kannte und zwar ersetze alle " " durch "".
Beispiel:
@echo off
set var=Soooofahroor
echo vorher: %var%
set var=%var:oo=e%
echo nachher: %var%
Ausgabe von echo:
vorher: Soooofahroor
nachher: Seefahrer
Gruß Frank
Hallo Pedant!
Kann nur gratulieren - so, wie Du es erklärt hast, war mein Beispiel auch gemeint.
Noch eine Anmerkung zum Thema "mehrere Netzwerkadapter / IP-Adressen": Wie Du richtig anmerkst, braucht es in diesem Fall ein weiteres Kriterium, um den richtigen Eintrag zu erhalten. Soferne einfach die letzte (weil ohnehin einzige) Adresse verwendet werden kann, klappt es mit meinem obigen Batch. Falls alternativ die erste Adresse benötigt wird, ginge das so:
Ansonsten eben ein weiteres "find" (oder "findstr"):
Damit ist einerseits sichergestellt, dass es sich um die IP-Adresse handelt, und zum anderen eben auch noch die für das gewünschte Netzwerk "Zuständige" selektiert.
Grüße
bastla
[Edit] Fehlende Variable IP in "if not defined IP" ergänzt. [/Edit]
Kann nur gratulieren - so, wie Du es erklärt hast, war mein Beispiel auch gemeint.
Kennst Du eine Seite, die mit veranschaulichenden Beispielen, "for" erklärt?
Da muss ich leider passen - bis auf den Hinweis, dass Du natürlich hier im Forum eine Menge an mehr oder weniger ausführlich dokumentierten Beispielen sowie einige äußerst empfehlenswerte Tutorials (insbesondere von Biber) vorfindest (was Du als Mitglied mit wesentlich höherem "Dienstalter" als ich ja ohnehin wissen wirst ...).Noch eine Anmerkung zum Thema "mehrere Netzwerkadapter / IP-Adressen": Wie Du richtig anmerkst, braucht es in diesem Fall ein weiteres Kriterium, um den richtigen Eintrag zu erhalten. Soferne einfach die letzte (weil ohnehin einzige) Adresse verwendet werden kann, klappt es mit meinem obigen Batch. Falls alternativ die erste Adresse benötigt wird, ginge das so:
set IP=
for /f "tokens=2 delims=:" %%i in ('ipconfig^|find "IP-Ad"') do if not defined IP set "IP=%%i"
set IP=
for /f "tokens=2 delims=:" %%i in ('ipconfig^|find "IP-Ad"^|find "192.168.0."') do set "IP=%%i"
Grüße
bastla
[Edit] Fehlende Variable IP in "if not defined IP" ergänzt. [/Edit]
Hallo,
mit den Werkzeugen von basla versuche ich gerade die ursprüngliche Aufgabenstellung zu bewerkstellingen, nämlich in einer ini-Datei einen bestimmten Wert durch die IP zu ersetzen.
Das scheitert aber noch an einer Stelle.
Ausgangspunkt ist eine ini-Datei mit festem Inhalt.
Die Batch, die eine geänderte ini-Datei erzeugen soll:
Hinweis:
Damit das Auswerten der Variablen "zeile" innerhalb der for-Schleife überhaupt funktioniert, ruft sich die Batch am Anfang selbst neu auf und zwar mit der cmd-Option "/v:on".
Das aktiviert die "verzögerte Erweiterung von Variablen" für diese Instanz des cmd.
Der Knackpunkt ist das Suchen und Ersetzen in der Variablen "zeile" mit der Variablen "IP".
In der Batch verwende ich noch einen festen String "192.168.0.100" und nur so gelingt es bisher.
Wie kann man hier Variablen verschachten?
@bastla,
Ich glaube an der Stelle liegt ein Fehler vor, da nicht angegeben ist, was eventuell nicht definiert wurde. Müsste es nicht wie folgt aussehen?
Ein funktionierendes Beispiel:
Gruß Frank
mit den Werkzeugen von basla versuche ich gerade die ursprüngliche Aufgabenstellung zu bewerkstellingen, nämlich in einer ini-Datei einen bestimmten Wert durch die IP zu ersetzen.
Das scheitert aber noch an einer Stelle.
Ausgangspunkt ist eine ini-Datei mit festem Inhalt.
Inhalt von allgemeine.ini:
Zeile 1
Zeile 2
serverpath=abcdse1,xxx.xxx.xx.xx,9521/*
Zeile 4
Die Batch, die eine geänderte ini-Datei erzeugen soll:
@echo off
if "%1"=="" (
cmd /v:on /k %0 dummyparameter
exit
)
:ip-auslesen
set IP=
for /f "tokens=2 delims=:" %%i in ('ipconfig^|find "IP-Ad"') do set "IP=%%i"
if not defined IP echo Keine IP-Adresse gefunden! & goto :eof
set IP=%IP: =%
:ini-neu-schreiben
cls
echo.
echo Eingabe:
if exist spezielle.ini del spezielle.ini
for /f "delims=" %%i in ('type allgemeine.ini^') do (
set zeile=%%i
echo !zeile!
echo !zeile:xxx.xxx.xx.xx=192.168.0.100! >> spezielle.ini
)
:test
echo.
echo IP-Nummer: !IP!
echo.
echo Ausgabe:
type spezielle.ini
Hinweis:
Damit das Auswerten der Variablen "zeile" innerhalb der for-Schleife überhaupt funktioniert, ruft sich die Batch am Anfang selbst neu auf und zwar mit der cmd-Option "/v:on".
Das aktiviert die "verzögerte Erweiterung von Variablen" für diese Instanz des cmd.
Die Ausgabe der Batch:
Eingabe:
Zeile 1
Zeile 2
serverpath=abcdse1,xxx.xxx.xx.xx,9521/*
Zeile 4
IP-Nummer: 192.168.1.60
Ausgabe:
Zeile 1
Zeile 2
serverpath=abcdse1,192.168.0.100,9521/*
Zeile 4
Der Knackpunkt ist das Suchen und Ersetzen in der Variablen "zeile" mit der Variablen "IP".
In der Batch verwende ich noch einen festen String "192.168.0.100" und nur so gelingt es bisher.
Funktioniert:
echo !zeile:xxx.xxx.xx.xx=192.168.0.100! >> spezielle.ini
Funktioniert nicht:
echo !zeile:xxx.xxx.xx.xx=!IP!! >> spezielle.ini
@bastla,
... do if not defined set "IP=%%i"
... do if not defined IP set "IP=%%i"
Ein funktionierendes Beispiel:
@echo off
if not defined IP set "IP=eins"
if not defined IP set "IP=zwei"
if not defined IP set "IP=drei"
echo IP: %IP%
Ausgabe:
IP: eins
Gruß Frank
Moin Pedant,
eine Seite, wo der FOR-Befehl anschaulich erklärt und diskutiert wird kenne ich auch nicht.
Aber vielleicht könnten wir hier im Forum, ausgehend von dem Beispiel, das Du so schön analysiert hast mit wenigen Copy&Paste-Klicks ein kleines Tutorial zu dem Thema erstellen.
Deinen letzten Kommentar fände ich jedenfalls sinnvoller nochmals als Tutorial gepostet - hier im aktuellen Thread werden ihn nicht viele auf der Suche nach FOR-Beispielen gezielt finden.
So oder so vielen Dank für die wirklich gut gelungene Erklärung.
Und natürlich wieder mal Dank an bastla für die Vorlage dazu.
Grüße
Biber
eine Seite, wo der FOR-Befehl anschaulich erklärt und diskutiert wird kenne ich auch nicht.
Aber vielleicht könnten wir hier im Forum, ausgehend von dem Beispiel, das Du so schön analysiert hast mit wenigen Copy&Paste-Klicks ein kleines Tutorial zu dem Thema erstellen.
Deinen letzten Kommentar fände ich jedenfalls sinnvoller nochmals als Tutorial gepostet - hier im aktuellen Thread werden ihn nicht viele auf der Suche nach FOR-Beispielen gezielt finden.
So oder so vielen Dank für die wirklich gut gelungene Erklärung.
Und natürlich wieder mal Dank an bastla für die Vorlage dazu.
Grüße
Biber
Hallo Pedant!
schon versucht?
Grüße
bastla
Ich glaube an der Stelle liegt ein Fehler vor
Leider ja; ich korrigiere das oben.Funktioniert nicht:
Hast Duecho !zeile:xxx.xxx.xx.xx=!IP!! >> spezielle.ini
Wie kann man hier Variablen verschachten?echo !zeile:xxx.xxx.xx.xx=%IP%! >> spezielle.ini
... cmd-Option "/v:on" ... aktiviert die "verzögerte Erweiterung von Variablen" für diese Instanz des cmd.
Wo siehst Du den Vorteil gegenüber "setlocal enabledelayedexpansion"?Grüße
bastla
Moin Pedant,
hat sich leider überschnitten, mein Vor-Post bezog sich auf deinen vorletzten Kommentar.
zu dem letzten Beispiel (Wechseln/Ersetzen mit Variablen): Es geht schon.
Beispiel/Proof of Concept fürs Erstezen (am Cmd-Prompt):
[DelayedExpansion ist ON, Zeilen beginnend mit ">" sind Eingaben]
In einem Ausschnitt Deines Schnipsels:
[Ungetestete Skizze]
Grüße
Biber
hat sich leider überschnitten, mein Vor-Post bezog sich auf deinen vorletzten Kommentar.
zu dem letzten Beispiel (Wechseln/Ersetzen mit Variablen): Es geht schon.
Beispiel/Proof of Concept fürs Erstezen (am Cmd-Prompt):
[DelayedExpansion ist ON, Zeilen beginnend mit ">" sind Eingaben]
>set IP=10.111.222.33
>set "zeile=serverpath=xxx.xxx.xxx"
>set dummy=xxx.xxx.xxx.xxx
>echo !zeile:%dummy%=%IP%!
serverpath=10.111.222.33,9521/*
In einem Ausschnitt Deines Schnipsels:
....setlocal EnableDelayedExpansion
...
if exist spezielle.ini del spezielle.ini
::# nächste Zeile nur Demo
Set IP=192.168.0.100
for /f "delims=" %%i in ('type allgemeine.ini') do (
set zeile=%%i
echo !zeile!
REM entweder so..
REM echo !zeile:xxx.xxx.xx.xx=%IP%!
REM oder jetzt als längeres, wenn auch überflüssiges Beispiel:
Call :ReplaceInVarAltMitNeu zeile xxx.xxx.xx.xx 192.168.0.100
echo !zeile!
)
goto :eof
:ReplaceInVarAltMitNeu par1=varname par2=alterString Par3=neuerString
REM Aber: die Variable %zeile% wird NICHT als Wert, nur als Name übergeben
Set "tmpvar=!%1!"
Set tmpvar=!tmpvar:%2=%3!
set "%1=%tmpvar%"
Goto :eof
Grüße
Biber
@bastla,
Nein, hatte ich nicht, aber es funktioniert, allerdings dachte ich, ich hätte alle Kombinationen von % und ! ausprobiert.
Wo siehst Du den Vorteil gegenüber "setlocal enabledelayedexpansion"?
Der Vorteil lag darin, dass ich das kannte, das Andere aber nicht.
"setlocal enabledelayedexpansion" ist offensichtlich einfacher und funktioniert auch.
@Biber
Der For-Befehl im Allgemeinen, bietet aber noch reichlich mir unverständliche Varianten.
Sprungziele per call und Parameter als Subroutienen zu nutzen ist auch eine interessante und für mich neue Methode.
@Kn0cki17
die finale Batch sieht jetzt also so aus:
Wo steckst Du eigentlich?
Gruß Frank
Hast Du
schon versucht?
echo !zeile:xxx.xxx.xx.xx=%IP%! >> spezielle.ini
schon versucht?
Nein, hatte ich nicht, aber es funktioniert, allerdings dachte ich, ich hätte alle Kombinationen von % und ! ausprobiert.
... cmd-Option "/v:on" ... aktiviert die "verzögerte Erweiterung von Variablen" für diese Instanz des cmd.
Wo siehst Du den Vorteil gegenüber "setlocal enabledelayedexpansion"?
"setlocal enabledelayedexpansion" ist offensichtlich einfacher und funktioniert auch.
@Biber
Aber vielleicht könnten wir hier im Forum, ausgehend von dem Beispiel, das Du so schön analysiert hast mit wenigen Copy&Paste-Klicks ein kleines Tutorial zu dem Thema erstellen.
Ich bin im Moment noch nicht dazu in der Lage, da ich nur durch Testen und Lesen diese eine, vorgegebene Variante der For-Schleife verstanden habe.Der For-Befehl im Allgemeinen, bietet aber noch reichlich mir unverständliche Varianten.
Sprungziele per call und Parameter als Subroutienen zu nutzen ist auch eine interessante und für mich neue Methode.
@Kn0cki17
die finale Batch sieht jetzt also so aus:
@echo off
:konfiguration
setlocal enabledelayedexpansion
set quelle=allgemeine.ini
set ziel=spezielle.ini
set suchen=xxx.xxx.xx.xx
set ersetzen=yyy.yyy.yy.yy
set netzwerk=192.168.0.
REM goto letzte_ip_auslesen - falls die letzte IP benutzt werden soll.
REM goto spezielle_ip_auslesen - falls eine andere IP benutzt werden soll.
REM goto neue_ini_schreiben - falls fester Text fuer suchen und ersetzten genutzt werden soll.
goto letzte_ip_auslesen
:letzte_ip_auslesen
set IP=
for /f "tokens=2 delims=:" %%i in ('ipconfig^|find "IP-Ad"') do set "IP=%%i"
if not defined IP echo Keine IP-Adresse gefunden! & goto ende
set ersetzen=%IP: =%
goto neue_ini_schreiben
:spezielle_ip_auslesen
set IP=
for /f "tokens=2 delims=:" %%i in ('ipconfig^|find "IP-Ad"^|find "%netzwerk%"') do set "IP=%%i"
if not defined IP echo Keine IP-Adresse gefunden! & goto ende
set ersetzen=%IP: =%
goto neue_ini_schreiben
:neue_ini_schreiben
if exist %ziel% del %ziel%
for /f "delims=" %%i in ('type %quelle%^') do (
set zeile=%%i
echo !zeile:%suchen%=%ersetzen%! >> %ziel%
)
REM move %ziel% %quelle% - falls das ziel die quelle ersetzen soll.
:ende
Gruß Frank
@bastla
Statt ":ziel_ersetzt_quelle" würde ein "move" genügen.
SCNR
@Kn0cki17 aka ThreadOwner
Pedants Frage interessiert mich aber auch: Liest Du noch mit?
Wie ist der gefühlte Lösungs-/Beantwortungsgrad Deiner Frage?
Wir chatten ja schon seit zwei Tagen zwar kompetent und kurzweilig, aber eindeutig OffTopic hier rum...
Kann der Thread geschlossen werden oder sind noch Fragen offen?
Grüße
Biber
In ":ziel_ersetzt_quelle" würde ein "move" genügen
Noch genauer formuliert:Statt ":ziel_ersetzt_quelle" würde ein "move" genügen.
SCNR
@Kn0cki17 aka ThreadOwner
Pedants Frage interessiert mich aber auch: Liest Du noch mit?
Wie ist der gefühlte Lösungs-/Beantwortungsgrad Deiner Frage?
Wir chatten ja schon seit zwei Tagen zwar kompetent und kurzweilig, aber eindeutig OffTopic hier rum...
Kann der Thread geschlossen werden oder sind noch Fragen offen?
Grüße
Biber
@bastla,
ich habe das copy+delete durch move ersetzt.
@Biber,
ich nutze Sprungmarken nicht nur zum Anspringen, sondern auch zum Kommentieren und Strukturieren, also um Programmblöcke zu benennen.
In diesem Fall war es aber tatsächlich zuviel des Guten.
Ich habe jetzt
Dem muss ich in zwei Punkten eindeutig wiedersprechen.
Kurzweilig ist es zumindest für mich nicht. Okay es ist auch nicht das Gegenteil, also langweilig, aber mit Kürze hat es auch nichts zu tun. Es hat mich schon diverse Stunden beschäftigt, meinen Code zu schreiben und den von basta zu verstehen und auch bastla wird seine Code nicht in fünf Minuten runtergeschrieben haben.
Und OffTopic ist es auch nicht. Jeder einzelen Beitrag im Thread nimmt konkreten Bezug auf die ursprüngliche Anfrage und nur zusätzlich wird auch über das Ziel hinaus, aber nicht daran vorbei, diskutiert.
Klingt jetzt vielleicht so, als wäre ich beleidigt, das ist definitiv nicht der Fall, ich wollte das nur kommentieren.
Wozu den Thread eigentlich schließen, auch falls Kn0cki17 sich meldet und sagt sein Problem wäre gelöst?
Reicht es nicht den Thread dann als gelöst zu markieren. Ein Anderer, der das gleiche Problem oder ein sehr ähnliches hat, könnte doch hier sinnvoll anknüpfen.
Ich würde den Thread erst schließen, wenn er tatsächlich ins OffTopic abgleitet.
(Und ironischerweise fängt er mit meinem letzten Absatz damit an.)
Gruß Frank
ich habe das copy+delete durch move ersetzt.
@Biber,
ich nutze Sprungmarken nicht nur zum Anspringen, sondern auch zum Kommentieren und Strukturieren, also um Programmblöcke zu benennen.
In diesem Fall war es aber tatsächlich zuviel des Guten.
Ich habe jetzt
REM quelle_ersetzt_ziel soll nicht stattfinden, deswegen
goto ende
:quelle_ersetzt_ziel
copy %ziel% %quelle%
del %ziel%
reduziert aufgoto ende
:quelle_ersetzt_ziel
copy %ziel% %quelle%
del %ziel%
REM move %ziel% %quelle% - falls das Ziel die Quelle ersetzen soll.
Wir chatten ja schon seit zwei Tagen zwar kompetent und kurzweilig, aber eindeutig OffTopic hier rum...
Kann der Thread geschlossen werden oder sind noch Fragen offen?
Kann der Thread geschlossen werden oder sind noch Fragen offen?
Dem muss ich in zwei Punkten eindeutig wiedersprechen.
Kurzweilig ist es zumindest für mich nicht. Okay es ist auch nicht das Gegenteil, also langweilig, aber mit Kürze hat es auch nichts zu tun. Es hat mich schon diverse Stunden beschäftigt, meinen Code zu schreiben und den von basta zu verstehen und auch bastla wird seine Code nicht in fünf Minuten runtergeschrieben haben.
Und OffTopic ist es auch nicht. Jeder einzelen Beitrag im Thread nimmt konkreten Bezug auf die ursprüngliche Anfrage und nur zusätzlich wird auch über das Ziel hinaus, aber nicht daran vorbei, diskutiert.
Klingt jetzt vielleicht so, als wäre ich beleidigt, das ist definitiv nicht der Fall, ich wollte das nur kommentieren.
Wozu den Thread eigentlich schließen, auch falls Kn0cki17 sich meldet und sagt sein Problem wäre gelöst?
Reicht es nicht den Thread dann als gelöst zu markieren. Ein Anderer, der das gleiche Problem oder ein sehr ähnliches hat, könnte doch hier sinnvoll anknüpfen.
Ich würde den Thread erst schließen, wenn er tatsächlich ins OffTopic abgleitet.
(Und ironischerweise fängt er mit meinem letzten Absatz damit an.)
Gruß Frank
Moin Pedant,
<grinz übers ganze Gesicht>
Selbst mich als jemanden, der schon mal auf einer F.D.P.-Wahlkampfveranstaltung länger als 23 Minuten ausgehalten hat und bisher glaubte, alle verbalen Verharmlosungsformen der deutschen Rhetorik gehört zu haben, selbst mich kannst Du mit so etwas begeistern:
Derart sprachliches Neuland wird eigentlich bei uns ernsthaften, humorlosen IT'lern eher selten betreten.
Aber sei's drum... vielleicht sind wir nicht "am Ziel vorbei" geschossen.
Dennoch steigt natürlich die Gefahr, dass wir hier im Thread Themen diskutieren, die niemand außer uns hier vermuten oder finden wird.
Bestes Beispiel sind oben Deine eigene excellente FOR-Anweisungs-Zerlegung oder auch die Erläuterung des Lösche-alle-Leerzeichen-mit-SET-Befehls.
Kannst Du beides Eins-u-Eins als Tutorial posten - alle sind glücklich, mit einem passenden Titel wird es auch wiedergefunden.
Hier im Thread, unter den Suchworten "IP" und "INI-Datei" ....keine Chance.
Deshalb bin ich eher Anhänger der altägyptschen Weisheit "Neues Thema, neuer Thread."
So, und mein GANZER Kommentar ist hier eindeutig OffTopic.
Grüße
Biber
<grinz übers ganze Gesicht>
Selbst mich als jemanden, der schon mal auf einer F.D.P.-Wahlkampfveranstaltung länger als 23 Minuten ausgehalten hat und bisher glaubte, alle verbalen Verharmlosungsformen der deutschen Rhetorik gehört zu haben, selbst mich kannst Du mit so etwas begeistern:
und nur zusätzlich wird auch über das Ziel hinaus, aber nicht daran vorbei, diskutiert.
Erklär das mal einem Golfer...Derart sprachliches Neuland wird eigentlich bei uns ernsthaften, humorlosen IT'lern eher selten betreten.
Aber sei's drum... vielleicht sind wir nicht "am Ziel vorbei" geschossen.
Dennoch steigt natürlich die Gefahr, dass wir hier im Thread Themen diskutieren, die niemand außer uns hier vermuten oder finden wird.
Bestes Beispiel sind oben Deine eigene excellente FOR-Anweisungs-Zerlegung oder auch die Erläuterung des Lösche-alle-Leerzeichen-mit-SET-Befehls.
Kannst Du beides Eins-u-Eins als Tutorial posten - alle sind glücklich, mit einem passenden Titel wird es auch wiedergefunden.
Hier im Thread, unter den Suchworten "IP" und "INI-Datei" ....keine Chance.
Deshalb bin ich eher Anhänger der altägyptschen Weisheit "Neues Thema, neuer Thread."
So, und mein GANZER Kommentar ist hier eindeutig OffTopic.
Grüße
Biber