使用PowerShell汇总文件系统目录

时间:2013-02-25 10:23:28

标签: powershell powershell-v3.0

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

这就是我所拥有的。

gci -r -ea Si `
| group { if ($_.PSIsContainer) {""} else {$_.Extension} } `
| select Name, Count, @{n="Measure"; e={$_.Group | measure Length -Sum -Average} }`
| sort Count -desc `
| ft Name, Count, @{n="SizeMB"; e={"{0:N1}" -f ($_.Measure.Sum / 1MB)}; a="right"} -Auto

这给了我:

Name            Count   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 `
| select `
    Length, `
    @{n="FileType"; e={ if ($_.PSIsContainer) {""} else {$_.Extension.ToLower()} }}, `
    @{n="PathLength"; e={$_.FullName.Length}}, `
    @{n="PathDepth"; e={$_.FullName.Split("\").Length - 1}} `
| group FileType `
| sort @{e="Count"; desc=$True}, FileType `
| select `
    Name, `
    Count, `
    @{n="Length"; e={$_.Group | measure Length -sum -average} }, `
    @{n="PathLength"; e={$_.Group | measure PathLength -max -average} }, `
    @{n="PathDepth"; e={$_.Group | measure PathDepth -max -average} } `
| ft `
    @{n="FileType"; e={$_.Name} }, `
    Count, `
    @{n="SumSizeMB"; e={"{0:N1}" -f ($_.Length.Sum / 1MB)}; a="right"}, `
    @{n="AvgSizeKB"; e={"{0:N2}" -f ($_.Length.Average / 1MB)}; a="right"}, `
    @{n="MaxPathLength"; e={[int]$_.PathLength.Maximum}; a="right"}, `
    @{n="AvgPathLength"; e={[int]$_.PathLength.Average}; a="right"}, `
    @{n="MaxPathDepth"; e={[int]$_.PathDepth.Maximum}; a="right"}, `
    @{n="AvgPathDepth"; e={[int]$_.PathDepth.Average}; a="right"} `
    -auto

1 个答案:

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