【发布时间】:2013-08-06 06:09:38
【问题描述】:
我有一个 Unix shell 脚本,它会杀死任何正在访问文件夹的进程:
fuser -k ..\logs\*
是否有与此等效的 Windows 批处理脚本?我知道 TASKKILL,但我不确定它是否能满足我的需要。有谁知道这是否可以通过 Windows shell 实现?
【问题讨论】:
标签: windows batch-file scripting kill-process fuser
我有一个 Unix shell 脚本,它会杀死任何正在访问文件夹的进程:
fuser -k ..\logs\*
是否有与此等效的 Windows 批处理脚本?我知道 TASKKILL,但我不确定它是否能满足我的需要。有谁知道这是否可以通过 Windows shell 实现?
【问题讨论】:
标签: windows batch-file scripting kill-process fuser
不使用内置工具(没有任何东西可以枚举句柄),但您可以使用 Sysinternals Handle tool 获取在文件上具有打开句柄的 PID 列表。然后您可以使用FOR /F 解析输出并使用TASKKILL 结束进程。
例子:
for /f "skip=4 tokens=3" %i in ('handle ..\logs\') do taskkill /pid %i
skip=4 跳过 Handle 输出中的版权信息,tokens=3 从输出的每一行中挑选出 PID。其余的都是不言自明的。
【讨论】:
我为 Windows 找到了 fuser。检查this link Sourceforge:
很多人会问,“为什么不使用来自 SysInternals 的
handle.exe?”虽然是一个真正优秀的实用程序(就像所有 SysInternals 的东西一样 是),它不够——至少对我来说——有几个原因:
它进行文件名模式匹配。我需要它与部分输入进行精确的文件匹配。例如,当我在
C:\TMP目录中,并且我正在检查一个名为out.dat的文件时,我希望它查看文件C:\TMP\OUT.DAT是否正在使用,而无需输入完整路径。我想想即使你输入了handle.exe的完整路径,它仍然会进行模式匹配。
handle.exe似乎总是退出 0。出于脚本目的,我需要 如果文件未被使用,则退出 1,如果是,则退出 0。这是 在脚本中非常有用。
【讨论】: