如何以编程方式关闭给定文件夹下的所有文件句柄?


17

我想知道是否有一个命令行工具允许我关闭在特定文件夹下打开的所有文件句柄。

我尝试过ProcessExplorerUnlocker和类似工具,但它们提供了GUI界面,在编程环境中没用

Python,cmd或PowerShell的解决方案将是理想的选择。


请记住,强制关闭文件句柄可能会导致使用该句柄的程序崩溃。
Harry Johnston

1
@HarryJohnston更糟糕的是,只要程序打开,你最终可能导致各种文件损坏:technet.microsoft.com/en-us/magazine / ...
Bob

Answers:


7

Unlocker声称它为您提供了这种能力:

  1. 只需右键单击文件夹或文件,然后选择Unlocker

    步骤1

  2. 如果文件夹或文件被锁定,则会出现储物柜的窗口列表

    第2步

  3. 只需点击Unlock All即可完成!

我不确定它是否支持命令行使用。

MalwareByte的FileAssassin执行类似的行动,支持命令行用法,所以你应该能够脚本它很容易。

FileAssassin的开关


谢谢techie007,我想我错过了。我注意到Unlocker有时会错过我的文件(ProcessExplorer没有)。第二个问题是如果我想以编程方式解锁或释放文件(例如,命令行工具会帮助这个方向)。
Amelio Vazquez-Reina

@intrpc你去了,我添加了另一个(命令行友好)建议。:)
Ƭᴇcʜιᴇ0072011年

1
如今,小心,Unlocker捆绑了恶意软件。
约书亚汉

10

谢谢你。我们在打开文件句柄方面遇到了一些问题,导致git checkout在我们基于Windows的Jenkins作业中失败,这有助于轻松解决问题。我将抛弃该技术的基础知识:

  1. 在构建节点上安装Handle.exe。我从这里下载了它http://technet.microsoft.com/en-us/sysinternals/bb896655,解压缩并删除了C:\ Windows \ System32下的Handle.exe以确保它在默认的%PATH%上可用

  2. 安装Jenkins pre-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/ntfortokens.php
c4sh

你是怎么解决handle.exe需要以管理员身份运行的事实,而我们是从一个非管理员的Jenkins用户运行的?
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

谢谢@Brendan。我认为您的代码格式不正确。你的答案看起来很有趣,所以如果你不介意编辑它,我建议你选择你的代码行,然后点击带有两个花环的按钮。这会将您的代码段转换为可读代码。
Amelio Vazquez-Reina

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

您需要从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\为您的文件夹路径。


4

如果您正在使用PSTools,这将强制递归关闭所有打开的文件:

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

请注意,这c:\path\toDatabase\是C:驱动器\\serverName,而不是本地计算机。起初我不清楚这一点,所以我想我会指出来。

这是一种蛮力方法,几乎​​可以保证丢失数据,因此请谨慎使用。

我们有一个非常拼凑的Access数据库,它确实让我们公司定期跪下(我昨天必须修复它三次)。

通常处理此问题的人休假几周,他的指示使用基于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

解锁器也可以在静默模式下运行。

例如,要解锁Jenkins工作区内的所有文件:

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

然后您可以安全地删除工作区文件:

del "%WORKSPACE%\*.*" /s /q
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.