haegar75
Goto Top

Textblöcke in ini-Datei ersetzen oder einfügen

Hi,
ich möchte in einer Ultraedit InI-Datei ganze Textblöcke ca. 70 Zeilen per Batch ersetzen. Mit VBScript kriege ich es hin einzelne Zeilen ersetzen aber das gibt dann ellenlangen Code... Es müsste doch auch irgendwie gehen eine Textdatei mit den zu ändernden Zeilen in die bestehende INI-Datei zu schreiben.. Weiß jemand Rat?
Hier ein typischer Block der geändert werden soll..

[Tools]
Tool Cmd0=""
Tool Dir0=""
Tool Menu0=""
Bitmap Path0=""
Show DOS Window0=0
Capture0=0
Capture Mode0=0
WinProg0=0
SaveAllFiles0=0
Save Active File0=1
Replace Type0=0
Tool Cmd1=""
Tool Dir1=""
Tool Menu1=""
.
.

in

[Tools]
Tool Cmd0="Pfad xyz"
Tool Dir0="Pfad xyz"
Tool Menu0="Pfad xyz"
Bitmap Path0="Pfad xyz"
Show DOS Window0=1
Capture0=1
Capture Mode0=1
WinProg0=0
SaveAllFiles0=0
Save Active File0=1
Replace Type0=0
Tool Cmd1="Pfad xyz"
Tool Dir1="Pfad xyz"
Tool Menu1="Pfad xyz"

Gruß Haegar

Content-ID: 115930

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

Ausgedruckt am: 25.11.2024 um 00:11 Uhr

77559
77559 12.05.2009 um 22:11:58 Uhr
Goto Top
Hallo Haegar.

Für den Zweck gibts es doch Buchstäblich Dutzende von Cmdline Tools.
Ein renommiertes ist Horst Schaeffers IniFile
Du kannst damit eine Section komplett löschen und per Batch Schleife aus einer Datei zufügen.

Gruß
LotPings
bastla
bastla 12.05.2009 um 22:18:35 Uhr
Goto Top
Hallo Haegar75!

Versuch es mal mit dem folgenden Script:
Ini = "D:\Ultraedit.ini"  
Repl = "D:\Replace.txt"  
Delim = "="  

Set fso = CreateObject("Scripting.FileSystemObject")  
T = fso.OpenTextFile(Ini).ReadAll
R = Split(fso.OpenTextFile(Repl).ReadAll, vbCrLF)

Set rE = New RegExp
rE.IgnoreCase = True

For i = 0 To UBound(R)
	If Len(R(i)) > 1 Then
        If Left(R(i), 1) = "[" And Right(R(i), 1) = "]" Then  
            S = R(i)
        Else
            K = Split(R(i), Delim)(0)
            rE.Pattern = "\r\n" & K & Delim & ".*\r\n"  
            If rE.Test(T) Then
                T = rE.Replace(T, vbCrLF & R(i) & vbCrLF)
            Else
                rE.Pattern = "\" & Replace(S, "]", "\]") & ".*\r\n"  
                If rE.Test(T) Then T = rE.Replace(T, S & vbCrLF & R(i) & vbCrLF)
            End If
        End If
    End If
Next

