如何获取打开文件的完整路径

如何获取打开文件的完整路径

我有一个在 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,当我们将脚本迁移到新服务器时,我不必安装第三方软件。决策,决策……

相关内容