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 locked a file?

于 2013-06-20T03:02:23.827 に答える
1

ファイルがロックされているかどうかのみを確認したい場合、またはこれを使用しない場合:

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

Sysinternals サードパーティ ツールの傾斜に追加するだけで、Sysinternals Process Explorer 内で検索機能を使用できます。

于 2016-10-13T09:09:33.920 に答える