- Offizieller Beitrag
Hi,
es wurde ja schon in einigen Threads auf das Tool devcon hingewiesen. Ich habe mal alle Beschreibungen zu den einzelnen Befehlen zusammengefaßt. Hier findet ihr die Syntaxbeschreibung.
Nicht wundern, dass ein Scan recht lange dauert. Als Trigger verwende ich die durch die Hardwareerkennung gestartete rundll32.exe. Erst wenn diese beendet wurde, wird die Liste neu geschrieben.
Edit: Habe die Zuordnung der Hardware-ID geändert. Nun ist gesichert, dass bei Sticks mit identischer Bezeichnung auch die ID zum Laufwerk stimmt.
Edit: Da ich ständig am Laptop arbeite, war mir der Fehler mit der Floppy gar nicht bewußt geworden.
Ich überprüfe im Registryeintrag auf $pref = _StringBetween($val, 'Media#', '&RM#', 1). Nur bei USB-Speichermedien ist dieser String in der Kennung enthalten. Jetzt habe ich dahinter eine Fehlerabfrage gesetzt mit ContinueLoop im Fehlerfall. Damit sollte eigentlich die Floppy keine Probleme mehr machen.
Über weiteres Feedback bin ich natürlich erfreut.
Bsp. zum Managen von USB-Drives
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <String.au3>
#include <Constants.au3>
#include <Array.au3>
Opt('GUIOnEventMode', 1)
Global $path_Devcon = @MyDocumentsDir & '\DOWNLOADS\TOOLS\Devcon\i386\devcon.exe' ; <<===== Pfad anpassen
Global $aRemovable, $strRun
$gui = GUICreate('Manage USB-Drive', 500, 120)
GUISetOnEvent($GUI_EVENT_CLOSE, '_ende')
$hListView = GUICtrlCreateListView('Laufwerk|Bezeichnung', 10, 10, 350, 100)
_GUICtrlListView_SetColumnWidth($hListView, 0, 60)
_GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE_USEHEADER )
$btRemove = GUICtrlCreateButton('Entfernen', 380, 10, 100, 20)
GUICtrlSetOnEvent(-1, '_entfernen')
$btScan = GUICtrlCreateButton('Scan', 380, 40, 100, 20)
GUICtrlSetOnEvent(-1, '_scan')
GUISetState()
_LVwrite()
While 1
Sleep(100)
WEnd
Func _ende()
Exit
EndFunc
Func _setStat($disable=True)
Local $stat = $GUI_ENABLE
If $disable Then $stat = $GUI_DISABLE
GUICtrlSetState($btRemove, $stat)
GUICtrlSetState($btScan, $stat)
EndFunc ;==>_setStat
Func _RunDevcon($strRun)
Local $data, $foo = Run("cmd.exe", @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
StdinWrite($foo, $strRun & @CRLF)
StdinWrite($foo)
While True
$data &= StdoutRead($foo)
If @error Then ExitLoop
Sleep(25)
WEnd
Local $split = StringSplit($data, @LF)
$data = ''
For $i = 5 To $split[0]
If StringStripWS($split[$i], == '' Then ExitLoop
$data &= $split[$i]
Next
Return $data
EndFunc ;==>_RunDevcon
Func _LVwrite()
$aRemovable = _GetRemovable()
If Not $aRemovable[0][0] Then Return
For $i = 0 To UBound($aRemovable) -1
GUICtrlCreateListViewItem($aRemovable[$i][0] & '|' & $aRemovable[$i][1], $hListView)
Next
EndFunc ;==>_LVwrite
Func _entfernen()
_setStat()
Local $index = _GUICtrlListView_GetSelectedIndices($hListView)
If $index = '' Then
_setStat(False)
Return
EndIf
Local $indRemove = _ArraySearch($aRemovable, _GUICtrlListView_GetItemText(GUICtrlGetHandle($hListView), $index, 1),0,0,0,0,1,1)
_GUICtrlListView_DeleteAllItems($hListView)
WinSetTitle($gui, '', 'Laufwerk wird entfernt..')
_Remove($aRemovable[$indRemove][2])
WinSetTitle($gui, '', 'Laufwerk wurde entfernt')
_LVwrite()
Sleep(500)
WinSetTitle($gui, '', 'Manage USB-Drive')
_setStat(False)
EndFunc ;==>_entfernen
Func _scan()
_setStat()
Local $count1 = 0, $count2 = 0, $list1 = ProcessList('rundll32.exe')
If Not @error Then $count1 = $list1[0][0]
_GUICtrlListView_DeleteAllItems($hListView)
WinSetTitle($gui, '', 'Es wird gescannt..')
$strRun = '"' & $path_Devcon & '" rescan'
_RunDevcon($strRun)
$list2 = ProcessList('rundll32.exe')
If Not @error Then $count2 = $list2[0][0]
If $count2 > $count1 And $count1 = 0 Then
Do
Sleep(50)
Until Not ProcessExists($list2[1][0])
ElseIf $count2 > $count1 Then
For $i = 1 To UBound($list2) -1
If _ArraySearch($list1, $list2[$i][0]) = -1 Then
Do
Sleep(50)
Until Not ProcessExists($list2[$i][0])
ExitLoop
EndIf
Next
EndIf
WinSetTitle($gui, '', 'Scan beendet')
_LVwrite()
Sleep(500)
WinSetTitle($gui, '', 'Manage USB-Drive')
_setStat(False)
EndFunc ;==>_scan
Func _Remove($ID)
$strRun = '"' & $path_Devcon & '" remove ' & $ID
_RunDevcon($strRun)
EndFunc ;==>_Remove
Func _GetRemovable()
Local $reg, $tmp, $val, $pref, $aDrive[1][3]
Local $var = DriveGetDrive( "REMOVABLE" )
If Not @error Then
For $i = 1 To UBound($var) -1
$val = ''
$reg = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices", "\DosDevices\" & $var[$i])
For $k = 1 To StringLen($reg) - 2 Step 2
$tmp = _HexToString(StringMid($reg, $k, 2))
If $tmp <> "" Then
$val = $val & $tmp
EndIf
Next
$pref = _StringBetween($val, 'Media#', '&RM#', 1)
If @error Then ContinueLoop
If $aDrive[UBound($aDrive)-1][0] <> '' Then ReDim $aDrive[UBound($aDrive)+1][3]
$aDrive[UBound($aDrive)-1][0] = StringUpper($var[$i])
$tmp = _GetUSBCaption($pref[0])
$tmp = StringSplit($tmp, '|')
$aDrive[UBound($aDrive)-1][1] = $tmp[1]
$tmp = StringSplit($tmp[2], @LF)
$aDrive[UBound($aDrive)-1][2] = $tmp[1]
Next
EndIf
Return $aDrive
EndFunc ;==>_GetRemovable
Func _GetUSBCaption($strIDPrefix)
Local $aUSB[1]=[0], $i = 0, $k, $var, $sub, $sRet
While 1
$i += 1
$var = RegEnumKey('HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR', $i)
If Not @error Then
$k = 0
While 1
$k += 1
$sub = RegEnumKey('HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR\' & $var, $k)
If Not @error Then
ReDim $aUSB[UBound($aUSB)+1]
$aUSB[UBound($aUSB)-1] = $var & '\' & $sub
Else
ExitLoop
EndIf
WEnd
Else
ExitLoop
EndIf
WEnd
For $i = 1 To UBound($aUSB) -1
$var = RegRead('HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR\' & $aUSB[$i], 'ParentIdPrefix')
If Not @error Then
If $var = $strIDPrefix Then
$sRet = RegRead('HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR\' & $aUSB[$i], 'FriendlyName')
Return $sRet & '|' & RegRead('HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR\' & $aUSB[$i], 'HardwareID')
EndIf
EndIf
Next
EndFunc ;==>_GetUSBCaption
einige Funktionsbsp.
#include <Constants.au3>
[/autoit] [autoit][/autoit] [autoit]Local $path_Devcon = @MyDocumentsDir & '\DOWNLOADS\TOOLS\Devcon\i386\devcon.exe' ; <<===== Pfad anpassen
Local $strRun, $ID
; Name und Hardware-ID der Instance-ID USB ausgeben
$strRun = '"' & $path_Devcon & '" hwids *USB*'
ConsoleWrite(_RunDevcon($strRun) & @CRLF)
; mögliche Ausgabe:
; USB\VID_13FE&PID_1D00\907310000250
; Name: USB-Massenspeichergerät
; Hardware ID's:
; USB\Vid_13fe&Pid_1d00&Rev_0110
; USB\Vid_13fe&Pid_1d00
; Compatible ID's:
; USB\Class_08&SubClass_06&Prot_50
; USB\Class_08&SubClass_06
; USB\Class_08
; Entfernen des USB-Massenspeichers mit der ID "USB\Vid_13fe&Pid_1d00&Rev_0110"
#cs
$ID = '"USB\Vid_13fe&Pid_1d00&Rev_0110"' ; <<------- ID in Anführungszeichen einfassen, sonst Fehler in Console
$strRun = '"' & $path_Devcon & '" remove ' & $ID
ConsoleWrite(_RunDevcon($strRun) & @CRLF)
#ce
; Scannen nach neu angeschlossener Hardware, z.B. wieder Aktivieren eines zuvor entfernten USB-Sticks
$strRun = '"' & $path_Devcon & '" rescan'
ConsoleWrite(_RunDevcon($strRun) & @CRLF)
; alle PCI-Geräte auf dem Computer ausgeben
$strRunRun = '"' & $path_Devcon & '" -m:\\' & @ComputerName & ' find pci\*'
ConsoleWrite(_RunDevcon($strRun) & @CRLF)
; Anzeigen aller bekannten Setupklassen
$strRun = '"' & $path_Devcon & '" classes'
ConsoleWrite(_RunDevcon($strRun) & @CRLF)
; Anzeigen von Dateien, die jeweils mit den in der Setupklasse ports (Anschlüsse) enthaltenen
; Geräten verknüpft sind
$strRun = '"' & $path_Devcon & '" driverfiles =ports'
ConsoleWrite(_RunDevcon($strRun) & @CRLF)
; Anzeigen der Geräteinstanzen aller Geräte , die auf dem lokalen Computer vorhanden sind.
$strRun = '"' & $path_Devcon & '" find *'
ConsoleWrite(_RunDevcon($strRun) & @CRLF)
; Anzeigen aller "nicht vorhandenen" Geräte und vorhandenen Geräte der Klasse ports (Anschlüsse).
; Dies schließt auch Geräte ein, die entfernt wurden, Geräte die von einem Steckplatz zu einem anderen
; Steckplatz versetzt wurden, und möglicherweise auch Geräte, die aufgrund einer BIOS-Änderung anders
; aufgezählt wurden.
$strRun = '"' & $path_Devcon & '" findall =ports'
ConsoleWrite(_RunDevcon($strRun) & @CRLF)
; Anzeigen aller vorhandenen Geräte aller angegebenen Klassen (in diesem Fall der Klassen "USB" und "1394").
$strRun = '"' & $path_Devcon & '" listclass usb 1394'
ConsoleWrite(_RunDevcon($strRun) & @CRLF)
; Anzeigen der Ressourcen, die von den Geräten der Setupklasse USB verwendet werden.
$strRun = '"' & $path_Devcon & '" resources =usb'
ConsoleWrite(_RunDevcon($strRun) & @CRLF)
Func _RunDevcon($strRun)
Local $data, $foo = Run("cmd.exe", @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
StdinWrite($foo, $strRun & @CRLF)
StdinWrite($foo)
While True
$data &= StdoutRead($foo)
If @error Then ExitLoop
Sleep(25)
WEnd
Local $split = StringSplit($data, @LF)
$data = ''
For $i = 5 To $split[0]
If StringStripWS($split[$i], == '' Then ExitLoop
$data &= $split[$i]
Next
Return $data
EndFunc
DL bisher: 14