特定のフォルダーの下にあるすべてのファイルハンドルをプログラムで閉じる方法は?


18

特定のフォルダーの下で開いているすべてのファイルハンドルを閉じることができるコマンドラインツールがあるかどうか疑問に思っていました。

ProcessExplorerUnlockerなどのツールを試しましたが、GUIインターフェースを提供し、プログラミング環境では役に立ちません

Python、cmd、またはPowerShellのソリューションが理想的です。


ファイルハンドルを強制的に閉じると、そのハンドルを使用するプログラムがクラッシュする可能性があることに注意してください。
ハリージョンストン

1
@HarryJohnstonさらに悪いことに、あなたは長いプログラムが開いている限りのため、ファイルの破損のすべての種類を引き起こしてしまう可能性があり:technet.microsoft.com/en-us/magazine/...
ボブ・

回答:


7

Unlockerは、次の機能を提供すると主張しています。

  1. フォルダーまたはファイルを右クリックし、ロック解除を選択するだけです

    ステップ1

  2. フォルダーまたはファイルがロックされている場合は、ロッカーのウィンドウリストが表示されます

    ステップ2

  3. クリックするだけでUnlock All完了です!

コマンドラインの使用をサポートしているかどうかはわかりません。

MalwareByteのFileAssassinは、同様のアクションを実行し、ないスクリプトかなり簡単にできるはずですので、サポートのコマンドラインの使用方法を。

FileAssassinのスイッチ


techie007に感謝、私はそれを見逃したと思います。Unlockerがファイルを時々見逃すことに気付きました(ProcessExplorerは見逃しません)。2番目の問題は、プログラムでファイルをロック解除または解放したい場合です(たとえば、この方向にコマンドラインツールが役立ちます)。
アメリオバスケスレイナ

@intrpcよし、別の(コマンドラインフレンドリーな)提案を追加しました。:)
Ƭᴇcʜιᴇ007

1
最近、Unlockerにはマルウェアがバンドルされています。
ジョシュアハンリー

10

これをありがとう。WindowsベースのJenkinsジョブ内でgitチェックアウトが失敗する原因となる、開いているファイルハンドルにいくつかの問題があり、これは問題を簡単に修正するのに役立ちました。テクニックの基本を捨てます:

  1. ビルドノードにHandle.exeをインストールします。http://technet.microsoft.com/en-us/sysinternals/bb896655からダウンロードして解凍し、C:\ Windows \ System32の下にHandle.exeをドロップして、デフォルトの%PATH%で使用できるようにしました。

  2. :ジェンキンス前SCM-buildstepプラグインをインストールhttps://wiki.jenkins-ci.org/display/JENKINS/pre-scm-buildstepを。これにより、潜在的にロックされているファイルにgitプラグインが到達する前に操作を定義できます。

  3. 次のバッチコマンドをpre-scmビルドステップとして実装しました。

    @echo off
    echo Cleaning up open file handles from %NODE_NAME%:%WORKSPACE%...
    for /f "tokens=3,6,8 delims=: " %%i in ('Handle /accepteula %WORKSPACE% ^| grep workspace') do echo Releasing file lock on E:%%k & handle -c %%j -y -p %%i
    

それはうまく機能しているように見え、偽の障害を確実に削減します。また、私が取り組んだいくつかの落とし穴にも注意してください。

  • Handler.exeにはEULAがあり、最初に実行するときに受け入れる必要があります。ローカルシステムコンテキストでJenkinsエージェントをサービスとして実行している場合、そのユーザーとしてログインして手動で受け入れることはできないため、これは問題です。Jenkinsのジョブから実行しようとすると、プロセスはユーザーの入力を待ってハングし、その理由を理解するのに数分かかりました。/ accepteulaフラグを使用してJenkinsジョブから実行することでこれを解決しましたが、自動化されたプロセスとしてこれを実装する人は誰でも同じことをお勧めします。これはたまたまHKEY_CURRENT_USER \ Software \ Sysinternals \ Handleの下のレジストリ設定であり、特定のユーザー用に操作する必要がある場合はregedit.exeを使用して設定および設定解除することもできますが、コマンドラインオプションが最も簡単に見えました。

  • Jenkins Batchステッププラグインは、コマンドラインディレクティブとしてではなく、スクリプト内にあるかのようにバッチコードを実行します。エスケープに注意してください(例:%% i、^ |)。

ありがとう!


この構文の取得に苦労していますが、誰かが%% i、jなどの詳細を提供できますか?
c4sh

これは、バッチコマンドの構文を理解するのに役立つ場合があります。robvanderwoude.com
c4sh

管理者ではないJenkinsユーザーから実行する場合、handle.exeを管理者として実行する必要があるという事実をどのように解決しましたか?
c4sh

8

