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.
#include "DeviceAPI.au3"
#include "Array.au3"
#include "GUIConstantsEx.au3"
#include "StaticConstants.au3"
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$treiberordner = FileSelectFolder("Orderausahl","")
[/autoit][autoit][/autoit][autoit]Local $HWID, $sammeln, $OSArch = @OSArch
local $einlesenlokal, $einlesenlokalfertig, $einlesenhwid, $einlesenhwidfertig, $linie, $suche, $suche1, $gefunden, $gefundenanzahl, $install, $installanzahl
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)
$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)
;Build list of devices
_DeviceAPI_GetClassDevices()
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)
$driver = _RecursiveFileListToArray($treiberordner, "(?i).*\.inf\z")
;_ArrayDisplay($driver)
GUICtrlSetState($einlesenhwidfertig, $GUI_show)
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]
for $b = 1 to $driver[0]
$file = Fileread($driver[$b])
GUICtrlSetData($suche2," Treiberordner: " & $b & "/" & $driver[0])
; MsgBox(1,"",$file)
if StringInStr($file, $generic) Then
;MsgBox(1,"", $driver[$b])
$sammeln &= $driver[$b] & @CR
;ExitLoop
endif
next
EndIf
#ce
If StringInStr($generic, "acpi") Then
$break = StringSplit($generic, "\", 1)
;_ArrayDisplay($break)
if $break[0] = 2 then $generic = $break[2]
;$specific = $break[2]
for $b = 1 to $driver[0]
$file = Fileread($driver[$b])
GUICtrlSetData($suche2," Treiberordner: " & $b & "/" & $driver[0])
; MsgBox(1,"",$file)
if StringInStr($file, $generic) Then
;MsgBox(1,"", $driver[$b])
$sammeln &= $driver[$b] & @CR
;ExitLoop
endif
next
EndIf
If StringInStr($generic, "SUBSYS") Then
$break = StringSplit($generic, "SUBSYS", 1)
$generic = StringTrimRight($break[1], 1)
$specific = $break[2]
for $b = 1 to $driver[0]
$file = Fileread($driver[$b])
GUICtrlSetData($suche2," Treiberordner: " & $b & "/" & $driver[0])
; MsgBox(1,"",$file)
if StringInStr($file, $generic) Then
;MsgBox(1,"", $driver[$b])
$sammeln &= $driver[$b] & @CR
;ExitLoop
endif
next
EndIf
$sammelnarray = StringSplit($sammeln, @CR)
GUICtrlSetData($gefundenanzahl, $sammelnarray[0] -1)
if $sammelnarray[0] = 0 then
[/autoit][autoit][/autoit][autoit]MsgBox(0,"","nix gefunden")
Exit
EndIf
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]
GUICtrlCreateLabel("Doppelte wurde gelöscht: " & $doppelt1 - $doppelt2, 100, 100)
GUICtrlSetData($gefundenanzahl, $sammelnarray[0] -1)
;_ArrayDisplay($sammelnarray)
for $c = 1 to $sammelnarray[0] -1
$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
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
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