2010年7月15日木曜日

◆FilterとPassThruの使い方

以前書いたPowerShell: ◆サブフォルダーの容量を求めると同じことをMSDNのサンプルでやっていたので比較してみる。
PowerShell で which、PowerShell で du ... | 今週の How-To | MSDN

function dusage{
param([String]$tgtDir = (pwd).Path)

filter dusage_filter{
$sum =
(dir -literalpath $_.FullName –r -force -ea silentlycontinue |
measure-object Length -sum).Sum
$result = New-Object Object |
Add-Member NoteProperty Folder $_.FullName -PassThru |
Add-Member NoteProperty Size $sum -PassThru
return $result
}

dir $tgtDir -force -erroraction silentlycontinue |
? {$_.PSIsContainer} | dusage_filter
}

dusage -tgtDir "c:\work" | sort -des size



再帰しながらファイルを読み込みMeasure-ObjectでLengthをサマリーするというのは基本的に同じ。
違いとしては、ファイルを読み込むときForceスイッチを指定して隠しファイルも取得できるようにしている。
目的を考えると確かにそのほうが良いだろう。
また、出力用のObjectを自前で作りAdd-Memberでプロパティを追加している。
まぁ、これはどちらでも良い気がする。

ここで参考にしたいのがAdd-Memberに指定しているPassThruパラメータの使い方。Helpを読んでも今一つ使い道が分かっていなかったが、この例をみるとよくわかる。
Add-Memberは入力パイプラインから入ってきたObjectにプロパティを追加しているのだが、本来こいつは出力を持たないので、PassThruスイッチを指定して、プロパティ追加後のObjectを次のパイプラインへと送っている。

もう一つ参考にしたいのがFilterの使い方。
いままでFilterってFunctionと同じ?と思っていたのだが、若干違うみたい。
Where-Objectで書くような処理で汎用的なものをFilterとして作っておけば便利なのかな。


PassThruについては、Start-ProcessのようにそのままではProcessオブジェクトを返さないが、PassThruスイッチを付けることにより開始したProcessオブジェクトを返してくれるようなコマンドもある。

0 件のコメント:

コメントを投稿