2012年10月10日水曜日

◆プロパティ名を纏めて変更する

プロパティ名を変更するには「算出プロパティ」(集計プロパティ)を使えば良い。

「算出プロパティ」はハッシュテーブルの形式で指定するので項目が多いとちょっと面倒だ。

そこで名称を単純に配列で指定できるようにしようというTipsがあったのでメモしておく。

PowerShell Tips
改行箇所を調整しているが基本的にそのまま転載。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019

$data = @(tasklist /V /FO CSV | ConvertFrom-Csv)

$columns = $data[0].PSObject.Properties |
 
 
Where-Object { $_.MemberType -eq 'NoteProperty' } |
 
 
Select-Object -ExpandProperty Name

$columnNames =
 
 
'Name', 'ID', 'Session', 'SessionID', 'Memory',
 
 
'Status', 'Owner', 'CPU', 'Title'

$customProperties = $columns | %{$i=0
}{ 
    @{
     Name 
= $columnNames[$i]
     Expression=[ScriptBlock]::Create(('$_.''{0}''' -f $columns[$i]
))
   }
  
$i++
 
}


$data | Select-Object -Property $customProperties

若干判り辛いので説明を書いておく。

1行目で「tasklist」コマンドでプロセスの一覧を取得している。
「Get-Process」を使っていないのは今回の例で言えば特に理由は無いが、そのまま使用している。
結果は、そのままだと以下のように表示される。
image

ここで、 19行目を「算出プロパティ」で直接書くと以下のようになる。

$data |
  Select-Object @{name="Name";expression={$_.$($columns[0])}},
                @{name="SessionName";expression={$_.セッション名}},
                @{name="Memory";expression={$_.$($columns[4])}}

image

3項目しか記載していないが、全項目書くとなると確かに煩雑。

そこで、7行目で出力プロパティをテーブルで指定して、11行目でハッシュテーブルをロジカルに作り出している。
肝は[ScriptBlock]クラスの「Create」メソッド。
変数値を解決しつつブロックを作り出している。

この例では日本語から英語に変えているが、英語の項目名を纏めて日本語にするなんて時には使えそうなTipsではなかろうか。

0 件のコメント:

コメントを投稿