1

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ですが、折りたたむことはできますか?
  • さらにいくつかのメトリックを出力したいのですが、適切に行う方法がわかりません。
    1. ファイルの種類ごとの最大/平均のネストの深さ
    2. ファイル タイプごとの最大/平均パス長
    3. 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="右"} `
    -オート
4

1 に答える 1

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を達成する明確な方法がわかりません。

于 2013-02-25T11:32:17.427 に答える