Для тех, кто может столкнуться с этой проблемой в будущем (и для моей собственной будущей ссылки на этот вопрос), этот ответ обобщает подробности из ответов Таера А в этой теме и Феликса Хайде здесь в более комплексный способ поиска диска по имени его тома.
Итак, давайте предположим, что у вас есть диск с именем 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())