我想知道是否有一个命令行工具允许我关闭在特定文件夹下打开的所有文件句柄。
我尝试过ProcessExplorer,Unlocker和类似工具,但它们提供了GUI界面,在编程环境中没用
Python,cmd或PowerShell的解决方案将是理想的选择。
我想知道是否有一个命令行工具允许我关闭在特定文件夹下打开的所有文件句柄。
我尝试过ProcessExplorer,Unlocker和类似工具,但它们提供了GUI界面,在编程环境中没用
Python,cmd或PowerShell的解决方案将是理想的选择。
Answers:
Unlocker声称它为您提供了这种能力:
只需右键单击文件夹或文件,然后选择Unlocker
如果文件夹或文件被锁定,则会出现储物柜的窗口列表
- 只需点击
Unlock All即可完成!
我不确定它是否支持命令行使用。
MalwareByte的FileAssassin执行类似的行动,不支持命令行用法,所以你应该能够脚本它很容易。

谢谢你。我们在打开文件句柄方面遇到了一些问题,导致git checkout在我们基于Windows的Jenkins作业中失败,这有助于轻松解决问题。我将抛弃该技术的基础知识:
在构建节点上安装Handle.exe。我从这里下载了它http://technet.microsoft.com/en-us/sysinternals/bb896655,解压缩并删除了C:\ Windows \ System32下的Handle.exe以确保它在默认的%PATH%上可用
安装Jenkins pre-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
您需要从Microsoft站点下载handle实用程序,并从GnuWin32下载grep实用程序
如果您不需要按文件类型筛选,则可以跳过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数据库,它确实让我们公司定期跪下(我昨天必须修复它三次)。
通常处理此问题的人休假几周,他的指示使用基于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无法删除的文件。