网络文件输出截断长文件路径

时间:2016-12-08 14:12:04

标签: powershell command-line-arguments windows-server-2012 powershell-v4.0

在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中的某个位置,但它们是否属于感兴趣的三个文件夹之一?

那么,是吗:

  1. 任何方式强制" net file"产生完整的路径
  2. " net file"的替代实用程序返回完整路径和ID
  3. 实现相同输出的POSH代码,例如任何打开文件的ID和完整路径
  4. #2& 3,我还需要文件ID,这样我就可以用" net file"来关闭连接。 (除非有替代方案)。

1 个答案:

答案 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

它完成了我需要做的所有事情:

  1. 将所有打开的文件作为对象返回
  2. 过滤路径长度至少等于$ topPath
  3. 的对象
  4. 过滤前x个字符上的对象等于$ topPath
  5. 选择FileID
  6. 将这些FileID传递给Close-SmbOpenFile,并使用-Force覆盖任何警告。
  7. 希望这有助于其他人!