如何修改代码以获取所有用户配置文件中所有快捷方式的目标路径?
搞定VBScript遍历所有用户开始菜单快捷方式的问题
嘿,我明白你的困扰——当前代码只盯着Public的公共开始菜单,却漏掉了C:\Users下每个用户的个人快捷方式。别担心,咱们来修改代码,让它覆盖所有用户目录。
问题根源
你原来指定的C:\ProgramData\Microsoft\Windows\Start Menu\Programs是公共开始菜单,而每个用户的个人快捷方式都存在C:\Users\[用户名]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs这个路径里。要覆盖所有用户,得先枚举C:\Users下的所有用户文件夹,再逐个处理对应的个人开始菜单,加上公共路径一起扫。
修改后的完整代码
下面是调整好的代码,我加了详细注释,方便你理解:
Option Explicit Set oFSO = CreateObject("Scripting.FileSystemObject") Set oShell = CreateObject("WScript.Shell") ' 定义公共开始菜单和用户目录根路径 Dim sPublicStartMenu, sUsersRoot sPublicStartMenu = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs" sUsersRoot = "C:\Users\" ' 先处理公共开始菜单 ProcessStartMenu sPublicStartMenu ' 遍历C:\Users下的所有用户文件夹 Set oUsersFolder = oFSO.GetFolder(sUsersRoot) For Each oUserFolder In oUsersFolder.SubFolders ' 拼接当前用户的个人开始菜单路径 Dim sUserStartMenu sUserStartMenu = oUserFolder.Path & "\AppData\Roaming\Microsoft\Windows\Start Menu\Programs" ' 先检查路径是否存在(避免系统账户或空目录报错) If oFSO.FolderExists(sUserStartMenu) Then ProcessStartMenu sUserStartMenu End If Next ' 封装处理单个开始菜单文件夹的子过程,复用逻辑 Sub ProcessStartMenu(sFolderPath) WScript.Echo "正在扫描: " & sFolderPath ' 获取当前文件夹对象 Set oFolder = oFSO.GetFolder(sFolderPath) ' 遍历文件夹内的.lnk快捷方式文件 For Each oFile In oFolder.Files If LCase(oFSO.GetExtensionName(oFile.Name)) = "lnk" Then ' 读取快捷方式的目标路径(你可以替换成自己的处理逻辑) Set oShortcut = oShell.CreateShortcut(oFile.Path) WScript.Echo "找到快捷方式: " & oFile.Name & " -> " & oShortcut.TargetPath Set oShortcut = Nothing End If Next ' 递归处理子文件夹(确保深层目录的快捷方式也被扫描) For Each oSubFolder In oFolder.SubFolders ProcessStartMenu oSubFolder.Path Next End Sub ' 释放对象 Set oFSO = Nothing Set oShell = Nothing
关键调整点
- 枚举用户目录:通过
oFSO.GetFolder(sUsersRoot)获取所有用户子文件夹,逐个遍历处理。 - 路径检查:拼接用户个人开始菜单路径后,先判断路径是否存在,避免因系统账户(比如Default)或缺失目录导致报错。
- 逻辑复用:把扫描文件夹的代码封装成
ProcessStartMenu子过程,公共路径和用户路径都用同一套逻辑,代码更整洁。 - 递归扫描:处理子文件夹,确保开始菜单里嵌套的快捷方式也不会被漏掉。
小提示
- 运行这个脚本需要管理员权限,否则可能无法访问其他用户的
AppData目录(毕竟涉及隐私嘛)。 - 如果想跳过系统默认账户(比如Default、Public),可以在遍历用户文件夹时加个判断:
' 跳过指定系统账户 If oUserFolder.Name = "Default" Or oUserFolder.Name = "Public" Then Continue For End If
内容的提问来源于stack exchange,提问作者RadFox
相关产品推荐
相关产品推荐

