【问题标题】:Get Drive-Letter of Storage Drive By Name/ID in Python在 Python 中按名称/ID 获取存储驱动器的驱动器号
【发布时间】:2020-04-12 07:30:38
【问题描述】:

我正在尝试创建一些代码来检查驱动器是否已连接,如果已连接,则编辑该驱动器上的文件。问题是与该驱动器关联的字母并不总是相同的。有什么方法可以检查是否连接了具有给定“名称”的驱动器,然后获取该驱动器的字母,类似于this person 的要求?就像我感兴趣的驱动器被称为Backup Drive,那么我可以检查是否连接了这个名称的驱动器并找到它分配的字母是否是?或者是否有某种特定于该驱动器的硬件 ID 可以完成同样的事情?

最终,我也可以只检查每个连接的驱动器,检查是否存在特定目录以找到字母分配,但这是一个相当迟钝的解决方案,如果可以的话,我想避免它。

我也希望这在 Python 中完成,因为这是我的其余代码所在,但如果 Powershell 或其他东西中存在解决方案,那么我会考虑将工作外包。我也很高兴有一个依赖于平台且仅适用于 Windows 的解决方案,因为这正是我正在使用的。

【问题讨论】:

  • @barny 谢谢。当我在寻找这个问题的答案时,我没有找到这个问题。尤其是 Felix Heide 的回答似乎非常适合这个问题。

标签: python windows drive-letter


【解决方案1】:

您是否尝试过使用 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])

【讨论】:

  • 谢谢,这正是我要找的!
  • 我希望您不介意我借用了您的一些代码以获得更全面的答案。再次感谢!
  • @BobSmith 一点也不。谢谢
【解决方案2】:

对于将来可能遇到此问题的任何人(以及我自己将来在此问题上的参考),此答案将 Thaer A 在此线程和 Felix Heide here 上的答案中的详细信息汇编成更全面的查找方式基于其卷名的驱动器。

因此,假设您有一个名称为 Backup Drive 的驱动器,您不知道它的字母,或者该驱动器是否已连接。您将执行以下操作:

首先,为了检查驱动器是否已连接,我们将创建一个所有已连接驱动器名称的列表,以便稍后检查是否有任何匹配 Backup Drive 以及所有驱动器号的列表以供以后使用。还值得注意的是,在这个过程的大部分时间里使用striplower 可能不是一个坏主意,但我不会在这里打扰(至少现在是这样)。所以我们得到:

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

我们也可以在这里使用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)]))

所以总的来说,还非常随意地添加了striplower,我们得到:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 2011-11-05
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多