VBS: Read "ini" - wie ordne ich zu?

amn.ssy

Erfahrenes Mitglied
Hallo,

Ich versuche mich gerade daran ein paar "Konstanten" in eine Textdatei auszulagen, um bei Änder- und Anpassungen deswegen nicht im Code rum fummeln zu müssen.

Mein erster Versuch sieht so aus:
Ini (txt)
Visual Basic:
sShDrv = "X:"
sRoot = sLw & "\gmd"
sBin = sRoot & "\bin"
sData = sRoot & "\data"
sInput = sRoot & "\input"
sStore = sRoot & "\store"
sCfg = sBin & "\cfg"
sExt = sBin & "\ext"
sLog = sBin & "\log\Events.log"
sInC = sInput & "\coa"
sInR = sInput & "\raw"
sStXLS = sStore & "\xls\"
sStZip = sStore & "\zip\"
s7z = sExt & "\7z.exe"
sVbs = sBin & "\getData.vbs"
sHta = sBin & "\GMDevents.hta"

Auslesen
Visual Basic:
Option Explicit
Dim fso, val, ts, sLw, sfile
Set fso = CreateObject("Scripting.FileSystemObject")
sLw = Left(WScript.ScriptFullName, 2)
sfile = sLw & "\GMD\bin\cfg\gmd.ini"
Set ts = fso.OpenTextFile(sfile,1)
Do Until ts.AtEndOfStream
val = Split(ts.ReadLine,"=")
WScript.Echo "Key : " & val(0) & vbTab & "Value: " & val(1)
Loop

...

    Set oShell = CreateObject("WScript.Shell")
    Set oFso = CreateObject("Scripting.Filesystemobject")
    iCount = 0
    iFlag = 0

'check if shared drive is available
    If (oFSO.DriveExists(sShDrv)) Then
        iFlag = 1
        Call Logging ("shared drive " & sShDrv & " is available!")
    Else
        iFlag = 0
        Call Logging ("shared drive " & sShDrv & " not available!")
    End If

...

Soweit sie das alles schon mal korrekt aus.
Die Frage ist jetzt wie ich im Code dann den Value z.B. "X: den "Variablen" z.B. "sShDrv" zuordne bzw diese entspechend gefüllt werden?
Wie man an der "ini" sieht gibt es da noch mehr, im wesentlichen, Pfade die ich gerne von "Außen" ggf. pflegen würde.

LG
amn.ssy
 
Zuletzt bearbeitet von einem Moderator:
Am einfachsten über die API-Funktionen zum ini-Handling
Ich verwende jeweils den folgenden Code dazu
Visual Basic:
'INI-Dateien per APIs erstellen, einlesen, ändern
'Original-Code :
'http://www.tutorials.de/forum/visual-basic/192481-eine-textdatei-einlesen-schreiben-mit-vb.html
'angepasst und korrigiert : 16.04.2008, NoNet - www.excelei.de
Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Declare Function WritePrivateProfileStringByKeyName& Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lplFileName As String)
 
Public Function GetIniParam(NomFichier As String, NomSection As String, NomVariable As String) As String
    Dim ReadString As String * 255
    Dim returnv As String
    Dim mResultLen As Integer
    mResultLen = GetPrivateProfileString(NomSection, NomVariable, "(Unassigned)", ReadString, Len(ReadString) - 1, NomFichier)
    If IsNull(ReadString) Or Left(ReadString, 12) = "(Unassigned)" Then
         Dim Tempvalue As Variant
         Dim Message As String
         returnv = ""
    Else
         returnv = Left(ReadString, InStr(ReadString, Chr$(0)) - 1)
    End If
    GetIniParam = returnv
End Function

Public Function WriteWinIniParam(NomDuIni As String, sLaSection As String, sNouvelleCle As String, sNouvelleValeur As String)
    Dim iSucccess As Integer
    iSucccess = WritePrivateProfileStringByKeyName(sLaSection, sNouvelleCle, sNouvelleValeur, NomDuIni)
    If iSucccess = 0 Then
        WriteWinIniParam = False
    Else
        WriteWinIniParam = True
    End If
End Function

Natürlich solltest du deine Detei noch in ein richtiges Ini wandeln und Kategorien einfügen

Visual Basic:
Dim s7z AS String
'Annahme: Du macht einen INI-Header ROOT
s7z = GetIniParam(sfile, "ROOT", "s7z")
 
Hallo Yaslaw,

ich hatte gehofft, daß es mit etwas weniger Code machbar wäre, zumal ich in diesem speziellen Fall keine Header benötige.
Klar kann das noch kommen, ich gehe aber im Moment eher nicht davon aus.
Ansonsten [GMD_Path] als Header würde auch nicht weiter stören ;-)

In deinem Beispiel: die writeini-Funktion (sollte das der einzig gangbare Weg sein) könnte ich auch draußen lassen?

Visual Basic:
sVbs = GetIniParam(sfile, "sVbs")

Würde dies auch so funktionieren?
Oder zwingend:

Visual Basic:
sVbs = GetIniParam(sfile, "GMD_Path", "sVbs")

Wenn ich mir das so ansehe, heißt das ja, daß mir im Prinzip die aktuellen Zeilen im code wie z.B sVbs = sBin & "\getData.vbs" nur in anderer Form erhalten bleiben? Was ich gewinne ich nur die Möglichkeit eben von "Außen" zu pflegen, was ja auch Ziel ist?

Danke und Gruß
amn.ssy

P.S. wie ist eigentlich der korrekte "Tag" um hier z.B. VB-Code darzustellen. In der vorherigen Version hatte ich das (glaub ich) mit [VB] gemacht. Das funktioniert jetzt scheinbar nicht mehr.
 
Zuletzt bearbeitet von einem Moderator:
@amn.ssy Bis auf einige Ausnahmen sind wir auf das Format
Code:
...
umgestiegen. Verfügbare Sprachen, darunter "vb", findest du in der Hilfe. (Ich werde deine Beiträge schnell mal ändern.)
 
Hallo ComFreak,

Danke für die Unterstützung und die Änderung.
Is kein so großer Unterschied zu vorher ;-)

Gruß
amn.ssy
 
Du kannst problemlos selber ein ini-Reader schreiben oder auf die API zurückgreiffen. Die API verlangt ein Standart-Ini, also mit Header. Es liegt an dir.

Wahrscheinlich musst du den ausgelesenen Wert so oder so noch mit eval() parsen.
 
Ich schreibe dir keine Funktion.

Jepp. eval(). Du liest so oder so nur den String 'sBin & "\getData.vbs"' aus der Datei. sBin bleibt der String sBin und nciht der Inhalt der Variable sBin

Darum eval:
Visual Basic:
sBin = "C:\\Hallo Welt\Hier ist mein Pfad"
sVbsCode = myReaderFunction(..)
sVbsPath = eval(sVbsCode)
 

Neue Beiträge

Zurück