问题:
如何在 Windows 10 下使用 Python 获取所有驱动器和网络位置的列表?该列表应包含“本地驱动器”、“网络驱动器”和“网络位置”。
例子
TYP HD HD NETWORK LOCATION
some_list = ["C:\\", "D:\\", "\\some.network.address\some_folder"]
我的解决方案:
有没有更好的方法来解决这个问题?我不认为我的快捷方式解析是一个“好的”解决方案...
import win32api
from os import getenv, listdir
from os.path import join
import win32com.client
NETWORK_SHORTCUTS_FOLDER_PATH = getenv('APPDATA') + \
"\\Microsoft\\Windows\\Network Shortcuts"
# Add Logical Drives
drives = win32api.GetLogicalDriveStrings()
drives = drives.split('\000')[:-1]
# Add Network Locations
network_shortcuts = [join(NETWORK_SHORTCUTS_FOLDER_PATH, f) +
"\\target.lnk" for f in listdir(NETWORK_SHORTCUTS_FOLDER_PATH)]
shell = win32com.client.Dispatch("WScript.Shell")
for network_shortcut in network_shortcuts:
shortcut = shell.CreateShortCut(network_shortcut)
drives.append(shortcut.Targetpath)
print(drives)
网络位置(不仅是网络驱动器!):
最佳答案
(第一部分是背景信息。滚动到下一条水平线以获得具体建议。)
您实际上在 Win10 中以与以前版本相同的方式映射网络驱动器:How to Map a Network Drive in Windows 10 .
您在屏幕截图上显示的不是映射驱动器,而是“网络快捷方式”。 XP 有一个类似的功能,叫做“网上邻居”,它收集了一个自动生成的上次访问的网络共享列表——与最近打开的文件的最近列表相同;该文件夹有一个 KNOWNFOLDERID
FOLDERID_NetHood
并在用户配置文件中使用了 NetHood
文件夹。 This feature was removed in Vista because it proved rather useless .这个相同的 KNOWNFOLDERID
现在用于基本相同的“网络位置”功能,但列表是手工和/或 by domain administrators via Group Policy 组成的,默认占用Network Shortcuts
文件夹。
请注意,映射的驱动器和网络位置都是针对每个用户的。
现在,为了使您的代码健壮,您所需要的只是不依赖于有关位置和格式的“内部知识”,而是尽可能使用提供的 API:
不要硬编码文件夹路径,而是使用
GetKnownFolderPath
获取它。自v223
起,pywin32
未公开此函数,但我们可以使用 older compatibleSHGetFolderPath
:from win32com.shell import shell,shellcon NETWORK_SHORTCUTS_FOLDER_PATH = shell.SHGetFolderPath(0,shellcon.CSIDL_NETHOOD,None,0)
阅读shortcuts and newfangled "Folder Shortcuts", collectively called "Shell Links" ,
shell32
提供官方接口(interface),但只有a COMIUnknown
-based one,IShellLink
( implemented byShellLink
COM class ), 因此 cannot be used bypywin32
.我还确认Wscript.Shell
只能使用常规快捷方式。所以,您的算法已经足够好了。
关于python - 在 python [Windows] 中列出驱动器和网络位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50528180/