【问题标题】:Summarize a file system directory with PowerShell使用 PowerShell 总结文件系统目录
【发布时间】:2013-02-25 10:23:28
【问题描述】:

我正在尝试使用 PowerShell 输出有关目录树的一些累积信息。

这是我所知道的。

gci -r -ea Si ` |组 { if ($_.PSIsContainer) {""} else {$_.Extension} } ` |选择名称、计数、@{n="Measure"; e={$_.组 |测量长度 -Sum -Average} }` |排序计数-desc` | ft 名称、计数、@{n="SizeMB"; e={"{0:N1}" -f ($_.Measure.Sum / 1MB)}; a="right"} -自动

这给了我:

名称 计数 SizeMB ---- ----- ------ .DOC 21660 6.988.6 .pdf 17323 11.893.1 11958 24.0 .rtf 2112 4.808.1 .tif 736 359.3 .msg 490 318.8 .ppt 260 168.5 .zip 219 2.239.6 .xls 216 78.5 [...]

这实际上是我第一次尝试使用 PowerShell,所以这可能不是最好的方法。欢迎对方法和风格发表评论。

  • 我不喜欢Select-ObjectFormat-Table之间的重复,这个可以折叠吗?
  • 我想输出更多指标,但我不确定如何正确执行:
    1. 每种文件类型的最大/平均嵌套深度
    2. 每种文件类型的最大/平均路径长度
    3. Get-ChildItem 的错误计数(访问被拒绝/路径太长)每种文件类型
  • 这些测量结果也可以在最后作为“整体”部分输出,但列会更好。
  • 如果可能的话,我想留在一个管道中,除非有充分的理由不这样做。

编辑:这是我当前的版本,计算路径长度和嵌套深度

gci -r -ea si ` |选择` 长度,` @{n="文件类型"; e={ if ($_.PSIsContainer) {""} else {$_.Extension.ToLower()} }}, ` @{n="路径长度"; e={$_.FullName.Length}},` @{n="路径深度"; e={$_.FullName.Split("\").Length - 1}} ` |组文件类型` |排序@{e="计数"; desc=$True},文件类型` |选择` 姓名,` 数,` @{n="长度"; e={$_.组 |测量长度 -sum -average} }, ` @{n="路径长度"; e={$_.组 |测量路径长度 -max -average} }, ` @{n="路径深度"; e={$_.组 |测量路径深度 -max -average} } ` |英尺` @{n="文件类型"; e={$_.Name} }, ` 数,` @{n="SumSizeMB"; e={"{0:N1}" -f ($_.Length.Sum / 1MB)};一个=“对”},` @{n="AvgSizeKB"; e={"{0:N2}" -f ($_.Length.Average / 1MB)};一个=“对”},` @{n="MaxPathLength"; e={[int]$_.PathLength.Maximum};一个=“对”},` @{n="平均路径长度"; e={[int]$_.PathLength.Average};一个=“对”},` @{n="MaxPathDepth"; e={[int]$_.PathDepth.Maximum};一个=“对”},` @{n="平均路径深度"; e={[int]$_.PathDepth.Average};一个=“对”}` -汽车

【问题讨论】:

  • 我已将其作为Function Tomalak { ... } 合并到我的Microsoft.PowerShell_profile.ps1 中。
  • 很高兴你给它我的名字,但称它为Get-DirectorySummary 或类似名称可能更明智。 :)

标签: powershell powershell-3.0


【解决方案1】:

折叠Select-ObjectFormat-Table 试试:

dir -r -ea si | group extension | sort count -desc | `
ft name, count, @{n="SizeMB";E={"{0:N1}" -f (($_.group | measure length -sum).sum / 1MB)}; a="right"} -auto

至于其他指标(1 和 2),这应该可以解决问题:

dir -r -ea si | group extension | sort count | `
ft name, count, @{n="SizeMB";E={"{0:N1}" -f (($_.group | measure length -sum).sum / 1MB)}; a="right"}, `
@{n="AVGPathLength";E={($_.group | select @{n="fullpathlength";e={$_.fullname.length}} | measure-object  -property fullpathlength -average).average  }}, `
@{n="MaxPathLength";E={($_.group | select @{n="fullpathlength";e={$_.fullname.length}} | measure-object  -property fullpathlength -maximum).maximum  }}, `
@{n="AVGNestingDepth";E={($_.group | select @{n="nestingdepth";e={$_.fullname.split("\").length -3}} | measure-object  -property nestingdepth -average).average  }}, `
@{n="MaxNestingDepth";E={($_.group | select @{n="nestingdepth";e={$_.fullname.split("\").length -3}} | measure-object  -property nestingdepth -maximum).maximum  }} -auto

我认为没有明显的方法可以实现指标 3。

【讨论】:

  • 谢谢,这是有道理的。让我们看看是否有人对其他问题提出了答案。
  • 查看您的编辑,我想在Select-ObjectFormat-Table 之间进行拆分并不是最糟糕的想法。让我感到困扰的是,无法将错误指标与其他数据一起输出,但考虑到它在管道的上下文中似乎是合乎逻辑的。
  • 你是对的。在Select-ObjectFormat-Table 之间拆分将提高易读性和性能。
  • 感谢您的帮助。我已将我现在使用的(半)最终版本附加到我的问题中。我假设我必须将其放入 ps1 脚本中以输出汇总信息(总体大小、错误计数等)。应该不是问题。
猜你喜欢
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 2021-12-08
  • 2019-07-05
  • 1970-01-01
相关资源
最近更新 更多