检查目录中的锁定文件并找到锁定应用程序

时间:2013-06-20 02:06:43

标签: powershell

我想创建一个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

我无法找到如何找到锁定此文件的应用程序或proecess。

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

如果想要检查文件是否已锁定,请不要使用此功能:

try {
   [IO.File]::OpenWrite($file).close();
}catch {
   $locked = 1;
};

答案 2 :(得分:0)

只需添加到Sysinternals第三方工具倾斜,您就可以使用Sysinternals Process Explorer中的Find功能。