fso.CreateTextFile(Ini, True).Write T
Das Script sollte (ist nur oberflächlich getestet) die "Replace.txt" (zB
[Tools]
Tool Cmd0="Pfad xyz"
Tool Dir0="Pfad xyz"
Tool Menu0="Pfad xyz"
Bitmap Path0="Pfad xyz"
Show DOS Window0=1
Capture0=1
Capture Mode0=1
WinProg0=0
SaveAllFiles0=0
Save Active File0=1
Replace Type0=0
Tool Cmd1="Pfad xyz"
Tool Dir1="Pfad xyz"
Tool Menu1="Pfad xyz"
auslesen und in der ini-Datei jeweils die erste Zeile, in welcher (ohne Berücksichtigung von Groß-/Kleinschreibung) der Teil vor dem ersten "=" (siehe Variable "Delim") mit jenem der Ersatzzeile übereinstimmt, ersetzen.

Wenn keine passende Zeile gefunden wird, soll die Ersatzzeile als erste Zeile der "Section" (im Beispiel daher gleich nach "[Test]") eingefügt werden.

Grüße
bastla
Haegar75
Haegar75 13.05.2009 um 10:07:35 Uhr
Goto Top
Also, ich habs mal so eingebaut wie man es mir mal gezeigt hat, aber irgendwas mache ich falsch. Die Scriptbefehle kennt er nicht.. face-confused

Set Ini = "D:\uedit32.INI"  
Set Repl = "D:\Replace.txt"  
Set Delim = "="  
set Y=%temp%\ReplaceInIni.vbs
>%Y% echo Set fso = CreateObject("Scripting.FileSystemObject")  
>>%Y% echo Set T = fso.OpenTextFile(Ini).ReadAll
>>%Y% echo Set R = Split(fso.OpenTextFile(Repl).ReadAll, vbCrLF)

>>%Y% echo Set rE = New RegExp
>>%Y% echo Set rE.IgnoreCase = True

>>%Y% echo  For i = 0 To UBound(R)
>>%Y% echo 	If Len(R(i)) > 1 Then
>>%Y% echo         If Left(R(i), 1) = "[" And Right(R(i), 1) = "]" Then  
>>%Y% echo             S = R(i)
>>%Y% echo         Else
>>%Y% echo             K = Split(R(i), Delim)(0)
>>%Y% echo             rE.Pattern = "\r\n" & K & Delim & ".*\r\n"  
>>%Y% echo             If rE.Test(T) Then
>>%Y% echo                 T = rE.Replace(T, vbCrLF & R(i) & vbCrLF)
>>%Y% echo             Else
>>%Y% echo                 rE.Pattern = "\" & Replace(S, "]", "\]") & ".*\r\n"  
>>%Y% echo                 If rE.Test(T) Then T = rE.Replace(T, S & vbCrLF & R(i) & vbCrLF)
>>%Y% echo             End If
>>%Y% echo         End If
>>%Y% echo     End If
>>%Y% echo Next

>>%Y% echo fso.CreateTextFile(Ini, True).Write T
77559
77559 13.05.2009 um 10:15:01 Uhr
Goto Top
Moin Haegar,

ich spring mal für bastla ein,

warum kopierst du den Quelltext aus bastla's script nicht einfach in eine Datei mit der endung vbs und führst diese dann direkt aus?

Dein Versuch scheitert weil du die Zeilen 1 bis 3 nicht auch in die vbs Datei schreibst. (und dann ohne das set davor)

Gruß
LotPings
Haegar75
Haegar75 13.05.2009 um 15:01:31 Uhr
Goto Top
So, habs jetzt wie in bastlas Beitrag in der vbs Datei stehen (gepiped) wenn ich es dann aus führe, meldet die Konsole:

C:\DOKUME~1\jkm\LOKALE~1\Temp\ReplaceInIni.vbs(16, 42) Kompilierungsfehler in Microsoft VBScript: ')' erwartet

Habe die Klammerausdrücke kontrolliert, kann aber auf Anhieb keine unplausibitäten erkennen.. face-confused
bastla
bastla 13.05.2009 um 15:19:56 Uhr
Goto Top
Hallo Haegar75!

Poste bitte Deinen Stand (der von meiner Version abweicht, da die Zeile 16 dort nur aus einem "Else" besteht) des Scripts - oder versuch es vielleicht doch mit einem Klick auf "Quelltext" und einem einfachen Kopieren meines Codes ...

Grüße
bastla
Haegar75
Haegar75 13.05.2009 um 15:46:50 Uhr
Goto Top
Also, der Fehler liegt definitiv bei mir. Bastlas Code direkt in die VBS-Datei kopiert, funktioniert einwandfrei.

Bei der Generierung der VBS-Datei in der Batch scheint was schief zu laufen. Die Zeile mit dem ersten IF wird gar nicht in die Datei geschrieben und die Zeilen die ein & enthalten sind ab dem & abgeschnitten..
Mein Code ist jetzt:

set Y=%temp%\ReplaceInIni.vbs
> %Y% echo Ini = "D:\uedit32.INI"  
>>%Y% echo Repl = "D:\Replace.txt"  
>>%Y% echo Delim = "="  

>>%Y% echo set fso = CreateObject("Scripting.FileSystemObject")  
>>%Y% echo T = fso.OpenTextFile(Ini).ReadAll
>>%Y% echo R = Split(fso.OpenTextFile(Repl).ReadAll, vbCrLF)

>>%Y% echo set rE = New RegExp
>>%Y% echo rE.IgnoreCase = True

>>%Y% echo  For i = 0 To UBound(R)
>>%Y% echo 	If Len(R(i)) > 1 Then
>>%Y% echo         If Left(R(i), 1) = "[" And Right(R(i), 1) = "]" Then  
>>%Y% echo             S = R(i)
>>%Y% echo         Else
>>%Y% echo             K = Split(R(i), Delim)(0)
>>%Y% echo             rE.Pattern = "\r\n" & K & Delim & ".*\r\n"  
>>%Y% echo             If rE.Test(T) Then
>>%Y% echo                 T = rE.Replace(T, vbCrLF & R(i) & vbCrLF)
>>%Y% echo             Else
>>%Y% echo                 rE.Pattern = "\" & Replace(S, "]", "\]") & ".*\r\n"  
>>%Y% echo                 If rE.Test(T) Then T = rE.Replace(T, S & vbCrLF & R(i) & vbCrLF)
>>%Y% echo             End If
>>%Y% echo         End If
>>%Y% echo     End If
>>%Y% echo Next

>>%Y% echo fso.CreateTextFile(Ini, True).Write T

cscript //nologo %Y%

Und das kommt dann als VBS-Datei raus..

Ini = "D:\uedit32.INI"
Repl = "D:\Replace.txt"
Delim = "="
set fso = CreateObject("Scripting.FileSystemObject")
T = fso.OpenTextFile(Ini).ReadAll
R = Split(fso.OpenTextFile(Repl).ReadAll, vbCrLF)
set rE = New RegExp
rE.IgnoreCase = True
For i = 0 To UBound(R)
If Left(R(i), 1) = "[" And Right(R(i), 1) = "]" Then
S = R(i)
Else
K = Split(R(i), Delim)(0)
rE.Pattern = "\r\n"
If rE.Test(T) Then
T = rE.Replace(T, vbCrLF
Else
rE.Pattern = "\"
If rE.Test(T) Then T = rE.Replace(T, S
End If
End If
End If
Next
fso.CreateTextFile(Ini, True).Write T

Edit:

Habs gefunden. Man muss die > und & mit ^ schützen. Ich Dämel...
77559
77559 13.05.2009 um 15:57:55 Uhr
Goto Top
Hallo Haegar,

ich verstehe zwar nicht warum du das Vb-Script unbedingt aus einer Batch heraus generieren willst,
aber sei's drum.

Das & hat in der Batch die Bedeutung einer Befehlsverkettung, d. h. es können so mehrere Befehle in einer Zeile stehen.

Damit die Cmd Shell dieses Zeichen nicht selbst interpretiert muss du es "Escapen" mit einem ^
also im Batch Code ^&

Gruß
LotPings
Haegar75
Haegar75 13.05.2009 um 21:03:02 Uhr
Goto Top
Zitat von @77559:
ich verstehe zwar nicht warum du das Vb-Script unbedingt aus einer
Batch heraus generieren willst,
aber sei's drum.

Das hat mir mal ein kompetenter Moderator so vorgeschlagen, bei ner anderen Sache.. face-wink

Das Problem was ich in dieser Sache noch hab ist , dass die INI-Section {Tools] in der ich die Änderungen machen möchte, nicht immer existiert und dann anlegen müsste...
An dieser Stelle kann ich bastlas Code nicht nachvollziehen, wie das funktionieren soll. Vielleicht ein paar warme Worte dazu, damit ich was lerne?face-wink
Gruß Haegar
Biber
Biber 13.05.2009 um 21:40:32 Uhr
Goto Top
Moin Haegar75, bastla und LotPings,

<OT>
@Haegar75
An dieser Stelle kann ich bastlas Code nicht nachvollziehen, wie das funktionieren soll.
Vielleicht ein paar warme Worte dazu, damit ich was lerne?

Von mir ein "Ja, aber..."

Ja, aber das "VBS-Lernen am überschaubaren Praxisbeispiel" möge auch der einzige Grund bleiben, warum die Lösung über drei Ecken weitergeführt werden sollte.
Ja, es hat für Dich und viele MitleserInnen spürbare Lerneffekte (".... ahh, Sonderzeichen im Batch muss ich vor dem Pipen maskieren...)
Das finde ich gut.
Ohne jede Ironie.

Aber, wie LotPings auch mehrfach vergeblich in diesem Thread betont hat: für so etwas gibt zwar abzählbar wenige, aber uns bekannte und immer gern empfohlene One-Trick-Utilities wie Horst Schaffers IniFile

Lässt sich nicht toppen, nicht selber besser machen und vor allem: Hey, es ist doch schon erfunden!

Wir müssen doch nicht immer wiederkehrende [Windows-]Probleme jedes Mal anders lösen.

Meine Bitte: Teste den Link wenigstens mal an...

Und natürlich sollen und werden weiterhin Verständnisfragen gestellt und beantwortet und auch Code-Schnipsel hier gebastelt werden.

Aber nicht die, die schon 5000mal erfunden wurden.
</OT>

Grüße
Biber

[Edit] @bastla
Ich weiß, dass du ja nur spielst, und -falls ich es noch nirgends geschrieben haben sollte - du spielst auch in der Oberliga. face-wink
Aber man/frau/moderator muss doch dann auch mal darauf hinweisen, dass sich zwar ein Frühstücksei mit einem Gabelstabler köpfen lässt, aber es möglicherweise auch einfacher ginge.
[/Edit]
bastla
bastla 13.05.2009 um 21:41:29 Uhr
Goto Top
Hallo Haegar75!
dass die INI-Section {Tools] in der ich die Änderungen machen möchte, nicht immer existiert und dann anlegen müsste...
... ist noch gar nicht berücksichtigt - bisher wird nur die aktuelle Section in der Variablen "S" zwischengespeichert, damit es einen definierten Ort für das Einfügen zusätzlicher Zeilen gibt (es wird dann einfach der Teil "Section + darauf folgende Zeilenschaltung" durch "Section + Zeilenschaltung + neue Zeile + Zeilenschaltung" ersetzt.

Unter der Annahme, dass eine noch nicht vorhandene Section (abgetrennt durch eine Leerzeile) an das Ende der Datei gestellt werden könnte, wäre die Erweiterung des Scripts nicht so dramatisch - es müsste zwischen Zeile 15 und 16 eingefügt werden:
rE.Pattern = "\" & Replace(S, "]", "\]") & ".*\r\n"  
If Not rE.Test(T) Then T = T & vbCrLF & S & vbCrLF
In weiterer Folge dürften alle zur neuen Section gehörigen Zeilen ja ebenfalls noch nicht in der Datei vorkommen, sodass diese dann jeweils als neue letzte Zeile (allerdings dadurch mit dem Schönheitsfehler einer "auf den Kopf gestellten" Reihenfolge) angefügt werden müssten.

Grüße
bastla

[Edit] @Biber: Ich spiel ja nur, drum auch so eher hanebüchene Ansätze ... [/Edit]

[Edit2]
Aber man/frau/moderator muss doch dann auch mal darauf hinweisen ...
... weshalb ich Dich auch um den Job nicht beneide ... face-wink

Danke jedenfalls für die Beförderung in die "Oberliga" - eine derartige Einschätzung von Dir bedeutet (mir) schon Einiges ...
[/Edit2]
77559
77559 13.05.2009 um 21:47:31 Uhr
Goto Top
Zitat von @Haegar75:
Das Problem was ich in dieser Sache noch hab ist , dass die INI-Section {Tools] in der ich die Änderungen machen möchte, nicht immer existiert und dann anlegen müsste...
An dieser Stelle kann ich bastlas Code nicht nachvollziehen, wie das funktionieren soll. Vielleicht ein paar warme Worte dazu, damit ich was lerne?face-wink

Ich habe noch nicht versucht den Code zu verstehen, am Besten fragst du ihn mal selber face-wink

Gruß
LotPings
BusterBlues1
BusterBlues1 31.05.2009 um 13:30:25 Uhr
Goto Top
Hallo zusammen,

ich habe diesen Beitrag und auch andere gelesen und habe eine ähnliche Problemstellung. Allerdings sind mir alle hier gemachten Ausführungen entweder zu kompliziert bzw. für mich als absoluten Anfänger zu unverständlich.

Mein Problem ist einfach folgendes:

Ich möchte in einer ini Datei nach dem Abschnitt [Textedi] suchen und den darunter enthaltenen Text editieren. Dabei dürfte es sich um 5-6 Zeilen handeln. Es ist jedoch nicht festgelegt, wo dieser Abschnitt in der ini zu finden ist.
Der Einfachheit halber kann der Textblock komplett ersetzt werden, da der einzufügende Inhalt immer der gleiche ist.
Falls der Abschnitt [Textedi] nicht vorhanden ist, soll er am Ende der ini eingefügt werden.

Oder noch einfacher: Abschnitt löschen, falls vorhanden und neu Einfügen.

Ich habe bereits das IniFile - Tool von Horst Schaeffer ausprobiert, geht auch so wie ich mir das vorstelle. Ich habe allerdings ein Problem mit der zugehörigen exe, zwar kein technisches aber ein nennen wir es mal ideologisches.

Und einfach auch aus Interesse muss dies doch auch mit einem einfachen ca. 5 Zeilen batch file zu machen sein, ohne if-else Schleifen o.ä.?

Gruß
BB
78632
78632 31.05.2009 um 13:38:09 Uhr
Goto Top
Zitat von @BusterBlues1:

Ich möchte in einer ini Datei nach dem Abschnitt [Textedi] suchen und den darunter enthaltenen Text editieren. Dabei dürfte
es sich um 5-6 Zeilen handeln. Es ist jedoch nicht festgelegt, wo dieser Abschnitt in der ini zu finden ist

Start > Ausführen > Notepad inidateiname.ini [OK]

Evtl. noch den vollständigen Pfad zur .Ini-Datei hinzufügen
77559
77559 31.05.2009 um 17:09:58 Uhr
Goto Top
Ich kann da blablnick nur zustimmen.

Du selbst benutzt das Wort editieren, das setzt einen Editor voraus.
Wenn du aus Automatiotionsgründen dies in einer Batch realisieren willst, hast du einen definierten Änderungswunsch. Die Struktur einer Ini-Datei mit Abschnitten gibt aber keine simple Batch Lösung her.

Ob du nun externe Tools als unelegant empfindest macht in der Sache keinen Unterschied.

Ausserdem Lesen hilft. Das zitierte IniFile kann eine Abschnitt einfach löschen

INIFILE filename [section] /remove

Deinen neuen Abschnitt kannst du dann einfach mit Echo anhägen.

Gruß
LotPings
BusterBlues1
BusterBlues1 31.05.2009 um 18:29:05 Uhr
Goto Top
Ja da habe ich mich wohl nicht genau ausgedrückt, es handelt sich um einen definierten Änderungswunsch.
Zum Glück hat aber doch jemand verstanden was ich meine.

Das es im besagten IniFile diesen Befehl gibt weiß ich und ich hatte ja auch geschrieben das mittels dieses Tools alles so FUNKTIONIERT wie ich mir das vorstelle.

Schön wäre es nur wenn sich dies auch ohne die zusätzliche exe datei realisieren ließe.

Aus welchem Grund ich diese exe Datei nicht haben will macht hier wirklich keinen Unterschied, hier kann ich LotPings nur zustimmen.
Biber
Biber 31.05.2009 um 22:48:22 Uhr
Goto Top
Moin BusterBlues1,

ein verspätetes Willkommen im Forum auch von mir.
Ich weiss nicht, ob Du meinen Verweis auf Horst Schaeffers IniFile nicht richtig verstanden hast, aber ich versuche es gerne noch einmal umzuformulieren.

Im Prinzip sehe ich drei bis vier Möglichkeiten für Deine geplante Inifile-Bearbeitung
  • entweder der Verzicht auf eine automatisierte (Batch-)Verarbeitung --> NotePad aufrufen oder komplette "richtige" Ini-Datei erzeugen
  • oder 2) ein vorhandenes (Exe-) Tool verwenden, das alle Bearbeitungsvorgänge, die mit einem Ini-File denkbar sind abdecken kann
  • oder 3a) , wenn es halt kein Fremdtool sein darf, es per Batch nachbilden, was hier und heute Deine auf dem Tisch liegenden Anforderungen sind ("3 Zeilen ersetzen in einer Section namens [Bla]")
  • oder 3b) ein allgemein verwendbares Tool a la IniFile mit Batchmitteln nachzukaspern

Die ersten beiden Varianten hattest Du ausgeschlossen.
Eigenprogrammierung der Machart a) würde ich als die dümmste aller Varianten bezeichnen - die Implementierung eines Schnipsels, der nur einen Bruchteil des Funktionsumfangs eines One-Trick-Tools hat... da steht mir alles senkrecht, was physisch bei Männern meines Alters noch möglich ist.

Variante 3b) würde bedeuten, das als Messlatte zu nehmen, was vorhandene Tools so können, und dazu ließe sich ja Horst Schaeffers Tool befragen:
IniFile behandelt Windows typische INI Dateien mit Gruppennamen in eckigen Klammern und Zuweisungen in der Form: Name=String.

Syntax:
 
INIFILE Dateiname [Gruppe] Name=String 	ändern oder neu schreiben
INIFILE Dateiname [Gruppe] Name= 	Zuweisung entfernen
INIFILE Dateiname [Gruppe] Name== 	leere Zuweisung
INIFILE Dateiname [Gruppe] /remove 	ganze Gruppe entfernen
INIFILE Dateiname [Gruppe] Name > temp.bat 	Zuweisung lesen
INIFILE Dateiname [Gruppe] > temp.bat 	alle Zuweisung der Gruppe lesen

Zuweisungen und Gruppen werden neu angelegt, falls nicht vorhanden. Die INI-Datei muss vorhanden sein.

