Arbeiten mit INI Files in VBScript
In letzter Zeit habe ich hier im Forum des Öfteren Fragen gesehen, wie man aus einer INI-Datei Werte liest bzw. Werte in eine INI-Datei schreibt. Die oft angebotenen Batchscript-Lösungen funktionieren zwar meistens, aber bedingt durch die vielen Fallstricke in Batchscript bei der Verarbeitung von Text kann das auch mal schief gehen. Ich stelle deshalb hiermit eine VBScript-Klasse zur Verarbeitung von INI-Dateien zur freien Verfügung, die von mir entwickelt wurde.
Beim Einlesen von INI-Dateien werden Zeilen, die mit einem Semikolon beginnen, als Kommentar interpretiert und überlesen.
Die IniFile-Klasse wird über das Unterprogramm
Vielleicht ist das ganze für den ein oder anderen mal nützlich.
Gruß
Friemler
Inhaltsverzeichnis
Allgemeines
Die Klasse ermöglicht (hoffentlich) alle notwendigen Operationen mit INI-Dateien , als da wären:- Bestehende INI-Datei lesen
- Neue INI-Datei anlegen bzw. geänderte Datei speichern
- Existenz einer Section abfragen
- Leere Section anlegen
- Komplette Section löschen
- Alle Keys einer Section löschen
- Existenz eines Keys abfragen
- Key/Value-Pärchen anlegen
- Einzelnen Key löschen
- Wert eines Keys löschen
- Die Namen aller Sections der INI-Datei ermitteln
- Die Namen aller Keys einer Section ermitteln
- Wert eines Keys lesen bzw. ändern
- Bulk Read/Insert aller Key/Value-Pärchen einer Section
Beim Einlesen von INI-Dateien werden Zeilen, die mit einem Semikolon beginnen, als Kommentar interpretiert und überlesen.
Infos zur Implementierung
Die Klasse verwendet intern ein Dictionary, dass die komplette INI-Datei repräsentiert. Für jede Section wird in diesem Dictionary ein Key/Value-Pärchen abgelegt. Als Key dient der Name der Section und als Value wird wiederum ein Dictionary gespeichert, das die Key/Value-Pärchen der Section enthält.Dokumentation
Auf Wunsch von @rubberman füge ich hier ergänzend eine Dokumentation aller öffentlichen Methoden und Eigenschaften der Klasse hinzu.Methoden
Function LoadFile(strFilePath, intEncoding)
Verwendung: Lädt eine INI-Datei in das Objekt.
Parameter: strFilePath (String) - Der Pfad zur Datei
intEncoding (Integer) - Kennung für die Zeichencodierung, in der die
Datei gespeichert ist. Mögliche Werte sind:
* -2 = System default
* -1 = Unicode (UTF-16)
* 0 = ANSI
Rückgabewert: True bei Erfolg, False wenn die Datei nicht existiert.
Function SaveFile(strFilePath, intEncoding, bolOverwrite)
Verwendung: Speichert die durch das Objekt modellierte INI-Datei auf der Festplatte.
Parameter: strFilePath (String) - Der Pfad zur Datei
intEncoding (Integer) - Kennung für die Zeichencodierung, in der die
Datei gespeichert werden soll. Mögliche Werte sind:
* -2 = System default
* -1 = Unicode (UTF-16)
* 0 = ANSI
bolOverwrite (Boolean) - Gibt an, ob eine evtl. unter dem gleichen Namen
existierende Datei überschrieben werden soll
(True) oder nicht (False)
Rückgabewert: True bei Erfolg, False wenn die Datei existiert und der Parameter
bolOverwrite den Wert False hat (Überschreiben nicht erlaubt).
Function SectionExists(strSection)
Verwendung: Prüft, ob in der INI-Datei eine bestimmte Section existiert.
Parameter: strSection (String) - Name der Section
Rückgabewert: True falls die Section existiert, False wenn nicht.
Function AddSection(strSection)
Verwendung: Fügt der INI-Datei eine leere Section hinzu (ohne Key/Value-Pärchen).
Parameter: strSection (String) - Name der Section
Rückgabewert: True falls die Section angelegt werden konnte, False wenn die Section bereits
existierte.
Function DeleteSection(strSection)
Verwendung: Löscht eine komplette Section incl. Key/Value-Pärchen
Parameter: strSection (String) - Name der Section
Rückgabewert: True falls die Section gelöscht werden konnte, False wenn die Section nicht
existierte.
Function ClearSection(strSection)
Verwendung: Löscht alle Key/Value-Pärchen einer Section.
Parameter: strSection (String) - Name der Section
Rückgabewert: True falls die Key/Value-Pärchen gelöscht werden konnten, False wenn die
Section nicht existierte.
Function KeyExists(strSection, strKey)
Verwendung: Prüft, ob in einer bestimmten Section ein bestimmter Schlüssel existiert.
Parameter: strSection (String) - Name der Section
strKey (String) - Name des Schlüssels
Rückgabewert: True falls die Section und in ihr der Schlüssel existieren, False wenn
eine dieser Bedingungen nicht zutrifft.
Function AddKeyValue(strSection, strKey, strValue)
Verwendung: Fügt einer bestimmten Section einen Schlüssel mit zugehörigem Wert hinzu.
Parameter: strSection (String) - Name der Section
strKey (String) - Name des Schlüssels
strValue (String) - Wert des Schlüssels
Rückgabewert: True falls der Schlüssel nach der Zuweisung existiert und den angegebenen
Wert hat, False wenn nicht.
Function DeleteKey(strSection, strKey)
Verwendung: Löscht in einer bestimmten Section einen bestimmten Schlüssel.
Parameter: strSection (String) - Name der Section
strKey (String) - Name des Schlüssels
Rückgabewert: True falls der Schlüssel gelöscht werden konnte, False wenn die Section
und/oder der Schlüssel nicht existierten.
Function ClearKey(strSection, strKey)
Verwendung: Löscht in einer bestimmten Section den Wert eine bestimmten Schlüssels.
Parameter: strSection (String) - Name der Section
strKey (String) - Name des Schlüssels
Rückgabewert: True falls der Wert des Schlüssels gelöscht werden konnte, False wenn die
Section und/oder der Schlüssel nicht existieren.
Eigenschaften/Properties
Property Sections Nur Lesezugriff
Verwendung: Alle Sections einer INI-Datei ermitteln.
Parameter: keine
Ergebnis: Ein Array mit Strings, das die Namen aller Sections enthält.
Beispiel: arrSections = objIniFile.Sections
Property Keys(strSection) Nur Lesezugriff
Verwendung: Alle Schlüssel einer bestimmten Section ermitteln.
Parameter: strSection (String) - Name der Section
Ergebnis: Ein Array mit Strings, das die Namen aller Schlüssel der
Section enthält.
Beispiel: arrKeys = objIniFile.Keys("Section1")
Property Value(strSection, strKey) Lese- und Schreibzugriff
Verwendung: Auslesen/Setzen des Wertes eines Schlüssel in einer bestimmten
Section.
Parameter: strSection (String) - Name der Section
strKey (String) - Name des Schlüssels
Ergebnis: Liefert beim Lesezugriff den Wert des Schlüssels als String.
Beispiel: Lesen: strValue = objIniFile.Value("Section1", "Key1")
Schreiben: objIniFile.Value("Section1", "Key1") = strValue
Property KeyValues(strSection) Lese- und Schreibzugriff
Verwendung: Auslesen/Setzen aller Key/Value-Pärchen einer bestimmten Section (Bulk Read/Insert).
Parameter: strSection (String) - Name der Section
Ergebnis: Liefert beim Lesezugriff ein 2-dimensionales Array. Die erste Dimension
hat so viele Elemente wie es Key/Value-Pärchen in der Section gibt, die
zweite Dimension hat zwei Elemente:
* Index 0 enthält den Namen des Schlüssels
* Index 1 enthält den Wert des Schlüssels
Beispiel: Lesen: arrKeyValues = objIniFile.KeyValues("Section1")
WScript.Echo "Wert von Schlüssel " & arrKeyValues(0,0) & ": " & arrKeyValues(0,1)
Schreiben: * Methode 1 (natives VBScript-Array)
Dim arrKeyValues(2,1)
arrKeyValues(0,0) = "Key11" : arrKeyValues(0,1) = "Value11"
arrKeyValues(1,0) = "Key12" : arrKeyValues(1,1) = "Value12"
arrKeyValues(2,0) = "Key13" : arrKeyValues(2,1) = "Value13"
objIniFile.KeyValues("Section1") = arrKeyValues
* Methode 2 (manuell erstelltes Array aus Arrays)
objIniFile.KeyValues("Section1") = Array(Array("Key11", "Value11"), _
Array("Key12", "Value12"), _
Array("Key13", "Value13") _
)
Code der Klasse
Und jetzt der Code der VBScript-Klasse. Bitte alsClassIniFile.vbs
speichern, damit das Zusammenspiel mit dem Demo Code weiter unten funktioniert.Class clsIniFile
Private objFSO
Private dicIniFile
Private Sub Class_Initialize()
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set dicIniFile = CreateObject("Scripting.Dictionary")
dicIniFile.CompareMode = vbTextCompare
End Sub
Private Sub Class_Terminate()
Clear
Set objFSO = Nothing
Set dicIniFile = Nothing
End Sub
Private Sub Clear
dicIniFile.RemoveAll
End Sub
Private Function IsArrayDimed(ByRef arrArray, intDimension)
Dim intUBound
If Not IsArray(arrArray) Or intDimension < 1 Then
IsArrayDimed = False
Exit Function
End If
On Error Resume Next
intUBound = UBound(arrArray, intDimension)
IsArrayDimed = (Err.Number = 0)
On Error Goto 0
End Function
Public Function LoadFile(strFilePath, intEncoding)
Dim objInStream
Dim objRegEx, colMatches
Dim strLine, strSection, strKey, strValue
Dim dicSection
Clear
strFilePath = objFSO.GetAbsolutePathName(strFilePath)
If Not objFSO.FileExists(strFilePath) Then
LoadFile = False
Exit Function
End If
Set objRegEx = New RegExp
objRegEx.Global = False
objRegEx.IgnoreCase = True
Set objInStream = objFSO.OpenTextFile(strFilePath, 1, False, intEncoding)
Do While Not objInStream.AtEndOfStream
strLine = objInStream.ReadLine
objRegEx.Pattern = "^\[(.+)\]$"
Set colMatches = objRegEx.Execute(strLine)
If colMatches.Count > 0 Then
strSection = colMatches(0).SubMatches(0)
Call AddSection(strSection)
ElseIf strSection <> "" Then
objRegEx.Pattern = "^([^;]+)=(.*)$"
Set colMatches = objRegEx.Execute(strLine)
If colMatches.Count > 0 Then
strKey = colMatches(0).SubMatches(0)
strValue = colMatches(0).SubMatches(1)
Call AddKeyValue(strSection, strKey, strValue)
End If
End If
Loop
objInStream.Close
LoadFile = True
End Function
Public Function SaveFile(strFilePath, intEncoding, bolOverwrite)
Dim objOutStream
Dim strSection, strKey
strFilePath = objFSO.GetAbsolutePathName(strFilePath)
If objFSO.FileExists(strFilePath) And Not bolOverwrite Then
SaveFile = False
Exit Function
End If
Set objOutStream = objFSO.OpenTextFile(strFilePath, 2, True, intEncoding)
For Each strSection In Sections
Call objOutStream.WriteLine("[" & strSection & "]")
For Each strKey In Keys(strSection)
Call objOutStream.WriteLine(strKey & "=" & Value(strSection, strKey))
Next
Next
objOutStream.Close
SaveFile = True
End Function
Public Function SectionExists(strSection)
SectionExists = dicIniFile.Exists(strSection)
End Function
Public Function AddSection(strSection)
Dim dicSection
If Not dicIniFile.Exists(strSection) Then
Set dicSection = CreateObject("Scripting.Dictionary")
dicSection.CompareMode = vbTextCompare
Call dicIniFile.Add(strSection, dicSection)
AddSection = True
Else
AddSection = False
End If
End Function
Public Function DeleteSection(strSection)
If dicIniFile.Exists(strSection) Then
Call dicIniFile.Remove(strSection)
DeleteSection = True
Else
DeleteSection = False
End If
End Function
Public Function ClearSection(strSection)
Dim dicSection
If dicIniFile.Exists(strSection) Then
Set dicSection = dicIniFile.Item(strSection)
dicSection.RemoveAll
ClearSection = True
Else
ClearSection = False
End If
End Function
Public Function KeyExists(strSection, strKey)
Dim dicSection
If dicIniFile.Exists(strSection) Then
Set dicSection = dicIniFile.Item(strSection)
KeyExists = dicSection.Exists(strKey)
Else
KeyExists = False
End If
End Function
Public Function AddKeyValue(strSection, strKey, strValue)
Value(strSection, strKey) = strValue
AddKeyValue = (Value(strSection, strKey) = strValue)
End Function
Public Function DeleteKey(strSection, strKey)
Dim dicSection
If dicIniFile.Exists(strSection) Then
Set dicSection = dicIniFile.Item(strSection)
If dicSection.Exists(strKey) Then
Call dicSection.Remove(strKey)
DeleteKey = True
Else
DeleteKey = False
End If
Else
DeleteKey = False
End If
End Function
Public Function ClearKey(strSection, strKey)
Dim dicSection
If dicIniFile.Exists(strSection) Then
Set dicSection = dicIniFile.Item(strSection)
If dicSection.Exists(strKey) Then
dicSection.Item(strKey) = ""
ClearKey = True
Else
ClearKey = False
End If
Else
ClearKey = False
End If
End Function
Public Property Get Sections
Sections = dicIniFile.Keys
End Property
Public Property Get Keys(ByRef strSection)
Dim dicSection
If dicIniFile.Exists(strSection) Then
Set dicSection = dicIniFile.Item(strSection)
Keys = dicSection.Keys
Else
Keys = Array()
End If
End Property
Public Property Get Value(ByRef strSection, ByRef strKey)
Dim dicSection
If dicIniFile.Exists(strSection) Then
Set dicSection = dicIniFile.Item(strSection)
If dicSection.Exists(strKey) Then
Value = dicSection.Item(strKey)
Else
Value = ""
End If
Else
Value = ""
End If
End Property
Public Property Let Value(ByRef strSection, ByRef strKey, ByRef strValue)
Dim dicSection
Call AddSection(strSection)
Set dicSection = dicIniFile.Item(strSection)
If Not dicSection.Exists(strKey) Then
Call dicSection.Add(strKey, strValue)
Else
dicSection.Item(strKey) = strValue
End If
End Property
Public Property Get KeyValues(ByRef strSection)
Dim dicSection, strKey, intIdx, arrResult
If dicIniFile.Exists(strSection) Then
Set dicSection = dicIniFile.Item(strSection)
If dicSection.Count > 0 Then
ReDim arrResult(dicSection.Count - 1, 1)
intIdx = 0
For Each strKey In dicSection.Keys
arrResult(intIdx, 0) = strKey
arrResult(intIdx, 1) = dicSection.Item(strKey)
intIdx = intIdx + 1
Next
Else
arrResult = Array()
End If
Else
arrResult = Array()
End If
KeyValues = arrResult
End Property
Public Property Let KeyValues(ByRef strSection, ByRef arrKeyValues)
Dim dicSection
Dim intArrLength, intCnt
If Not IsArrayDimed(arrKeyValues, 1) Then Exit Property
If UBound(arrKeyValues, 1) < 0 Then Exit Property
If Not IsArrayDimed(arrKeyValues, 2) Then
If Not IsArrayDimed(arrKeyValues(0), 1) Then Exit Property
If UBound(arrKeyValues(0), 1) < 1 Then Exit Property
Else
If UBound(arrKeyValues, 2) < 1 Then Exit Property
End If
Call AddSection(strSection)
Set dicSection = dicIniFile.Item(strSection)
If Not IsArrayDimed(arrKeyValues, 2) Then
'Manuell erzeugtes 2-dimensionales Array
For intCnt = 0 To UBound(arrKeyValues)
Value(strSection, arrKeyValues(intCnt)(0)) = arrKeyValues(intCnt)(1)
Next
Else
'Natives 2-dimensionales VBScript Array
For intCnt = 0 To UBound(arrKeyValues)
Value(strSection, arrKeyValues(intCnt, 0)) = arrKeyValues(intCnt, 1)
Next
End If
End Property
End Class
Demo Code
Jetzt noch etwas Beispielcode, der die Verwendung der Klasse demonstriert. Alle zur Verfügung stehenden Methoden und Properties werden mindestens einmal verwendet.Die IniFile-Klasse wird über das Unterprogramm
Include
in den Code eingebunden. Falls man den obigen Code der Klasse unter einem anderen als dem vorgeschlagenen Namen bzw. nicht im gleichen Verzeichnis wie die Datei mit dem folgenden Code gespeichert hat, muss Zeile 16 entsprechend angepasst werden.'Alle Variablen müssen vor der ersten Verwendung mit Dim deklariert werden
Option Explicit
'Konstanten für die Dateisystem-Routinen
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Const AsSystemDefault = -2
Const AsUnicode = -1
Const AsAnsi = 0
'Die IniFile-Klasse in das Script einbinden
Include ".\ClassIniFile.vbs"
'Variablendeklaration
Dim strIniFilePath, objIniFile
Dim strSection, strKey
'Initialisierung
strIniFilePath = ".\Test.ini"
Set objIniFile = New clsIniFile
'============================================
' Ini-Datei neu anlegen
'============================================
'Möglichkeit 1 zum Speichern von Key/Value Pärchen
objIniFile.AddKeyValue "Section1", "Key11", "Value11"
objIniFile.AddKeyValue "Section1", "Key12", "Value12"
'Möglichkeit 2 zum Speichern von Key/Value Pärchen
objIniFile.Value("Section2", "Key21") = "Value21"
objIniFile.Value("Section2", "Key22") = "Value22"
'INI-Datei speichern
objIniFile.SaveFile strIniFilePath, AsAnsi, True
'============================================
' INI-Datei ändern
'============================================
'INI-Datei einlesen
objIniFile.LoadFile strIniFilePath, AsAnsi
'Bestehenden Schlüssel ändern
objIniFile.Value("Section2", "Key22") = "Value22_neu"
'Neuen Schlüssel hinzufügen
objIniFile.Value("Section1", "Key13") = "Value13"
'Wert eines bestehenden Schlüssels löschen, Methode 1
objIniFile.Value("Section1", "Key11") = ""
'Wert eines bestehenden Schlüssels löschen, Methode 2
objIniFile.ClearKey "Section1", "Key12"
'Bestehenden Schlüssel löschen
objIniFile.DeleteKey "Section2", "Key21"
'Neue Section hinzufügen
objIniFile.AddSection "Section3"
'Zu bestehender Section gleichzeitig mehrere Values hinzufügen
'Methode 1: Manuell erzeugtes 2-dimensionales Array (Array of Arrays)
objIniFile.KeyValues("Section3") = Array(Array("Key31", "Value31"), _
Array("Key32", "Value32") _
)
'Eine neue Section und gleichzeitig mehrere Values hinzufügen
'Methode 2: Natives 2-dimensionales VBScript-Array
Dim arrValues(2,1)
arrValues(0,0) = "Key41"
arrValues(0,1) = "Value41"
arrValues(1,0) = "Key42"
arrValues(1,1) = "Value42"
arrValues(2,0) = "Key43"
arrValues(2,1) = "Value43"
objIniFile.KeyValues("Section4") = arrValues
'Prüfen ob eine Section existiert
If objIniFile.SectionExists("Section4") Then
WScript.Echo "Section4 existiert"
WScript.Echo
Else
WScript.Echo "Section4 existiert nicht"
WScript.Echo
End If
'Prüfen ob in einer Section ein Key existiert und ggf. seinen Value ausgeben
If objIniFile.KeyExists("Section4", "Key42") Then
WScript.Echo "Key42 = " & objIniFile.Value("Section4", "Key42")
WScript.Echo
Else
WScript.Echo "Section4, Key42 existiert nicht"
WScript.Echo
End If
'Alle Keys einer Section löschen
objIniFile.ClearSection "Section4"
'Prüfen ob in einer Section ein Key existiert und ggf. seinen Value ausgeben
If objIniFile.KeyExists("Section4", "Key42") Then
WScript.Echo "Key42 = " & objIniFile.Value("Section4", "Key42")
WScript.Echo
Else
WScript.Echo "Section4, Key42 existiert nicht"
WScript.Echo
End If
'Prüfen ob eine Section existiert
If objIniFile.SectionExists("Section4") Then
WScript.Echo "Section4 existiert"
WScript.Echo
Else
WScript.Echo "Section4 existiert nicht"
WScript.Echo
End If
'Komplette Section löschen
objIniFile.DeleteSection "Section4"
'Prüfen ob eine Section existiert
If objIniFile.SectionExists("Section4") Then
WScript.Echo "Section4 existiert"
WScript.Echo
Else
WScript.Echo "Section4 existiert nicht"
WScript.Echo
End If
'Alle Key/Value-Pärchen einer Section ausgeben
Dim arrKeyValues, intIdx
arrKeyValues = objIniFile.KeyValues("Section1")
For intIdx = 0 To UBound(arrKeyValues)
WScript.Echo arrKeyValues(intIdx, 0) & " = " & arrKeyValues(intIdx, 1)
Next
WScript.Echo
'INI-Datei speichern
objIniFile.SaveFile strIniFilePath, AsAnsi, True
'============================================
' Ini-Datei einlesen und vollständig ausgeben
'============================================
WScript.Echo "INI-Datei ausgeben"
WScript.Echo "------------------"
'INI-Datei einlesen
objIniFile.LoadFile strIniFilePath, AsAnsi
'Alle Sections verarbeiten
For Each strSection In objIniFile.Sections
'Section ausgeben
WScript.Echo "[" & strSection & "]"
'Alle Keys der Section verarbeiten
For Each strKey In objIniFile.Keys(strSection)
'Key/Value Pärchen ausgeben
WScript.Echo strKey & "=" & objIniFile.Value(strSection, strKey)
Next
Next
WScript.Echo
'============================================
' Routine zum Einbinden von externem Code
'============================================
Sub Include(ByRef strFilePath)
Dim objFSO, objFileStream, strAbsFilePath, strCode
Set objFSO = CreateObject("Scripting.FileSystemObject")
strAbsFilePath = objFSO.GetAbsolutePathName(strFilePath)
Set objFileStream = objFSO.OpenTextFile(strAbsFilePath, ForReading, False, AsAnsi)
strCode = objFileStream.ReadAll
objFileStream.Close
ExecuteGlobal strCode
End Sub
Vielleicht ist das ganze für den ein oder anderen mal nützlich.
Gruß
Friemler
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 308128
Url: https://administrator.de/contentid/308128
Ausgedruckt am: 21.11.2024 um 14:11 Uhr
11 Kommentare
Neuester Kommentar
Hallo Friemler,
wäre ja schade, wenn du dir so viel Arbeit für umsonst gemacht hättest. Da werden Mod und Admin schon was tun können
[OT]
Die Reglung finde ich aber auch fragwürdig für Beiträge im Bereich Wissen und Links. Nicht nur wenn man konkretisieren will, wie du gerade. Da könnte sich so viel ändern (Betriebssysteme und Sprachen entwickeln sich weiter, Links sind ggf. tot und der Inhalt findet sich woanders), dass es auch mal größere Änderungen erfordern könnte, wenn man seinen Beitrag up to date halten will.
[/OT]
Grüße
rubberman
wäre ja schade, wenn du dir so viel Arbeit für umsonst gemacht hättest. Da werden Mod und Admin schon was tun können
[OT]
Die Reglung finde ich aber auch fragwürdig für Beiträge im Bereich Wissen und Links. Nicht nur wenn man konkretisieren will, wie du gerade. Da könnte sich so viel ändern (Betriebssysteme und Sprachen entwickeln sich weiter, Links sind ggf. tot und der Inhalt findet sich woanders), dass es auch mal größere Änderungen erfordern könnte, wenn man seinen Beitrag up to date halten will.
[/OT]
Grüße
rubberman
[OT]
Grüße
Biber
[/OT]
Zitat von @Frank:
Hi @rubbermann,
da stimme ich dir zu, bei Anleitungen sollte ich die Änderungsrate höher ansetzten. Ich werde es am Montag ändern.
Da es montags immer etwas anders laufen kann als geplant, habe ich Friemlers Ergänzungen schon mal oben im Beitrag angefügt..Hi @rubbermann,
da stimme ich dir zu, bei Anleitungen sollte ich die Änderungsrate höher ansetzten. Ich werde es am Montag ändern.
Grüße
Biber
[/OT]
Hi,
sorry, but where is the script ??
Regards
sorry, but where is the script ??
Regards
Moin highload,
Both of us didn't keep in mind the implications of this specific weekday today...
Don't bother... i told Friemler, something went wrong and asked for instructions.
P.S. I noticed you're a friend of proverbs, too.
In this case - i just tried to help - the saying would be "The road to hell is paved with good intentions."
But, at the end of the day: "All's well that ends well. "
Regards
Biber
Zitat von @129813:
Hi,
sorry, but where is the script ??
Regards
Hmm, Friemler sent his "complete tutorial" to me to just "brush over" the elder version.Hi,
sorry, but where is the script ??
Regards
Both of us didn't keep in mind the implications of this specific weekday today...
Don't bother... i told Friemler, something went wrong and asked for instructions.
P.S. I noticed you're a friend of proverbs, too.
In this case - i just tried to help - the saying would be "The road to hell is paved with good intentions."
But, at the end of the day: "All's well that ends well. "
Regards
Biber
Moin Friemler,
Kann mir auch nicht erklären, was so große Konzerne bei einer so kleinen plain text - Datei verkehrt machen können und wie..
Ein dickes Danke an dich für dieses nützliche Tutorial und - wie rubberman schon schrieb, es ist schön zu lesen und nachzuvollziehen, es macht Appetit aufs Coden.. 5 von 5 Sternen von mir.
Grüße
Biber
Zitat von @Friemler:
@Biber: Ich habe keine Ahnung, was das Mailsystem von Freenet und Hotmail da verbrochen hat, ich habe jedenfalls eine vollständige Version meiner geänderten Anleitung an Dich geschickt, nämlich genau das, was ich gerade eben oben eingefügt habe.
Ich habe es auch mehrmals geprüft... der gesamte Anhang besteht aus schlanken 65 Zeilen.@Biber: Ich habe keine Ahnung, was das Mailsystem von Freenet und Hotmail da verbrochen hat, ich habe jedenfalls eine vollständige Version meiner geänderten Anleitung an Dich geschickt, nämlich genau das, was ich gerade eben oben eingefügt habe.
Kann mir auch nicht erklären, was so große Konzerne bei einer so kleinen plain text - Datei verkehrt machen können und wie..
zunächst mal ein Dankeschön an Frank. Die meist prompte Behebung von Fehlern bzw. die Umsetzung von Verbesserungen ist wirklich vorbildlich.
Na, so geht das nicht, dass alle ein Dankeschön bekommen von dem, der die meiste Arbeit gehabt hat ...Ein dickes Danke an dich für dieses nützliche Tutorial und - wie rubberman schon schrieb, es ist schön zu lesen und nachzuvollziehen, es macht Appetit aufs Coden.. 5 von 5 Sternen von mir.
Alles wird gut.
Meine Worte... Grüße
Biber