【问题标题】:Net file output truncates long file paths网络文件输出截断长文件路径
【发布时间】: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 中的某个位置,但它们是否位于感兴趣的三个文件夹之一中?

那么,有没有:

  1. 任何强制“网络文件”生成完整路径的方法
  2. “网络文件”的替代实用程序,返回完整路径和 ID
  3. 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


【解决方案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. 过滤前 x 个字符等于 $topPath 的对象
  4. 选择 FileID
  5. 通过管道将这些 FileID 传递给 Close-SmbOpenFile,并使用 -Force 覆盖任何警告。

希望这对其他人有帮助!

【讨论】:

  • 不需要这些反引号。没有它们也能正常工作。
  • 您可以保留新行和缩进...。只需删除反引号。我的编码方式相同。
猜你喜欢
  • 1970-01-01
  • 2012-10-21
  • 2011-09-26
  • 1970-01-01
  • 2011-02-20
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多