次のスニペットを使用して、ユーザーからサーバーへのファイルハンドルを閉じます。使用するために変更できる場合があります。

rem close all network files that are locked
for /f "skip=4 tokens=1" %%a in ('net files') do net files %%a /close

ありがとう、ブレンダン。あなたのコードは適切にフォーマットされていないと思います。答えはおもしろそうなので、編集を気にしない場合は、コードの行を選択してから、2つの中括弧のボタンをクリックすることをお勧めします。これにより、スニペットが読み取り可能なコードに変わります。
アメリオバスケスレイナ

5

私はこの小さなバッチファイルを作成して、Eclipseによってすべてのロックをxmlファイルに自動的に解放します

@echo off
for /f "tokens=3,6,8 delims=: " %%i in ('handle -p eclipse e:\git\ ^| grep .xml') do echo Releasing %%k & handle -c %%j -y -p %%i

あなたはダウンロードする必要がハンドルからユーティリティをマイクロソフトサイトはgrepユーティリティからGnuWin32

ファイルの種類によるフィルターが不要な場合は、次のようにgrepの部分をスキップできます。

@echo off
for /f "tokens=3,6,8 delims=: " %%i in ('handle -p eclipse e:\git\') do echo Releasing %%k & handle -c %%j -y -p %%i

または、特定のプログラムでロックをフィルタリングする必要がない場合は、Eclipseプロセスフィルターを削除するだけです。

@echo off
for /f "tokens=3,6,8 delims=: " %%i in ('handle e:\git\') do echo Releasing %%k & handle -c %%j -y -p %%i

必ずe:\git\フォルダーパスに置き換えてください。


4

PSToolsを使用している場合、これにより、開いているすべてのファイルが再帰的に強制的に閉じられます。

psfile \\serverName c:\path\toDatabase\ -c

ローカルマシンではなくc:\path\toDatabase\、C:ドライブであることに注意して\\serverNameください。これは最初ははっきりしていなかったので、指摘したいと思いました。

これは、データを失うことがほぼ確実なブルートフォースアプローチであるため、注意して使用してください。

ひどく丸石のAccessデータベースがあり、文字通り会社をひざまずかせています(昨日は3回修正しなければなりませんでした)。

通常、これを処理する人は数週間休暇であり、彼の指示はUIベースのアプローチを使用します(スタート>コンピューター>管理>コンピューター管理(ローカル)>別のコンピューターに接続>システムツール>共有フォルダー>ファイルを開く>閉じるファイルを開く)。上記のコマンドを実行し、すべてのデータベースファイルから会社全体を追い出し、Compact&Repairプロセスを開始するだけで、クリック数が多すぎます(これもブルートフォーススクリプトによるアプローチに取り組んでいます)。

トリックは、データベースがダウンするとすぐにデータベースに再接続し始める人々よりも先を行くことです。彼らはこれに慣れているので、バグを報告することはありません。データベースに戻るまでハンマーで叩き続けます。圧縮して修復するまで、それらを起動し続けます。データベースを構成するファイル。


4

Windowsファイルサーバー(Server 2012以降)のSMB共有を介して開かれているファイルハンドルについて話している場合、PowerShellの答えは次のとおりです。

Get-SmbOpenFile | Where-Object { $_.Path -like "D:\Folder\*" } | Close-SmbOpenFile -Force

古いWindowsファイルサーバーでは、それはですopenfiles.exe /disconnect

ローカルシステムファイルハンドルの場合、Sysinternals handle.exeを使用するのが最良の方法です



2

Unlockerはサイレントモードでも実行できます。

たとえば、Jenkinsワークスペース内のすべてのファイルのロックを解除するには:

"C:\Program Files\Unlocker\unlocker.exe" "%WORKSPACE%" /S

その後、ワークスペースファイルを安全に削除できます。

del "%WORKSPACE%\*.*" /s /q

0

Powershellを使用してこのようなことを行うことができます。

function KillProcessesWithHandles
{
    param([string]$path)

    $allProcesses = Get-Process

    # Start by closing all notepad processes. Someone may have left a logor config file open
    $allProcesses | Where-Object {$_.Name -eq "notepad"} | Stop-Process -Force -ErrorAction SilentlyContinue

    # Then close all processes running inside the folder we are trying to delete
    $allProcesses | Where-Object {$_.Path -like ($path + "*")} | Stop-Process -Force -ErrorAction SilentlyContinue

    # Finally close all processes with modules loaded from folder we are trying to delete
    foreach($lockedFile in Get-ChildItem -Path $path -Include * -Recurse) {
        foreach ($process in $allProcesses) {
            $process.Modules | Where-Object {$_.FileName -eq $lockedFile} | Stop-Process -Force -ErrorAction SilentlyContinue
        }
    }
}

詳細については、こちらのThomas Ardalを参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.