【问题标题】:Python: get name of a USB flash drive device [windows]Python:获取 USB 闪存驱动器设备的名称 [windows]
【发布时间】:2015-11-18 15:51:32
【问题描述】:

我正在尝试编写能够读取有关 REMOVEABLE_DEVICE (USB) 的一些信息的小程序。我试过pyusb,但我无法提取我需要的数据。

我想从系统中读取 USB 设备的名称。

采用这种格式:

USB Flash Memory - this is the model information
Removable Disk (H:) - this is the name of device

Generic Flash Disk
USB DISK (F:)

Lexar USB Flash Drive
Lexar (I:)

我可以通过 win32com.client 库获取型号信息,灵感来自 here,但我无法获取 Windows 资源管理器中显示的设备名称。

也许我使用了错误的库?

这是我的代码:

import win32com.client
strComputer = "."
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")
colItems = objSWbemServices.ExecQuery("SELECT * FROM Win32_DiskDrive WHERE InterfaceType = \"USB\"")
for objItem in colItems:
    if objItem.Caption != None:
        print "Caption:" + ` objItem.Caption[:-11]`

这里是 Windows Win32_DiskDrive 类的链接:link

提前感谢您的帮助。

【问题讨论】:

    标签: python usb wmi


    【解决方案1】:

    免责声明:我对win32com.client 库没有任何经验。

    像你一样从Win32_DiskDrive开始,我遍历Win32_DiskDriveToDiskPartition和Win32_LogicalDiskToPartition,然后到Win32_LogicalDisk得到VolumeName,这似乎是你想要的。

    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 + ')'
    

    为我工作:

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

    这似乎提供了一种复杂但可行的方法,也许您可​​以进一步简化它。我唯一的简化是已经省略了Win32_DiskPartition,因为我们只需要连接。

    请注意:

    • 我不确定解压\\.\PHYSICALDRIVE1 之类的“干净”方法是什么,但应该可以摆脱.replace() 方法。
    • 我不确定是否可以将步骤 2 和 3 中的循环集成到查询中?这也将大大简化它(也许可以JOIN 他们像 SQL 一样?)。
    • (以上代码仅适用于单个 USB 驱动器。)

    【讨论】:

    • 非常感谢您的帖子。这正是我想要的!对您的步骤的精彩描述我非常感谢。
    • 我采用了您的代码以允许返回多个 USB 驱动器,如果它们的名称不为空。我相信我们的两件作品都可以做得更好,但它对我有用。也许其他人可以改进它。
    【解决方案2】:

    我看起来很奇怪,但它会起作用(获取所有可移动卷的列表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]+":)"
    

    输出

    MYPENDRIVE(D:)
    

    【讨论】:

    • 感谢您的提交。我更喜欢使用 Windows API 的解决方案。无论如何有趣的想法,如果我不会想出其他方式,我一定会使用你的解决方案。
    【解决方案3】:

    我使用了@adrianus 的方法并对其进行了一些改进以返回多个 USB 驱动器。对于它是如何工作的,请检查他的答案。对于希望对您有用的快速而肮脏的代码,请查看以下内容:)

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      相关资源
      最近更新 更多