【where-Object】PowerShell で条件に該当するものを取り出す

スポンサーリンク

where-Object は条件にマッチする行を取り出すためのコマンドレットです。単体で使われずに基本的に | (パイプライン) や自動変数 $_ などと合わせて使われます。実際にコマンドを実行して動きを確認しましょう。

TEST

1. where-Object の基本

本題に入る前に、まずは 1..5 と入力してEnterキーを押してみてください。

PS> 1..5
1
2
3
4
5

上記のように1から5までの数値が生成されることがわかります。次に 1..5 | where-Object {$_ -eq 5} を実行してみましょう。

PS> 1..5 | where-Object {$_ -eq 5}
5

今度は先程と違い 5 だけが表示されたはずです。

ここで何が起きたか少し考えてみましょう。まず最初の 1..5 の部分で、1から5の数値が生成されます。次に | (パイプライン) を使って 1..5 の実行結果を順番に where-Object に引き渡します。$_ は自動変数と呼ばれる変数で、受け取った数値は同時にこの変数に格納されます。 1..5 | where-Object {$_ -eq 5} を実行すると下記のことが起きています。

1 | where-Object {1 -eq 5} –> 条件に不一致
2 | where-Object {2 -eq 5} –> 条件に不一致
3 | where-Object {3 -eq 5} –> 条件に不一致
4 | where-Object {4 -eq 5} –> 条件に不一致
5 | where-Object {5 -eq 5} –> 条件に一致

まず最初の行で 1..5 の実行結果である 1where-Object に引き渡します。このとき自動変数である $_ にも 1 が格納されます。ここで条件比較が行われますが「1=5」は真ではないため where-Object で受け取った 1 は条件不一致となり表示されません。2~4も同様です。5の場合は条件が一致するので、実行結果が表示されます。

実際にコマンドを実行して実行結果を確認してみましょう。

PS> 1 | where-Object {1 -eq 5}
PS>

条件不一致となるためなにも表示されません。それでは次のようにコマンドを実行してみましょう。

PS> 5 | where-Object {5 -eq 5}
5
PS>

条件に一致するため where-Object で受け取った 5 が表示されます。

2. where-Object の利用例

where-Object は Linuxの grep コマンドのように利用できます。

例1

ipconfig の実行結果から IPv4 アドレスに関する行を取り出しています。 -like を使ってあいまい検索を実施しています。

PS> ipconfig | where-Object {$_ -like '*IPv4*'}
   IPv4 アドレス . . . . . . . . . . . .: 192.168.47.134

例2

Get-Service でサービス一覧を出力し、その中からサービス名が WinRM であるものを抜き出しています。

PS> Get-Service | where-Object {$_.Name -eq 'WinRM'}

Status   Name               DisplayName
------   ----               -----------
Running  WinRM              Windows Remote Management (WS-Manag...

以上。

PowerShell に関しては下記の本をお勧めしておきます。プログラミング初心者向けに丁寧に解説されています。2015年に出版された本ですが、PowerShell の基本的なコマンドはかわらないので何の問題もありません。

コメント