2013-06-20 66 views
3

我想創建一個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。

回答

4

那麼,你需要使用sysinternals的handle.exe來實現這一點。 PowerShell MVP的Adam Driscoll編寫了sysinternals handle.exe的PowerShell版本。您可以檢查在:https://github.com/adamdriscoll/PoshInternals/blob/master/Handle.ps1

此外,也存在類似的問題,由基思·希爾在這裏找到答案:PowerShell script to check an application that's locking a file?

+0

,你必須使用第三方工具,只看到一個應用程序使用哪些文件有點令人沮喪,但我會嘗試使用它。已嘗試使用Get-Handle.ps1文件,使用類似的命令來描述PS版本的句柄中提供的命令,我無法讓它在沒有錯誤的情況下工作:Where-Object:無法綁定參數'FilterScript'。無法將類型「System.String」的「類型」值轉換爲鍵入「S ystem.Management.Automation.ScriptBlock」。 – Lima

+1

這裏的鏈接已經死了。 –

+1

是否有引用的腳本的副本仍然可用? – r4d1um

0

如果要檢查是否文件被鎖定或不使用這樣的:

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

只要添加到Sysinternals第三方工具斜面,您可以使用Sysinternals Process Explorer內部的查找功能。