Python:获取USB闪存驱动器设备的名称[windows]

问题描述 投票:2回答:3

我正在尝试编写一个小程序,它将能够读取有关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
3个回答
2
投票

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

通过像Win32_DiskDrive一样开始,我去了Win32_DiskDriveToDiskPartitionWin32_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驱动器。)

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:)

0
投票

我使用@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
© www.soinside.com 2019 - 2024. All rights reserved.