Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst VBScript zwei ini Dateien vergleichen

Mitglied: pdeges

pdeges (Level 1) - Jetzt verbinden

05.11.2008, aktualisiert 06.11.2008, 7644 Aufrufe, 5 Kommentare

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
Mitglied: bastla
05.11.2008 um 14:10 Uhr
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
Conf = Split(fso.OpenTextFile("config.ini").ReadAll, vbCrLF)
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
fso.CreateTextFile("config.ini", True).Write Join(Conf, vbCrLF)
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:
Conf(j) = Conf(j) & vbCrLF & NewConf(i)
(wobei NewConf(i) die neue Zeile darstellt).

Grüße
bastla
Bitte warten ..
Mitglied: pdeges
06.11.2008 um 08:27 Uhr
Hallo Bastla,

vielen dank für deine Nachricht, ja in der Tat, so einfach kann das sein ... ich muss aber gestehen, dass mir der Split Befehl nicht geläufig war. Ich werde das ganze nun mal in mein Skript einbauen und testen. Werde mich danach wieder melden!!

Vielen dank nochmals
Bitte warten ..
Mitglied: pdeges
06.11.2008 um 10:40 Uhr
Tja bastla was soll ich sagen, danke für deine Hilfe, klappt wunderbar!! Hier mal mein Code, ich habe lediglich eine Überprüfung der "[" Zeilen gemacht, die Leerstrings werden halt einfach durch einen Leerstring ersetzt ... also passt alles!

01.
Option Explicit  
02.
 
03.
Dim FSO 
04.
Dim i, j, k, l 
05.
Dim inifile, newini, Posinifile, Posnewini 
06.
 
07.
Set FSO = CreateObject("Scripting.FileSystemObject") 
08.
inifile = Split(FSO.OpenTextFile("inifile.ini").ReadAll, VbCrLf, -1, 1) 
09.
newini = Split(FSO.OpenTextFile("newini.ini").ReadAll, VbCrLf, -1, 1) 
10.
i = UBound(inifile) 
11.
j = UBound(newini) 
12.
 
13.
MsgBox (i & VbCrLf & j) 'Anzeige der vorhandenen Strings im Array 
14.
 
15.
k = 0 
16.
l = 0 
17.
For k = 0 To i 
18.
	Posinifile = InStr(inifile(k), "=") 
19.
	For l = 0 To j 
20.
		Posnewini = InStr(newini(l), "=") 
21.
		If (Left (newini(l), Posnewini) = Left (inifile(k), Posinifile)) Then 
22.
			If Not Left(inifile(k), 1) = "[" And Not Left(newini(l), 1) = "[" Then 
23.
				MsgBox inifile(k) & VbCrLf & newini(l) 'Zeigt die zwei Strings an, die verglichen werden 
24.
				inifile(k) = newini(l) 
25.
			End If 
26.
		End If 
27.
	Next 
28.
Next 
29.
FSO.CreateTextFile("inifile.ini", True).Write Join(inifile, VbCrLf)
Nochmals herzlichen Dank !!!
Bitte warten ..
Mitglied: bastla
06.11.2008 um 13:08 Uhr
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:
01.
Option Explicit  
02.
 
03.
Dim FSO 
04.
Dim i, j, k, l 
05.
Dim inifile, newini, KeyNew 
06.
 
07.
Set FSO = CreateObject("Scripting.FileSystemObject") 
08.
inifile = Split(FSO.OpenTextFile("inifile.ini").ReadAll, VbCrLf, -1, 1) 
09.
newini = Split(FSO.OpenTextFile("newini.ini").ReadAll, VbCrLf, -1, 1) 
10.
i = UBound(inifile) 
11.
j = UBound(newini) 
12.
 
13.
WScript.Echo i & VbCrLf & j 'Anzeige der vorhandenen Strings im Array 
14.
 
15.
For l = 0 To j 
16.
    KeyNew = Left(newini(l), InStr(newini(l), "=")) 
17.
    If KeyNew <> "" Then 
18.
        For k = 0 To i 
19.
            If Left(inifile(k), InStr(inifile(k), "=")) = KeyNew Then 
20.
                WScript.Echo inifile(k) & " --> " & newini(l) 'Zeigt die zwei Strings an, die verglichen werden 
21.
                inifile(k) = newini(l) 
22.
                Exit For 
23.
            End If 
24.
        Next 
25.
    End If 
26.
Next 
27.
FSO.CreateTextFile("inifile.ini", True).Write Join(inifile, VbCrLf)
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]
Bitte warten ..
Mitglied: pdeges
06.11.2008 um 13:42 Uhr
Hallo bastla, vielen Dank für deinen Optimierungsvorschlag.
Die Änderung der Schleifen hab ich nach deinem Beispiel vorgenommen, ebenso das Ermitteln des zu verändernden Keys.

