在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)。最后,它比较了" net file"中每个项目的路径属性。我喜欢的路径集合。所以在循环遍历项目数组时,(伪代码):
foreach ($netFileOutputItem in $netFileOutput) {
if ($netFileOutputItem.Path -in $arrayOfSubDirs) {
net file $netFileOutputItem.FileID /close
}
}
问题在于:如果文件路径太长,那么命令" net file"截断输出,插入" ..."在文件路径中(请参阅文件ID 228,167,120)。我不知道文件ID 228或167的完整位置:它们位于DIR1中的某个位置,但它们是否属于感兴趣的三个文件夹之一?
那么,是吗:
#2& 3,我还需要文件ID,这样我就可以用" net file"来关闭连接。 (除非有替代方案)。
答案 0 :(得分:1)
感谢Tav对Get-SmbOpenFile的建议,我得出了这个管道解决方案:
$topPath = 'E:\DIR1\source\'
Get-SmbOpenFile | `
? { $_.Path.Length -ge $topPath.Length} | `
? { $_.Path.Substring(0, $topPath.Length) -eq $topPath} | `
select fileID | `
Close-SmbOpenFile -Force
它完成了我需要做的所有事情:
希望这有助于其他人!