PowerShell本身不自动记录文件访问热点日志,需结合Handle.exe、性能计数器和Get-ChildItem等工具,按实时进程级、近期修改、目录级I/O三类场景主动采集分析。PowerShell 本身不记录“文件被谁、何时、高频访问”这类日志,所谓热点统计,是你根据实际问题主动定义指标,并用脚本组合系统能力去抓取、筛选、排序结果。没有一键全量报表,但每种常见场景都有对应解法。
明确你要找哪类热点
不同目的对应不同采集方式:
- 实时进程级热点:现在哪个程序正猛读写哪些文件?适合排查卡顿、杀毒扫描拖慢系统、OneDrive/Teams后台冲突。
- 近期修改热点:过去1小时/24小时内,哪些文件被反复保存或覆盖?适用于定位日志爆炸、临时文件堆积、自动备份频繁触发的目录。
- 目录级I/O热点:某个文件夹(如D:\Temp、%LOCALAPPDATA%\Packages)是否持续产生大量读写?可用性能计数器快速圈定范围。
用 Handle.exe 抓当前进程打开的文件
PowerShell 的 Get-Process 只能列出进程名,看不到它打开了什么文件。需搭配微软官方工具 Handle.exe(Sysinternals 套件,免安装):
- 下载 handle.exe 到本地(例如 C:\Tools\handle.exe)
- 以管理员身份运行 PowerShell,执行:
.\C:\Tools\handle.exe -u -p explorer.exe | Select-String "\.docx|\.xlsx|\.pdf"
→ 快速看到资源管理器当前打开了哪些文档。 - 查某路径被哪些进程占用:
.\C:\Tools\handle.exe "C:\MyData" | Where-Object { $_ -match "pid:" }
用性能计数器和 Get-ChildItem 找历史修改热点
Windows 不保存“文件打开次数”日志,但可借助最后修改时间(LastWriteTime)近似反映活跃度:
- 统计过去一小时内被修改最多的前3个日志子目录:
Get-ChildItem D:\Logs -File | Where-Object { $_.LastWriteTime -gt (Get-Date).AddHours(-1) } | Group-Object Directory | Sort-Object Count -Descending | Select-Object -First 3 - 若想看单个文件修改频次,可按文件名分组:
Get-ChildItem C:\App\Data\*.log | Group-Object Name | Sort-Object Count -Descending | Select-Object Name, Count
注意权限与限制
很多访问行为默认不可见:
- 系统进程(如 svchost.exe、csrss.exe)、受保护服务、驱动层操作,PowerShell 普通权限下无法读取其句柄。
- Handle.exe 需管理员权限才能捕获全部进程;非管理员下可能只返回部分结果或报错 Access is denied。
- 事件日志中 Security 日志若未开启对象访问审计,就无法回溯“谁在什么时候打开了哪个文件”。


















