Ini: Alle Sectionen nach Wert durchsuchen

  • Hallo,

    ich hab mal wieder ein Problem, welches ich nicht lösen kann.
    Wir haben ein kleines Programm geschrieben, welches aus der Firma alle Daten der Rechner erfasst und in eine Ini schreibt. Ein zweites Programm liest das ganze dann aus, indem man nach dem Rechnernamen sucht, soweit funktioniert das ganze. Nun soll es auch möglich sein, nach der Seriennummer vom Angeschlossenen Monitor zu suchen. Über die RadioButtons kann man das bei der Suchabfrage auswählen.

    Die Ini Datei ist folgendermaßen aufgebaut:

    [Computername]
    user=xyz
    ip=10.1.0.2
    ser_moni=YLS01123548


    Momentan sucht das Script nach dem Computernamen und ließt alle Infos aus und zeigt diese in einer ChildGUI, nun muss aber das Script nach einem Wert in einem Key suchen und dazu die Section ausgeben. Ist das möglich, wenn ja, wie?

    Danke euch für eure Hilfe!
    Schönen Montag noch :)

  • Ich würde generell erst einmal alle Daten permanent im Speicher halten... speichern und laden der Daten von/in die/der INI-Datei und das immer und immer wieder ist nicht gerade performant...
    Anders würde ich das auch nicht machen, wenn eine Datenbank genutzt wird ;) (unabhängig vom Datenbanktyp)

    Im Speicher würde ich die Daten in einem Array halten, 2-D Array um genau zu sein... dann lässt sich auch der Rechner mit einer recht einfachen/simplen Schleife finden ;)

  • Okay danke für die Antworten!
    Die Idee mit der Datenbank gefällt mir, hatte vorher noch nie mit Datenbanken über AutoIT gearbeitet, werde mich da mal ransetzen.

    Danke!

    • Offizieller Beitrag

    Auch mit der INI geht das recht einfach:

    [autoit]


    $SerNum = "YLS01123548"
    $SearchPattern = "\[(\w+)\]\r\nuser=[\w]+\r\nip=[\d\.]+\r\n\w+=" & $SerNum

    [/autoit][autoit][/autoit][autoit]

    ;~ $sRead = FileRead('Deine.INI')

    [/autoit][autoit][/autoit][autoit]

    $sRead = _
    "[Computername_A]" & @CRLF & _
    "user=xyz" & @CRLF & _
    "ip=10.1.0.2" & @CRLF & _
    "ser_moni=YLS01123548" & @CRLF & _
    @CRLF & _
    "[Computername_B]" & @CRLF & _
    "user=abc" & @CRLF & _
    "ip=10.1.0.3" & @CRLF & _
    "ser_moni=YLS01123666" & @CRLF

    [/autoit][autoit][/autoit][autoit]

    $aRet = StringRegExp($sRead, $SearchPattern, 3)
    ConsoleWrite($aRet[0] & @LF)

    [/autoit]
    • Offizieller Beitrag

    Wenn man das Pattern etwas ändert, erhältst du auch gleich alle anderen Daten der INI-Sektion in einem Aufwasch:

    Spoiler anzeigen
    [autoit]

    $SerNum = "YLS01123548"
    $SearchPattern = "\[(\w+)\]\r\nuser=(\w+)\r\nip=([\d\.]+)\r\n\w+=" & $SerNum

    [/autoit] [autoit][/autoit] [autoit]

    ;~ $sRead = FileRead('Deine.INI')

    [/autoit] [autoit][/autoit] [autoit]

    $sRead = _
    "[Computername_A]" & @CRLF & _
    "user=xyz" & @CRLF & _
    "ip=10.1.0.2" & @CRLF & _
    "ser_moni=YLS01123548" & @CRLF & _
    @CRLF & _
    "[Computername_B]" & @CRLF & _
    "user=abc" & @CRLF & _
    "ip=10.1.0.3" & @CRLF & _
    "ser_moni=YLS01123666" & @CRLF

    [/autoit] [autoit][/autoit] [autoit]

    $aRet = StringRegExp($sRead, $SearchPattern, 3)
    ConsoleWrite('+> Monitor mit der SerNr: ' & $SerNum & @LF)
    ConsoleWrite('>> PC-Name ' & $aRet[0] & @LF)
    ConsoleWrite('>> User-Name ' & $aRet[1] & @LF)
    ConsoleWrite('>> IP-Adresse ' & $aRet[2] & @LF)

    [/autoit]
  • Hallo,
    mein Problem ist vielleicht ganz ähnlich, daher grabe ich mal dieses Thema wieder hervor.
    Die .cfg Datei die bei uns verwendet wird ähnelt einer .ini, allerdings mit Leerzeichen vor und nach den = Zeichen
    weiterhin sind einige "Values" in " " geschrieben.
    Wie sollte das Pattern aussehen, damit ich die sogenannte "Sektion" in der .cfg Datei ermitteln kann.
    Als Suchbegriff wird der Name verwendet.

    Hier der Aufbau der .cfg Datei:
    [123]
    gruppe = "Gruppe1"
    name = "Name1"
    wert = 1
    [862]
    gruppe = "Gruppe1"
    name = "Name2"
    wert = 1

  • Hi,

    meine inis sind teilweise als *.dll gespeichert, macht gar keinen Unterschied, arbeite einfach so, als wäre es eine normale ini.

    Fügst halt einfach jeweils beim ein- und auslesen ein Leerzeichen ein bzw nimmst es weg mit

    [autoit]

    StringTrimLeft()

    [/autoit]

    oder

    [autoit]

    StringTrimRight()

    [/autoit]

    .

    So würds ich jedenfalls machen :)

    Gruß,
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • allerdings mit Leerzeichen vor und nach den = Zeichen [...] weiterhin sind einige "Values" in " " geschrieben.

    Bei IniRead egal - nutz diese.
    Hier eine Lösung auf Basis der Ini-Funktionen:

    Spoiler anzeigen
    [autoit]

    $s_Section = IniGetSectionByValue("Test.cfg", "ser_moni", "YLS01123666")

    [/autoit] [autoit][/autoit] [autoit]

    If @error = 1 Then
    MsgBox(48,"Nichts gefunden", "Eintrag in ini-Datei nicht gefunden")
    ElseIf @error = 2 Then
    MsgBox(48,"Fehler", "Konnte ini-Datei nicht lesen")
    Else
    MsgBox(0,"", "ser_moni = YLS01123666 in Section [" & $s_Section & "] gefunden.")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func IniGetSectionByValue($s_IniFile, $s_SearchKey, $s_SearchValue)
    Local $a_Sections = IniReadSectionNames($s_IniFile)
    If @error Then Return SetError(2, @error, "")

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $a_Sections[0]
    If IniRead($s_IniFile, $a_Sections[$i], $s_SearchKey, Default) = $s_SearchValue Then Return $a_Sections[$i]
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return SetError(1,0, "")
    EndFunc ;==>IniGetSectionByValue

    [/autoit]

    meine inis sind teilweise als *.dll gespeichert

    ???
    Du nennst deine Ini-Dateien "dll"?
    Was soll denn das?!?

  • User.dll => user_id=user_name

    Hat den einfachen Sinn, wenn einer der Mitarbeiter seine ID bei anderen Namen einfügt, kann er die Stempelzeiten des jeweiligen sehen. Um da Manipulationen vorzubeugen, nenn ich die ini in dll und setz damit vorraus, dass die Leute zu "doof" sind, um dlls mit Textdateien zu öffnen ;)

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Hallo nochmal,
    ich hatte eben nochmal den Code von Aspirin getest und stellte fest, dass wenn der Suchbegriff sich nicht in der ersten
    Sektion befindet, nicht weiter in den anderen Sektionen gesucht wird.
    Wie müßte man den Code verändern damit das auch noch gelingt?

  • Sorry Aspirin, ich hatte wohl eine variable vertauscht.
    Natürlich geht es jetzt.

    Spoiler anzeigen
    [autoit]

    Local $path = @ScriptDir & "\beispiel.cfg"
    Local $key = "name"
    Local $name = "username5"
    Local $s_Section = IniGetSectionByValue($path, $key, $name)

    [/autoit] [autoit][/autoit] [autoit]

    If @error = 1 Then
    MsgBox(48, "Nichts gefunden", "Eintrag in ini-Datei nicht gefunden")
    ElseIf @error = 2 Then
    MsgBox(48, "Fehler", "Konnte ini-Datei nicht lesen")
    Else
    MsgBox(0, "", "name = " & $name & " in Section [" & $s_Section & "] gefunden.")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func IniGetSectionByValue($s_IniFile, $s_SearchKey, $s_SearchValue)
    Local $a_Sections = IniReadSectionNames($s_IniFile)
    If @error Then Return SetError(2, @error, "")
    For $i = 1 To $a_Sections[0]
    If IniRead($s_IniFile, $a_Sections[$i], $s_SearchKey, Default) = $s_SearchValue Then Return $a_Sections[$i]
    Next
    Return SetError(1, 0, "")
    EndFunc ;==>IniGetSectionByValue

    [/autoit]

    Hier die passende beispiel.cfg

    Spoiler anzeigen

    ;Beispiel cfg

    [111]
    gruppe = "admin"
    name = "username1"
    wert = 1

    [22222]
    gruppe = "user"
    name = "username2"
    wert = 1

    [33333]
    gruppe = "user"
    name = "username3"
    wert = 1

    [44444]
    gruppe = "gast"
    name = "username4"
    wert = 1

    [55555]
    gruppe = "user"
    name = "username5"
    wert = 1