2013-02-25 36 views
0

我試圖使用PowerShell輸出有關目錄樹的某些累積信息。使用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. 最大/平均路徑每個文件長度鍵入每個文件類型
  • 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

要崩潰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.

+0

謝謝,這是有道理的。讓我們看看是否有人想出了其他要點的答案。 – Tomalak 2013-02-25 11:49:58

+0

看看你的編輯,我想在'Select-Object'和'Format-Table'之間進行分割並不是最糟糕的主意。它讓我感到無法將錯誤度量與其他數據一起輸出,但考慮到它在流水線上下文中似乎是合乎邏輯的。 – Tomalak 2013-02-25 14:38:27

+0

你說得對。在「Select-Object」和「Format-Table」之間進行分割將提高易讀性和性能。 – 2013-02-25 15:13:17