通过 Name/ID 在 Python 中获取存储驱动器的盘符
Get Drive-Letter of Storage Drive By Name/ID in Python
我正在尝试创建一些代码来检查驱动器是否已连接,如果已连接则编辑该驱动器上的文件。问题是与该驱动器相关联的字母并不总是相同的。有什么方法可以检查给定 'name' 的驱动器是否已连接,然后获取该驱动器的字母,类似于 this person 所要求的?就像如果我感兴趣的驱动器称为 Backup Drive
,那么我可以检查是否连接了这个名称的驱动器,如果是,则找到它分配的字母?或者是否有某种特定于该驱动器的硬件 ID 可以完成同样的事情?
最终,我还可以检查每个连接的驱动器,检查特定目录是否存在,以找到字母分配,但这是一个相当迟钝的解决方案,如果可以的话,我想避免它。
我也希望在 Python 中完成这项工作,因为我的其余代码都在其中,但如果 Powershell 或其他东西中存在解决方案,那么我会考虑将工作外包。我也很高兴有一个依赖于平台且仅适用于 Windows 的解决方案,因为这就是我正在使用的解决方案。
您尝试过使用 WMI 模块吗?
import wmi
DRIVE_TYPES = {
0 : "Unknown",
1 : "No Root Directory",
2 : "Removable Disk",
3 : "Local Disk",
4 : "Network Drive",
5 : "Compact Disc",
6 : "RAM Disk"
}
c = wmi.WMI ()
for drive in c.Win32_LogicalDisk ():
# prints all the drives details including name, type and size
print(drive)
print (drive.Caption, drive.VolumeName, DRIVE_TYPES[drive.DriveType])
对于将来可能会遇到此问题的任何人(以及我自己在这个问题上的未来参考),此答案将 Thaer A 在此线程和 Felix Heide here 的答案中的详细信息编译成更多根据卷名查找驱动器的综合方法。
因此,假设您有一个名称为 Backup Drive
的驱动器,您不知道其盘符,甚至不知道该驱动器是否已连接。您将执行以下操作:
首先,要检查驱动器是否已连接,我们将创建一个包含所有连接的驱动器名称的列表,以便稍后检查是否匹配 Backup Drive
以及所有驱动器号的列表以供稍后检查采用。还值得注意的是,在这个过程的大部分时间里使用 strip
和 lower
可能不是一个坏主意,但我不会在这里(至少现在)为此烦恼。所以我们得到:
looking_for = "Backup Drive"
drive_names = []
drive_letters = []
接下来,让我们为以后设置 WMI
对象:
import wmi
c = wmi.WMI()
现在我们遍历所有连接的驱动器并填写我们的两个列表:
for drive in c.Win32_LogicalDisk ():
drive_names.append(str(drive.VolumeName))
drive_letters.append(str(drive.Caption))
我们也可以通过检查 if
使用 win32api
模块向后验证
win32api.GetVolumeInformation(str(drive.Caption) + "\")[0]
等于drive.VolumeName
.
然后我们可以检查驱动器是否已连接并打印驱动器号:
if looking_for not in drive_names:
print("The drive is not connected currently.")
else:
print("The drive letter is " + str(drive_letters[drive_names.index(looking_for)]))
所以总的来说,还非常自由地添加 strip
和 lower
,我们得到:
import wmi
import win32api, pywintypes # optional
looking_for = "Backup Drive"
drive_names = []
drive_letters = []
c = wmi.WMI()
for drive in c.Win32_LogicalDisk ():
drive_names.append(str(drive.VolumeName).strip().lower())
drive_letters.append(str(drive.Caption).strip().lower())
# below is optional
# need a try catch because some drives might be empty but still show up (like D: drive with no disk inserted)
try:
if str(win32api.GetVolumeInformation(str(drive.Caption) + "\")[0]).strip().lower() != str(drive.VolumeName).strip().lower():
print("Something has gone horribly wrong...")
except pywintypes.error:
pass
if looking_for.strip().lower() not in drive_names:
print("The drive is not connected currently.")
else:
print("The drive letter is " + str(drive_letters[drive_names.index(looking_for.strip().lower())]).upper())
我正在尝试创建一些代码来检查驱动器是否已连接,如果已连接则编辑该驱动器上的文件。问题是与该驱动器相关联的字母并不总是相同的。有什么方法可以检查给定 'name' 的驱动器是否已连接,然后获取该驱动器的字母,类似于 this person 所要求的?就像如果我感兴趣的驱动器称为 Backup Drive
,那么我可以检查是否连接了这个名称的驱动器,如果是,则找到它分配的字母?或者是否有某种特定于该驱动器的硬件 ID 可以完成同样的事情?
最终,我还可以检查每个连接的驱动器,检查特定目录是否存在,以找到字母分配,但这是一个相当迟钝的解决方案,如果可以的话,我想避免它。
我也希望在 Python 中完成这项工作,因为我的其余代码都在其中,但如果 Powershell 或其他东西中存在解决方案,那么我会考虑将工作外包。我也很高兴有一个依赖于平台且仅适用于 Windows 的解决方案,因为这就是我正在使用的解决方案。
您尝试过使用 WMI 模块吗?
import wmi
DRIVE_TYPES = {
0 : "Unknown",
1 : "No Root Directory",
2 : "Removable Disk",
3 : "Local Disk",
4 : "Network Drive",
5 : "Compact Disc",
6 : "RAM Disk"
}
c = wmi.WMI ()
for drive in c.Win32_LogicalDisk ():
# prints all the drives details including name, type and size
print(drive)
print (drive.Caption, drive.VolumeName, DRIVE_TYPES[drive.DriveType])
对于将来可能会遇到此问题的任何人(以及我自己在这个问题上的未来参考),此答案将 Thaer A 在此线程和 Felix Heide here 的答案中的详细信息编译成更多根据卷名查找驱动器的综合方法。
因此,假设您有一个名称为 Backup Drive
的驱动器,您不知道其盘符,甚至不知道该驱动器是否已连接。您将执行以下操作:
首先,要检查驱动器是否已连接,我们将创建一个包含所有连接的驱动器名称的列表,以便稍后检查是否匹配 Backup Drive
以及所有驱动器号的列表以供稍后检查采用。还值得注意的是,在这个过程的大部分时间里使用 strip
和 lower
可能不是一个坏主意,但我不会在这里(至少现在)为此烦恼。所以我们得到:
looking_for = "Backup Drive"
drive_names = []
drive_letters = []
接下来,让我们为以后设置 WMI
对象:
import wmi
c = wmi.WMI()
现在我们遍历所有连接的驱动器并填写我们的两个列表:
for drive in c.Win32_LogicalDisk ():
drive_names.append(str(drive.VolumeName))
drive_letters.append(str(drive.Caption))
我们也可以通过检查 if
使用win32api
模块向后验证
win32api.GetVolumeInformation(str(drive.Caption) + "\")[0]
等于drive.VolumeName
.
然后我们可以检查驱动器是否已连接并打印驱动器号:
if looking_for not in drive_names:
print("The drive is not connected currently.")
else:
print("The drive letter is " + str(drive_letters[drive_names.index(looking_for)]))
所以总的来说,还非常自由地添加 strip
和 lower
,我们得到:
import wmi
import win32api, pywintypes # optional
looking_for = "Backup Drive"
drive_names = []
drive_letters = []
c = wmi.WMI()
for drive in c.Win32_LogicalDisk ():
drive_names.append(str(drive.VolumeName).strip().lower())
drive_letters.append(str(drive.Caption).strip().lower())
# below is optional
# need a try catch because some drives might be empty but still show up (like D: drive with no disk inserted)
try:
if str(win32api.GetVolumeInformation(str(drive.Caption) + "\")[0]).strip().lower() != str(drive.VolumeName).strip().lower():
print("Something has gone horribly wrong...")
except pywintypes.error:
pass
if looking_for.strip().lower() not in drive_names:
print("The drive is not connected currently.")
else:
print("The drive letter is " + str(drive_letters[drive_names.index(looking_for.strip().lower())]).upper())