2016-08-28 10 views
2

私はPowerShellスクリプトを書こうとしていますが、特定のフォルダ内のどのファイルもプロセスによってロックされていないかどうかをチェックします。 trueの場合は、そのフォルダのみを削除します。どのプロセスでもフォルダにファイルがロックされていないかどうかを確認する方法は?

1つの方法は、RWモードで繰り返し開くことによって各ファイルのロックをチェックすることです。例外が発生するかどうかを確認してください。しかし、それはあまりにも面倒です。

フォルダに同じことを確認する方法はありますか?私はRemove-Item-WhatIfフラグを使用しようとしましたが、コマンドは値を返さず、ロックされたファイルを検出しなかったので使用しません。例外を探すためのフラグを付けずにRemove-Itemを実行しようとすると、空きファイルのみが削除されますが、すべてまたはすべての条件は削除されます。

+0

いつでもRestart Managerを入手してロックを確認することはできますが、やはりやや面倒です。 – Neil

答えて

2

解決策を配布しない限り、handle.exeを使用できます。それは使用中のすべてのファイル/フォルダを表示し、誰がそれを使用しているかを示します。

$path = "C:\Users\frode\Desktop\Test folder" 

(.\handle64.exe /accepteula $path /nobanner) -match 'File' 
explorer.exe  pid: 1888 type: File   F3C: C:\Users\frode\Desktop\Test folder 
explorer.exe  pid: 1888 type: File   2E54: C:\Users\frode\Desktop\Test folder 
notepad.exe  pid: 2788 type: File   38: C:\Users\frode\Desktop\Test folder 
WINWORD.EXE  pid: 2780 type: File   40: C:\Users\frode\Desktop\Test folder 
WINWORD.EXE  pid: 2780 type: File   6FC: C:\Users\frode\Desktop\Test folder\New Microsoft Word-dokument.docx 

あなただけが戻って任意の結果ならば、それを見ている場合、テストおよび-matchを使用することができますはい/いいえ答えが欲しいない場合。

if((.\handle64.exe /accepteula $path /nobanner) -match 'File') { "IN USE, ABORT MISSION!" } 

通常、あなたが通常の結果から、そのプロセスを除外することができるように、explorer.exeは、その中に閲覧されている場合でもフォルダを削除することができます:

if((.\handle64.exe /accepteula $path /nobanner) -match 'File' -notmatch 'explorer.exe') { "IN USE, ABORT MISSION!" } 
2

あなたがハンドルをインストールしたくない場合プロセスが指定されたディレクトリまたはサブディレクトリで実行されているのを見ることができます。

$lockedFolder="C:\Windows\System32" 
Get-Process | % { 
    $processVar = $_ 
    $_.Modules | %{ 
    if($_.FileName -like "$lockedFolder*"){ 
     $processVar.Name + " PID:" + $processVar.id + " FullName: " + $_.FileName 
    } 
    } 
} 
0

これは完全な解決策ではありませんが、あなたが構築できる出発点です。

"E:\ Work \ Powershell \ scripts \ demo"の下に "demo.txt"と呼ばれるtxtファイルがあります。私はNotepad.exeを使って開きます。この場合、メモ帳を閉じるまで、フォルダ「デモ」を削除することはできません。

"Win32_process"クラスを照会して、メモ帳がファイルを使用している場合は理解する必要があります。上記のコマンドレットの出力で

Get-WmiObject win32_process | where {$_.name -eq 'notepad.exe'} 

「のCommandLine」プロパティは、ファイルは現在そのプロセスで使用されているかを紹介します。

enter image description here

あなたの問題のための完全なソリューションを持っているために、このを反復する必要があります。

「chrome.exe」のような特定のプロセスは、「CommandLine」プロパティの下で膨大なリストになります。chromeまたはiExplorerはファイルを開いたときにフォルダを削除できないため、そのような種類のプロセスは無視できます。

注: "(Get-Process).Modules"の下の "FileName"は、 "notepad.exe"(E:\ Work \ Powershell \ scripts \ demo)を見つけるPATHのみを提供します

+0

このべきかなり多くの仕事: $場所= 'E:\作業\ PowerShellの\スクリプト\デモ' Win32_Processに-WmiObjectコマンドを取得|ここで、{$ _。コマンドラインのような "* $ location *"} |名前を選択 –

関連する問題