friemler
Goto Top

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.


back-to-topAllgemeines

Die Klasse ermöglicht (hoffentlich) alle notwendigen Operationen mit INI-Dateien , als da wären:


Beim Einlesen von INI-Dateien werden Zeilen, die mit einem Semikolon beginnen, als Kommentar interpretiert und überlesen.

back-to-topInfos 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.

back-to-topDokumentation

Auf Wunsch von @rubberman füge ich hier ergänzend eine Dokumentation aller öffentlichen Methoden und Eigenschaften der Klasse hinzu.
back-to-topMethoden
back-to-topFunction 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.

back-to-topFunction 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).

back-to-topFunction 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.

back-to-topFunction 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.

back-to-topFunction 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.

back-to-topFunction 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.

back-to-topFunction 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.

back-to-topFunction 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.

back-to-topFunction 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.

back-to-topFunction 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.

back-to-topEigenschaften/Properties
back-to-topProperty 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

back-to-topProperty 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")

back-to-topProperty 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

back-to-topProperty 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")  _
                                                                    )

back-to-topCode der Klasse

Und jetzt der Code der VBScript-Klasse. Bitte als ClassIniFile.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

back-to-topDemo 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

Content-ID: 308128

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

Ausgedruckt am: 21.11.2024 um 14:11 Uhr

rubberman
rubberman 25.06.2016 aktualisiert um 22:09:24 Uhr
Goto Top
Hallo Friemler,

sehr schöne Arbeit! Macht Spaß zu lesen face-smile
Gut wäre noch ein Index/eine Referenz mit kurzer Erklärung der Parameter.

Grüße
rubberman
Friemler
Friemler 26.06.2016 um 01:41:48 Uhr
Goto Top
Hallo rubberman,

danke für die Blumen!

Ich wollte Deinem Wunsch entsprechen und habe eine Doku der öffentlichen Methoden und Eigenschaften der Klasse verfasst. Die ist jedoch so umfangreich, dass die Anleitung auf eine Änderungsquote von 67,5% kommt. Die Forensoftware meint, dass das zu viel sei für einen Beitrag, für den bereits Kommentare existieren und hat die Speicherung abgelehnt. face-sad

Ich bin dann dem Hinweis gefolgt, mich an den Moderator des Themenbereichs (in dem Fall Biber) zu wenden, um die Änderungen dennoch speichern zu können. Mal sehen, was daraus wird. Ich melde mich dann nochmal.

Grüße
Friemler
rubberman
rubberman 26.06.2016 um 11:59:59 Uhr
Goto Top
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 face-smile

[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
Frank
Frank 26.06.2016 um 14:59:13 Uhr
Goto Top
Hi @rubbermann,

da stimme ich dir zu, bei Anleitungen sollte ich die Änderungsrate höher ansetzten. Ich werde es am Montag ändern.

Gruß
Frank
Biber
Biber 27.06.2016 um 10:54:12 Uhr
Goto Top
[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..

Grüße
Biber
[/OT]
129813
129813 27.06.2016 aktualisiert um 14:21:06 Uhr
Goto Top
Hi,
sorry, but where is the script face-smile ??

Regards
Biber
Biber 27.06.2016 um 14:53:26 Uhr
Goto Top
Moin highload,

Zitat von @129813:

Hi,
sorry, but where is the script face-smile ??

Regards
Hmm, Friemler sent his "complete tutorial" to me to just "brush over" the elder version.

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
Frank
Frank 27.06.2016 aktualisiert um 17:56:51 Uhr
Goto Top
Hi,

die Änderungen sind durch und bei Wissensbeiträgen wird die Änderungsquote nicht mehr abgefragt.

Gruß
Frank
Friemler
Friemler 27.06.2016 um 19:13:53 Uhr
Goto Top
Hi @all,

zunächst mal ein Dankeschön an Frank. Die meist prompte Behebung von Fehlern bzw. die Umsetzung von Verbesserungen ist wirklich vorbildlich.

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

Anyway, Franks Änderung funktioniert, rubbermans Wunsch ist erfüllt und die Arbeit, die ich mir gemacht habe, war nicht umsonst. Alles wird gut. face-wink

Grüße
Friemler
Biber
Biber 27.06.2016 um 19:31:10 Uhr
Goto Top
Moin Friemler,


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.
Kann mir auch nicht erklären, was so große Konzerne bei einer so kleinen plain text - Datei verkehrt machen können und wie.. face-wink

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. face-wink
Meine Worte... face-wink

Grüße
Biber
rubberman
rubberman 27.06.2016 um 22:07:59 Uhr
Goto Top
Super gemacht, so wünscht man sich einen Wissensbeitrag!

Grüße
rubberman