PowerShell无内置文件访问热点统计功能,需结合Handle.exe抓取实时进程文件占用、性能计数器监测磁盘I/O、Get-ChildItem统计目录修改频次等方式主动识别不同场景下的热点。
powershell 本身不提供“文件访问热点”这类内置统计功能,windows 系统也未原生记录“哪些文件被最频繁打开”或“访问集中时段”的聚合日志。所谓“热点”,其实是需要你主动定义指标(比如:单位时间内某文件被读/写次数最多、最近被多个进程反复访问、在特定目录下触发高频 i/o),再通过 powershell 收集、筛选、排序数据来识别。
明确你要分析的“热点”类型
不同场景下的“热点”含义不同,直接影响采集方式:
- 实时进程级热点:当前哪些进程正在高频读写哪些文件?适合排查卡顿、杀毒扫描干扰、后台同步冲突。
- 历史访问痕迹热点:过去24小时/一周内,哪些文件被 Explorer、Word、Chrome 等反复打开?需依赖事件日志或第三方审计工具辅助。
- 目录级 I/O 热点:某个文件夹(如 D:\Projects 或 %TEMP%)是否持续产生大量读写?可用性能计数器快速定位。
用 Get-Process + 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:" }
用性能计数器发现目录级 I/O 热点
无需第三方工具,直接调用 Windows 内置性能数据:
- 查看物理磁盘整体读写压力:
Get-Counter '\PhysicalDisk(*)\Disk Reads/sec','\PhysicalDisk(*)\Disk Writes/sec' -SampleInterval 2 -MaxSamples 5 - 定位到具体目录较难,但可结合
Get-ChildItem+Get-ItemProperty统计近期修改频次:Get-ChildItem D:\Logs -File | Where-Object { $_.LastWriteTime -gt (Get-Date).AddHours(-1) } | Group-Object Directory | Sort-Object Count -Descending | Select-Object -First 3
这会列出过去一小时内被修改次数最多的前3个日志目录。
注意权限与实际限制
很多文件访问行为(尤其是系统进程、服务、受保护进程)PowerShell 默认无权读取句柄或详细 I/O 记录。即使使用管理员权限,也无法绕过内核保护机制。真正完整的访问审计需开启Windows 高级审核策略,并配置“对象访问”日志,之后再用 Get-WinEvent 解析安全日志——但这会产生大量日志,且默认关闭,不适合临时排查。

















