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

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

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

我努力了进程探索器解锁者和类似的工具,但它们提供 GUI 界面,在编程环境中没有用处

Python、cmd 或 PowerShell 上的解决方案将是理想的。

答案1

解锁者确实声称它能给你这种能力:

  1. 只需右键单击文件夹或文件并选择解锁

    步骤1

  2. 如果文件夹或文件被锁定,则会出现一个锁定窗口列表

    第2步

  3. 只需单击一下Unlock All即可完成!

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

MalwareByte 的 FileAssassin执行类似的操作,并且支持命令行使用,因此您应该能够非常轻松地编写脚本。

FileAssassin 的开关

答案2

谢谢。我们在基于 Windows 的 Jenkins 作业中遇到了一些打开文件句柄的问题,导致 git checkout 失败,这有助于轻松解决问题。我将介绍该技术的基本原理:

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

  2. 安装 Jenkins pre-scm-buildstep 插件:https://wiki.jenkins-ci.org/display/JENKINS/pre-scm-buildstep. 这使我们能够在 git 插件开始接触可能被锁定的文件之前定义操作。

  3. 实施以下批处理命令作为预 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、^|)。

谢谢!

答案3

我们使用以下代码片段来关闭用户和服务器之间的文件句柄。您可以根据自己的需要对其进行修改。

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

答案4

如果你使用工具,这将强制递归关闭所有打开的文件:

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

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

这是一种蛮力方法,几乎​​肯定会丢失数据,因此请谨慎使用。

我们有一个拼凑起来的 Access 数据库,它确实经常让我们的公司陷入瘫痪(仅昨天我就不得不修复它三次)。

通常处理这个问题的人正在休假几个星期,他的指示使用基于 UI 的方法(开始 > 计算机 > 管理 > 计算机管理(本地) > 连接到另一台计算机 > 系统工具 > 共享文件夹 > 打开文件 > 关闭打开的文件)。我只需运行上述命令并将整个公司的所有数据库文件踢出并启动压缩和修复过程(我也正在研究一种强力脚本方法),却需要点击太多次。

诀窍是要领先于那些在数据库关闭后立即重新连接数据库的人。他们已经习惯了这种情况,以至于他们不会想到要针对数据库提交错误报告,他们只是不断地敲打数据库,直到他们重新连接。我只是不断地启动它们,直到我压缩并修复了构成数据库的三十多个文件。

相关内容