tinything
Goto Top

vbs - Eine ini Datei auslesen an dieser Stelle einen Pfad einfügen und wenn dieser Datei nicht existiert in der ini Pfad zusätzlich einfügen

Hallo zusammen,

da ich vbs Anfänger bin hätte ich eine Frage. Habe schon viele Programme hier gefunden doch keines hatte ich für meinen Gebrauch nutzen können.

Vielleicht könnte mir einer von euch helfen.

Möchte eine *.ini Datei auslesen nach dem wert names=
nach dem = möchte ich einen vorgegebenen Pfad einfügen.

Dies möchte ich auch mit der desktop6=
machen. Wenn dieser Wert nicht existiert soll er zusätzlich angelegt werden.

Dann habe ich noch folgendes Problem:

Ein Wert soll ausgelesen werden ... dies ist der Username der bei jeder Datei unterschiedlich ist.
Dieser wert soll dann in einen weiteren Pfad eingefügt werden.

Andere Werte wie z.B. Region=de sollten noch ausgelesen werden und wenn nicht vorhanden zusätzlich dazu geschrieben werden.

Vielleicht könnte mir jemand da weiterhelfen
Sasha

Content-Key: 123909

Url: https://administrator.de/contentid/123909

Printed on: April 24, 2024 at 17:04 o'clock

Member: TsukiSan
TsukiSan Sep 01, 2009 at 06:22:48 (UTC)
Goto Top
Hallo tinything und willkommen im Forum,

könntest du bitte noch genauer beschreiben, wie deine ini-Datei aussieht?
Beisiel:
names=XXXX
desktop6=XXXXX
User=XXXXX
usw.
????

Sollen die neuen Daten in der gleichen Datei umgeschrieben werden oder soll im Anschluß eine neue ini-Datei kreeiert werden?

Zum öffnen von Dateien in VBS nimmst du das "Scripting.FileSystemObject".

Beispiel:
Set FSO = CreateObject("Scripting.FileSystemObject")  

Zum einlesen/schreiben einer Datei in VBS geht folgendes:
Set MyFile = FSO.OpenTextFile("D:\testfile.txt", 8)  
MyFile.WriteLine (time)

' Art, wie die Datei geöffnet werden soll  
'ForReading   = 1   
'ForWriting   = 2   
'ForAppending = 8   

zum austauschen von Daten kann man die "Replace"-Methode verwenden:
' ";" durch Tab ersetzen  
TextNeu = Replace(TextAlt, ";", vbTab)  

So, das sind erst mal ein paar Infos von meiner Seite her. Wenn du noch mehr Infos für uns hast, dann basteln wir dir was zurecht face-wink

Gruß
Tsuki
Member: tinything
tinything Sep 01, 2009 at 07:00:30 (UTC)
Goto Top
Super genial wie schnell du mir geantwortet hast face-smile Vielen Dank schonmal dafür.

Die vorhandene ini Datei soll geändert werden. Eine neue ini erstellen ist nicht notwendig.

Die alte ini schaut folgendermassen aus:

Directory=C:\Programme\LN\Data
Names=names.nsf
Keyfilename=%USER%.id
Desktop6=

Region=de
UserInterface=de
ContentLanguage=de
Cache=C:\Temp\cache.ndk

Die neue soll dann so aussehen:

Directory=C:\Programme\IBM\LN\Data
Names=H:\Documents\LN\Data\names.nsf
Desktop6=H:\Documents\LN\Data\Desktop6.ndk
KeyFilename=H:\Documents\LN\Data\%USER%.id

Region=de <-Diese 4 Zeilen sollen nur überprüft werden ob vorhanden wenn nicht erstellen
UserInterface=de <-
ContentLanguage=de <-
Cache=C:\Temp\cache.ndk <-

Vielen vielen Dank schonmal !
Sitze schon Tage davor und komme einfach nicht weiter face-sad
Member: TsukiSan
TsukiSan Sep 01, 2009 at 07:01:51 (UTC)
Goto Top
hi,

also kurzes Beisiel:

Ini-Datei hat folgende Daten:
names=Testname
desktop6=desktop5
region=fr
path=
usw.

