以前PowerShell: ◆オブジェクトにプロパティを追加する(Add-Member)でも使用した集計プロパティ。
余り説明せずに使っていたので今一度その使い方を確認してみる。
集計プロパティはSelect-Objectだけで使えるものではないが、いちばん基本的なコマンドレットであるSelect-Objectを例に説明する。
PS>dir d:\desktop\test1
Mode Name |
こんな感じでプロパティを射影するのが基本的な使い方。SQLと同じイメージ。
ここで出力フォーマットを弄ってみる。
Mode $_.name + "です" |
本来プロパティ名を指定するところに式を指定するのでスクリプトブロックで指定する。
スクリプトブロックの中ではパイプラインオブジェクトが$_変数で参照できる。
ただし、これではタイトルがいただけない。
この様な時のためにタイトルを指定する機能を提供するのが集計プロパティと呼ばれるものである。
Mode ファイル名は |
もともとあったスクリプトブロックにexpressionというキーを付け、加えてnameというキーでタイトルを追加している。キーと値のセットなので指定形式は@{}がついた連想配列形式になる。2個のキーと値の設定を1行で書いているので間にセミコロンを入れている。コマンドラインからではなくスクリプトファイルとして書くのならば以下のように書くのも良いかも。
001 002 003 004 005 | $fileprop = @{ name="ファイル名は" expression={$_.name + "です"} } dir d:\desktop\test1 | select mode,$fileprop |
ちなみに、上記のハッシュテーブルは以下のように書いても良い。
001 002 003 | $fileprop2 = @{} $fileprop2.name="ファイル名は" $fileprop2.expression={$_.name + "です"} |
と、思っていたのだが・・・。
実際以下のようにどうみても同じに見える。
しかし、$fileprop2のほうは以下のようなエラーになる。
Select-Object : System.Management.Automation.PSObject を型 {System.String, Syst |
だいぶ悩んで$fileprop1と$fileprop2の違いを調べたがどうにもわからない。
個人的にはバグ(bug)にしか思えないのだが・・・・。
とりあえず1の書き方をすればよいだけなので放置。
最後にSelect-Objectの使い方(オプション)を。集計プロパティを使っているが、コメントにしてあるAdd-Memberのほうを使ったも結果は同じになる。
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 | $ps = Get-Process $script:i = 0 #$ps | %{$i=0}{ #Add-Member -MemberType NoteProperty -Name No -Value (++$i) -InputObject $_ #} $no = @{name="No";expression={(++$script:i)}} $ps = $ps | select * ,$no "先頭から3件" $ps | select No,processname -First 3 | ft -AutoSize "最後から3件" $ps | select No,processname -Last 3 | ft -AutoSize "0番目と12番目" $ps | select No,processname -index 0,12 "0番目と12番目" $ps | select -index 0,12 "modulesを展開" $ps | select $name -ExpandProperty modules -First 1 |
結果は以下の通りなのだが、またしても色々と嵌った。(嵌ってばかりだ・・・)
まず、Indexパラメータ。なぜかエラーになる・・・。
どうやらPropertyパラメータと一緒に使えないらしい。
それじゃSelectじゃないと思うのだが・・・。
プロパティが連想配列の時(だけかは?)にExpandPropertyを指定すると中身を展開してくれる。これもPropertyとは併用できないようだ。(こちらはエラーにはならずに無視される)
今日もやけに疲れた・・・。
先頭から3件 No ProcessName
No ProcessName
0番目と12番目 Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName Name : BaiduJPEngine Site : |
0 件のコメント:
コメントを投稿