Hi,
auf der Suche nach meinen USB-Sticks dachte ich, das Skript von BugFix könnte helfen.
BugFix untersucht nämlich die Registry nur auf Beschreibungen von optischen Lauwerken.
Doch die Registry liefert noch mehr Informationen.
(Hier nun eine durch Mitarbeit von BugFix verbesserte Version)
Spoiler anzeigen
;<AutoItScript>
#NoTrayIcon
AutoItSetOption("MustDeclareVars", 1)
#include <GUIConstants.au3>
;+----------------------------------------------------------------------------+
;| Header: Bestimmen der Übergabeparameter |
;| ( Alles Strings(!!!), bis auf ArgC ) |
;| FontAnzeigeCheck: |Il1 sind Alt-0124, Großes i, Kleines L, Eins |
Const $Author="USBSticks.au3 ©2006 by ytwinky, MD"; |
;| EMail: PIII1kSystem-AutoIt3Forum@yahoo.de |
;| (Tastenkombination: keine) |
;| AutoIt3-Version: 3.1.1.125(beta) |
;| Zweck : Anzeigen des eines lokalen Standard-Admin-Zugangs |
;| Tab auf 2 setzen wg. Lesbarkeit |
;+----------------------------------------------------------------------------+
; == GUI generated with Koda ==
Const $RegKey="HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices\", $rv="\DosDevices\"
Dim $i=0, $s="", $Wert, $Fehler=0, $Lw, $c, $a, $OnOff[2]=["Off", "On"], $Breite=397
Dim $Edit
Do
$i+=1
$Wert=RegEnumVal($RegKey, $i)
$Fehler=@Error
If $Fehler=0 Then
If StringInStr(StringUpper($Wert), "DOSDEVICES") Then
$Lw+=1
$c=StringRight($Wert, 2)
$s&=StringRight($Wert, 2) &@Tab
; $s&=$OnOff[DriveStatus($c)="READY"] &" "
$s&=GetNameFromRegistry($c) &@Cr
EndIf
EndIf
Until $Fehler<>0
GUICreate("Bekannte Laufwerke", $Breite, $Lw*14+10, 290, 125)
$Edit=GUICtrlCreateEdit("Bitte warten..", 5, 5, $Breite-10, $Lw*14, $ES_OEMCONVERT, $WS_EX_CLIENTEDGE)
GUISetState(@SW_SHOW)
$a=StringSplit(StringLeft($s, StringLen($s)-1), @Cr)
BubbleSort($a, 1, $a[0])
$Lw=DriveGetDrive("ALL")
GUICtrlSetData($Edit, "Vorhanden sind " &ShowIt($Lw, " ") &@CrLf &ShowIt($a))
While 1
Switch GuiGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case Else
;-))
EndSwitch
WEnd
Exit
Func GetNameFromRegistry($Lw)
Dim $Wert, $Reg=RegRead("HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices", "\DosDevices\" &$Lw), $c, $i, $va, $ve, $vr
For $i=1 To StringLen($Reg)-2 Step 2
$c=Dec(StringMid($Reg, $i, 2))
If $c<>0 Then $Wert&=Chr($c)
Next
; jetzt prüfen was es ist
; kein Wert=Festplattenpartition; "GENERIC_FLOPPY_DRIVE"; "CdRomNAME"; "CdRom&Ven_NAME"; "RemovableMedia"
Select
Case StringInStr($Wert, "GENERIC_FLOPPY_DRIVE")>0
Return "GENERIC FLOPPY DRIVE"
Case StringInStr($Wert, "CdRom")>0
$i=StringInStr($Wert, "#")+6
$c=StringInStr($Wert, "__")
$va=StringInStr($Wert, "&Ven_")+5
$ve=StringInStr($Wert, "#",0,2)
Select
Case $va=5
Return StringReplace(StringMid($Wert, $i, $c-$i), "_", " ")
Case $va>5
$Wert=StringReplace(StringMid($Wert, $va, $ve-$va), "&Prod_", " ")
$vr=StringInStr($Wert, "&Rev",0,-1)
Return StringReplace(StringLeft($Wert,StringLen($Wert)-($ve-$vr)) & StringReplace(StringRight($Wert, $ve-$vr), "_", ". "),"&", " ")
EndSelect
Case StringInStr($Wert, "RemovableMedia")>0
Return "RemovableMedia"
Case Else
Return "Festplattenpartition"
EndSelect
EndFunc
Func BubbleSort(byRef $Feld, $l, $r) ; ist Ok, mit Kleiner zusammen..
If IsArray($Feld) Then
Dim $i, $j, $y
For $i=$l To $r
For $j=$i To $r
If $Feld[$j]<$Feld[$i] Then
$y=$Feld[$i]
$Feld[$i]=$Feld[$j]
$Feld[$j]=$y
EndIf
Next
Next
Else
MsgBox(4096, "Fehler", "$Feld ist kein Array")
EndIf
EndFunc
Func ShowIt(byRef $Feld, $Tr=@CrLf) ; ist Ok, mit Kleiner zusammen..
If IsArray($Feld) Then
Dim $i, $p
For $i=1 To UBound($Feld)-1
If $Tr<>@CrLf Then $Feld[$i]=StringUpper($Feld[$i])
$p&=$Feld[$i] &$Tr
Next
Else
$p="$Feld ist kein Array!"
EndIf
Return $p
EndFunc
;</AutoItScript>
Alles anzeigen
Das bringt mich auf der Suche nach meinen USB-Sticks schon
ein Stück weiter. Lediglich zwei(FAT, 128 bzw 256 MB) lassen nur über das
allgemeine Kriterium: DosDevice und Größe>3MB erkennen
BugFix :
Du hast Recht, es fehlt ein Smily für
[PfingstEdit]
dies ist nun eine geänderte Version, die mir alle Laufwerke anzeigt.
(Nebenbei habe ich jetzt auch die Optionen von StringInstr begriffen )
BugFix :
Die ganz langen Bezeichnungen der CDVD-Laufwerke auszublenden, verschenkt
Informationen: Mein Brenner wurde ausgeliefert mit Revision H
An diesem Protokoll ist zu erkennen, daß das Upgrade auf Version J
vom System übernommen wurde.
Nach dem '#' hinter der Lw-Bezeichnung steht mit Sicherheit ein Lw-Typ.
(5:wechselbar, 8:USB, 2:Netz???)
Lediglich die beiden USB-Sticks U: und V: hauen hier raus.
(Beide haben feste Laufwerksbuchstaben zugeordnet bekommen, beide hatte
ich im Optimierungswahn mal auf NTFS formatiert[sind aber wieder FAT],
außerdem sind es meine ältesten Sticks[~2003])
Ich glaube, mit diesen Vermutungen liege ich einigermaßen richtig.
Wer die ZusatzInfos nicht benötigt, muß in DecodeName() die StringInstr()
Anweisung von -1 auf -2 ändern und schon bleiben sie weg.
Das Protokoll:
A: GENERIC_FLOPPY_DRIVE#5&14f74304&0&0 ;OK, Diskette
C: DosDevice ;Part. 0,1
D: DosDevice ;Part. 1,1
E: DosDevice ;Part. 0,2
F: DosDevice ;Part. 1,2
G: DosDevice ;Part. 0,3
H: DosDevice ;Part. 1,3
I: DosDevice ;Part. 1,4
J: DosDevice ;Part. 1,5
K: DosDevice ;Part. 1,6
L: CdRom&Ven_Generic&Prod_DVD-ROM&Rev_1.0#2&12b1de20&0&000 ;virt. DVD
M: RemovableMedia#8&87d15f4&0&RM ;MMKarte-128MB
N: RemovableMedia#8&1fde2770&0&RM
O: RemovableMedia#8&1d9465bd&0&RM
P: RemovableMedia#8&35998ef&0&RM
S: RemovableMedia#8&1014e105&0&RM ;SD-Karte 128MB
U: DosDevice ;USB-Stick 128MB
V: DosDevice ;USB-Stick 256MB
W: CdRomTEAC_CD-W516EB__________________________1.0J____#5&35bcaee8&0&0.0.0
Z: CdRomTSSTcorp_DVD-ROM_SH-D162C_______________TS01____#5&35bcaee8&0&0.1.0
Alles anzeigen
Unschwer zu erkennen: die Kommentare nach ; sind manuell eingefügt..
Und hier das Skript:
Spoiler anzeigen
;<AutoItScript>
#NoTrayIcon
AutoItSetOption("MustDeclareVars", 1)
;+----------------------------------------------------------------------------+
;| Header: Bestimmen der Übergabeparameter |
;| ( Alles Strings(!!!), bis auf ArgC ) |
;| FontAnzeigeCheck: |Il1 sind Alt-0124, Großes i, Kleines L, Eins |
Const $Author="Always.au3 ©2006 by ytwinky, MD"; |
;| EMail: PIII1kSystem-AutoIt3Forum@yahoo.de |
;| (Tastenkombination: keine) |
;| AutoIt3-Version: 3.1.1.125(beta) |
;| Editor: SciTE 1.68, feste Schriftart |
;| Zweck : Anzeigen der vom System gespeicherten Laufwerke |
;| Tab auf 2 setzen wg. Lesbarkeit |
;+----------------------------------------------------------------------------+
Const $RegKey="HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices\", $rv="\DosDevices\"
Dim $i=0
Dim $s="", $Wert, $Fehler=0
Do
$i+=1
$Wert=RegEnumVal($RegKey, $i)
$Fehler=@Error
If $Fehler=0 And StringInstr($Wert, ":") Then
$s&=StringRight($Wert, 2) &" " &DecodeName(StringRight($Wert, 2)) &@Lf
EndIf
Until $Fehler<>0
$Wert=StringSplit($s, @Lf)
BubbleSort($Wert, 1, $Wert[0])
$s=""
For $i=1 To $Wert[0]
$s&= $wert[$i] &@CrLf
Next
_IEPrt("<html><pre>" &$s, "Registry-Info", 660, $i*18)
Func _IEPrt($Was, $Titel, $Breite=660, $Hoehe=300, $Links=100, $Oben=100)
Dim $IE=ObjCreate("InternetExplorer.Application.1")
$IE.Navigate("about:blank")
$IE.Document.Title=$Titel
$IE.Left=$Links
$IE.Top=$Oben
$IE.Width=$Breite
$IE.Height=$Hoehe
$IE.Visible=True
$IE.Document.Body.InnerHtml="Bitte warten.."
$IE.Toolbar=False
$IE.Menubar=False
$IE.Statusbar=False
$IE.Document.Body.InnerHtml=$Was
EndFunc
Func DecodeName($Lw)
Dim $w, $Reg=RegRead($RegKey, $rv &$Lw), $c, $i
For $i=1 To StringLen($Reg)-2 Step 2
$c=Dec(StringMid($Reg, $i, 2))
If $c<>0 Then $w&=Chr($c)
Next
$i=StringInStr($w, "#")
If $i=0 Then Return StringMid($w, 2, 9)
$c=StringInstr($w, "#", 0, -1)
Return StringMid($w, $i+1, $c-$i-1)
EndFunc
Func BubbleSort(byRef $Feld, $l, $r) ; ist Ok, mit Kleiner zusammen..
If IsArray($Feld) Then
Dim $i, $j, $y
For $i=$l To $r
For $j=$i To $r
If $Feld[$j]<$Feld[$i] Then
$y=$Feld[$i]
$Feld[$i]=$Feld[$j]
$Feld[$j]=$y
EndIf
Next
Next
Else
MsgBox(4096, "Fehler", "$Feld ist kein Array")
EndIf
EndFunc
;</AutoItScript>
Alles anzeigen
Witzige Erscheinung am Rande:
Obwohl in der Registry alle Laufwerke sortiert abgelegt sind,
werden sie per RegEnumVal() doch nicht soertiert ausgelesen.
Ich hätte zum Sortieren auch meinen QSort nehmen können, aber
den hatte ich ja schon gepostet
[Edit]
Frei nach Murphy:Ein Programm ist nie fertig..
(Schreibfehler berichtigt)
Gruß
ytwinky