【发布时间】:2017-04-23 19:35:39
【问题描述】:
在 Windows 服务器上使用 POSH (2012) 我试图有选择地关闭在某些子目录上打开的任何文件;让我们说 E:\DIR1\source*.*.
顶层文件夹结构为:
E:\
DIR0
DIR1
source
bob
mike
archive
Week
Weekend
这意味着我想关闭与中任何文件的连接
E:\DIR1\source\
E:\DIR1\source\bob
E:\DIR1\source\mike
我调用“net file”(无参数)的代码来获取所有打开的连接的列表,并使用其输出创建一个包含七个项目的数组,如下所示:
194 E:\DIR0\ user1 0
228 E:\DIR1\...\myFile.csv user2 0
227 E:\DIR1\source\files\ user1 0
167 E:\DIR1\... user1 0
181 E:\ user3 0
241 E:\ user1 0
120 E:\DIR3\... user4 0
然后代码将每一行分成四列(FileID、Path、User、NumLocks)。最后,它将“网络文件”中每个项目的路径属性与我感兴趣的路径集合进行比较。因此,在遍历项目数组时,(伪代码):
foreach ($netFileOutputItem in $netFileOutput) {
if ($netFileOutputItem.Path -in $arrayOfSubDirs) {
net file $netFileOutputItem.FileID /close
}
}
问题出在:如果文件路径太长,则“net file”命令会截断输出,在文件路径中插入“...”(参见文件 ID 228、167、120)。我不知道文件 ID 228 或 167 的完整位置:它们位于 DIR1 中的某个位置,但它们是否位于感兴趣的三个文件夹之一中?
那么,有没有:
- 任何强制“网络文件”生成完整路径的方法
- “网络文件”的替代实用程序,返回完整路径和 ID
- POSH 代码实现相同的输出,例如任何打开文件的 ID 和完整路径
对于 #2 和 3,我还需要文件 ID,以便我可以关闭与“net file”的连接(除非也有替代方法)。
【问题讨论】:
-
Get-SmbOpenFile 是等效的 powershell。
-
这是一个很好的骗子:stackoverflow.com/questions/34885837/…
-
@Tav - 该功能是我找到的解决方案的挂钩 - 谢谢
-
@Matt - 我不同意,因为这是一个相当冗长的解决方案。我的要优雅得多(反正相比之下!)
-
“长篇大论”并没有使它成为一个解决方案。它使用与 net.exe 相同的 api 来以实际有效的格式获取信息。如果您可以访问 cmdlet,例如 Get-SmbOpenFile,那么效果很好。虽然你的很简单 它不起作用 并且链接的答案地址在这些限制内。我很高兴你找到了有用的东西
标签: powershell command-line-arguments windows-server-2012 powershell-4.0