PowerShell の Where-Object コマンドの使い方
-
PowerShell における
Where-Object
コマンドレット - PowerShell でのスクリプトブロックによるフィルタ条件の作成
-
PowerShell でのオブジェクトをフィルタリングするための
Where-Object
の使用 - PowerShell でのパラメータによるフィルタ条件の作成
- 複数の条件文の使用

Windows PowerShell のプロパティをオブジェクトのコレクションで操作する際、特定の必要なものだけをフィルタリングする方法が必要になることがあります。したがって、Windows PowerShell の Where-Object
コマンドレットの使い方を知ることは、Windows PowerShell のスキルセットにおいて重要な技術です。
Where-Object
コマンドレットは、オブジェクトをフィルタリングするための貴重なコマンドです。この文書では、Where-Object
コマンドを構築する方法、構文、および複数の条件文の使用方法を学びます。
PowerShell における Where-Object
コマンドレット
Windows PowerShell の Where-Object
コマンドレットの唯一の目的は、コマンドの出力をフィルタリングし、印刷したい特定の情報を返すことです。
要約すると、Where-Object
コマンドレットはフィルターです。True
または False
のいずれかを返す条件を構築できるようにします。状況の結果に応じて、コマンドレットは出力を返すかどうかを決定します。
その条件は、スクリプトブロックとパラメータの 2つの方法で作成できます。
PowerShell でのスクリプトブロックによるフィルタ条件の作成
スクリプトブロックは Windows PowerShell において重要な要素です。スクリプト言語のあらゆる場所で何百にも渡って使用されます。スクリプトブロックは、コードをカテゴライズし、さまざまな場所で実行する無名関数です。
例スクリプトブロック:
{$_.StartType -EQ 'Automatic'}
Windows PowerShell のパイプラインを使用すると、これらのオブジェクトを Where-Object
コマンドレットにパイプし、FilterScript
パラメータを使用できます。FilterScript
パラメータはスクリプトブロックを受け入れるため、次の例のように各オブジェクトのプロパティが特定の値と等しいかどうかをチェックする条件を作成できます。
例コード:
Get-Service | Where-Object -FilterScript { $_.StartType -eq 'Automatic' }
Where-Object
コマンドレットと位置パラメータを使用し、FilterScript
パラメータ名を含めていません。代わりに、スクリプトブロックのみを提供し、Where-Object {$_.StartType -eq 'Automatic'}
のようにより迅速かつクリーンなスクリプト作成を行うことができます。この種の構文が特定のシナリオで機能する一方で、波カッコ({}
)を使用したスクリプトブロックの概念は、コードの可読性を低下させ、経験の浅い Windows PowerShell ユーザーにとってより難しくなります。この可読性の問題が、Windows PowerShell チームがパラメータを導入する原因となりました。
PowerShell でのオブジェクトをフィルタリングするための Where-Object
の使用
Get-ChildItem
は指定された場所のすべてのファイルとフォルダーのリストを取得します。ディレクトリ内の .csv
ファイルだけを表示したいと考えているとします。
次の例では、Where-Object
コマンドレットを使用して .csv
ファイルのみをフィルタリングして選択する方法を示します。
Get-ChildItem | Where-Object { $_.extension -eq ".csv" }
上記のスクリプトでは、Get-ChildItem
の出力が Where-Object
コマンドレットにパイプされています。Where-Object
はファイル拡張子が .csv
である出力をフィルタリングします。
出力:
Directory: C:\Users\rhntm
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/11/2022 7:57 AM 122 books.csv
-a---- 3/8/2022 2:07 PM 780199 house_data.csv
-a---- 3/8/2022 10:38 PM 421 play_tennis.csv
Where
を Where-Object
コマンドレットのエイリアスとしても使用できます。
以下は、ProcessName
プロパティ値でプロセスのリストをフィルタリングする別の例です。ProcessName
が spotify
であるプロセスのみを表示します。
Get-Process | where { $_.ProcessName -in "spotify" }
出力:
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
550 31 55036 71256 2.81 1820 3 Spotify
294 21 12328 18144 0.06 13536 3 Spotify
476 64 96012 141208 20.61 13980 3 Spotify
コレクションのオブジェクトにない値を選択するために -notin
演算子を使用することもできます。
たとえば、次の例は ProcessName
が spotify
でないすべてのプロセスを印刷します。
Get-Process | where { $_.ProcessName -notin "spotify" }
このようにして、プロパティ値に基づいてオブジェクトのコレクションからオブジェクトをフィルタリングするために Where-Object
コマンドレットを使用できます。
PowerShell でのパラメータによるフィルタ条件の作成
Windows PowerShell 3.0 で導入されたパラメータは、それらがどのように記述されるかに自然な流れをもたらします。先の例と同じように、特定の出力をフィルタリングするためにパラメータを使用しましょう。
例コード:
Get-Service | Where-Object -Property StartType -EQ 'Automatic'
上記のように、スクリプトブロックを使用する代わりに、コマンドはオブジェクトプロパティを Property パラメータのパラメータ値として指定しています。さらに、-eq
演算子は現在パラメータであり、Automatic
値を渡すことができます。
このようにパラメータを使用することで、スクリプトブロックを必要としなくなります。しかし、Microsoft がクリーンなスクリプト作成方法としてパラメータを導入したとはいえ、次のセクションで説明する、スクリプトブロックを使用する良い理由があります。
複数の条件文の使用
演算子(-and
や -or
など)を利用して 2つ以上の条件を組み合わせて、スクリプトブロックを使用して評価できます。ただし、各条件を成功裏に評価するには、サブ式と呼ばれる特定の Windows PowerShell コンポーネントを使用する必要があります。
Windows PowerShell では、Where-Object
のようなフィルタリング構文内で式を実行するためにサブ式を使用できます。これは、実行する条件文を括弧(()
)で囲むことによって行います。
例コード:
Get-Process | Where-Object { ($_.CPU -gt 2.0) -and ($_.CPU -lt 10) }
例スクリプトブロック:
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------ - ------ ---- - ---- - ------ -- -- ---------- -
334 21 18972 26384 5.23 3808 0 AnyDesk
635 34 13304 51264 9.56 4140 5 notepad
726 36 12820 51196 4.69 12088 5 notepad
802 46 18356 65088 7.98 10784 5 OneDrive
340 18 6472 26436 3.44 1252 5 RuntimeBroker
698 34 14672 44484 3.63 3284 5 RuntimeBroker
323 19 5732 23432 4.00 11200 5 RuntimeBroker
560 18 6440 27752 4.63 8644 5 sihost
632 31 21524 69972 2.81 6392 5 StartMenuExperienceHost
390 18 9756 30832 3.94 3084 5 svchost
523 24 8768 36312 2.17 6300 5 svchost
524 17 6416 21036 4.42 10932 5 SynTPEnh
525 22 15336 38904 3.41 2192 5 TextInputHost
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn