VBScript zwei ini Dateien vergleichen
Schönen guten Tag Administrator-Community,
ich bin hier schon etwas länger passiv unterwegs und habe so bisher alle Probleme lösen können. Jedoch stehe ich derzeit vor einem Problem in VBS. Ich habe ein etwas größeres Tool geschrieben, welches Backup und Updatefunktionen beinhaltet, desweiteren Prozesse auf einem Embeddedsystem (XP) verwaltet und ini Dateien bearbeitet. Und genau da liegt mein Problem. Derzeit ist es so, dass ich im Quellcode die Änderungen vorgegeben habe, jetzt soll es aber so funktionieren, dass ich eine Ini-Datei vorgebe, welche eingelesen wird und die Änderungen in die vorhandene Datei auf dem Client ändert. Dabei gebe ich in der neuen ini lediglich die Parameter an, welche geändert werden müssen. Beispiel:
Eine Ini-Datei (auf dem Embedded PC) hat folgende Einstellungen:config.ini
[Config]
Test=1
Test1=2
Test2=3
[Backup]
Time=10:30
Date=2008_10_03
[Undsoweiter]
Hier=15
könnte=20
was=50
wichtiges=Hallo
stehen=50
Die Ini-Datei die ich vorgebe, soll dann so aussehen: newconfig.ini
[Config]
Test2=5
[Backup]
Time=12:00
Date=2008_10_10
[Undsoweiter]
wichtiges=12345
Ich kann keine komplette ini-Datei kopieren, da sich Teilweise die Werte im normalen Betrieb verändern und somit müsste ich erst immer den derzeitigen Stand auslesen, meine Parameter von Hand ändern und anschliessend wieder hinkopieren. Mein Problem ist nun, wie kann ich die Änderungsdatei so einlesen, dass die "alte" ini-Datei auch nur diese Änderungen übernimmt ? Ich erwarte hier keine vollständige Programmierung von euch, lediglich einen Gedankenanstoß, da ich derzeit irgendwie "auf dem Schlauch stehe" !!
Ich hoffe das Problem ist auch so klar geschildert, dass ihr versteht, was ich meine!!
Danke und Grüße
ich bin hier schon etwas länger passiv unterwegs und habe so bisher alle Probleme lösen können. Jedoch stehe ich derzeit vor einem Problem in VBS. Ich habe ein etwas größeres Tool geschrieben, welches Backup und Updatefunktionen beinhaltet, desweiteren Prozesse auf einem Embeddedsystem (XP) verwaltet und ini Dateien bearbeitet. Und genau da liegt mein Problem. Derzeit ist es so, dass ich im Quellcode die Änderungen vorgegeben habe, jetzt soll es aber so funktionieren, dass ich eine Ini-Datei vorgebe, welche eingelesen wird und die Änderungen in die vorhandene Datei auf dem Client ändert. Dabei gebe ich in der neuen ini lediglich die Parameter an, welche geändert werden müssen. Beispiel:
Eine Ini-Datei (auf dem Embedded PC) hat folgende Einstellungen:config.ini
[Config]
Test=1
Test1=2
Test2=3
[Backup]
Time=10:30
Date=2008_10_03
[Undsoweiter]
Hier=15
könnte=20
was=50
wichtiges=Hallo
stehen=50
Die Ini-Datei die ich vorgebe, soll dann so aussehen: newconfig.ini
[Config]
Test2=5
[Backup]
Time=12:00
Date=2008_10_10
[Undsoweiter]
wichtiges=12345
Ich kann keine komplette ini-Datei kopieren, da sich Teilweise die Werte im normalen Betrieb verändern und somit müsste ich erst immer den derzeitigen Stand auslesen, meine Parameter von Hand ändern und anschliessend wieder hinkopieren. Mein Problem ist nun, wie kann ich die Änderungsdatei so einlesen, dass die "alte" ini-Datei auch nur diese Änderungen übernimmt ? Ich erwarte hier keine vollständige Programmierung von euch, lediglich einen Gedankenanstoß, da ich derzeit irgendwie "auf dem Schlauch stehe" !!
Ich hoffe das Problem ist auch so klar geschildert, dass ihr versteht, was ich meine!!
Danke und Grüße
Please also mark the comments that contributed to the solution of the article
Content-Key: 101085
Url: https://administrator.de/contentid/101085
Printed on: April 18, 2024 at 08:04 o'clock
5 Comments
Latest comment
Hallo pdeges und willkommen als schreibender Besucher!
Soferne vorausgesetzt werden könnte, dass etwa "Text2" genau ein einziges Mal in der gesamten "config.ini" vorkommt, wäre der Ablauf relativ einfach:
"config.ini" und "newconfig.ini" jeweils zeilenweise in ein Array einlesen (am einfachsten mit
und dann in einer äußeren Schleife alle Zeilen der "newconfig.ini", welche nicht mit "[" beginnen bzw ganz leer sind, abarbeiten (Anfang der Zeile bis vor "=" verwenden).
In einer inneren Schleife die entsprechende Zeile aus der "config.ini" finden und ersetzen.
Am Ende die jetzt veränderten Zeilen der "config.ini" mit
wieder als Ersatz der Originaldatei schreiben.
Wenn Du allerdings die Sections ("[Config]" etc) berücksichtigen musst (etwa auch, weil zusätzliche Zeilen einzufügen sind), muss die jeweils zu bearbeitende Section aus der "newconfig.ini" in einer Variable zwischengespeichert werden und die Suche in der "config.ini" zunächst auf den Beginn der Section ausgelegt werden. Erst wenn diese gefunden wurde, kann nach dem Wert ("Test2") gesucht werden, wobei zusätzlich auf das Ende (der Section bzw der Datei) zu achten ist.
Muss tatsächlich noch eine zusätzliche Zeile eingefügt werden, lässt sich dies erleichtern, indem in der "config.ini" die neue Zeile am Ende der Section angeführt wird (erspart die ansonsten nötige Sortierung). Dann genügt es, die bisher letzte Zeile der Section etwa so zu ergänzen:
(wobei NewConf(i) die neue Zeile darstellt).
Grüße
bastla
Soferne vorausgesetzt werden könnte, dass etwa "Text2" genau ein einziges Mal in der gesamten "config.ini" vorkommt, wäre der Ablauf relativ einfach:
"config.ini" und "newconfig.ini" jeweils zeilenweise in ein Array einlesen (am einfachsten mit
Conf = Split(fso.OpenTextFile("config.ini").ReadAll, vbCrLF)
In einer inneren Schleife die entsprechende Zeile aus der "config.ini" finden und ersetzen.
Am Ende die jetzt veränderten Zeilen der "config.ini" mit
fso.CreateTextFile("config.ini", True).Write Join(Conf, vbCrLF)
Wenn Du allerdings die Sections ("[Config]" etc) berücksichtigen musst (etwa auch, weil zusätzliche Zeilen einzufügen sind), muss die jeweils zu bearbeitende Section aus der "newconfig.ini" in einer Variable zwischengespeichert werden und die Suche in der "config.ini" zunächst auf den Beginn der Section ausgelegt werden. Erst wenn diese gefunden wurde, kann nach dem Wert ("Test2") gesucht werden, wobei zusätzlich auf das Ende (der Section bzw der Datei) zu achten ist.
Muss tatsächlich noch eine zusätzliche Zeile eingefügt werden, lässt sich dies erleichtern, indem in der "config.ini" die neue Zeile am Ende der Section angeführt wird (erspart die ansonsten nötige Sortierung). Dann genügt es, die bisher letzte Zeile der Section etwa so zu ergänzen:
Conf(j) = Conf(j) & vbCrLF & NewConf(i)
Grüße
bastla
Hallo pdeges!
Etwas gestrafft / optimiert (was sich allerdings nur bei umfangreichen Dateien tatsächlich als merkbare Verbesserung der Laufzeit auswirken würde ) könnte das dann so aussehen:
Die Verwendung von "WScript.Echo" anstelle von "MsgBox" erspart (bei Ausführung des Scripts über "cscript" in der CMD-Shell), die MsgBoxes jeweils wegklicken zu müssen.
Da die "newini.ini" sicherlich nicht mehr Zeilen als die "inifile.ini" enthält, ist es sinnvoller, die äußere Schleife über die "newini.ini"-Zeilen laufen zu lassen.
Das einmalige Ermitteln des zu verändernden Keys ist effizienter, als in der inneren Schleife jeweils mittels "Left"-Funktion diesen Wert immer neu zu bestimmen. [Edit] Außerdem können so leichter die relevanten Zeilen (jene, welche ein "=" beinhalten) der "newini.ini" gefunden und (dann nur für diese) die Ersetzungen vorgenommen werden. [/Edit]
In der inneren Schleife genügt es darüber hinaus, mit einem einzigen "If" die gesuchte Zeile zu finden. Außerdem kann danach (unter der Voraussetzung, dass jeder Schlüssel nur einmal vorkommen kann) die Schleife beendet werden.
Falls die Sortierreihenfolge in der "newini.ini" jener in der "inifile.ini" entspricht, ließe sich die innere Schleife noch weiter optimieren, indem diese nicht bei Zeile 0, sondern nach der Zeile, in welcher der letzte zu ändernde Schlüssel gefunden wurde, beginnt. Dies ist in der obigen Version nicht berücksichtigt.
Ebenfalls nicht enthalten ist die Überprüfung, ob der Schlüssel, für welchen ein neuer Wert eingetragen werden soll, überhaupt gefunden wurde - im Hinblick auf eine Absicherung gegen ev Schreibfehler in der "newini.ini" (etwa "Test22" anstatt "Test2") wäre dies wohl eine sinnvolle Ergänzung.
Grüße
bastla
[Edit] Abfrage nach Verarbeitung der jeweiligen Zeile auf Vorhandensein eines "=" abgeändert. [/Edit]
Etwas gestrafft / optimiert (was sich allerdings nur bei umfangreichen Dateien tatsächlich als merkbare Verbesserung der Laufzeit auswirken würde ) könnte das dann so aussehen:
Option Explicit
Dim FSO
Dim i, j, k, l
Dim inifile, newini, KeyNew
Set FSO = CreateObject("Scripting.FileSystemObject")
inifile = Split(FSO.OpenTextFile("inifile.ini").ReadAll, VbCrLf, -1, 1)
newini = Split(FSO.OpenTextFile("newini.ini").ReadAll, VbCrLf, -1, 1)
i = UBound(inifile)
j = UBound(newini)
WScript.Echo i & VbCrLf & j 'Anzeige der vorhandenen Strings im Array
For l = 0 To j
KeyNew = Left(newini(l), InStr(newini(l), "="))
If KeyNew <> "" Then
For k = 0 To i
If Left(inifile(k), InStr(inifile(k), "=")) = KeyNew Then
WScript.Echo inifile(k) & " --> " & newini(l) 'Zeigt die zwei Strings an, die verglichen werden
inifile(k) = newini(l)
Exit For
End If
Next
End If
Next
FSO.CreateTextFile("inifile.ini", True).Write Join(inifile, VbCrLf)
Da die "newini.ini" sicherlich nicht mehr Zeilen als die "inifile.ini" enthält, ist es sinnvoller, die äußere Schleife über die "newini.ini"-Zeilen laufen zu lassen.
Das einmalige Ermitteln des zu verändernden Keys ist effizienter, als in der inneren Schleife jeweils mittels "Left"-Funktion diesen Wert immer neu zu bestimmen. [Edit] Außerdem können so leichter die relevanten Zeilen (jene, welche ein "=" beinhalten) der "newini.ini" gefunden und (dann nur für diese) die Ersetzungen vorgenommen werden. [/Edit]
In der inneren Schleife genügt es darüber hinaus, mit einem einzigen "If" die gesuchte Zeile zu finden. Außerdem kann danach (unter der Voraussetzung, dass jeder Schlüssel nur einmal vorkommen kann) die Schleife beendet werden.
Falls die Sortierreihenfolge in der "newini.ini" jener in der "inifile.ini" entspricht, ließe sich die innere Schleife noch weiter optimieren, indem diese nicht bei Zeile 0, sondern nach der Zeile, in welcher der letzte zu ändernde Schlüssel gefunden wurde, beginnt. Dies ist in der obigen Version nicht berücksichtigt.
Ebenfalls nicht enthalten ist die Überprüfung, ob der Schlüssel, für welchen ein neuer Wert eingetragen werden soll, überhaupt gefunden wurde - im Hinblick auf eine Absicherung gegen ev Schreibfehler in der "newini.ini" (etwa "Test22" anstatt "Test2") wäre dies wohl eine sinnvolle Ergänzung.
Grüße
bastla
[Edit] Abfrage nach Verarbeitung der jeweiligen Zeile auf Vorhandensein eines "=" abgeändert. [/Edit]