如何通过PowerShell准确获取Windows快速访问中显示的所有文件(含云端同步文件)
如何通过PowerShell准确获取Windows快速访问中显示的所有文件(含云端同步文件)
我明白你遇到的困扰了——之前的脚本抓取的内容和资源管理器里的快速访问完全对不上,甚至出现了一堆系统相关的快捷方式,完全不是你要的内容。这是因为快速访问的“最近使用文件”并不是直接对应系统Recent文件夹里的所有快捷方式,而是Shell命名空间里经过筛选的专属项。下面给你整理了精准的解决方案,能完整获取快速访问里的固定项目和最近文件,还能准确识别云端同步的内容:
一、核心原理说明
Windows快速访问的内容存储在Shell的特定命名空间中,分为**固定项目(用户手动固定的文件/文件夹)和最近使用项目(系统自动收录的最近打开文件/文件夹)**两部分。我们需要直接从这个Shell命名空间中读取,而不是依赖Recent文件夹,这样才能和资源管理器显示的内容完全一致。
二、完整PowerShell脚本实现
1. 获取快速访问中的所有项目(固定+最近)
这个脚本会一次性抓取快速访问里的所有内容,自动区分固定项和最近项,同时标记是否为云端同步路径:
# 初始化Shell对象 $shell = New-Object -ComObject Shell.Application # 快速访问的专属Shell命名空间路径 $quickAccess = $shell.Namespace('shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}') # 遍历快速访问的所有项目 $quickAccess.Items() | ForEach-Object { # 判断是否为用户手动固定的项目(对应资源管理器的图钉标记) $isPinned = $_.ExtendedProperty('System.IsPinnedToNameSpaceTree') -eq 1 # 判断是否为云端同步内容(匹配OneDrive/SharePoint/Teams路径特征) $isCloudItem = $_.Path -match 'OneDrive|SharePoint|Teams' # 输出结构化结果 [PSCustomObject]@{ 项目名称 = $_.Name 目标路径 = $_.Path 项目类型 = if ($_.IsFolder) { "文件夹" } else { "文件" } 是否固定 = $isPinned 是否云端同步 = $isCloudItem } } | Format-Table -AutoSize
2. 单独筛选最近使用的文件(排除固定项)
如果你只需要快速访问里的“最近使用文件”,可以用这个简化版,还会附带最近访问时间:
$shell = New-Object -ComObject Shell.Application $quickAccess = $shell.Namespace('shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}') $quickAccess.Items() | Where-Object { # 筛选条件:非文件夹 + 未被手动固定 !$_.IsFolder -and $_.ExtendedProperty('System.IsPinnedToNameSpaceTree') -ne 1 } | ForEach-Object { $isCloudItem = $_.Path -match 'OneDrive|SharePoint|Teams' [PSCustomObject]@{ 文件名 = $_.Name 文件路径 = $_.Path 是否云端同步 = $isCloudItem 最近访问时间 = $_.ExtendedProperty('System.DateAccessed') } } | Format-Table -AutoSize
3. 单独获取固定的项目(文件+文件夹)
如果你只需要用户手动固定到快速访问的内容:
$shell = New-Object -ComObject Shell.Application $quickAccess = $shell.Namespace('shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}') $quickAccess.Items() | Where-Object { # 仅保留手动固定的项目 $_.ExtendedProperty('System.IsPinnedToNameSpaceTree') -eq 1 } | ForEach-Object { $isCloudItem = $_.Path -match 'OneDrive|SharePoint|Teams' [PSCustomObject]@{ 项目名称 = $_.Name 项目路径 = $_.Path 项目类型 = if ($_.IsFolder) { "文件夹" } else { "文件" } 是否云端同步 = $isCloudItem } } | Format-Table -AutoSize
三、关键优化点(解决你之前的问题)
- 直接读取Shell命名空间:不再依赖系统
Recent文件夹,完全和资源管理器快速访问的内容对齐,避免了系统生成的无效快捷方式。 - 准确识别固定项:通过
System.IsPinnedToNameSpaceTree属性判断是否为用户手动固定的项目,和资源管理器的图钉标记完全一致。 - 精准标记云端文件:通过路径匹配OneDrive/SharePoint/Teams的特征,同时支持文件和文件夹的云端识别。
- 保留项目类型区分:明确标记是文件还是文件夹,更符合实际使用需求。
四、导出结果到CSV(可选)
如果需要把结果保存到CSV文件,只需把脚本中的Format-Table替换为变量赋值,再添加导出命令即可,比如:
# 先将结果存入变量 $allQuickAccessItems = $quickAccess.Items() | ForEach-Object { # 此处省略前面的对象生成代码,和上面一致 } # 导出到用户文档目录下的CSV文件 $allQuickAccessItems | Export-Csv -Path "$env:USERPROFILE\Documents\快速访问内容.csv" -Encoding UTF8 -NoTypeInformation
如果还有其他需求,比如按时间筛选、按文件类型过滤,随时告诉我,我再给你调整脚本~




