当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 周五乐趣:使用 PowerShell 查找文件锁定进程

作者:精品下载站 日期:2024-12-14 07:41:49 浏览:14 分类:玩电脑

周五乐趣:使用 PowerShell 查找文件锁定进程


今天早上有人在 Twitter 上问我如何找出哪个进程锁定了给定文件。我不知道有任何 PowerShell cmdlet 可以做到这一点,但我认为必须有一种 .NET 方式,如果我能找到代码示例,我就可以在 PowerShell 中组合一些东西。经过一番研究后,我得出的结论是,程序化方法远远高于我的薪资等级,但我仍然想出了一个选择。

我坚信有适合这项工作的正确工具,并且仅仅因为您可以在 PowerShell 中执行某些操作,并不意味着您应该这样做。这项工作的最佳工具是 Sysinternals 套件中的 Handle.exe,您可以免费下载该工具。您可以指定文件名的一部分,它将显示拥有该文件句柄的进程。

[玩转系统] 周五乐趣:使用 PowerShell 查找文件锁定进程

但为什么不鱼与熊掌兼得呢?我可以获取此输出并将其转换为 PowerShell 对象。我最近发布了一个函数,使用正则表达式和命名捕获将命令行输出转换为对象。我所需要的只是一个正则表达式模式。

PS Scripts:\>[regex]$matchPattern = "(?<Name>\w+\.\w+)\s+pid:\s+(?<PID>\b(\d+)\b)\s+type:\s+(?<Type>\w+)\s+\w+:\s+(?<Path>.*)"
PS Scripts:\> g:\sysinternals\handle parent.lock | select -skip 5 | convertfrom-text $matchpattern

[玩转系统] 周五乐趣:使用 PowerShell 查找文件锁定进程

或者您可以创建特定于此任务的内容。

Function Get-LockingProcess {

[cmdletbinding()]
Param(
 [Parameter(Position=0,Mandatory=$True,
 HelpMessage="What is the path or filename? You can enter a partial name without wildcards")]
 [Alias("name")]
 [ValidateNotNullorEmpty()]
 [string]$Path
)

#define the path to Handle.exe
$Handle = "G:\Sysinternals\handle.exe"

[regex]$matchPattern = "(?<Name>\w+\.\w+)\s+pid:\s+(?<PID>\b(\d+)\b)\s+type:\s+(?<Type>\w+)\s+\w+:\s+(?<Path>.*)"

$data = &$handle $path 
$MyMatches = $matchPattern.Matches( $data )

if ($MyMatches.value) {
      $MyMatches | foreach {
     [pscustomobject]@{ 
      FullName = $_.groups["Name"].value
      Name = $_.groups["Name"].value.split(".")[0]
      ID = $_.groups["PID"].value
      Type = $_.groups["Type"].value
      Path = $_.groups["Path"].value
     } #hashtable
    } #foreach
  } #if data
else {
    Write-Warning "No matching handles found"
  }
} #end function

这需要 Handle.exe。我已经对您需要调整的路径进行了硬编码,或者确保该实用程序位于您的 PATH 中。但现在看看我能做什么!

[玩转系统] 周五乐趣:使用 PowerShell 查找文件锁定进程

我知道有些人对外部依赖感到困扰,但如果它完成了工作,我就看不到问题。尤其是当解决方案一开始是免费的时!

周末愉快。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