PR

 コマンドレット(コマンド)の結果から必要な情報を抽出する方法を解説する。大量の処理結果から必要なものを素早く見つけ出したい場合に便利だ。

 やり方は大きく二つあり、一つはコマンド標準のフィルターを利用する方法、もう一つは「Where-Object」コマンドまたは「Where」メソッドを使用する方法だ。

 まず以下のコマンドを実行してみよう(図1)。これで名前に「user」という文字列があるコマンドだけを抽出できる

Get-Command *user*
図1●コマンドレットを名前で絞り込む
図1●コマンドレットを名前で絞り込む
フィルターを使って名前に「user」が含まれているものだけを抽出している。
[画像のクリックで拡大表示]

 各コマンドは名前を格納する「Name」属性を持っている。そのため、次のようにWhere-ObjectコマンドやWhereメソッドでName属性を検索しても結果は同じだ。

Get-Command | Where-Object{$_.Name.ToString() -Like "*user*" }
(Get-Command).Where{ $_.Name.ToString() -Like "*user*" }

 前者は、Get-Commandで取得した結果をパイプ(|)でWhere-Objectコマンドに1行ずつ渡し「$_」 に格納した上で、Name属性に「user」という文字列が入っていれば出力している。後者もWhereメソッドを使ってほぼ同じ処理をしている。

大きな違いは実行速度

 ここまで紹介したどの方法がベストなのだろうか。得られる結果は同じだが、実は処理速度に大きな違いがある。次のように「Measure-Command」コマンドの後ろにコマンドを書いて実行すると処理時間を計測できるので、試してみよう(図2)。

Measure-Command { Get-Command *user* }
図2●コマンドの実行時間を計測する
図2●コマンドの実行時間を計測する
Measure-Commandに続けて実行したら約80ミリ秒で終了していることがわかった。
[画像のクリックで拡大表示]
▼抽出できる
「user」の両側をアスタリスクで挟むことで、どこかにuserがあるという任意一致で検索している。
▼出力している
Name属性は基本的に文字列だと予測できるが、念のために文字列に強制変換するための「ToString()」メソッドで確実に文字列として判定できるようにしている。