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



## amn.ssy (13. Juni 2014)

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)

```
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

```
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


----------



## Yaslaw (13. Juni 2014)

Am einfachsten über die API-Funktionen zum ini-Handling
Ich verwende jeweils den folgenden Code dazu

```
'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


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


----------



## amn.ssy (13. Juni 2014)

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?


```
sVbs = GetIniParam(sfile, "sVbs")
```

Würde dies auch so funktionieren?
Oder zwingend:


```
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.


----------



## ComFreek (13. Juni 2014)

@amn.ssy Bis auf einige Ausnahmen sind wir auf das Format 
	
	
	



```
...
```
 umgestiegen. Verfügbare Sprachen, darunter "vb", findest du in der Hilfe. (Ich werde deine Beiträge schnell mal ändern.)


----------



## amn.ssy (13. Juni 2014)

Hallo ComFreak,

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

Gruß
amn.ssy


----------



## Yaslaw (13. Juni 2014)

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.


----------



## amn.ssy (13. Juni 2014)

Problemlos? ... Yaslaw ist heut' wohl zum Spaßen aufgelegt ;-)
eval() parsen? Mir ist schon eval


----------



## Yaslaw (13. Juni 2014)

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:

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


----------

