GetLwW-alle Laufwerke mit Anschluß anzeigen..

  • Hi,
    ja, mein Rechner hat noch IDE-Anschlüsse aber auch schon USB 2.0..
    Da ich mehrere Partitionen habe..
    Ach ist ja auch egal..

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon ;ohne SysTray-Icon, hängende Prozesse mit TaskMan beenden
    #include <EditConstants.au3>
    #include <ListViewConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
    #AutoIt3Wrapper_Add_Constants=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ;<AutoItScript>
    Opt('MustDeclareVars', 1) ;0=ohne, 1=erfordert Variablen-Deklaration
    ;+----------------------------------------------------------------------------+
    ;| Header: Bestimmen der Übergabeparameter |
    ;| ( Alles Strings(!!!), bis auf ArgC ) |
    ;| FontAnzeigeCheck: |Il1 sind Alt-0124, Großes i, Kleines L, Eins |
    Const $Autor='GetLwW.au3 ©2012 by ytwinky, MD'; |
    ;| EMail: [email='PIII1kSystem-AutoIt3Forum@yahoo.de'][/email] |
    ;| AutoIt3-Version: aktuelle beta |
    ;| Editor: SciTE aktuelle Version, feste Schriftart |
    ;| Zweck : Laufwerke mit Anschlußtyp anzeigen(nur Laufwerke mit Buchstaben)|
    ;| Tab auf 2 setzen wg. Lesbarkeit |
    ;+----------------------------------------------------------------------------+
    Const $UnGerade[2]=[0xFFFFFF, 0xD2F6CC], $wbemFlagReturnImmediately=0x10, $wbemFlagForwardOnly=0x20, $wbemFlags=0x10+0x20
    Const $btnCaption[2]=['Typ-Legende', 'Keine Legende'], $IniDatei=StringLeft(@ScriptFullPath, StringLen(@ScriptFullPath)-3) &'Ini'
    Const $GUIBreite=717, $GUIHoehe=455, $GUILeft=350, $GUITop=200, $MaxUsbLw=50, $MaxLw=27
    Const $fmt=StringFormat('%4s|%4s|%3s|%7s|%8s|%4s|%12s|%15s|%-15s|%-15s|%-20s', '', '', '', '', '', '', '', '', '', '', '')
    Global $USBLw[$MaxUsbLw+1], $LwIndex[$MaxLw], $WmiSvc, $strComputer=@ComputerName, $LwZeile[$MaxLw+1], $u, $CurPos, $StartLw, $CurLw
    Local $i, $s, $t, $f, $dt[2]=['DD', 'UD'], $Items, $Item, $m, $Lw, $n, $l, $GesKapaz, $GesFrei
    Global $ShowTyp=GUICreate('Typ-Legende', $GUILeft-102, $GUIHoehe, $GUILeft-254, $GUITop), $ChkStatus=IniRead($IniDatei, 'Config', 'ShowHelp', $GUI_Checked)
    Global $LwAStatus=IniRead($IniDatei, 'Config', 'ShowLwA', $GUI_Checked), $LwBStatus=IniRead($IniDatei, 'Config', 'ShowLwB', $GUI_UnChecked)
    GUICtrlCreateGroup('', 1, -4, $GUILeft-104, $GUIHoehe+4)
    $l='DD=DisketteDrive(Diskette 3,5"/5,25")' &@CrLf
    $l&='FD=FloppyDrive(Diskette 3,5"/5,25")' &@CrLf
    $l&='HD=Festplatte(HardDisk)' &@CrLf
    $l&='ND=NetzLaufwerk(NetDrive)' &@CrLf
    $l&='OD=Optisches Laufwerk(Optical Disk, CD/DVD)' &@CrLf
    $l&='RD=RAM-Disk' &@CrLf
    $l&='UD=USB Drive(Sticks/Karten)' &@CrLf
    $l&='UFD=USB-FloppyDrive' &@CrLf
    $l&='UHD=(externe) USB-Festplatten' &@CrLf
    $l&='ULw=USB-Laufwerk(Sticks/Karten)' &@CrLf
    $l&='UOD=optisches USB-Laufwerk' &@CrLf
    $l&='nv=nicht verfügbar' &@CrLf
    $l&='Disketten und CD/DVD zählen nicht zur Summe..' &@CrLf
    $l&='..Netzlaufwerke auch nicht!' &@CrLf
    Global $efTyp=GUICtrlCreateEdit($l &'[] ist das Gauss''sche Summensymbol' &@CrLf &' (in case you didn''t know..)', 4, 4, $GUILeft-110, $GUIHoehe-7, $ES_READONLY)
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    If BitAnd($ChkStatus, $GUI_Checked) Then GUISetState(@SW_SHOW)
    Global $ShowLw=GUICreate('GetLwW', $GUIBreite, $GUIHoehe, $GUILeft, $GUITop)
    Global $lbTitel=GUICtrlCreateLabel('Laufwerke von ' &$strComputer, 0, -2, 439, 24)
    GUICtrlSetFont(-1, 18, 800, 0, 'Arial')
    GUICtrlSetColor(-1, 0x000080)
    GUICtrlSetTip(-1, $Autor)
    Global $btnF5=GUICtrlCreateButton('F5', 482, 1, 27, 25)
    GUICtrlSetFont(-1, 8, 800, 0, 'MS Sans Serif')
    GUICtrlSetColor(-1, 0x008000)
    GUICtrlSetTip(-1, 'aktualisieren..')
    Global $cbxLwA=GUICtrlCreateCheckbox('A: ausblenden', 531, 4, 90, 17)
    GUICtrlSetState(-1, $LwAStatus)
    Global $cbxLwB=GUICtrlCreateCheckbox('B: ausblenden', 622, 4, 90, 17)
    GUICtrlSetState(-1, $LwBStatus)
    Global $lvLwAdr=GUICtrlCreateListView(StringFormat('%4s|%4s|%3s|%7s|%8s|%4s|%17s|%18s|%11s|%17s|%-20s', 'lfd.', 'Lw', 'DNr', 'Typ', 'FS ', 'bereit', 'Total[MB]', 'Frei[MB]', 'Frei[%]', 'belegt[MB]', 'Bezeichnung'), 0, 26, $GUIBreite-1, $GUIHoehe-53, default, $LVS_EX_GRIDLINES)
    For $i=1 To 27
    $LwZeile[$i]=GUICtrlCreateListViewItem($fmt, $lvLwAdr)
    GUICtrlSetFont(-1, 9, 400, 0, 'Lucida Console')
    Next
    Global $btnTyp=GUICtrlCreateButton($btnCaption[BitAnd($ChkStatus, $GUI_Checked)], 2, $GUIHoehe-26, 93, 25, 0)
    GUICtrlSetFont(-1, 8, 800, 0, 'MS Sans Serif')
    Global $lblBusy=GUICtrlCreateLabel('*busy*', 300, $GUIHoehe-22, 80, 24)
    GUICtrlSetFont(-1, 8, 800, 0, 'MS Sans Serif')
    GUICtrlSetColor(-1, 0xE00000)
    GUICtrlSetState(-1, $GUI_Hide)
    Global $cbxLegStart=GUICtrlCreateCheckbox('Legende beim Start anzeigen', 100, $GUIHoehe-22, 190, 17)
    GUICtrlSetState(-1, $ChkStatus)
    GUICtrlSetTip(-1, 'legt im Dateiverzeichnis eine IniDatei an..' &@CrLf &'(braucht dort also Schreibrechte!)')
    GetLW()
    Global $btnQuit=GUICtrlCreateButton('Ende', $GUIBreite-77, $GUIHoehe-26, 75, 25, 0)
    GUICtrlSetFont(-1, 8, 800, 0, 'MS Sans Serif')
    GUICtrlSetState($btnTyp, $GUI_Focus)
    GUISetState(@SW_SHOW)
    $StartLw=DriveGetDrive('All')
    While True
    $CurLw=DriveGetDrive('All')
    If $CurLw[0]<>$StartLw[0] Then
    $StartLw=$CurLw
    GetLw()
    EndIf
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE, $btnQuit
    Exit
    Case $btnF5
    GetLW()
    Case $cbxLwA
    IniWrite($IniDatei, 'Config', 'ShowLwA', GuiCtrlRead($cbxLwA))
    GetLW()
    Case $cbxLwB
    IniWrite($IniDatei, 'Config', 'ShowLwB', GuiCtrlRead($cbxLwB))
    GetLW()
    Case $cbxLegStart
    IniWrite($IniDatei, 'Config', 'ShowHelp', GuiCtrlRead($cbxLegStart))
    Case $btnTyp
    If GUICtrlRead($btnTyp)='Keine Legende' Then
    WinSetState('Typ-Legende', '', @SW_HIDE)
    GUICtrlSetData($btnTyp, 'Typ-Legende')
    Else
    WinSetState('Typ-Legende', '', @SW_Show)
    $CurPos=WinGetPos('GetLwW', '')
    If $CurPos[0]<251 Then WinMove('GetLwW', '', 252, $CurPos[1])
    $CurPos=WinGetPos('GetLwW', '')
    WinMove('Typ-Legende', '', $CurPos[0]-252, $CurPos[1])
    GUICtrlSetState($btnTyp, $GUI_Focus)
    GUICtrlSetData($btnTyp, 'Keine Legende')
    EndIf
    EndSwitch
    Wend

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

    Func myStatus($Lw)
    Switch StringLower(DriveStatus($Lw))
    Case 'ready'
    Return 'ja'
    Case 'notready'
    Return 'nein'
    Case 'unknown'
    Return '???'
    Case 'invalid'
    Return 'atmno'
    Case Else
    Return 'wtf???'
    EndSwitch
    EndFunc

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

    Func myDriveType($Lw)
    Local $WMiSvc, $EachCD, $CDs
    If $USBLw[$LwIndex[Asc($Lw)-64]]<>'' Then Return $USBLw[$LwIndex[Asc($Lw)-64]]
    Switch StringLower(DriveGetType($Lw))
    Case 'cdrom'
    $WmiSvc=ObjGet('winmgmts:\\' &$strComputer &'\root\cimv2')
    $CDs=$WmiSvc.ExecQuery('Select PNPDeviceID From Win32_CDROMDrive Where Drive="' &$Lw &'"', 'wql', $wbemflags)
    If IsObj($CDs) Then
    For $EachCD In $CDs
    If StringInstr($EachCD.PNPDeviceID, 'USB') Then Return 'UOD'
    Next
    Else
    Msg('WMI-Ausgabe','Keine WMI-Objekte gefunden für Klasse: Win32_CDROMDrive')
    EndIf
    Return 'OD'
    Case 'fixed'
    Return 'HD'
    Case 'ramdisk'
    Return 'RD'
    Case 'network'
    Return 'ND'
    Case 'removable'
    Return $dt[$Lw>'C:']
    Case Else
    Return 'nv'
    EndSwitch
    EndFunc

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

    Func myGetFS($Lw)
    Local $FS=DriveGetFileSystem($Lw)
    If $Fs=1 Then Return 'leer/raw'
    Return $Fs
    EndFunc

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

    Func Msg($What, $Title=$Autor, $Icons=0, $ErrLevel=0)
    MsgBox($Icons, $Title, $What)
    If $ErrLevel Then Exit $ErrLevel
    EndFunc

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

    Func PSpace($Where, $Fw, $Nk)
    If $Where='' Then Return ''
    Local $s=StringFormat('%.' &$Nk &'f', $Where), $i=StringLeft($s, StringInstr($s, '.')), $Nk1=$Nk, $j
    If $Nk1>0 Then $Nk1+=1
    Do
    $s=' ' &$s
    Until StringLen($s)=$Fw
    For $j=6 To 1 Step -1
    If $i<10^$j Then $s=' ' &$s
    Next
    Return $s
    EndFunc

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

    Func GetLW()
    Local $WmiSvc=ObjGet('winmgmts:\\' &$strComputer &'\root\CIMV2')
    Local $Items=$WmiSvc.ExecQuery('Select Index,MediaType From Win32_DiskDrive Where InterfaceType="USB"', 'wql', $wbemflags)
    Local $Items, $i, $j=0, $m, $AlleLw, $f, $t, $GesFrei, $GesKapaz
    GUICtrlSetState($lblBusy, $GUI_Show)
    If IsObj($Items) Then
    For $Item In $Items
    If $Item.Index<0 Or $Item.Index>=$MaxUsbLw Then Msg('Script erneuern: Index(erlaubt):0..' &$MaxUsbLw &@Lf &'Index(aktuell):' &$Item.Index, 'Huch..', 64, 27)
    $USBLw[$Item.Index]='UD'
    $m=StringReplace($Item.MediaType, @Tab, ' ')
    $m=StringLeft($m, StringInstr($m, ' ')-1)
    If StringInstr($m, 'x') Then $USBLw[$Item.Index]='UHD'
    If StringInstr($m, 'o') Then $USBLw[$Item.Index]='ULw'
    Next
    Else
    Msg('Keine WMI-Objekte gefunden für Klasse: Win32_DiskDrive', $strComputer, 64, 27)
    EndIf
    $Items=$WMISvc.ExecQuery('Select Antecedent, Dependent From Win32_LogicalDiskToPartition', 'wql', $wbemFlags)
    If IsObj($Items) Then
    For $Item In $Items
    $i=StringMid($Item.Antecedent, StringInstr($Item.Antecedent, '=')+2)
    $i=StringMid($i, StringInstr($i, '#')+1, StringInstr($i, ',')-StringInstr($i, '#')-1)
    $m=StringMid($Item.Dependent, StringInstr($Item.Dependent, '=')+2, 1)
    $LwIndex[Asc($m)-64]=$i
    Next
    Else
    Msg('Keine WMI-Objekte gefunden für Klasse: Win32_LogicalDiskToPartition', $strComputer, 64, 27)
    EndIf
    $AlleLw=DriveGetDrive('all')
    If Not @error Then
    For $i=1 To $AlleLw[0]
    $Lw=StringUpper($AlleLw[$i])
    If $Lw='A:'And BitAnd(GUICtrlRead($cbxLwA), $GUI_CHECKED) Then ContinueLoop
    If $Lw='B:' And BitAnd(GUICtrlRead($cbxLwB), $GUI_CHECKED) Then ContinueLoop
    $j+=1
    $m=myStatus($Lw)
    $s=StringFormat('%02s|%3s|%3s|%6s|%6s|%4s|', $j, $Lw, $LwIndex[Asc(StringLeft($Lw, 1))-64], myDriveType($Lw), myGetFS($Lw), $m)
    If $m='ja' Then
    $t=DriveSpaceTotal($Lw)
    $f=DriveSpaceFree($Lw)
    If StringInstr(myDriveType($Lw), 'OD')=0 Then
    $GesKapaz+=$t
    $GesFrei+=$f
    EndIf
    $m=''
    If $t<>0 Then $m=PSpace($f/$t*100, 7, 1)
    $s&=PSpace($t, 15, 3) &'|' &PSpace($f, 15, 3) &'| ' &$m &'|' &PSpace($t-$f, 15, 1) &'|' &DriveGetLabel($Lw)
    EndIf
    GUICtrlSetData($LwZeile[$j], $fmt)
    GUICtrlSetData($LwZeile[$j], $s)
    GUICtrlSetColor($LwZeile[$j], 0x000080)
    GUICtrlSetBkColor($LwZeile[$j+1], $UnGerade[BitAnd($j, 1)])
    Next
    For $i=$j+1 To $MaxLw
    GUICtrlSetData($LwZeile[$i], $fmt)
    GUICtrlSetBkColor($LwZeile[$i], $UnGerade[0])
    Next
    $s=StringFormat('[]||||||%10s|%12s|%12s|%-12s|', PSpace($GesKapaz, 15, 3), PSpace($GesFrei, 15, 3), PSpace($GesFrei/$GesKapaz*100, 7, 1), PSpace($GesKapaz-$GesFrei, 15, 1))
    GUICtrlSetData($LwZeile[$j+1], $s)
    GUICtrlSetBkColor($LwZeile[$j+1], 0xDDDDDD)
    EndIf
    GUICtrlSetState($lblBusy, $GUI_Hide)
    EndFunc

    [/autoit]

    Mich würde nun interessieren, was das Programm unter Win7 anzeigt(Vista interessiert mich nicht..)
    Bzw. ob es überhaupt etwas anzeigt bei Rechnern, die gar keine IDE-Platten mehr haben(also SATA etc.)
    Da ich viele Anregungen zum Programm hier aus dem Forum habe, ist es für mich natürlich kein Problem, den QuälCode hier zu posten..
    ..auch als Dankeschön an die vielen (ungenannten) 'Helfer' ^^
    Da das Script bei mir unter XP SP3+ funktioniert, hat es mit Rückmeldungen keine Eile ;)
    Wenn die Admins meinen, es würde besser nach 'Scripte' passen, sollten sie es dorthin verschieben..
    Gruß
    ytwinky

  • Sieht ja schmuck aus, vielen Dank L3viathan ^^
    Ich vermute mal, das das Programm mindestens ein optisches Laufwerk und eine Festplatte nicht richtig erkannt hat..
    naja, schaunwer mal..
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..