5

我想创建一个 PowerShell 脚本,它将查找在提供的目录中锁定的任何文件并返回已锁定文件的应用程序/进程。

我找到了一个脚本,它通过一个目录,当它发现一个锁定的文件时会停止并报告文件被锁定。

Function Test-Lock{
    param(
    [parameter(ValueFromPipeline=$true)]
    $Path
    )
    Process {
        if($Path.Attributes -ne 'Directory'){
            $oFile = New-Object System.IO.FileInfo $Path.FullName
            $locked=$false
            try{
                $oStream = $oFile.Open([System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None)
                $oStream.Close()
                }
            catch{
                write-host $Error[0]
                $locked=$true
                New-Object PSObject -Property @{'Path'=$Path.FullName;'Locked?'=$locked} | Select Path,Locked?
                } 

        }
    }
}
$lockedfiles=(gci C:\temp | Test-Lock)
$lockedfiles | Format-Table -auto

这将返回:

Path                  Locked?
----                  ------- 
C:\temp\ReportReq.doc    True

我不知道如何找到锁定此文件的应用程序或进程。

4

4 回答 4

5

好吧,您需要使用 sysinternals 中的 handle.exe 来实现这一点。PowerShell MVP Adam Driscoll 编写了 sysinternals handle.exe 的 PowerShell 版本。您可以在以下位置查看:https ://github.com/adamdriscoll/PoshInternals/blob/master/Handle.ps1

此外,Keith Hill 在这里回答了一个类似的问题:PowerShell script to check an application that's locking a file?

于 2013-06-20T03:02:23.827 回答
1

如果您只想检查文件是否被锁定,请使用:

try {
   [IO.File]::OpenWrite($file).close();
}catch {
   $locked = 1;
};
于 2014-10-08T08:30:22.350 回答
0

在 PsGallery 中发布了一个 PowerShell 模块,以发现和终止对文件或文件夹具有打开句柄的进程。它将函数暴露于:1) 找到锁定进程,以及 2) 终止锁定进程。该模块在首次使用时自动下载handle.exe。

Find-LockingProcess()
检索具有打开到指定路径的文件句柄的进程信息。
示例:Find-LockingProcess -Path $Env:LOCALAPPDATA
示例:Find-LockingProcess -Path $Env:LOCALAPPDATA | 获取进程

Stop-LockingProcess()
杀死所有打开指定路径的文件句柄的进程。
示例:Stop-LockingProcess -Path $Home\Documents

PsGallery 链接:https ://www.powershellgallery.com/packages/LockingProcessKiller 安装运行:
Install-Module -Name LockingProcessKiller

于 2021-08-26T03:59:38.037 回答
-1

只是为了添加到 Sysinternals 3rd Party Tools 倾斜,您可以使用 Sysinternals Process Explorer 中的 Find 功能。

于 2016-10-13T09:09:33.920 回答