Die beiden Msgboxen dienten lediglich zur Diagnose und werden für die Endversion rausgenommen.

Tja die Sortierreihenfolge ist noch so eine Geschichte, derzeit (solange ich die inis vorgebe) wird es eine Reihenfolge geben, jedoch wenn das Ganze im System läuft und theoretisch jeder die inis vorgeben kann, kann ich nicht garantieren, dass die Reihenfolge eingehalten wird. Daher belasse ich die komplette Überprüfung. Ich habe vorhin den ersten Testlauf (noch mit meiner Version) im Betrieb gemacht und der Prozess war binnen 1-2 sec abgearbeitet, obwohl die ini Datei doch schon 350 Zeilen enthält.

Die Überprüfung werde ich wohl noch einbauen müssen, diesen Punkt habe ich nicht bedacht. Daran werde ich noch arbeiten müssen.

Danke und Grüße
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Arbeiten mit INI Files in VBScript
Anleitung von FriemlerBatch & Shell11 Kommentare

In letzter Zeit habe ich hier im Forum des Öfteren Fragen gesehen, wie man aus einer INI-Datei Werte liest ...

Batch & Shell
Batch vergleich von zwei dateien
gelöst Frage von realdavegerBatch & Shell6 Kommentare

Hallo, nach Jahrelangem zugucken, habe ich jetzt schlussendlich eine Frage welche ich selbst stelle. Ich versuche 2 zeiten aus ...

Batch & Shell

Zwei Werte vergleichen in einer Batch-Datei

gelöst Frage von PatrickHeissi10Batch & Shell1 Kommentar

Ich möchte die beiden Variablen %eins% und %zwei% vergleichen haben diese den gleichen Wert haben-> goto einszwei Danke

Windows Server

Terminalserver .ini Datei unter C:Windows

gelöst Frage von geocastWindows Server8 Kommentare

Guten Abend zusammen Ich habe mir hier einen Server 2012R2 Terminalserver zum Testen aufgesetzt. Ich habe dann unsere alte ...

Neue Wissensbeiträge
Windows 10
Zero-Day-Lücke in Microsoft Edge
Information von kgborn vor 2 TagenWindows 10

In Microsofts Edge-Browser klafft wohl eine nicht geschlossene (0-Day) Sicherheitslücke im Just In Time Compiler (JIT Compiler) für Javascript. ...

Sicherheit
Microsoft und Skype: Sicherheit
Information von kgborn vor 2 TagenSicherheit

Die Tage gab es ja einige Berichte zur Sicherheit des Skype-Updaters. Der Updater von Skype läuft unter dem Konto ...

Datenschutz

Behörden ignorieren Sicherheitsbedenken gegenüber Windows 10

Information von Penny.Cilin vor 3 TagenDatenschutz8 Kommentare

Hallo, passend zum Thema Ablösung LIMUX in München ein interessanter Beitrag dazu: Behörden ignorieren Sicherheitsbedenken gegenüber Windows 10 Anscheinend ...

Sicherheit
Information Security Hub Munich airport
Information von brammer vor 3 TagenSicherheit

Hallo, Neues Center für Cyber Kriminalität am Münchener Flughafen brammer

Heiß diskutierte Inhalte
Windows 10
Windows 10 (1709) Tastur und Maus wieder einschalten?
Frage von LochkartenstanzerWindows 1016 Kommentare

Moin, Ich habe von einem Kunden einen Win10-Rechner bekommen, bei dem weder Tastatur noch Maus geht. Die Hardware funktioniert ...

Humor (lol)
Was könnte man mit einem Server machen? Idee gesucht
Frage von 2SeitenHumor (lol)12 Kommentare

Hey Zusammen Ich habe einen alten HP G2 Rackserver zu Hause rumliegen. 28GB Ram, 1xAMD Prozi mit etwa 2GHz. ...

Server-Hardware
Server für Exchange 2016, Kaufberatung
Frage von MazenauerServer-Hardware10 Kommentare

Guten Tag werte Gemeinde, Vorab: Ich dachte es gab mal einen separaten Bereich für solche Anfragen, habe ich leider ...

Firewall
RB2011 Firewall Rule eine bestimmte Mac oder IP Adresse nicht zu blockieren
Frage von lightmanFirewall10 Kommentare

Hallo liebes Forum mit ihren Spezialisten. Ich habe meine Firewall so konfiguriert das kein Endgerät ohne meine Speziellen Erlaubnis ...