Mit Batch Datei 2 bestimmte Zeilen aus .ini verändern
Hallo Leute,
ich hab ein kleines Problem.
Ich habe eine ini datei, die ausser 2 voneinandere abhänige dinge immer gleich aussieht und zwar so:
vorher:
[Extern]
AnzRec=4
Rec1=[text]
Rec2=[text]
Rec3=[text]
Rec4=[text]
[Weitere Einträge......]
Was auch sein kann, ist das AnzRec=5 oder mehr ist, dann brauch ich natürlich AnzRec=6 oder mehr
Ich bräuchte jetzt eine Batchdatei, die die zahl hinter AnzRec= ausliest und dann diese um eins erhöht.
Dann muss die Batch auch noch unter Rec4 einen eintrag mit Rec5=TEST_TEXT erstellen.
Nachher:
[Extern]
AnzRec=5
Rec1=[text]
Rec2=[text]
Rec3=[text]
Rec4=[text]
Rec5=TEST_TEXT
Um raus zu bekommen, was hinter AnzRec= steht hab ich hier schonma einen schnipsel:
ich hab ein kleines Problem.
Ich habe eine ini datei, die ausser 2 voneinandere abhänige dinge immer gleich aussieht und zwar so:
vorher:
[Extern]
AnzRec=4
Rec1=[text]
Rec2=[text]
Rec3=[text]
Rec4=[text]
[Weitere Einträge......]
Was auch sein kann, ist das AnzRec=5 oder mehr ist, dann brauch ich natürlich AnzRec=6 oder mehr
Ich bräuchte jetzt eine Batchdatei, die die zahl hinter AnzRec= ausliest und dann diese um eins erhöht.
Dann muss die Batch auch noch unter Rec4 einen eintrag mit Rec5=TEST_TEXT erstellen.
Nachher:
[Extern]
AnzRec=5
Rec1=[text]
Rec2=[text]
Rec3=[text]
Rec4=[text]
Rec5=TEST_TEXT
Um raus zu bekommen, was hinter AnzRec= steht hab ich hier schonma einen schnipsel:
SET anzrec=""
SET rec=""
FOR /f "tokens=2 delims==" %%x in ('findstr "AnzRec" test.ini') do SET "anzrec_vor=%%x"
SET /a rec="%anzrec%+1"
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 91645
Url: https://administrator.de/contentid/91645
Ausgedruckt am: 26.11.2024 um 18:11 Uhr
8 Kommentare
Neuester Kommentar
Hi TRMxDEVIL
ich würde das auslesen folgendermaßen machen (deine version ist auch nicht schlecht):
Und zu dem ändern deiner datei müsste man so ansetzen:
bitte testen, habe grade keine zeit dafür, ich bin auch nicht sicher ob es bugfrei is, denke haben an alles gedacht
Nur genau da glaube ich liegt das gleiche problem an dem ich an meinem Punkt ebenfalls nicht weiterkommen:
Auslesen von 2 Werten aus einer Textdatei (in abhängigkeit vo suchkriterien)
zumindest ähnlich
ich würde das auslesen folgendermaßen machen (deine version ist auch nicht schlecht):
for /f "delims=" %%a in ('find "AnzRec=" test.ini') do set x=%%a
set anzrec=%x:~7,%
set /a rec=%anzrec%+1
Und zu dem ändern deiner datei müsste man so ansetzen:
for /f "delims=" %%a in ('type test.ini') do call :dateischreiben %%a
:dateischreiben
if %1==AnzRec=%anzrec% (AnzRec=%rec%>> test_neu.ini
) else (
if %1==Rec%anzrec% (Rec%rec%=TEST_TEXT>> test_neu.ini
) else (
echo %1 >> test_neu.ini
))
bitte testen, habe grade keine zeit dafür, ich bin auch nicht sicher ob es bugfrei is, denke haben an alles gedacht
Nur genau da glaube ich liegt das gleiche problem an dem ich an meinem Punkt ebenfalls nicht weiterkommen:
Auslesen von 2 Werten aus einer Textdatei (in abhängigkeit vo suchkriterien)
zumindest ähnlich
Moin TRMxDEVIL
willkommen im Forum.
Finde ich äußerst vielversprechend, wie ihr (pumi32 und Du) euch hier durchzubeißen versucht.
Will es Euch auch gern allein zu Ende bringen lassen, aber ein paar Fallstricke, die eher einem geübten Auge auffallen, möchte ich aufzeigen... die findet ihr sonst erst nach Tagen.
Bezogen auf die Zeilennummern in TRMxDEVILs letztem Schnipsel
Zeile 03:/04
ist anders als in anderen Skriptsprachen, wo diese Syntax eher bedeuten würde: Setze String anzrec auf Leerstring.
Beide Zeilen sind überflüssig, da durch das "& setlocal" gesagt wurde: "verwende neu angelgte Variablen nur intern, lege keinen globalen Variablen an"
Zeile 05:
Genau hinschauen. Hier wird vermeintlich ein Komplett-Pfad gesetzt.
Aber die Laufwerksangabe fehlt. Also das "C:\" oder "D:\" oder "%HomeDrive%"
Ist gefährlich ... weil: niemand kann ausschließen , dass der Batch mal aufgerufen wird, wenn sich der geneigte User und mit ihm das Betriebssystem auf Laufwerk E, oder USB-Stick S: befindet.
Dann geht alles danach in die Grütze.
Zeile 07:
Ein "CD \pfad\nochmehrpfad" ist (wie im letzten Punkt angedeutet) immer suboptimal.
Außerdem wechselt man7frau nicht in einem Programmschnipsel Lw oder Pfad wenn nicht am Ende der Ur-zustand wiederhergestellt wird.
Ist sonst Pfusch. Redmond-Stil.Aäbäh eben.
Besser: Wenn es denn unbedingt sein muss, dann wechseln und wiederherstellen mit PushD/PopD [siehe PushD /? etc. am CMD-Prompt].
hier muss es gar nicht sein -- Lass die Zeile weg.
Zeile 17/18
Na, na, na... wer löscht denn da eine Quelldatei, bevor eine neue Zieldatei ohne Fehler erzeugt werden konnte??!!??
So was tut man/frau nicht. Ist sonst Pfusch. Re^H^H^H.... Rest siehe oben.
---> erst abwarten, ob wir eine neue Ersatzdatei hinbekommen.... bis dahin wird die Quell-Datei nur gelesen, nicht gelöscht.
Das Ersetzen der alten Ini-Datei durch eine neue erst ganz am Ende.
Zeile 21: hier wird es fehlerträchtig...(fast) immer habt ihr mit der SET-Syntax [Set "var=wert"], also mit Anführungszeichen gearbeitet.
Hier nun nicht. und prompt steht nach dem .."....DO .Set Zeile=%%i "<--- hier am Ende ein Leerzeichen nach %%i.
Besser hier (soll ja eine "numerische" Variable sein: ...Do Set /a zeile=%%i
Zeile 24:
Hier würde ich dann ändern auf
Zeile 25
Würde ich so erweitern, dass alle drei Fälle ("%%i ist KleinerGleich, Gleich, größer als %zeile% ")abgefrühstückt werden.
Dann kann das "more"-Konstrukt in Zeile 30 entfallen.
-oder- ^^... (kürzer würde auch genügen, sagen meine Praktikantinnen immer)..
So solltet ihr zumindest einen pfleg- und wartbaren Ausgangsbatch für evtl. Fehlersuche haben.
Grüße
Biber
willkommen im Forum.
Finde ich äußerst vielversprechend, wie ihr (pumi32 und Du) euch hier durchzubeißen versucht.
Will es Euch auch gern allein zu Ende bringen lassen, aber ein paar Fallstricke, die eher einem geübten Auge auffallen, möchte ich aufzeigen... die findet ihr sonst erst nach Tagen.
Bezogen auf die Zeilennummern in TRMxDEVILs letztem Schnipsel
Zeile 03:/04
Set anzrec=""
> das setzt nicht die Variable %anzrec% auf {leer} oder löscht diese, sondern setzt die auf den Wert [zwei Anführungszeichen]ist anders als in anderen Skriptsprachen, wo diese Syntax eher bedeuten würde: Setze String anzrec auf Leerstring.
Beide Zeilen sind überflüssig, da durch das "& setlocal" gesagt wurde: "verwende neu angelgte Variablen nur intern, lege keinen globalen Variablen an"
Zeile 05:
Genau hinschauen. Hier wird vermeintlich ein Komplett-Pfad gesetzt.
Aber die Laufwerksangabe fehlt. Also das "C:\" oder "D:\" oder "%HomeDrive%"
Ist gefährlich ... weil: niemand kann ausschließen , dass der Batch mal aufgerufen wird, wenn sich der geneigte User und mit ihm das Betriebssystem auf Laufwerk E, oder USB-Stick S: befindet.
Dann geht alles danach in die Grütze.
Zeile 07:
Ein "CD \pfad\nochmehrpfad" ist (wie im letzten Punkt angedeutet) immer suboptimal.
Außerdem wechselt man7frau nicht in einem Programmschnipsel Lw oder Pfad wenn nicht am Ende der Ur-zustand wiederhergestellt wird.
Ist sonst Pfusch. Redmond-Stil.Aäbäh eben.
Besser: Wenn es denn unbedingt sein muss, dann wechseln und wiederherstellen mit PushD/PopD [siehe PushD /? etc. am CMD-Prompt].
hier muss es gar nicht sein -- Lass die Zeile weg.
Zeile 17/18
Na, na, na... wer löscht denn da eine Quelldatei, bevor eine neue Zieldatei ohne Fehler erzeugt werden konnte??!!??
So was tut man/frau nicht. Ist sonst Pfusch. Re^H^H^H.... Rest siehe oben.
---> erst abwarten, ob wir eine neue Ersatzdatei hinbekommen.... bis dahin wird die Quell-Datei nur gelesen, nicht gelöscht.
Das Ersetzen der alten Ini-Datei durch eine neue erst ganz am Ende.
Zeile 21: hier wird es fehlerträchtig...(fast) immer habt ihr mit der SET-Syntax [Set "var=wert"], also mit Anführungszeichen gearbeitet.
Hier nun nicht. und prompt steht nach dem .."....DO .Set Zeile=%%i "<--- hier am Ende ein Leerzeichen nach %%i.
Besser hier (soll ja eine "numerische" Variable sein: ...Do Set /a zeile=%%i
Zeile 24:
Hier würde ich dann ändern auf
if %Zeile% EQU 0 goto .Rest
Wenn vorher %zeile% mit "SET /a " auf einen "arithmetischen" Wert gesetzt wurde, dann steht auch "numerisch null" drin bei Fehler.Zeile 25
Würde ich so erweitern, dass alle drei Fälle ("%%i ist KleinerGleich, Gleich, größer als %zeile% ")abgefrühstückt werden.
Dann kann das "more"-Konstrukt in Zeile 30 entfallen.
....
:: REM Achtung: %Quelle% ist in meinem Ablauf NICHT gelöscht!! siehe oben
if exist "%tempTxt%" del "%tempTxt%"
for /f "tokens=1* delims=:" %%i in ('findstr /n $ "%Quelle%"') do (
if %%i LEQ %Zeile% echo.%%j>>"%TempTxt%"
if %%i EQU %Zeile% echo.%INSERT%>>"%TempTxt%"
if %%i GTR %Zeile% echo.%%j>>"%TempTxt%"
)
....
:: REM Achtung: %Quelle% ist in meinem Ablauf NICHT gelöscht!! siehe oben
if exist "%tempTxt%" del "%tempTxt%"
for /f "tokens=1* delims=:" %%i in ('findstr /n $ "%Quelle%"') do (
if %%i NEQ %Zeile% echo.%%j>>"%TempTxt%"
if %%i EQU %Zeile% echo.%INSERT%>>"%TempTxt%"
)
So solltet ihr zumindest einen pfleg- und wartbaren Ausgangsbatch für evtl. Fehlersuche haben.
Grüße
Biber
Danke für die infos Biber
so dann fasse ich mal zusammen:
Es gibt noch kleine Probs:
Anzrec wird nicht erhöt und Rec4 wird ersetzt
so dann fasse ich mal zusammen:
Es gibt noch kleine Probs:
Anzrec wird nicht erhöt und Rec4 wird ersetzt
@echo off & setlocal
set "Quelle=%HomeDrive%%homepath%\desktop\test.ini"
PushD "%HomeDrive%%homepath%\desktop\"
for /f "tokens=2 delims==" %%x in ('findstr "AnzRec" "%Quelle%"') do set "anzrec=%%x"
set rec=%anzrec%
set /a rec="%rec%+1"
set "Mark=Rec%anzrec%="
set "Insert=Rec%rec%=TEST_TEXT"
set "TempTxt=%temp%\TT.txt"
copy "%Quelle%" "%TempTxt%">nul
set Zeile=0
for /f "delims=:" %%i in ('findstr /n /i /b /c:"%Mark%" "%TempTxt%"') do set /a "Zeile=%%i"
if %Zeile% EQU 0 goto :Rest
:: REM Achtung: %Quelle% ist in meinem Ablauf NICHT gelöscht!! siehe oben
if exist "%tempTxt%" del "%tempTxt%"
for /f "tokens=1* delims=:" %%i in ('findstr /n $ "%Quelle%"') do (
if %%i NEQ %Zeile% echo.%%j>>"%TempTxt%"
if %%i EQU %Zeile% echo.%INSERT%>>"%TempTxt%"
)
:Rest
more +%Zeile% "%TempTxt%">>"%Quelle%"
:: if exist "%TempTxt%" del "%quelle%"
pause