特定のフォルダーの下で開いているすべてのファイルハンドルを閉じることができるコマンドラインツールがあるかどうか疑問に思っていました。
ProcessExplorer、Unlockerなどのツールを試しましたが、GUIインターフェースを提供し、プログラミング環境では役に立ちません
Python、cmd、またはPowerShellのソリューションが理想的です。
特定のフォルダーの下で開いているすべてのファイルハンドルを閉じることができるコマンドラインツールがあるかどうか疑問に思っていました。
ProcessExplorer、Unlockerなどのツールを試しましたが、GUIインターフェースを提供し、プログラミング環境では役に立ちません
Python、cmd、またはPowerShellのソリューションが理想的です。
回答:
Unlockerは、次の機能を提供すると主張しています。
フォルダーまたはファイルを右クリックし、ロック解除を選択するだけです
フォルダーまたはファイルがロックされている場合は、ロッカーのウィンドウリストが表示されます
- クリックするだけで
Unlock All
完了です!
コマンドラインの使用をサポートしているかどうかはわかりません。
MalwareByteのFileAssassinは、同様のアクションを実行し、ないスクリプトかなり簡単にできるはずですので、サポートのコマンドラインの使用方法を。
これをありがとう。WindowsベースのJenkinsジョブ内でgitチェックアウトが失敗する原因となる、開いているファイルハンドルにいくつかの問題があり、これは問題を簡単に修正するのに役立ちました。テクニックの基本を捨てます:
ビルドノードにHandle.exeをインストールします。http://technet.microsoft.com/en-us/sysinternals/bb896655からダウンロードして解凍し、C:\ Windows \ System32の下にHandle.exeをドロップして、デフォルトの%PATH%で使用できるようにしました。
:ジェンキンス前SCM-buildstepプラグインをインストールhttps://wiki.jenkins-ci.org/display/JENKINS/pre-scm-buildstepを。これにより、潜在的にロックされているファイルにgitプラグインが到達する前に操作を定義できます。
次のバッチコマンドを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、^ |)。
ありがとう!
次のスニペットを使用して、ユーザーからサーバーへのファイルハンドルを閉じます。使用するために変更できる場合があります。
rem close all network files that are locked
for /f "skip=4 tokens=1" %%a in ('net files') do net files %%a /close
私はこの小さなバッチファイルを作成して、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\
フォルダーパスに置き換えてください。
PSToolsを使用している場合、これにより、開いているすべてのファイルが再帰的に強制的に閉じられます。
psfile \\serverName c:\path\toDatabase\ -c
ローカルマシンではなくc:\path\toDatabase\
、C:ドライブであることに注意して\\serverName
ください。これは最初ははっきりしていなかったので、指摘したいと思いました。
これは、データを失うことがほぼ確実なブルートフォースアプローチであるため、注意して使用してください。
ひどく丸石のAccessデータベースがあり、文字通り会社をひざまずかせています(昨日は3回修正しなければなりませんでした)。
通常、これを処理する人は数週間休暇であり、彼の指示はUIベースのアプローチを使用します(スタート>コンピューター>管理>コンピューター管理(ローカル)>別のコンピューターに接続>システムツール>共有フォルダー>ファイルを開く>閉じるファイルを開く)。上記のコマンドを実行し、すべてのデータベースファイルから会社全体を追い出し、Compact&Repairプロセスを開始するだけで、クリック数が多すぎます(これもブルートフォーススクリプトによるアプローチに取り組んでいます)。
トリックは、データベースがダウンするとすぐにデータベースに再接続し始める人々よりも先を行くことです。彼らはこれに慣れているので、バグを報告することはありません。データベースに戻るまでハンマーで叩き続けます。圧縮して修復するまで、それらを起動し続けます。データベースを構成するファイル。
Windowsファイルサーバー(Server 2012以降)のSMB共有を介して開かれているファイルハンドルについて話している場合、PowerShellの答えは次のとおりです。
Get-SmbOpenFile | Where-Object { $_.Path -like "D:\Folder\*" } | Close-SmbOpenFile -Force
古いWindowsファイルサーバーでは、それはですopenfiles.exe /disconnect
。
ローカルシステムファイルハンドルの場合、Sysinternals handle.exeを使用するのが最良の方法です
http://lockhunter.comの方が好きです。GUIとコマンドラインインターフェイスの両方をサポートしており、多くの場合、Unlockerで削除できなかったファイルを削除できたからです。
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を参照してください。