in meinem Schnipsel wird eine neue txt-Datei erstellt, welche fest angepasste Daten dann erhält:
Dim MeineIniDatei
dim Wert1 , Wert2

'On Error resume next  

Set FSO = CreateObject("Scripting.FileSystemObject")  
Set MyDB = FSO.OpenTextFile("C:\Test.ini", 1)  

Set MyNewDB = FSO.CreateTextFile("C:\TestIni.txt", TRUE)  
MyNewDB.close

Do Until MyDB.AtEndOfStream 
    
    MeineIniDatei = MyDB.ReadLine
    MeineIniDatei = Split(MeineIniDatei , "=")  
	Wert1 = MeineIniDatei(0)
	Wert2 = MeineIniDatei(1)
	
	select case Wert1
	case "names"  
	if not Wert2 = "C:\User\" then Wert2 = "C:\User\"  
	case "desktop6"  
	if not Wert2 = "desktop6" then Wert2 = "desktop6"  
	case "region"  
	if not Wert2 = "de" then Wert2 = "de"  
	end select
	
	Set FSO = CreateObject("Scripting.FileSystemObject")  
	Set MyNewDB = FSO.OpenTextFile("C:\TestIni.txt", 8)  
		MyNewDB.WriteLine (Wert1 & "=" & Wert2)  
	MyNewDB.close


Loop

MyDB.close

set MyDB = nothing
set MyNewDB = nothing
set FSO = nothing

ich weiß, daß du noch Daten anlegen möchtest. Das ist auch kein Problem. Möchte aber erst mal genau wissen, was im Detail tatsächlich passieren soll.

poste mal deinen Code

Gruß
Tsuki
Member: TsukiSan
TsukiSan Sep 01, 2009 at 07:02:52 (UTC)
Goto Top
ah, warst schneller,

ich schaue mir deins mal an

Gruß
Tsuki
Member: TsukiSan
TsukiSan Sep 01, 2009 at 07:41:03 (UTC)
Goto Top
Hi Tinything,

hatte etwas zu tun und auf die Schnelle nur diesen Script zusammen bekommen.
Du mußt natürlich die Pfade oder Dateinamen deinen Bedürfnissen anpassen face-wink
Beim schnellen Testen hatte es bei mir funktioniert (WinXP Pro Eng).
Sicher gibt es auch einfachere Varianten, aber die Zeit....

Dim MeineIniDatei
dim WertA(7)
dim WertB(7)
dim i
i = 0
dim Nutzer

'On Error resume next  

'Usernamen auslesen (angemeldet am PC)  
Set objUsr = CreateObject("WScript.NetWork")   
Nutzer = objUsr.UserName


Set FSO = CreateObject("Scripting.FileSystemObject")  
Set MyDB = FSO.OpenTextFile("C:\Test.ini", 1)  


Do Until MyDB.AtEndOfStream 
    
    MeineIniDatei = MyDB.ReadLine
    MeineIniDatei = Split(MeineIniDatei , "=")  
	WertA(i) = MeineIniDatei(0)
	WertB(i) = MeineIniDatei(1)
	
	select case WertA(i)
	case "Directory"  
	if not WertB(i) = "C:\Programme\IBM\LN\Data" then WertB(i) = "C:\Programme\IBM\LN\Data"  
	case "Names"  
	if not WertB(i) = "H:\Documents\LN\Data\names.nsf" then WertB(i) = "H:\Documents\LN\Data\names.nsf"  
	case "Desktop6"  
	if not WertB(i) = "H:\Documents\LN\Data\Desktop6.ndk" then WertB(i) = "H:\Documents\LN\Data\Desktop6.ndk"  
	case "KeyFilename"  
	if not WertB(i) = "H:\Documents\LN\Data\" & Nutzer & ".id" then WertB(i) = "H:\Documents\LN\Data\" & Nutzer & ".id"  
	case "Region"  
	if not WertB(i) = "de" then WertB(i) = "de"  
	case "UserInterface"  
	if not WertB(i) = "de" then WertB(i) = "de"  
	case "ContentLanguage"  
	if not WertB(i) = "de" then WertB(i) = "de"  
	case "Cache"  
	if not WertB(i) = "C:\Temp\cache.ndk" then WertB(i) = "C:\Temp\cache.ndk"  
	end select
	
	
	i = i + 1

