PowerShell を使用してディレクトリ ツリーに関する累積情報を出力しようとしています。
これは私が持っている限りです。
gci -r -ea Si ` | | group { if ($_.PSIsContainer) {""} else {$_.Extension} } ` | | 名前、カウント、@{n="メジャー"; を選択します。e={$_.グループ | 長さを測定 - 合計 - 平均} }` | | 並べ替え回数 -desc ` | | ft 名前、カウント、@{n="SizeMB"; e={"{0:N1}" -f ($_.Measure.Sum / 1MB)}; a="right"} -自動
これは私に与えます:
名前数サイズMB ---- ----- ------ .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-Object
との重複が気に入らないのFormat-Table
ですが、折りたたむことはできますか?- さらにいくつかのメトリックを出力したいのですが、適切に行う方法がわかりません。
- ファイルの種類ごとの最大/平均のネストの深さ
- ファイル タイプごとの最大/平均パス長
Get-ChildItem
ファイルの種類ごとの (アクセスが拒否されました/パスが長すぎます)からのエラー数
- これらの測定値は、最後に「全体」セクションとして出力することもできますが、列があれば便利です。
- 可能であれば、正当な理由がない限り、1 つのパイプラインにとどまりたいと考えています。
編集:これが私の現在のバージョンで、パスの長さとネストの深さも計算しています
gci -r -ea si ` | | `を選択 長さ、` @{n="ファイルタイプ"; e={ if ($_.PSIsContainer) {""} else {$_.Extension.ToLower()} }}, ` @{n="パスの長さ"; e={$_.FullName.Length}}, ` @{n="パスの深さ"; e={$_.FullName.Split("\").Length - 1}} ` | | グループファイルタイプ ` | | sort @{e="Count"; desc=$True}, ファイルタイプ ` | | `を選択 名前、` カウント、` @{n="長さ"; e={$_.グループ | 長さを測定 -合計 -平均} }, ` @{n="パスの長さ"; e={$_.グループ | 測定 PathLength -max -平均} }, ` @{n="パスの深さ"; e={$_.グループ | 測定 PathDepth -最大 -平均} } ` | | ft ` @{n="ファイルタイプ"; e={$_.Name} }, ` カウント、` @{n="SumSizeMB"; e={"{0:N1}" -f ($_.Length.Sum / 1MB)}; a="右"}, ` @{n="AvgSizeKB"; e={"{0:N2}" -f ($_.Length.Average / 1MB)}; a="右"}, ` @{n="MaxPathLength"; e={[int]$_.PathLength.Maximum}; a="右"}, ` @{n="AvgPathLength"; e={[int]$_.PathLength.Average}; a="右"}, ` @{n="MaxPathDepth"; e={[int]$_.PathDepth.Maximum}; a="右"}, ` @{n="AvgPathDepth"; e={[int]$_.PathDepth.Average}; a="右"} ` -オート