INI-Dateien mit VBScript auslesen

Einige Ihrer selbstentwickelten Programme speichern Konfigurationsparameter in INI-Dateien. Per VBScript wollen Sie auf diese INI-Dateien zugreifen, finden aber keine passenden vordefinierten Funktionen dafür.

Die folgende VBScript-Funktion »readIni()« kann beliebige INI-Dateien auslesen. Das funktioniert, weil INI-Dateien eine eindeutige Struktur haben: Sie enthalten Sektionen (engl. Sections), deren von eckigen Klammern eingefassten Überschriften alleine in einer Zeile stehen. In den Sections befinden sich untereinander meist mehrere Schlüssel, denen jeweils ein Gleichheitszeichen und ein Wert folgen. Diese Schlüssel sind nur innerhalb einer Section eindeutig.

»ReadIni()« benötigt drei Parameter: erstens den Namen und Pfad der betreffenden INI-Datei (»szIniDatei«), zweitens den Namen der Sektion, in der die gesuchte Information in der INI-Datei abgelegt ist (»szSection«) und drittens den Namen des gesuchten Eintrages (»szKey«). Als Rückgabewert liefert die Funktion die ausgelesenen Daten.

Function readIni (ByVal szIniDatei, ByVal szSection, ByVal szKey)

Dim objFileSystem
Dim szIniDateiInhalt
Dim intPosStart
Dim intPosEnd
Set objFileSystem = CreateObject(„Scripting.FileSystemObject“)
If objFileSystem.FileExists(szIniDatei) Then
szIniDateiInhalt = objFileSystem.OpenTextFile(szIniDatei).ReadAll
intPosStart = InStr(1, szIniDateiInhalt, „[„ & szSection & „]“, vbTextCompare)
If intPosStart > 0 Then
intPosEnd = InStr(intPosStart, szIniDateiInhalt, vbNewLine & „[„ , vbTextCompare)
If intPosEnd = 0 Then
intPosEnd = Len(szIniDateiInhalt)+1
End If
szIniDateiInhalt = Mid(szIniDateiInhalt, intPosStart, intPosEnd - intPosStart)
intPosStart = InStr(1, szIniDateiInhalt, szKey & „=“, vbTextCompare)
If intPosStart > 0 Then
intPosStart = intPosStart + Len(szKey) + 1
intPosEnd = InStr(intPosStart, szIniDateiInhalt, vbNewLine, vbTextCompare)
If intPosEnd = 0 Then
intPosEnd = Len(szIniDateiInhalt) + 1
End If
readIni = Mid(szIniDateiInhalt, intPosStart, intPosEnd - intPosStart)
Else
MsgBox „Schlüssel “ & szKey & „ nicht gefunden!“
End If
Else
MsgBox „Section“ & szSection & „ nicht gefunden!“
End If
Else
MsgBox „INI-Datei „ & szIniDatei & „ nicht gefunden!“
End If
End Function
Um »readIni()« in Ihren Programmen zu nutzen, kopieren Sie den Code einfach ans Ende Ihres eigenen Skriptes. Rufen Sie die Funktion in Ihrem Skript folgendermaßen auf (im Beispiel wird die INI-Datei von QUICKEN übergegeben):
szInformation=readIni(„D:\WINDOWS\QUICKEN.INI“, „Internet“, „UpdateDirCgi“)
So arbeitet das Skript: Nachdem »readIni()« mit der Methode »FileExists« des Objektes »objFileSystem« vom Typ »Scripting.FileSystemObject« sichergestellt hat, dass die als Parameter »szIniDatei« übergebene Datei existiert, kopiert sie ihren gesamten Inhalt in die Variable »szIniDateiInhalt«. Dazu verwendet sie die Methode »objFileSystem.OpenTextFile (szIniDatei).ReadAll«.

ReadIni() sucht dann mit »intPosStart = InStr(1, szIniDateiInhalt, „[„ & szSection & „]“, vbTextCompare)« den Anfang und mit »intPosEnd = InStr(intPosStart, szIniDateiInhalt, vbNewLine & „[„ , vbTextCompare)« das Ende der gesuchten Section. Ist »intPosEnd« gleich »0«, so handelt es sich um die letzte Section der INI-Datei. In diesem Fall entspricht »intPosEnd« dem Ausdruck »Len(szIniDateiInhalt)+1« – dem Ende der Datei. Mit »szIniDateiInhalt =« »Mid(szIniDateiInhalt, intPosStart, intPosEnd - intPosStart)« ersetzt readIni() den Inhalt von »szIniDateiInhalt« durch den Inhalt der gesuchten Section, so dass sie nur noch innerhalb dieser Section operiert.

Anschließend ermittelt readIni() Anfang und Ende des gesuchten Schlüssels. Dazu sucht sie zuerst nach dem als Parameter »szKey« übergebenen Namen des Schlüssels, gefolgt von einem Gleichheitszeichen, dann nach dem folgenden Zeilenumbruch (»vbNewLine«). Nachdem nur der Wert des Schlüssels interessiert, verschiebt die Funktion den ermittelten Anfang des Eintrages »intPosStart« um die Anzahl der Zeichen des Schlüsselnamens, gefolgt von einem Gleichheitszeichen (»intPosStart = intPosStart + Len(szKey) + 1«). Daraufhin kann sie mit »Mid(szIniDateiContent, intPosStart, intPosEnd - intPosStart)« einfach den Wert des Schlüssels lesen und als Rückgabewert der Funktion in die Variable »readIni« schreiben.