TXT Datei nach VEN_ID auswerten

  • TXT Datei auswerten

    Hallo, ich beschäftige mich seit kurzem mit Autoit und möchte jetzt den Schwierigkeitsgrad etwas anziehen. Meine Erfahrungen mit anderen Programmiersprachen sind sehr gering, deshalb hackt es etwas sobald es mit Schleifen und Arrays losgeht.
    Soweit zum mir und meinen (noch) nicht vorhandenen Programmierkenntnissen.
    Meine Idee ist die Datei „hwids.txt“ nach bestimmten Strings wie z.B. „4&243D7BD0&0&0070“ (RADEON) oder „4&13699180&0&3848“ (X-FI) zu durchsuchen und für die gefundenen Einträge Erweiterungen wie z.B. Hydravision oder ATI-Tray Tools zu installieren.
    Im ersten Schritt soll das Programm einfach ohne Gui die Einträge auswerten und die definierten Aktionen durchführen.
    Später im weiteren Ausbau sollen die Ergebnisse mit Checkboxen angezeigt werden und ein Timer ablaufen, aber das hat noch etwas Zeit rolleyes

    Das Script ist quasi als Vorstufe für WPI gedacht.
    Fragen:
    1- Benötige ich für die VEN ID’s eine Tabelle oder schreibe ich einfach z.B 20 Constaten ?
    2- Wie bekomme ich aus jeder Zeile die Stelle 46 bis 62 und vergleiche sie mit meinen Einträgen, oder wie gebe ich einer Variablen den Wertebereich von 0-9 ?
    Entweder bin ich gerade blind und denke völlig verquer oder es steht wirklich nirgends!

    C
    #include <string.au3>
    #include <array.au3>
    
    
    Global $FilePath = @ScriptDir & "\hwids.txt"
    Global $ID001 = _StringBetween (FileRead($FilePath), "\4", ":")
    _ArrayDisplay($ID001, "VEN-ID")


    MfG
    janos

    Einmal editiert, zuletzt von janos (29. November 2006 um 05:22)

    • Offizieller Beitrag

    Mit diesem Code separierst du ID und Device in ein Array. Beide Elemente sind mit dem Doppelpunkt getrennt.
    Zur weiteren Verarbeitung kannst du dann mit

    [autoit]

    StringSplit($arID_Dev, ":")

    [/autoit]

    ID und Device getrennt auswerten.

    Viel Spaß!

    [autoit]

    #include <array.au3>
    #include <file.au3>

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

    Dim $arID_Dev[1]
    $arID_Dev[0] = 0
    Dim $fileArray
    $Pfad = @ScriptDir & "\hwids.txt"

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

    If Not _FileReadToArray($Pfad, $fileArray) Then
    MsgBox(262144,"Fehler", " Fehler beim Lesen der Datei Fehler-Nr" & @error)
    Exit
    EndIf
    For $i = 1 To $fileArray[0]
    $posBackSlash = StringInStr($fileArray[$i], "\", 1, 2) ; 2.te Übereinstimmung
    If $posBackSlash <> 0 Then
    $ID_Dev = StringRight($fileArray[$i], StringLen($fileArray[$i])-$posBackSlash)
    _ArrayAdd($arID_Dev, $ID_Dev)
    $arID_Dev[0] += 1 ; Anzahl der Elemente in $arID_Dev[0] führen
    EndIf
    Next

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

    _ArrayDisplay($arID_Dev, "ID's + Geräte")

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

    ; mit StringSplit() kannst du die einzelnen Einträge in ID und Device trennen

    [/autoit]
  • Hallo BugFix,
    ich komme nicht so richtig weiter.
    Im Moment geht es mir wie mit einer neuen Fremdsprache.
    Ich verstehe ungefähr was in Deinen Script passiert, aber weiterentwickeln kann ich es noch nicht.

    1.Wie bekomme ich die Leerstellen aus dem Array? (falls überhaupt nötig)
    2.Mit „StringSplit($arID_Dev, ":")“ erhalte ich alle möglichen Ergebnisse, nur nicht das was ich möchte.

    MfG
    Janos

  • Hi, das kommt darauf an wie die zu vergleichende Einträge hinterlegt sind, oder?

    Womit wir meiner nächsten Frage sind.
    Ich denke es ist am sinnvollsten einfach eine Datei anzulegen, in die man die gesuchten ID’s mit Pfad zur ausführbaren Datei eintragen kann.
    Oder denkst du es ist einfacher die Einträge im Script als Constante oder wie auch immer zu hinterlegen?
    Der Inhalt von „$arID_Dev“ wird dann mit den Einträgen der Datei verglichen, bei Übereinstimmungen wird das dazugehörige Programm ausgeführt.
    Das Script wartet solange bis das Installationsscript abgeschlossen ist und setzt dann den Vergleich fort.
    ---------------------------
    Beispiel: Zuvergleichende ID’s TXT Datei.

    4&243D7BD0&0&0070 = %CDROM%\\WPI\INSTALL\RADEON-Tools.exe ; RADEON X800
    4&13699180&0&3848 = %CDROM%\\WPI\INSTALL\X-FI-Tools.exe ; Creative X-FI
    ---------------------------
    So kann einfach die TXT Datei mit neuen ID gefüllt werden ohne das Autoit Script zu verändern

    • Offizieller Beitrag

    Hi,

    ich hoffe, ich habe es nicht total falsch verstanden.

    Hilft das dir weiter?

    [autoit]


    #include <array.au3>
    #include <file.au3>

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

    Global $vendorIDs_A[2] = ['4&243D7BD0&0&0070', '4&13699180&0&3848']
    Global $toDo[2] = ['%CDROM%\\WPI\INSTALL\RADEON-Tools.exe', '%CDROM%\\WPI\INSTALL\X-FI-Tools.exe']

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

    Dim $lines
    If Not _FileReadToArray("File.txt", $lines) Then
    MsgBox(4096, "Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf

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

    For $y = 0 To UBound($vendorIDs_A) - 1
    For $i = 1 To $lines[0]
    If StringInStr($lines[$i], $vendorIDs_A[$y]) <> 0 Then
    MsgBox(64, "Eigentlich ausführen!", "Todo --> " & $toDo[$y] & @CRLF & "ID " & $vendorIDs_A[$y] & _
    @CRLF & "gefunden in Zeile : " & $i & @CRLF & $lines[$i])
    EndIf
    Next
    Next

    [/autoit]

    So long,

    Mega

  • Das wird aber schwierig zu pflegen oder verstehe ich das falsch?
    Eigentlich ist es so, ich möchte das Ergebnis der Datei „hwids.txt“ =„$arID_Dev mit den Einträgen einer mit bekannten VenID gefüllten Datei
    Vergleichen.
    Bei Übereinstimmung soll ein zu jeweiligen ID gehöriges Programm ausgeführt werden.
    In Deinem Beispiel wird es schwierig neue ID’s hinzuzufügen, spätestens nach 20 Einträgen wird es unübersichtlich.
    Deswegen mein Gedanke eine extra Datei zu benutzen, jede Zeile ist ein Gerät und man sieht sofort um was es sich handelt.

    • Offizieller Beitrag

    Hi,

    also willst du folgendes:

    Datei 1 : (diese Datei wird irgendwie erstell)

    123
    456
    789

    Datei 2: (diese Datei pflegst du)

    123 = %CDROM%\\WPI\INSTALL\RADEON-Tools.exe
    789 = %CDROM%\\WPI\INSTALL\X-FI-Tools.exe

    Und jetzt checkst du, ist Eintrag 123 in Datei 1 dann %CDROM%\\WPI\INSTALL\RADEON-Tools.exe

    ist 789 dann ...

    So ungefär?

    So long,

    Mega

  • genau !!!!!!!!! :musik2:

    edit: beim Vergleich verschiedener Grafikkarten ist mir aufgefallen das der komplette String benötigt wird um eine eindeutige Identifizierung zu gewährleisten.
    Die Geforce 7600 GS und die RADEON X800 haben hinter dem letzten Backslash dieselbe Kennung „4&243D7BD0&0&0070“

    Eine auswertbare Datei müsste also wie im folgenden Beispiel aussehen.

    Code
    PCI\VEN_1102&DEV_0004&SUBSYS_00531102&REV_03\4&13699180&0&4048 = %CDROM%\\WPI\\INSTALL\\TREIBER-TOOLS\\CRATIVE_AUDIGY.exe ; Creative SB Audigy
    PCI\VEN_1102&DEV_0005&SUBSYS_00211102&REV_00\4&13699180&0&3848 = %CDROM%\\WPI\\INSTALL\\TREIBER-TOOLS\\CREATIVE-XFI.exe   ; Creative X-FI
    PCI\VEN_10DE&DEV_0291&SUBSYS_22111682&REV_A1\4&243D7BD0&1&0070 = %CDROM%\\WPI\\INSTALL\\TREIBER-TOOLS\\GEFORCE-TOOLS.exe  ; GeForce 7900 GT
    PCI\VEN_10DE&DEV_0392&SUBSYS_82021043&REV_A1\4&243D7BD0&0&0070 = %CDROM%\\WPI\\INSTALL\\TREIBER-TOOLS\\GEFORCE-TOOLS.exe  ; GeForce 7600 GS
    PCI\VEN_1002&DEV_554D&SUBSYS_09521462&REV_00\4&243D7BD0&0&0070 = %CDROM%\\WPI\\INSTALL\\TREIBER-TOOLS\\RADEON-TOOLS.exe   ; RADEON X800
    USB\VID_03F0&PID_1005\CN24U160F9ST = %CDROM%\\WPI\\INSTALL\\TREIBER-TOOLS\\Scan5400.exe                                   ; HP Scanjet5400
    PCI\VEN_1131&DEV_7146&SUBSYS_00211894&REV_01\4&13699180&0&4048 = %CDROM%\\WPI\\INSTALL\\TREIBER-TOOLS\\Globe-TV.exe       ; KNC DVB-C
    PCI\VEN_104B&DEV_1040&SUBSYS_1040104B&REV_01\3&61AAA01&0&80 = %CDROM%\\WPI\\INSTALL\\TREIBER-TOOLS\\VMWARE-TOOLS.exe      ; VMware SCSI Controller

    Einmal editiert, zuletzt von janos (30. November 2006 um 04:55)

    • Offizieller Beitrag

    HI,

    quick try:

    [autoit]

    #include <Array.au3>
    #include <File.au3>

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

    $a = _CompareFiles(@ScriptDir & "\File.txt", @ScriptDir & "\Installcheck.txt")
    ;_ArrayDisplay($a, "")

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

    Func _CompareFiles($filename_1, $filename_2)
    Local $newFile[1], $file1_A, $file2_A
    _FileReadToArray($filename_1, $file1_A)
    _FileReadToArray($filename_2, $file2_A)
    For $i = 1 To UBound($file2_A) - 1
    If _ArraySearch($file1_A, _StringBetween1($file2_A[$i], 0, " =")) = -1 Then
    ;_ArrayAdd($newFile, _StringBetween1($file2_A[$i], 0, " ="))
    MsgBox(0,"info", "Gefunden wurde : " & _StringBetween1($file2_A[$i], 0, " =") & @CRLF & "augeführt werden muss : " & _
    _StringBetween1($file2_A[$i], " = %", ";") & @CRLF & "was dies bedeutet : " & _
    _StringBetween1($file2_A[$i], ";"))
    EndIf
    Next
    ;$newFile[0] = UBound($newFile)
    ;Return $newFile
    EndFunc ;==>_CompareFiles

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

    Func _StringBetween1($s_String, $s_Start = 0, $s_End = 0)
    $s_Start = StringInStr($s_String, $s_Start) + StringLen($s_Start)
    ;ConsoleWrite(StringInStr($s_String, $s_Start) + StringLen($s_Start) & @LF)
    Return StringMid($s_String, $s_Start, StringInStr($s_String, $s_End) - $s_Start)
    EndFunc ;==>_StringBetween1

    [/autoit]

    So long,

    Mega

  • Hi, der ausführbare Pfad hat noch nicht gestimmt, das konnte ich immerhin noch selbst lösen.
    Das Script scheint aber auch nicht die ermittelten ID’s aus der „File.txt“ mit den Einträgen in der „Installcheck.txt“ Dateien zu vergleichen.
    Es wird einfach alles ausgeführt was in der „Installcheck.txt“ steht, also z.B. auch „ffffffffffffffffffffff = explorer.exe ; test“
    Ich versteh nicht was du in Zeile 8 und 11 machst, z.B. $newFile[1] wird nicht weiter benutzt???

    Edit: Es wird jetzt auch auf den Abschluss des zuletzt gestarteten Prozesses gewartet. :stolz_bin: :rolleyes:
    Die Korrektur der "_CompareFiles" Funktion bekomme ich noch nicht geregelt...

    [autoit]

    #include <Array.au3>
    #include <File.au3>

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

    RUN("hwid.exe")
    Sleep(2000)
    $a = _CompareFiles(@ScriptDir & "\hwids.txt", @ScriptDir & "\Installcheck.txt")
    ;_ArrayDisplay($a, "")

    Func _CompareFiles($filename_1, $filename_2)
    Local $newFile[1], $file1_A, $file2_A
    _FileReadToArray($filename_1, $file1_A)
    _FileReadToArray($filename_2, $file2_A)
    For $i = 1 To UBound($file2_A) - 1
    If _ArraySearch($file1_A, _StringBetween1($file2_A[$i], 0, " = ")) = -1 Then
    EndIf
    $pid = run(_StringBetween1($file2_A[$i], " = ", ";"))
    ProcessWaitClose ( $pid )


    Next

    ;$newFile[0] = UBound($newFile)
    ;Return $newFile
    EndFunc ;==>_CompareFiles

    Func _StringBetween1($s_String, $s_Start = 0, $s_End = 0)
    $s_Start = StringInStr($s_String, $s_Start) + StringLen($s_Start)
    ;ConsoleWrite(StringInStr($s_String, $s_Start) + StringLen($s_Start) & @LF)
    Return StringMid($s_String, $s_Start, StringInStr($s_String, $s_End) - $s_Start)
    EndFunc ;==>_StringBetween1

    [/autoit]

    3 Mal editiert, zuletzt von janos (30. November 2006 um 17:58)

  • Hi, die Funktion „_CompareFiles“ stimmt noch nicht.
    Das Script vergleicht nicht die ermittelten ID’s aus der „File.txt“ mit den Einträgen in der „Installcheck.txt“.
    Es wird einfach alles ausgeführt was in der „Installcheck.txt“ steht, also z.B. auch „ffffffffffffffffffffff = explorer.exe ; test“
    Ich habe schon etliche Umstellungen ausprobiert, ist aber nicht vernünftiges dabei rausgekommen.


    MfG
    Janos

    Einmal editiert, zuletzt von janos (30. November 2006 um 19:03)

    • Offizieller Beitrag

    Hi,

    [autoit]


    #include <File.au3>

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

    $a = _CompareFiles(@ScriptDir & "\File.txt", @ScriptDir & "\Installcheck.txt")

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

    Func _CompareFiles($filename_1, $filename_2)
    Local $newFile[1], $file1_A, $file2_A
    _FileReadToArray($filename_1, $file1_A)
    _FileReadToArray($filename_2, $file2_A)
    For $i = 1 To UBound($file2_A) - 1
    For $y = 1 To UBound($file1_A) - 1
    If StringInStr($file1_A[$y], _StringBetween1($file2_A[$i], 0, " =")) <> 0 Then
    MsgBox(0,"info", "Gefunden wurde : " & _StringBetween1($file2_A[$i], 0, " =") & @CRLF & "augeführt werden muss : " & _
    _StringBetween1($file2_A[$i], " = %", ";") & @CRLF & "was dies bedeutet : " & _
    _StringBetween1($file2_A[$i], ";"))
    EndIf
    Next
    Next
    EndFunc ;==>_CompareFiles

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

    Func _StringBetween1($s_String, $s_Start = 0, $s_End = 0)
    $s_Start = StringInStr($s_String, $s_Start) + StringLen($s_Start)
    Return StringMid($s_String, $s_Start, StringInStr($s_String, $s_End) - $s_Start)
    EndFunc ;==>_StringBetween1

    [/autoit]

    So long,

    Mega

  • Hi, das Script funktioniert super! :party4: :kiss:
    Das nächste Projekt wird einfacher, mein Eigenanteil war sehr bescheiden.


    Danke!

    MfG
    Janos