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

如何使用PowerShell查找正在读写指定文件的所有进程?

如何用PowerShell查找读写特定文件的进程

别担心,我明白你想用PowerShell找出正在读写某个特定文件的进程,但之前用Get-ProcessWhere-Object没成功——这很正常,因为Get-Process本身并不跟踪进程打开的文件句柄信息。下面给你两种靠谱的方法,一步步来:

方法1:使用Sysinternals Handle工具(最推荐)

微软的Sysinternals工具集里的handle.exe是专门用来查看系统中进程打开的句柄(包括文件)的工具,非常好用,而且完全免费。

步骤:

  1. 从微软官网下载Handle工具(不用安装,解压就能用),把handle.exe放到你方便的路径,比如C:\Tools,或者把它所在路径加入系统环境变量。
  2. 打开PowerShell,切换到handle.exe所在路径,或者直接输入完整路径调用。
  3. 运行以下命令(替换成你的目标文件路径):
# 自动接受许可协议(第一次运行需要)
.\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

火山引擎 最新活动