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