2014/04/20

Select-Object、Format-Table、Sort-Objectなど、-Propertyパラメータを持つコマンドレットには、プロパティ名を指定する以外にも「集計プロパティ」という連想配列を指定することができます。

集計プロパティを利用すると、オブジェクトが持っていないプロパティを動的に作成し、その値を表示することができるようになります。

たとえば、dir (Get-ChildItem)の出力するファイルリストに、テキストファイルとして開いた場合の1行目の記述(Textプロパティとする)も合わせて表示したい場合は以下のようにします。

dir | select Name, Extension, @{Name="Text"; Expression={$_|gc|select -First 1}}

出力は以下のようになります。

Name            Extension            Text                              
----            ---------            ----         
test1.ps1       .ps1                 param([Parameter(ValueFro...
test2.ps1       .ps1                 $x=1231                           
test3.ps1       .ps1                 Start-Transcript                  
test4.ps1       .ps1                 Get-Content .\gacha_log.t...

ここで、@{Name="Text"; Expression={$_|gc|select -First 1}}と指定している部分が集計プロパティです。連想配列のキーとしてプロパティ名を表すNameと、スクリプトブロックを指定するExpressionを含めます。なお、キー名のNameはN、ExpressionはEと省略表記できるので、

dir | select Name, Extension, @{N="Text"; E={$_|gc|select -First 1}}

と書くこともできます。

ここまではヘルプにも載っていることなのでご存知の方も多いと思います。ただ、連想配列を指定してごにょごにょ、というのは(特にインタラクティブ実行時には)正直だるいです。そこでもっと楽な書き方はないものかと思って何気なく、

dir | select Name, Extension, {$_|gc|select -First 1}

とプロパティとしてスクリプトブロックをそのまま書いたら、普通に通りました。これ、知ってました? 私は知らなかったです。しかしv2環境で実行しても動いたので前からあったんですね。なぜヘルプに載ってないのか…。それともどこかに載ってるんでしょうか…。

ただしこの方法だと、集計プロパティでプロパティ名(Nameキー)を指定しない場合と同様、以下のようにプロパティ名がスクリプトブロックの定義そのままになります。

Name          Extension          $_|gc|select -First 1                              
----          ---------          ---------------------         
test1.ps1     .ps1               param([Parameter(ValueFro...

そのため、コマンドの出力を変数に入れて利用する場合などはこの方法は不適です。ですがインタラクティブ実行時で、結果表示の見た目よりも効率を重視する場合なら、この方法はお勧めです。


古い記事へ | 新しい記事へ


プライバシーポリシー

Twitter

Books