You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过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

三、关键优化点(解决你之前的问题)

  1. 直接读取Shell命名空间:不再依赖系统Recent文件夹,完全和资源管理器快速访问的内容对齐,避免了系统生成的无效快捷方式。
  2. 准确识别固定项:通过System.IsPinnedToNameSpaceTree属性判断是否为用户手动固定的项目,和资源管理器的图钉标记完全一致。
  3. 精准标记云端文件:通过路径匹配OneDrive/SharePoint/Teams的特征,同时支持文件和文件夹的云端识别。
  4. 保留项目类型区分:明确标记是文件还是文件夹,更符合实际使用需求。

四、导出结果到CSV(可选)

如果需要把结果保存到CSV文件,只需把脚本中的Format-Table替换为变量赋值,再添加导出命令即可,比如:

# 先将结果存入变量
$allQuickAccessItems = $quickAccess.Items() | ForEach-Object {
    # 此处省略前面的对象生成代码,和上面一致
}

# 导出到用户文档目录下的CSV文件
$allQuickAccessItems | Export-Csv -Path "$env:USERPROFILE\Documents\快速访问内容.csv" -Encoding UTF8 -NoTypeInformation

如果还有其他需求,比如按时间筛选、按文件类型过滤,随时告诉我,我再给你调整脚本~

火山引擎 最新活动