如何使用PowerShell查找正在读写指定文件的所有进程?
如何用PowerShell查找读写特定文件的进程
别担心,我明白你想用PowerShell找出正在读写某个特定文件的进程,但之前用Get-Process加Where-Object没成功——这很正常,因为Get-Process本身并不跟踪进程打开的文件句柄信息。下面给你两种靠谱的方法,一步步来:
方法1:使用Sysinternals Handle工具(最推荐)
微软的Sysinternals工具集里的handle.exe是专门用来查看系统中进程打开的句柄(包括文件)的工具,非常好用,而且完全免费。
步骤:
- 从微软官网下载Handle工具(不用安装,解压就能用),把
handle.exe放到你方便的路径,比如C:\Tools,或者把它所在路径加入系统环境变量。 - 打开PowerShell,切换到
handle.exe所在路径,或者直接输入完整路径调用。 - 运行以下命令(替换成你的目标文件路径):
# 自动接受许可协议(第一次运行需要) .\handle.exe /accepteula # 查询特定文件的进程 .\handle.exe "C:\Example\YourTargetFile.txt"
解析输出:
输出结果里会显示进程名称、PID,以及打开的文件路径。如果想让结果更整洁,用PowerShell解析输出:
$targetFile = "C:\Example\YourTargetFile.txt" # 调用handle并跳过前5行版权信息 $handleResults = .\handle.exe /accepteula $targetFile | Select-Object -Skip 5 # 解析结果为结构化对象 $handleResults | ForEach-Object { if ($_ -match "^(?<Process>\w+)\s+(?<PID>\d+):\s+(?<Type>\w+)\s+(?<Handle>[0-9A-F]+)\s+(?<Path>.*)$") { [PSCustomObject]@{ ProcessName = $matches.Process PID = [int]$matches.PID HandleType = $matches.Type FilePath = $matches.Path } } }
方法2:用PowerShell原生命令(需管理员权限)
如果你不想额外下载工具,可以用PowerShell结合WMI/CIM来查询,但这个方法需要管理员权限,而且对某些进程可能因权限问题无法获取信息。
运行以下命令(替换目标文件路径):
# 必须以管理员身份运行PowerShell $targetFile = "C:\Example\YourTargetFile.txt" Get-CimInstance Win32_Process | ForEach-Object { try { # 获取进程关联的文件模块 $files = Get-CimAssociatedInstance -InputObject $_ -ResultClassName Win32_ProcessModule foreach ($file in $files) { if ($file.FileName -eq $targetFile) { $_ | Select-Object Name, ProcessId, ExecutablePath } } } catch { # 忽略无权限访问的进程 continue } }
为什么之前的方法不行?
Get-Process cmdlet主要返回进程的基本信息(比如名称、PID、内存占用),但不包含进程打开的文件句柄数据,所以单纯用Where-Object筛选是找不到关联文件的——必须借助专门的句柄查询工具或WMI关联查询。
内容的提问来源于stack exchange,提问作者Alex




