Python: 获取U盘设备名称[windows]
Python: get name of a USB flash drive device [windows]
我正在尝试编写能够读取有关 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]`
这里是 link Windows Win32_DiskDrive Class: link
预先感谢您的帮助。
我会看起来很奇怪,但它会起作用(获取所有可移动卷的列表 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:)
免责声明:我对win32com.client
库没有任何经验。
像您一样从 Win32_DiskDrive
开始,我检查了 Win32_DiskDriveToDiskPartition
and Win32_LogicalDiskToPartition
, and then to 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
之类的东西的 "clean" 方法是什么,但应该可以摆脱 .replace()
方法。
- 我不确定是否可以将步骤 2 和 3 中的循环集成到查询中?这也会大大简化它(也许可以
JOIN
他们 SQL-like?)。
- (以上代码仅适用于单个 USB 驱动器。)
我使用了@adrianus 的方法并将其改进为 return 多个 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
我正在尝试编写能够读取有关 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]`
这里是 link Windows Win32_DiskDrive Class: link
预先感谢您的帮助。
我会看起来很奇怪,但它会起作用(获取所有可移动卷的列表 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:)
免责声明:我对win32com.client
库没有任何经验。
像您一样从 Win32_DiskDrive
开始,我检查了 Win32_DiskDriveToDiskPartition
and Win32_LogicalDiskToPartition
, and then to 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
之类的东西的 "clean" 方法是什么,但应该可以摆脱.replace()
方法。 - 我不确定是否可以将步骤 2 和 3 中的循环集成到查询中?这也会大大简化它(也许可以
JOIN
他们 SQL-like?)。 - (以上代码仅适用于单个 USB 驱动器。)
我使用了@adrianus 的方法并将其改进为 return 多个 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