Как найти неназначенную букву диска в Windows с Python - PullRequest
0 голосов
/ 04 декабря 2018

Мне нужно было найти букву свободного диска на Windows из скрипта Python.Свободные означают не назначенные физическим или удаленным устройствам.

Я провел некоторое исследование и нашел здесь решение для stackoverflow (не могу вспомнить точную ссылку):

# for python 2.7
import string
import win32api

def getfreedriveletter():
    """ Find first free drive letter """
    assigneddrives = win32api.GetLogicalDriveStrings().split('\000')[:-1]
    assigneddrives = [item.rstrip(':\\').lower() for item in assigneddrives]
    for driveletter in list(string.ascii_lowercase[2:]):
        if not driveletter in assigneddrives:
            return driveletter.upper() + ':'

Это прекрасно работает длявсе физически диски и подключенные сетевые диски.Но не для отключенных в данный момент дисков.Как я могу получить все использованные буквы дисков, а также временные неиспользованные?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Создание дочернего процесса является относительно дорогим, и синтаксический анализ вывода текста в свободной форме - не самый надежный метод.Вместо этого вы можете использовать PyWin32 для вызова тех же функций API, которые вызывает net use.

import string
import win32api
import win32wnet
import win32netcon

def get_free_drive():
    drives = set(string.ascii_uppercase[2:])
    for d in win32api.GetLogicalDriveStrings().split(':\\\x00'):
        drives.discard(d)
    # Discard persistent network drives, even if not connected.
    henum = win32wnet.WNetOpenEnum(win32netcon.RESOURCE_REMEMBERED, 
        win32netcon.RESOURCETYPE_DISK, 0, None)
    while True:
        result = win32wnet.WNetEnumResource(henum)
        if not result:
            break
        for r in result:
            if len(r.lpLocalName) == 2 and r.lpLocalName[1] == ':':
                drives.discard(r.lpLocalName[0])
    if drives:
        return sorted(drives)[-1] + ':'

Обратите внимание, что эта функция возвращает последнюю доступную букву диска.Обычной практикой является назначение подключенных и замененных дисков (например, из net.exe и subst.exe) из конца списка и локальных системных дисков с самого начала.

0 голосов
/ 04 декабря 2018

Поскольку я передам найденное письмо внешнему сценарию, который запустит команду Winshell cmd 'subst / d letter '.Я не должен пропускать не подключенный в данный момент диск, так как он удалит сопоставление сетевого диска.

Единственный способ, который я обнаружил, был результатом 'net use' winshellcmd для поиска недоступных дисков.

Вот мое решение, если у вас есть лучший способ, пожалуйста, поделитесь им со мной:

# for python 2.7
import string
import win32api
from subprocess import Popen, PIPE

def _getnetdrives():
""" As _getfreedriveletter can not find unconnected network drives
    get these drives with shell cmd 'net use' """
    callstr = 'net use'
    phandle = Popen(callstr, stdout=PIPE)
    presult = phandle.communicate()
    stdout = presult[0]
    # _stderr = presult[1]
    networkdriveletters = []
    for line in stdout.split('\n'):
        if ':        ' in line:
             networkdriveletters.append(line.split()[1] + '\\')
    return networkdriveletters

def getfreedriveletter():
    """ Find first free drive letter """
    assigneddrives = win32api.GetLogicalDriveStrings().split('\000')[:-1]
    assigneddrives = assigneddrives + _getnetdrives()
    assigneddrives = [item.rstrip(':\\').lower() for item in assigneddrives]
    for driveletter in list(string.ascii_lowercase[2:]): #array starts from 'c' as i dont want a and b drive
        if not driveletter in assigneddrives:
        return driveletter.upper() + ':'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...