Manage USB-Drives per devcon.exe

  • 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. :D
    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. ;-)




    DL bisher: 14

  • Hallo BugFix.


    Ich bekomme folgende Fehlermeldung beim Versuch die GUI zu öffnen:


    $path_Devcon wurde na klar angepaßt ;-)


    LG,
    Lina.

    ...... Lieben Gruß, ........
    ...........
    Alina ............

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Ich habe die Deutsche Hilfe auf meinem PC und
    OrganizeIncludes ist beim Scripten mein bester
    Freund. Okay?

    Einmal editiert, zuletzt von Alina ()

  • Habe den gleichen Fehler wie Alina. Muss dazu sagen: Bei mir läuft noch AutoIt 3.2.10.0.
    Aber damit scheint es nichts zu tun zu haben.


    Sondern das Auslesen der Registry gibt nichts brauchbares zurück.
    Die Variable $val hat bei mir in Zeile 131 folgenden Inhalt:
    '\??\FDC#GENERIC_FLOPPY_DRIVE#5&2ded1349&0&0#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}'


    Damit gibts das StringBetween anschließend keine Array zurück.
    Denn die Strings 'Media#' und '&RM#' sind ja nicht enthalten.


    Edit: Es ist der erste Schleifendurchlauf, wo es mein Floppy-LW A findet !

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:


    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hmm, eigentlich wird beim Einstecken eines eines USB-Devices ein Registryeintrag in HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR\ erstellt (und nicht wieder entfernt), mit den Parametern des Devices.
    autoit.de/wcf/index.php?attachment/3888/ autoit.de/wcf/index.php?attachment/3889/


    Probiert mal bitte mit dem WMI-Code von hier: [ gelöst ] USB-Hardware-ID auslesen
    Sollte bei eingestecktem Stick in etwa so etwas herauskommen:

    Code
    1. \\ComputerName\root\cimv2:Win32_PnPEntity.DeviceID="USBSTOR\\DISK&VEN_USB&PROD_FLASH_DISK&REV_V1.1\\907310000250&0"


    Wenn nicht... :wacko:

  • Vielleicht habe ich mich nicht verständlich genug ausgedrückt.


    Dein Script sammelt in Zeile 120 'REMOVEABLE' Drives, dazu zählen bei mir auch Floppy A und eine virtuelle Floppy B.
    Nun durchläuft das Script das Array ( Zeilen 122-139) und steigt gleich bei Floppy A aus weil das StringBetween kein gültiges Array liefert.
    Ändere ich die For-Schleife ab (Zeile 122: For $i = 3 ...) dann scheint es auch bei mir zu laufen.


    Gruß
    micha_he

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:


    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Also nun bekomme ich folgenden Fehlen:


    E:\ManageUSB.au3 (134) : ==> Subscript used with non-Array variable.:
    $tmp = _GetUSBCaption($pref[0])
    $tmp = _GetUSBCaption($pref^ ERROR



    Mhhhhhhh.

    ...... Lieben Gruß, ........
    ...........
    Alina ............

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Ich habe die Deutsche Hilfe auf meinem PC und
    OrganizeIncludes ist beim Scripten mein bester
    Freund. Okay?

  • Achja, die gute (böse) alte Floppy.
    OK, Änderung wie folgt:


    Ich werde es gleich mal im ersten Post korrigieren.

  • Auch nach deinen ganzen änderungen kommt diese Fehlermeldung :
    C:\Users\Michael\Desktop\rt.au3 (134) : ==> Subscript used with non-Array variable.:
    $tmp = _GetUSBCaption($pref[0])
    $tmp = _GetUSBCaption($pref^ ERROR

  • Der Start des Tools geht jetzt und wenn ein USB-Stick vorhanden ist, wird er auch angezeigt.


    Klicke ich jetzt nochmal auf Scan kommte folgende Meldung:
    autoit.de/wcf/index.php?attachment/3893/


    Wähle ich dagegen meinen USB-Stick aus und klicke auf Entfernen, erscheint folgender Fehler:
    autoit.de/wcf/index.php?attachment/3894/

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:


    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"


  • Wähle ich dagegen meinen USB-Stick aus und klicke auf Entfernen, erscheint folgender Fehler:


    Kann es sein, dass du nicht die aktuelle Stable-Version hast? Die _ArraySearch-Funktion wurde nämlich verändert und hat jetzt einen Parameter mehr.


    Auch nach deinen ganzen änderungen kommt diese Fehlermeldung :
    C:\Users\Michael\Desktop\rt.au3 (134) : ==> Subscript used with non-Array variable.:
    $tmp = _GetUSBCaption($pref[0])
    $tmp = _GetUSBCaption($pref^ ERROR


    Raupi, sicher dass If @error Then ExitLoop eingefügt ist? Denn in diesem Fall wird $pref[0] gar nicht zur Verarbeitung herangezogen.


    Edit: In Post 1 ist der Code (auch im Anhang) jetzt aktualisiert.

  • Zitat

    Raupi, sicher dass If @error Then ExitLoop eingefügt ist? Denn in diesem Fall wird $pref[0] gar nicht zur Verarbeitung herangezogen.


    Habe nix eingefügt , da ich mich darauf verlassen habe :

    Zitat

    Ich werde es gleich mal im ersten Post korrigieren.


    Hast du ja jetzt gemacht ;-)

  • Also mit der NUN oberen Version arbeitet es einwandfrei !!!

    ...... Lieben Gruß, ........
    ...........
    Alina ............

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Ich habe die Deutsche Hilfe auf meinem PC und
    OrganizeIncludes ist beim Scripten mein bester
    Freund. Okay?

  • Was soll passieren wenn ich auf "Entfernen" klicke? ^^


    Kann wird das USB Gerät abgemeldet (Sicheres entfernen der Hardware).
    Schau einfach vorher und nach dem betätigen des Buttons "Entfernen" mal im Autoplatz nach dem entsprechenden Laufwerk. Nach dem betätigen ist es weg.

    ...... Lieben Gruß, ........
    ...........
    Alina ............

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Ich habe die Deutsche Hilfe auf meinem PC und
    OrganizeIncludes ist beim Scripten mein bester
    Freund. Okay?

  • Hi


    Hier ist meine Version.
    Die Erkennung erfolgt ausschließlich über wmi, also bin ich nicht auf die Registry angewiesen...
    Andererseits dauert die Auflistung doch erheblich länger.


    Für Devcon verwende ich die InstanceID.


    BugFix :
    1) Hast du 2 Identische Sticks? Ich kann meine Version leider nicht testen, ob das dann auch funktioniert...
    2)was passiert mit deiner Methode, wenn du manuell im Gerätemanager deaktivierst und dann per DevCon aktivierst?
    Bei mir (mitder InstanceID) sagt Devcon zwar, daß es geklappt hat, ist aber deinitiv nicht so!?
    Thx



    ps.: Und sorry, daß ich dir auch noch das Design geklaut hab :D


    lgE

  • eukalyptus :


    Ich habe mir Deine WMI-Version jetzt nicht extra angesehen.


    Nur einen Tip den ich beim Arbeiten mit WMI feststellen musste:
    Nicht alle WMI-Abfragen dürfen auch "Normalsterbliche"-User durchführen.
    Einiges ist den Admins vorbehalten. Also immer schön als Nicht-Admin testen.


    Aber wie gesagt, muss bei Deinem Script nicht zutreffen.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:


    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Ist mir vorher gar nicht aufgefallen - aber wenn du per Gerätemanager den Stick abmeldest, kann devcon nichts mehr erkennen. Das ist auch sichtbar, wenn du mit devcon abmeldest. Dann verbleibt trotzdem das Symbol für die Hardwareabmeldung im Tray, nur ohne Lw-Buchstaben. Die Abmeldung durch devcon ist also keine echte Hardwareentfernung.
    Ich habe keine 2 identischen Sticks, sie nutzen aber dieselbe Bezeichnung, haben aber unterschiedliche ID's.

  • Hallo,


    ich bekomme leider auch eine Fehlermeldung (OS=Windows XP SP3, MUL):


    Aufruf aus SciTE (V1.76):
    >Running:(3.2.12.1):C:\Program Files\AutoIt3\autoit3.exe "D:\Scripts\ManageUSB.au3"
    D:\Scripts\ManageUSB.au3 (138) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $tmp = StringSplit($tmp[2], @LF)
    $tmp = StringSplit(^ ERROR
    ->12:01:06 AutoIT3.exe ended.rc:1
    >Exit code: 1 Time: 2.065


    Nach dem compilieren:
    Es erscheint das Fenster "Manage USB-Drive" allerdings auch eine Fehlermeldung:
    "AutoIt Error"
    Line -1:
    Error: Array variable has incorrect number of subscripts or subscript dimension range exceeded.


    mfg
    Axel

    There exist 10 different kind of people on earth.
    Those who understand binary, and those who don't.