Python: get name of a USB flash drive device [windows]

前端 未结 3 1541
遥遥无期
遥遥无期 2021-01-20 09:02

I\'m trying to write little program which will be able to read some informations about REMOVEABLE_DEVICE (USB). I\'ve tried pyusb but I was not able to pull data I need.

相关标签:
3条回答
  • 2021-01-20 09:31

    Disclaimer: I haven't really got any experience with the win32com.client library.

    By starting with Win32_DiskDrive like you did, I went over Win32_DiskDriveToDiskPartition and Win32_LogicalDiskToPartition, and then to Win32_LogicalDisk to get the VolumeName which seems what you want.

    import win32com.client
    strComputer = "."
    objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
    objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")
    
    # 1. Win32_DiskDrive
    colItems = objSWbemServices.ExecQuery("SELECT * FROM Win32_DiskDrive WHERE InterfaceType = \"USB\"")
    DiskDrive_DeviceID = colItems[0].DeviceID.replace('\\', '').replace('.', '')
    DiskDrive_Caption = colItems[0].Caption
    
    print 'DiskDrive DeviceID:', DiskDrive_DeviceID
    
    # 2. Win32_DiskDriveToDiskPartition
    colItems = objSWbemServices.ExecQuery("SELECT * from Win32_DiskDriveToDiskPartition")
    for objItem in colItems:
        if DiskDrive_DeviceID in str(objItem.Antecedent):
            DiskPartition_DeviceID = objItem.Dependent.split('=')[1].replace('"', '')
    
    print 'DiskPartition DeviceID:', DiskPartition_DeviceID
    
    # 3. Win32_LogicalDiskToPartition
    colItems = objSWbemServices.ExecQuery("SELECT * from Win32_LogicalDiskToPartition")
    for objItem in colItems:
        if DiskPartition_DeviceID in str(objItem.Antecedent):
            LogicalDisk_DeviceID = objItem.Dependent.split('=')[1].replace('"', '')
    
    print 'LogicalDisk DeviceID:', LogicalDisk_DeviceID
    
    # 4. Win32_LogicalDisk
    colItems = objSWbemServices.ExecQuery("SELECT * from Win32_LogicalDisk WHERE DeviceID=\"" + LogicalDisk_DeviceID + "\"")
    print 'LogicalDisk VolumeName:', colItems[0].VolumeName
    print
    
    # putting it together
    print DiskDrive_Caption
    print colItems[0].VolumeName, '(' + LogicalDisk_DeviceID + ')'
    

    Works for me:

    DiskDrive DeviceID: PHYSICALDRIVE1
    DiskPartition DeviceID: Disk #1, Partition #0
    LogicalDisk DeviceID: D:
    LogicalDisk VolumeName: PENDRIVE
    
    Sony Storage Media USB Device
    PENDRIVE (D:)
    

    This seems to provide a complicated, but possible way, maybe you can simplify it even more. My only simplification is leaving out Win32_DiskPartition already because we only need the connection.

    Please note:

    • I'm not sure what's the "clean" way to unpack something like \\.\PHYSICALDRIVE1, but it should be possible to get rid of the .replace()-methods.
    • I'm not sure if it's possible to integrate the loops in steps 2 and 3 into the query? That would also simplify it a lot (maybe it's possible to JOIN them SQL-like?).
    • (The code above will only work for a single USB drive.)
    0 讨论(0)
  • 2021-01-20 09:47

    I will look odd but it will work (get list of all removable volume's Label's)

    import os
    os.system('echo list volume > Ravi.txt')
    path1 = os.path.join(os.getcwd(),"Ravi.txt")
    os.system('diskpart /s '+path1+' > logfile.txt')
    path2 = os.path.join(os.getcwd(),"logfile.txt")
    
    Str = open(path2).read()
    Str = Str.split('\n')
    matching = [s for s in Str if "Removable" in s]
    
    for i in matching:
        i = ' '.join(i.split())
        i = i.split(" ")
        print i[3]+"("+i[2]+":)"
    

    output

    MYPENDRIVE(D:)
    
    0 讨论(0)
  • 2021-01-20 09:49

    I used the approach of @adrianus and improved a bit on it to return multiple usb drives. For how it works check his answer. For quick and dirty code that hopefully works for you check below :)

    def get_usb_volume_name():  # pragma: no cover
        str_computer = "."
        logical_disk_device_ids = []
        volumes = []
        try:
            obj_wmi_service = win32com.client.Dispatch("WbemScripting.SWbemLocator")
            obj_swbem_services = obj_wmi_service.ConnectServer(str_computer, "root\cimv2")
    
        # 1. Win32_DiskDrive
        col_items = obj_swbem_services.ExecQuery("SELECT * FROM Win32_DiskDrive WHERE InterfaceType = \"USB\"")
        for item in col_items:
            disk_drive_device_ids = item.DeviceID.replace('\\', '').replace('.', '')
    
        # 2. Win32_DiskDriveToDiskPartition
        col_items = obj_swbem_services.ExecQuery("SELECT * from Win32_DiskDriveToDiskPartition")
        disk_partition_device_ids = []
        for obj_item in col_items:
            for disk_drive_device_id in disk_drive_device_ids:
                if disk_drive_device_id in str(obj_item.Antecedent):
                    disk_partition_device_ids.append(obj_item.Dependent.split('=')[1].replace('"', ''))
                    break
    
        # 3. Win32_LogicalDiskToPartition
        col_items = obj_swbem_services.ExecQuery("SELECT * from Win32_LogicalDiskToPartition")
        for objItem in col_items:
            for disk_partition_device_id in disk_partition_device_ids:
    
                if disk_partition_device_id in str(objItem.Antecedent):
                    logical_disk_device_ids.append(objItem.Dependent.split('=')[1].replace('"', ''))
                    break
    
        # 4. Win32_LogicalDisk
        col_items = []
        for logical_disk_device_id in logical_disk_device_ids:
            col_items.append(obj_swbem_services.ExecQuery("SELECT * from Win32_LogicalDisk WHERE DeviceID=\"" +
                                                          logical_disk_device_id + "\""))
    
        for col_item in col_items:
            volumes.append(col_item[0].VolumeName)
    except IndexError:
        pass
    volumes_result = []
    logical_disk_device_ids_result = []
    for i in range(len(volumes)):
        if volumes[i] != "":
            volumes_result.append(volumes[i])
            logical_disk_device_ids_result.append(logical_disk_device_ids[i])
    
    return logical_disk_device_ids_result, volumes_result
    
    0 讨论(0)
提交回复
热议问题