You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell遍历所有用户AppData查找json文件报错无输出如何解决

问题原因排查

你的脚本存在两类问题,分别对应两个异常现象:

1. 普通权限运行报访问拒绝错误

  • 系统默认NTFS权限规则限制,普通用户无权访问其他用户目录下的AppData\Roaming文件夹,只有对应用户、系统账户、管理员组有该目录的访问权限,普通权限下遍历必然触发权限拦截。
  • PowerShell 5.1是ISE默认搭载的版本,这个版本存在已知行为:Get-ChildItem附带的-ErrorAction SilentlyContinue参数无法完全抑制递归遍历子目录时产生的权限类非终止错误,因此控制台会直接抛出“Access is denied”提示。

2. 管理员身份运行无任何输出

核心问题出在输出语句和遍历逻辑上:

  • 输出语句存在语法问题:一是格式化字符串只写了{1}占位符对应路径,遗漏了文件名的{0}占位符;二是给格式化表达式套了一层多余的$()子表达式符号,在PowerShell 5.1的ISE环境下会导致运算结果无法正常传递给Write-Host,自然没有内容输出。
  • 遍历逻辑未跳过系统重解析点:C:\Users目录下存在Default User、All Users这类类似快捷方式的系统联接点(Junction),默认-Recurse参数会跟随联接点循环遍历,触发大量隐藏错误,所有错误被-ErrorAction SilentlyContinue吞掉后,遍历过程会异常终止,最终无结果返回。
  • 多余的.NET方法调用:你使用[System.IO.Path]::GetDirectoryName($_.FullName)获取目录路径属于冗余操作,PowerShell返回的文件对象本身就自带DirectoryName属性,直接调用即可,还能避免不同PowerShell版本下的兼容性问题。
修正后的可运行脚本
# 全局设置错误静默,解决PowerShell 5.1下递归错误无法被参数抑制的问题
$ErrorActionPreference = 'SilentlyContinue'

# 遍历所有用户的Roaming目录,跳过重解析点避免循环遍历
Get-ChildItem -Path "C:\Users\*\AppData\Roaming" -Filter "*.json" -File -Recurse -Force -Attributes !ReparsePoint |
ForEach-Object {
    # 修正格式化字符串,直接使用对象自带属性获取目录名
    Write-Host ("{0} found in {1}" -f $_.Name, $_.DirectoryName)
}
运行注意事项
  • 必须以管理员身份启动64位版本的PowerShell ISE,不要启动32位版本,避免触发系统文件系统重定向导致遍历结果不全。
  • 遍历时长取决于磁盘上的文件总量,文件较多时需要等待一定时间,不要刚启动就终止脚本误以为无结果。
  • 如果不需要遍历Default、Public这类系统默认生成的用户目录,可以自行添加过滤条件排除对应路径,能大幅提升遍历速度。

内容的提问来源于stack exchange,提问作者Matt Coombs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 13:27:19