我有一个在 Windows 服务器上运行的脚本,用于对某些文件执行操作。该脚本经常失败,因为各种用户(甚至我自己)在服务器上打开了文件共享,但忘记关闭,因此文件夹被锁定。
我添加了代码来检查打开的文件net file
,如果它们与某些模式匹配,则关闭它们。这里的限制是net file
总结打开文件的路径,例如
ID Path User name # Locks
-------------------------------------------------------------------------------
2 C:\Program Files\...\cocoon-2.1.11\ huttarl 0
当打开文件的完整路径为
C:\Program Files\Apache Software Foundation\cocoon-2.1.11
因此,当我的脚本检查文件路径是否与某种模式(例如“Apache”)匹配时,它有时会错过列表...
中间的文件net file
。
所以我的问题是,如何在脚本中获取打开文件的完整路径?
目前,我使用的是 cygwin/bash。因此,如果我必须切换到 WSH,则需要进行一些移植。但如果这是唯一的选择,我会选择它。
如果重要的话,系统信息面板会显示我的 Windows 版本是 Windows Server Standard,(c) 2007,SP2。
答案1
我发现以下内容很有用:
openfiles /query /v | findstr "string what You want"
答案2
你应该使用程序文件
关于它
“net file”命令会显示其他计算机在您执行该命令的系统上打开的文件列表,但它会截断长路径名,并且不会让您看到远程系统的这些信息。PsFile 是一个命令行实用程序,可显示系统上远程打开的文件列表,还允许您按名称或文件标识符关闭打开的文件。
答案3
啊……看来我一年前甚至更早就发现了这一点。
事实证明,如果您给出net file
打开文件的 ID,它将输出完整路径。
因此,对于我的问题中的例子,如果我输入
C:\>net file 2
我会得到
File ID 2
User name huttarl
Locks 0
Path C:\Program Files\Apache Software Foundation\cocoon-2.1.11\
Permissions (none)
The command completed successfully.
使用此功能意味着
net file
从初始命令的输出中解析出 ID 号- 循环遍历它们并
net file
使用每个 ID 再次调用 - 测试第二个输出
- 并关闭路径与模式匹配的文件。
而使用 PSFile,我可以用一个简单的命令完成所有这些操作。但使用net use
,当我们将脚本迁移到新服务器时,我不必安装第三方软件。决策,决策……