Loop

MyDB.close

	if not WertA(4) = "Region" then  
		WertA(4) = "Region"  
		WertB(4) = "de"  
	end if
	if not WertA(5) = "UserInterface" then  
		WertA(5) = "UserInterface"  
		WertB(5) = "de"  
	end if
	if not WertA(6) = "ContentLanguage" then  
		WertA(6) = "ContentLanguage"  
		WertB(6) = "de"  
	end if
	if not WertA(7) = "Cache" then  
		WertA(7) = "Cache"  
		WertB(7) = "C:\Temp\cache.ndk"  
	end if

'jetzt Date überschreiben  
	Set MyNewDB = FSO.CreateTextFile("C:\Test.ini", TRUE)  
	MyNewDB.close

for i = 0 to 7
	Set FSO = CreateObject("Scripting.FileSystemObject")  
	Set MyNewDB = FSO.OpenTextFile("C:\Test.ini", 8)  
		MyNewDB.WriteLine (WertA(i) & "=" & WertB(i))  
	MyNewDB.close
next

set MyDB = nothing
set MyNewDB = nothing
set FSO = nothing
Set objUsr = nothing

Sag mal bescheid, was nicht funktioniert!

Gruß
Tsuki
Member: bastla
bastla Sep 01, 2009 at 07:51:48 (UTC)
Goto Top
@TsukiSan
Kurzer Hinweis:
	if not WertB(i) = "C:\Programme\IBM\LN\Data" then WertB(i) = "C:\Programme\IBM\LN\Data"
lässt sich schmerzfrei reduzieren auf
	WertB(i) = "C:\Programme\IBM\LN\Data"
- wenn der gewünschte Wert schon vorhanden ist, schadet's ja nicht, ihn durch den selben Wert zu ersetzen ...

Grüße
bastla
Member: TsukiSan
TsukiSan Sep 01, 2009 at 07:57:08 (UTC)
Goto Top
@bastla

Danke für deinen Hinweis!
Natürlich kann man das ganze noch etwas "kürzen", aber ich hatte auf die Schnelle nur die Vorgaben und Werte von Tinything übernommen und ihm einfach Zeile für Zeile zu zeigen, was ich meine.
Danke dir aber trotzdem, daß du dir die Zeit genommen hast, mal drüber zu schauen!!!!!!

Bei meinem Script muss die INI-Datei auch immer nach dem selben Muster gestrickt sein - also "Taylor-Made" face-wink

Gruß
Tsuki
Member: bastla
bastla Sep 01, 2009 at 08:34:18 (UTC)
Goto Top
@TsukiSan
Bei meinem Script muss die INI-Datei auch immer nach dem selben Muster gestrickt sein - also "Taylor-Made" face-wink
Wenn diese Voraussetzung erfüllt wäre, würde, da es ja anscheinend keine variablen Bestandteile gibt, ein einfaches Ersetzen der gesamten Datei durch die neue Version (also ein "copy") ja auch genügen ... face-wink

Grüße
bastla
Member: tinything
tinything Sep 01, 2009 at 09:17:17 (UTC)
Goto Top
Vielen lieben Dank für eure Unterstützung face-smile

Die ini Datei besteht aus mehreren Zeilen ausser die 8 die geändert werden müssen. face-sad deswegen das auslesen und ersetzten.

Habe jetzt alles fein säuberlich übernommen. Leider bekomme ich in Zeile: 24 Zeichen: 3 einen Fehler: Index außerhalb des gültigen Bereichs:´[number:1]´

könnt ihr mir da weiterhelfen? Oder habe ich was übersehen?
Member: bastla
bastla Sep 01, 2009 at 10:15:13 (UTC)
Goto Top
Hallo tinything!

Der Fehler resultiert daraus, dass Deine Datei mehr als die (vorgesehenen) 8 Zeilen Zeilen hat (siehe TsukiSans Anmerkung oben) ...

