[英]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.