我有一个Unix shell脚本,它将杀死正在访问文件夹的所有进程:
fuser -k ..\logs\*
是否有Windows批处理脚本与此等效?我知道TASKKILL,但不确定是否能满足我的需求。有人知道Windows Shell是否可以做到这一点?
没有内置工具(没有可以枚举句柄的东西),但是您可以使用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。这是在脚本中非常有用。