Inf-Datei auslesen

  • Hi,

    ich will gerne eine Inf Datei auslesen (Inf-Datei von Druckertreiber) da ich an einen Script Arbeite was hier auf meiner Arbeit sämtliche drucker mit 2klicks installiert, jedoch wäre es sehr viel Arbeit die Druckernamen aus den Inf-Dateien per hand rauszusuchen und als Variablen im Script zu speichern(wie ich es mit 4 Druckern gemacht habe zum test). Ich denke mal das man das Problem mit RegExp lösen kann allerdings kenne ich mich damit noch NULL aus. Desweiteren besteht das Problem das die Inf-Dateien nicht gleichmäßig aufgebaut sind, jeder Herrsteller kann sie im prinzip selbst gestallten, nur das Shema bleibt gleich.


    Hier mal 2ausschnitte als Beispiel:


    Hier müsste er zu Manufacture gehen dann lesen das "HP"=Models ist und zu Models gehen um die hier 2 Modelle auszulesen und zu speichern. Eig. nicht so schwer denk ich aber:

    Hier heißt der 2te Teil nach Manufacture, HP und nicht mehr Model.

    Somit kann man den ersten teil finden aber wie den 2ten?(Da der in jeder 3ten Inf-Datei anders heißt)


    Hoffe mir kann geholfen werden. Schonmal Danke für eure Mühe ;)

  • Ich würd den hier probieren:

    [autoit]

    ; Text einlesen
    $sText = ClipGet()

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

    $aSection = StringRegExp($sText,'(?:=|(?:[\r\n]|\r\n)"?)(\w+\b)(?:[\w\W]+?)\[\1\]',3)
    If IsArray($aSection) Then MsgBox(0,"",$aSection[0])
    If Not IsArray($aSection) Then MsgBox(0,"","Kein match :(")

    [/autoit]

    Liefert zumindest bei den beiden Testdateien das richtige ;)
    Die Section, die dann zurückgegeben wird, kannst du ja einfach mit IniReadSection auslesen (oder auch per RegExp, falls das nicht geht)

  • @Xenobiologist: Deine Lösung funktioniert soweit schonmal, muss jedoch noch genauer testen und hab grade net so viel zeit.


    SEuBo: Wie kann ich da den Dateipfad angeben wo die inf ist? xD

    Blick da net so richtig durch, wei ClipGet ist ja für datei aus der zwichenablage aber wie krieg ich die inf darein?? *grins*


    Edit: Es geht darum das Druckermodell rauszusuchen womit der Drucker per Inf datei isntalliert wird.(Oft sind es nicht die bekannte betzeichnung(die auf dem Drucker oder im Handbuch stehen) sondern i.welche abkürzungen oder sonstwas)

  • Statt ClipGet() einfach FileRead(....). Von mir aus auch mit FileOpenDialog, oder _FileListToArray. Das bleibt völlig dir überlassen.

    Hab das nur zum Testen so gemacht, damit man nicht immer den Pfad anpassen muss (und damit ich die Dateien nicht auf meinem eh schon zu vollen Desktop speichern musste)

    Aber wenns bei einer Datei nicht klappt, bitte die Datei dann posten ^^

    Der wesentliche Unterschied : Mein Pattern versucht die Section auszulesen. Das von Xeno versucht die Namen direkt auszulesen. MUsst entscheiden, was für dich am effektivsten und am Vorteilhaftesten ist.

  • ahh, also dann ist Section schon besser als direkt den namen auslesen da bei Sectionen der name auf jedenfall stimmen müsste. Werd evtl. bei glück heute noch testen können. Meld mich dann.


    SEuBo: ist es auch noch möglich unter der gefundenen Section den darin stehenden Namen auszulesen? sodass er zuerst die section sucht und wenn er diese gefunden hat den Model namen der dort steht.

    Wäre Super ;). Soweit funktionierts aber gut.

  • SEuBo: ist es auch noch möglich unter der gefundenen Section den darin stehenden Namen auszulesen? sodass er zuerst die section sucht und wenn er diese gefunden hat den Model namen der dort steht.

    so?!

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    ; Text einlesen
    $sFile = FileOpenDialog("", "", "Inf (*.inf)")
    $sText = FileRead($sFile)

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

    $aSection = StringRegExp($sText, '(?:=|(?:[\r\n]|\r\n)"?)(\w+\b)(?:[\w\W]+?)\[\1\]', 3)

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

    If IsArray($aSection) Then
    $aIniRead = IniReadSection($sFile, $aSection[0]) ; That's where the magic happens
    If Not @error Then
    _ArrayDisplay($aIniRead)
    Else
    MsgBox(0, "", "Konnte Ini nicht lesen")
    EndIf
    Else
    MsgBox(0, "", "Kein match :(")
    EndIf

    [/autoit]
  • Und wieder hat sich mein Problem erweitert, soweit funktioniert SEuBo's vorschlag ganz gut allerdings nicht bei jeder Inf-Datei.


    z.B.

    Hier findet er %Printer% was soweit ja richtig ist, nur %Printer% ist ein String in dem HP LaserJet 2100 Series PCL 6 steht(siehe Zeile 54) also müsste mein Script quasi irgendwie den String erkennen und zu den Punkt springen wo sein Inhalt steht um diesen das auszulesen. (Ich hasse Inf-Dateien).

  • Hey Altair:

    Langsam wird das ganze kompliziert :D
    Zum Glück gibts Backreference. Ich würde die Variablen in der .inf dann erstmal aufschlüsseln.
    Hilft dir dieses Script? Zeile 6-11 ist der "neue" und "interessante" Teil ;)

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    ; Text einlesen
    $sFile = FileOpenDialog("", "", "Inf (*.inf)")
    $sText = FileRead($sFile)

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

    ;Variablen "entschlüsseln" und in Temp datei schreiben
    Do
    $sText = StringRegExpReplace($sText,"(?isx)(\%(\w+)\%)(.+?)\2(=([""']?[^""']+[""']?))","\5\3\2\4")
    Until @extended = 0
    FileDelete(@TempDir & "\~print.inf")
    FileWrite(@TempDir & "\~print.inf",$sText)

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

    $aSection = StringRegExp($sText, '(?:=|(?:[\r\n]|\r\n)"?)(\w+\b)(?:[\w\W]+?)\[\1\]', 3)

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

    If IsArray($aSection) Then
    $aIniRead = IniReadSection(@TempDir & "\~print.inf", $aSection[0]) ; That's where the magic happens
    If Not @error Then
    _ArrayDisplay($aIniRead)
    Else
    MsgBox(0, "", "Konnte Inf nicht lesen")
    EndIf
    Else
    MsgBox(0, "", "Kein match :(")
    EndIf

    [/autoit]

    //EDIT: Kleine Korrektur. (Do-Until)

  • Wäre echt megahappy wenn jemand eine Lösung für mein Problem finden könnte, da mir nix mehr einfällt ausser wirklich alle benötigten .inf-Dateien per hand durchzugehen um die Druckernamen rauszufinden und diese in mein Script einzupflegen.

  • Hilft dir der Teil von Seubo nicht weiter?

    Ansonsten mal ein anderer Ansatz hierzu um erstmal eine saubere Inf-Datei mit aufgelösten Variablen zu erhalten:

    Spoiler anzeigen
    [autoit]

    $sFile = FileOpenDialog("", "", "Inf (*.inf)")
    $sText = FileRead($sFile)

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

    Global $aStringSection = IniReadSection($sFile, "Strings")

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

    For $i = 1 To $aStringSection[0][0]
    $sText = StringReplace($sText, "%" & $aStringSection[$i][0] & "%", StringTrimLeft(StringTrimRight($aStringSection[$i][1], 1), 1))
    Next

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

    ;ab hier sind die Strings in der Variablen $sText aufgelöst.

    [/autoit]
  • Ja SEuBo's lösungsvorschläge haben leider auch nicht ganz funktioniert.

    Das problem liegt einfach darinn das es keine genauen vorschriften gibt wie eine Inf-Datei auszusehen hat. Es ist nur das schema vorgeschrieben also:

    Code
    [Variable1]
    Muster = "Test"
     
    [Variable2]
    Muster2 = "Test2"

    Wie jedoch die Variablen heißen kann sich jede Firma selbst aussuchen, und somit kann man nicht immer nach den gleichen schema die Dateien durchsuchen, da man nie weiß in wie die Variable heißt in dem der Druckername gespeichert ist.

  • Also war das Problem gar nicht das du Variable nicht aufgelöst bekommst?
    Ansonsten gibt es schon Vorschriften wie eine Inf-Datei für Treiber auszusehen hat.
    Die String-Sektion z.B. ist so ein Standard.
    Ansonsten findest du ein paar Erklärungen dazu z.B. >>Hier<<.

  • Das Problem was ich habe ist das ich nicht Automatisch den passenden Druckernamen der für die Installation per Inf benötigt wird rausfinden kann. Da es zwa vorschriften gibt aber die Variablen jeder Herrsteller selbst wählen kann, kann ich nicht in jeder nach der gleichen suchen um den Druckernamen zu kriegen, da wie bereits erwähnt fast jeder Herrsteller andere Namen benutzt.

  • der aktuelle stand ist wie er war kann ja garnicht weitermachen da das auslesen nicht funktioniert. -.-


    Bei dir funktioniert es wahrscheinlich bei ein oder zwei(wie hier auch) aber da hier ja nicht nur 2 verschiedene drucker installiert sind im Haus sondern ca. 150 gibt es auch dem entsprechend viele verschiedene Inf-Dateien. Und das auslesen müsste ja leider bei jeder funktionieren. Aber so langsam denk ich das ich einfach meinen Praktikanten die Inf-Dateien gebe und er soll sich da mal durcharbeiten und mir die Druckernamen raussuchen ;). Das funktioniert wenigstens auf unkomplizierte weise =).

  • Wie gestern persönlich besprochen SEuBo poste ich hier alle(bzw. erstmal nur die von den Laserdruckern) Inf-Dateien um die Automatische auslesung anzupassen. Dazu noch ein fettes Dankeschön an SEuBo für die Hilfe.


    autoit.de/wcf/attachment/9672/