Zum Lesen einer Zuweisung wird ein SET Statement nach STDOUT ausgegeben (für Umleitung in eine temporäre Bach-Datei). 
Diese Funktionalität also müsste per Native-Batch nachgekaspert werden.
Und hier stellt sich nicht die Frage, ob das machbar ist, sondern nur und ausschließlich die Frage, wer sollte so verrückt sein, nochmals ein paar Nachtschichten in die Erfindung des Farbfernsehers oder glykolfreiem Spätburgunder zu investieren, wo doch alles schon erfunden ist?

Und wenn Perfektionisten wie H.S. mittlerweile bei einer Version 1.6 angelangt sind, was würde dann wohl der Entwicklungsaufwand für ein reines Batchtool sein?

Meiner Meinung nach ist es absolut unverhältnismäßig und meine Antwort auf deine Frage, ob es denn auch mit reinen Batchbefehlen geht wäre ein überzeugtes Nein.

Bzw, mach es, wenn es um eine Wette geht - sonst nicht

Grüße
Biber
77559
77559 31.05.2009 um 23:07:21 Uhr
Goto Top
Zitat von @Biber:
Meiner Meinung nach ist es absolut unverhältnismäßig und meine Antwort auf deine Frage, ob es denn auch mit reinen Batchbefehlen geht wäre ein überzeugtes Nein.

Ich kann mir ja Gründe vorstellen, es mit Batchmitteln machen zu müssen,
aber über die abwegige Vorstellung, das es mit 5 Zeilen reinen Batchcode und ohne Schleifen und if tun zu sollen,
kann man nur lachen.

Gruß
LotPings