如何在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)
答案 0 :(得分:1)
(第一部分是背景信息。滚动到下一个水平线以获取具体建议。)
您实际上在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
获取它。自pywin32
起v223
from win32com.shell import shell,shellcon
NETWORK_SHORTCUTS_FOLDER_PATH = shell.SHGetFolderPath(0,shellcon.CSIDL_NETHOOD,None,0)
不会公开此功能,但我们可以使用older compatible SHGetFolderPath
:
shell32
要阅读shortcuts and newfangled "Folder Shortcuts", collectively called "Shell Links",Wscript.Shell
提供官方界面,但仅提供a COM IUnknown
-based one, IShellLink
(implemented by ShellLink
COM class),因此cannot be used by pywin32
。我还确认 Var searchedProductsIds = SearchPanelDto.SelectedProductsList;
var userList = listOfUsers.Where(m =>
searchedProductsIds.Any(x=> m.IntrestetProducts.Select(t => t.ProductId).Any(z => x.Equals(z))));
只能使用常规快捷方式。所以,你的算法就足够了。