Select-Object コマンドレットには大きく分けて 2 種類の書き方がある。その違いをサンプルコードを用いて説明します。
Select-Object コマンドレットの引数にプロパティのみを指定する方法
のようにデータを抽出した場合には、出力結果にも Name, Length プロパティが存在します。従って、この結果をさらにパイプライン処理することができます。
Get-ChildItem | Select-Object Name, Length
Select-Object コマンドレットの引数にスクリプトブロックを指定する方法
このようにデータを抽出した場合には、出力結果には Name, Length プロパティが存在しません。従って、この結果をさらにパイプライン処理した場合、これらのプロパティは使用できません。
Get-ChildItem | Select-Object {$_.Name, $_.Length}
Select-Object コマンドレットの引数にスクリプトブロックを指定すると、出力結果の加工をすることが可能
スクリプトブロックを使用しない場合は、単にプロパティの選択ですのでこのような加工はできません。
Get-ChildItem | Select-Object {"{0,-20} サイズ{1,10}" -f $_.Name, $_.Length}
Select-Object コマンドレットの引数にスクリプトブロックを指定すると、指定したプロパティに対してメソッドの実行をすることが可能
スクリプトブロックを使用しない場合は、単にプロパティの選択ですのでこのようなメソッドの指定はできません。
Get-ChildItem | Select-Object {$_.Name, $_.Length.ToString("#,###")}
スクリプトブロックを使用しないで、出力結果を加工したり、プロパティに対するメソッドを実行したい場合には、ハッシュテーブルを使用
Get-ChildItem | Select-Object -Property Name, @{Name = "Size"; Expression = {$_.Length.ToString("#,###")}}
(補足説明)
Length プロパティの処理にハッシュテーブルを使用しています。処理後のプロパティの名前は "Size" で、その内容についてはスクリプトブロックで作成しています。ここでは ToString メソッドを実行して 3 桁区切りに加工しています。