Device Installer

  • Hallo,

    da wir in der Firma diverse Rechner zur Reparatur haben und in dem
    Falle auch immer Treiber installieren und es mich nervte ständig die
    Treiber zu suchen und per Hand zu installieren, habe ich mir gedacht,
    es gibt doch bestimmt die Möglichkeit das etwas zu automatisieren.
    Vielleicht gibt es hier ja auch was ähnliches, das habe ich aber nicht gefunden.

    Habe dann das hier gefunden:

    http://www.autoitscript.com/forum/topic/11…f-deviceinstall

    was wohl funktioniert, aber nur mit den gepackten Driverpacks.net Dateien
    und ich wollte das selber erweitern können für neue Mainboards oder Notebooks usw.

    Also habe ich das mal etwas verändert.

    Die Driverpacks habe ich nach Windows XP, Vista/Win7 32-bit, Vista/Win7 64-bit
    entpackt und kann jetzt bei Bedarf noch eigene hinzufügen.

    Wenn einer mal seinen PC installieren muss kann er das hier ja mal testen.
    Grafisch sieht das ganze nicht so toll aus, aber habe es mal mit drei
    Treibern an meinem Laptop getestet und das hat funktioniert.

    Gibt es vielleicht noch die Möglichkeit die Suche schneller zu machen.
    Es dauert ziemlich lange die inf-Dateien zu durchsuchen.

    Wenn man das noch optimieren und verbessern kann, wäre ich für Tipps dankbar.


    [autoit]

    #include "DeviceAPI.au3"
    #include "Array.au3"
    #include "GUIConstantsEx.au3"
    #include "StaticConstants.au3"
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    $treiberordner = FileSelectFolder("Orderausahl","")

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

    Local $HWID, $sammeln, $OSArch = @OSArch
    local $einlesenlokal, $einlesenlokalfertig, $einlesenhwid, $einlesenhwidfertig, $linie, $suche, $suche1, $gefunden, $gefundenanzahl, $install, $installanzahl

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

    GUICreate("Driver Installer by AtomAs", 400, 200)
    $einlesenlokal = GUICtrlCreateLabel("Einlesen der lokalen Hardware",15, 20)
    $einlesenlokalfertig = GUICtrlCreateLabel("FERTIG", 350,20)
    GUICtrlSetState($einlesenlokalfertig, $GUI_hide)
    $einlesenhwid =GUICtrlCreateLabel("Einlesen der Treiberliste",15, 40)
    $einlesenhwidfertig = GUICtrlCreateLabel("FERTIG", 350,40)
    GUICtrlSetState($einlesenhwidfertig, $GUI_hide)
    $linie = $einlesenlokalfertig = GUICtrlCreateLabel("____________________________________________________________________________________________________________", 0,60)

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

    $suche = GUICtrlCreateLabel("Suche: ",15,80)
    $suche1 = GUICtrlCreateLabel("0",80,80,200)
    $suche2 = GUICtrlCreateLabel("0",200,80,200)
    $gefunden = GUICtrlCreateLabel("Gefunden: ",15,100 )
    $gefundenanzahl = GUICtrlCreateLabel("0",80,100,200)
    $install = GUICtrlCreateLabel("Installiere: ",15,120)
    $installanzahl = GUICtrlCreateLabel("0",80,120,200)
    GUISetState(@SW_SHOW)

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

    ;Build list of devices
    _DeviceAPI_GetClassDevices()

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

    While _DeviceAPI_EnumDevices()
    $haveHWID = _DeviceAPI_GetDeviceRegistryProperty($SPDRP_HARDWAREID)
    If $haveHWID <> "" Then
    $HWID &= _DeviceAPI_GetDeviceRegistryProperty($SPDRP_DEVICEDESC) & Chr(2) & _DeviceAPI_GetDeviceRegistryProperty($SPDRP_HARDWAREID) & Chr(2)
    EndIf
    WEnd
    $localHWID = StringSplit(StringTrimRight($HWID, 1), Chr(2))
    GUICtrlSetState($einlesenlokalfertig, $GUI_show)
    ;_ArrayDisplay($localHWID)

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

    $driver = _RecursiveFileListToArray($treiberordner, "(?i).*\.inf\z")
    ;_ArrayDisplay($driver)
    GUICtrlSetState($einlesenhwidfertig, $GUI_show)

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

    For $a = 1 To $localHWID[0] Step 2

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

    GUICtrlSetData($suche1, "LOKAL: " & $a & "/" & $localHWID[0] -1 )
    $generic = $localHWID[$a + 1]
    #cs
    If StringInStr($generic, "acpi") Then
    $break = StringSplit($generic, "\", 1)
    ;_ArrayDisplay($break)
    if $break[0] = 2 then $generic = $break[2]
    ;$specific = $break[2]

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

    for $b = 1 to $driver[0]
    $file = Fileread($driver[$b])
    GUICtrlSetData($suche2," Treiberordner: " & $b & "/" & $driver[0])
    ; MsgBox(1,"",$file)

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

    if StringInStr($file, $generic) Then
    ;MsgBox(1,"", $driver[$b])
    $sammeln &= $driver[$b] & @CR
    ;ExitLoop
    endif

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

    next
    EndIf
    #ce

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

    If StringInStr($generic, "acpi") Then
    $break = StringSplit($generic, "\", 1)
    ;_ArrayDisplay($break)
    if $break[0] = 2 then $generic = $break[2]
    ;$specific = $break[2]

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

    for $b = 1 to $driver[0]
    $file = Fileread($driver[$b])
    GUICtrlSetData($suche2," Treiberordner: " & $b & "/" & $driver[0])
    ; MsgBox(1,"",$file)

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

    if StringInStr($file, $generic) Then
    ;MsgBox(1,"", $driver[$b])
    $sammeln &= $driver[$b] & @CR
    ;ExitLoop
    endif

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

    next
    EndIf

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

    If StringInStr($generic, "SUBSYS") Then
    $break = StringSplit($generic, "SUBSYS", 1)
    $generic = StringTrimRight($break[1], 1)
    $specific = $break[2]

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

    for $b = 1 to $driver[0]
    $file = Fileread($driver[$b])
    GUICtrlSetData($suche2," Treiberordner: " & $b & "/" & $driver[0])
    ; MsgBox(1,"",$file)

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

    if StringInStr($file, $generic) Then
    ;MsgBox(1,"", $driver[$b])
    $sammeln &= $driver[$b] & @CR
    ;ExitLoop
    endif

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

    next
    EndIf

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

    $sammelnarray = StringSplit($sammeln, @CR)
    GUICtrlSetData($gefundenanzahl, $sammelnarray[0] -1)

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

    if $sammelnarray[0] = 0 then

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

    MsgBox(0,"","nix gefunden")
    Exit
    EndIf

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

    Next
    ;_ArrayDisplay($sammelnarray); Es wird ein Zeile zuviel angezeigt also $sammelnarray[0] - 1
    $doppelt1 = $sammelnarray[0]
    _ArrayDelete($sammelnarray, 0)
    $sammelnarray = _ArrayUnique($sammelnarray)
    $doppelt2 = $sammelnarray[0]

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

    GUICtrlCreateLabel("Doppelte wurde gelöscht: " & $doppelt1 - $doppelt2, 100, 100)
    GUICtrlSetData($gefundenanzahl, $sammelnarray[0] -1)

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

    ;_ArrayDisplay($sammelnarray)
    for $c = 1 to $sammelnarray[0] -1

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

    $pfad = StringRegExp($sammelnarray[$c], '(.\:|\\\\[^\\]+)(\\*.*\\)(.*)', 3)
    ;MsgBox(1,"",$pfad[0] & $pfad[1] & "dpinst.exe")
    GUICtrlSetData($installanzahl, $c & "/" & $sammelnarray[0] -1)
    if $OSArch = "X86" then
    FileInstall("dpinst.exe", $pfad[0] & $pfad[1] & "dpinst.exe", 1)
    FileInstall("dpinst.xml", $pfad[0] & $pfad[1] & "dpinst.xml", 1)
    ShellExecuteWait($pfad[0] & $pfad[1] & "dpinst.exe", "/S /SA /SE /SW /LM")
    EndIf

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

    if $OSArch = "X64" Then
    FileInstall("dpinst64.exe", $pfad[0] & $pfad[1] & "dpinst.exe", 1)
    FileInstall("dpinst.xml", $pfad[0] & $pfad[1] & "dpinst.xml", 1)
    ShellExecuteWait($pfad[0] & $pfad[1] & "dpinst.exe", "/S /SA /SE /SW /LM")
    EndIf

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

    next

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

    MsgBox(1,"","fertig")

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

    ;===============================================================================
    ; Function Name: _RecursiveFileListToArray($sPath[, $sPattern][, $iFlag][, $iFormat][, $iRecursion][, $sDelim])
    ; Description:: gibt Verzeichnisse (rekursiv) und/oder Dateien zurück, die einem RegExp-Pattern entsprechen
    ; Parameter(s): $sPath = Startverzeichnis
    ; $sPattern = ein beliebiges RexExp-Pattern für die Auswahl
    ; $iFlag = Auswahl
    ; 0 = Dateien & Verzeichnisse
    ; 1 = nur Dateien
    ; 2 = nur Verzeichnisse
    ; $iFormat = Rückgabeformat
    ; 0 = String
    ; 1 = Array mit [0] = Anzahl
    ; 2 = Nullbasiertes Array
    ; $iRecursion = Verzeichnisse rekursiv durchsuchen
    ; 0 = Nein
    ; 1 = Ja
    ; $sDelim = Trennzeichen für die String-Rückgabe
    ; Requirement(s): AutoIt 3.3.0.0
    ; Return Value(s): Array/String mit den gefundenen Dateien/Verzeichnissen
    ; Author(s): Oscar (http://www.autoit.de)
    ; Anregungen von: bernd670 (http://www.autoit.de)
    ;===============================================================================
    Func _RecursiveFileListToArray($sPath, $sPattern = '', $iFlag = 0, $iFormat = 1, $iRecursion = 1, $sDelim = @CRLF)
    Local $hSearch, $sFile, $sReturn = ''
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*.*')
    If @error Or $hSearch = -1 Then Return SetError(1, 0, $sReturn)
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($sPath & $sFile), 'D') Then
    If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
    If $iRecursion Then $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0)
    ContinueLoop
    EndIf
    If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
    WEnd
    FileClose($hSearch)
    If $iFormat And $sReturn = '' Then Return StringSplit($sReturn, '', $iFormat)
    If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
    Return $sReturn
    EndFunc

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