Ein etwas anderer Ansatz sähe so aus:
'Usernamen auslesen (angemeldet am PC)  
Set objUsr = CreateObject("WScript.NetWork")   
Nutzer = objUsr.UserName

MeineIniDatei = "C:\Test.ini"  
'Alle benötigten Zeilen in einem Array zusammenfassen,  
'  um sie dann in einer Schleife einzeln bearbeiten zu können  
Ersetzungen = Array( _
    "Directory=C:\Programme\IBM\LN\Data", _  
    "Names=H:\Documents\LN\Data\names.nsf", _  
    "Desktop6=H:\Documents\LN\Data\Desktop6.ndk", _  
    "KeyFilename=H:\Documents\LN\Data\" & Nutzer & ".id", _  
    "Region=de", _  
    "UserInterface=de", _  
    "ContentLanguage=de", _  
    "Cache=C:\Temp\cache.ndk" _  
)

Set fso = CreateObject("Scripting.FileSystemObject")  
'Aktuellen Inhalt der .ini-Datei einlesen und zeilenweise  
'    in das Array Ini() schreiben  
Ini = Split(fso.OpenTextFile(MeineIniDatei, 1).ReadAll, vbCrLF)
'Höchsten Index zwischenspeichern (wird mehrmals benötigt)  
MaxZeile = UBound(Ini)

'Alle Zeilen der Ersetzungstabelle durchgehen  
For Each Eintrag In Ersetzungen
    Wert = Split(Eintrag, "=") 'Eintrag anhand des "=" aufteilen; Wert(0) = Schlüssel  
    Vorhanden = False 'Schalter, um festzuhalten, ob der Eintrag in der Ini vorhanden ist  
    For i = 0 To MaxZeile 'alle Zeilen der Ini durchgehen  
        'Ist Schlüssel + "=" in der Zeile enthalten?  
	    If InStr(1, Ini(i), Wert(0) & "=", vbTextCompare) > 0 Then  
            Ini(i) = Eintrag 'gesamte Zeile durch Eintrag ersetzen  
            Vorhanden = True 'merken, dass Eintrag in der Ini vorhanden ist  
            Exit For 'die weiteren Zeilen der Ini müssen nicht mehr geprüft werden  
        End If
    Next
    'Falls der Eintrag noch nicht vorhanden ist,  
    '  als "Zusatzzeile" zwischenspeichern (an bereits vorhandene  
    '    Zusatzzeilen mit einer Zeilenschaltung vorweg anfügen)  
    If Not Vorhanden Then Zusatz = Zusatz & vbCrLF & Eintrag
Next

'Neuen Inhalt der Ini durch Zusammenfügen der bisherigen Zeilen  
'  und Anfügen der zusätzlichen Zeilen erstellen ...  
InhaltNeu = Join(Ini, vbCrLF) & Zusatz

'... und damit die Originaldatei überschreiben  
fso.CreateTextFile(MeineIniDatei, True).Write InhaltNeu
In dieser Variante wird eine Liste aller zu ändernden Zeilen (unter der Annahme, dass die Inhalte der eigentlich nur zu prüfenden Zeilen ab "Region=de" ebenfalls ersetzt werden dürfen - ansonsten müssten diese getrennt behandelt werden) erstellt und, nachdem die gesamte .ini-Datei in den Speicher eingelesen wurde, jeweils mit den vorhandenen Ini-Zeilen verglichen. Gibt es die Zeile schon, wird sie durch den neuen Inhalt ersetzt, ansonsten am Ende der Datei angefügt.

Grüße
bastla
Member: tinything
tinything Sep 01, 2009 at 10:35:01 (UTC)
Goto Top
Hallo bastla, Tsuki,

Vielen vielen Dank für eure Bemühungen. Das Programm funktioniert jetzt einwandfrei face-smile

Genau so hab ich mir das vorgestellt face-smile wie kann ich das je wieder gutmachen ...

Vielen Vielen Dank nochmal !!!
Member: TsukiSan
TsukiSan Sep 01, 2009 at 13:48:29 (UTC)
Goto Top
@tinything

keine Ursache!
Bedanken müssen wir uns bei bastla!
Ich habe auch wieder gelernt und verstanden!

Gruß
Tsuki