簡體   English   中英

如何使用python在Windows上查找未分配的驅動器號

[英]How to find a unassigned drive letter on windows with python

我需要從python腳本在Windows上找到一個免費的驅動器號。 Free Stand表示未分配給任何物理或遠程設備。

我做了一些研究,並在這里找到了一個關於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() + ':'

這適用於所有物理驅動器和連接的網絡驅動器。 但不適用於當前斷開連接的驅動器。 如何獲得所有用過的驅動器號以及臨時用過的驅動器號?

因為我會將找到的字母傳遞給將運行Winshell cmd'subst / d letter '的外部腳本。 我不能傳遞當前未安裝的驅動器,因為它將刪除網絡驅動器映射。

我發現的唯一方法是winshellcmd'net use'查找不可用驅動器的結果。

這是我的解決方案,如果您有更好的方法,請與我分享:

# 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() + ':'

創建子進程相對昂貴,並且解析自由格式的文本輸出並不是最可靠的技術。 您可以改為使用PyWin32來調用與net use調用相同的API函數。

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),並從頭開始分配本地系統驅動器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM