Получить диск-букву диска по имени / идентификатору в Python - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь создать некоторый код, который проверяет, подключен ли диск, а затем редактирует файлы на этом диске, если он есть. Проблема в том, что буква, связанная с этим диском, не всегда будет одинаковой. Можно ли каким-то образом проверить, подключен ли диск с данным «именем» или нет, а затем получить букву для этого диска, аналогичную тому, что этот человек запрашивает? Например, если интересующий меня диск называется Backup Drive, могу ли я проверить, подключен ли диск с таким именем или нет, и найти назначенную ему букву, если она есть? Или есть какой-то аппаратный идентификатор, указывающий c для этого диска, который может выполнить sh то же самое?

В конечном счете, я мог бы просто go через каждый подключенный диск проверить, если указан c каталог существует или нет, чтобы найти буквенное назначение, но это довольно тупое решение, и я бы хотел его избежать, если смогу.

Я бы также предпочел, чтобы это было сделано в Python так как это то, в чем заключается остальная часть моего кода, но если решение существует в Powershell или что-то еще, я бы рассмотрел работу на стороне. Я также рад, что у меня есть решение, которое зависит от платформы и работает только на Windows, потому что это то, над чем я работаю.

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Для тех, кто может столкнуться с этой проблемой в будущем (и для моей собственной будущей ссылки на этот вопрос), этот ответ обобщает подробности из ответов Таера А в этой теме и Феликса Хайде здесь в более комплексный способ поиска диска по имени его тома.

Итак, давайте предположим, что у вас есть диск с именем Backup Drive, букве которого вы не знаете, или же диск подключен. Вы должны сделать следующее:

Сначала, чтобы проверить, подключен ли диск, мы создадим список всех имен подключенных дисков, чтобы проверить, совпадает ли позднее Backup Drive, и список всех буквы диска для последующего использования. Стоит также отметить, что, вероятно, неплохая идея использовать strip и lower для большей части этого процесса, но я не буду беспокоиться об этом здесь (по крайней мере, сейчас). Итак, мы получаем:

looking_for = "Backup Drive"
drive_names = []
drive_letters = []

Далее, давайте настроим наш объект WMI на потом:

import wmi
c = wmi.WMI()

Теперь мы пропустим oop через все подключенные диски и заполните наши два списка:

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

Таким образом, в сумме, очень просто добавив 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())
1 голос
/ 12 апреля 2020

Вы пытались использовать модуль 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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...