Windows PowerShell でオブジェクトを作成してパイプラインで渡すとき、実際には不要なオブジェクトまで伝達されます。Format コマンドレットを使用すると特定のオブジェクトのプロパティを指定して表示できますが、不要なオブジェクトそのものを表示から除外することはできません。パイプラインの最後に到達する前に、オブジェクトをフィルター処理しておき、最初に生成したオブジェクトのサブセットだけを対象に操作を適用する場合も考えられます。
Windows PowerShell には、パイプラインの各オブジェクトを調べ、特定の判定条件を満たしたオブジェクトだけにパイプラインの通過を許可する Where-Object コマンドレットが用意されています。条件を満たさないオブジェクトは、パイプラインから削除されます。判定条件は、Where-Object FilterScript パラメーターの値として指定します。
Where-Object を使用した簡単な条件判定の実行
FilterScript の値は、True または False として評価されるスクリプト ブロックです。1 つまたは複数の Windows PowerShell コマンドを中かっこ ({}) で囲んで指定します。スクリプト ブロックはごく簡単なもので済む場合もありますが、その作成には、Windows PowerShell の概念とは別に、比較演算子に関する知識が必要です。比較演算子とは、その両側に指定された項目を比較する演算子です。比較演算子の名前には、先頭に '-' 文字を付けます。基本的な比較演算子であれば、ほとんどの種類のオブジェクトで使用できます。より高度な比較演算子になると、テキストのみ、または配列のみにしか使用できない場合もあります。
注意事項: | |
Windows PowerShell の比較演算子をテキストに対して使用した場合、既定では、大文字と小文字は区別されません。 |
構文解析上、<、>、= などの記号は、比較演算子として使用されません。比較演算子はアルファベットで構成されます。基本的な比較演算子を次の表に示します。
比較演算子 | 意味 | 例 (戻り値は True) |
---|---|---|
-eq |
等しい |
1 -eq 1 |
-ne |
等しくない |
1 -ne 2 |
-lt |
より小さい |
1 -lt 2 |
-le |
以下 |
1 -le 2 |
-gt |
より大きい |
2 -gt 1 |
-ge |
以上 |
2 -ge 1 |
-like |
似ている (ワイルドカードによるテキスト比較) |
"file.doc" -like "f*.do?" |
-notlike |
似ていない (ワイルドカードによるテキスト比較) |
"file.doc" -notlike "p*.doc" |
-contains |
含む |
1,2,3 -contains 1 |
-notcontains |
含まない |
1,2,3 -notcontains 4 |
Where-Object のスクリプト ブロックでは、パイプラインの現在のオブジェクトを参照するときに、特殊な変数 '$_' を使用します。以下は、具体的な動作の例を示しています。複数の数値が存在する場合に、3 未満の値だけを取得するには、次のように Where-Object を使用して数値をフィルター処理します。
PS> 1,2,3,4 | Where-Object -FilterScript {$_ -lt 3} 1 2
オブジェクトのプロパティに基づいてフィルター処理する
現在のパイプライン オブジェクトは $_ で参照できるため、そのプロパティにアクセスすることによって条件判定を実行できます。
たとえば、WMI の Win32_SystemDriver クラスを例に考えてみます。1 つのシステムに数百個のシステム ドライバーが存在することもありますが、実際に調べるのは、現在実行されているシステム ドライバーなど特定の種類のシステム ドライバーだけであるとします。Get-Member を使用して Win32_SystemDriver のメンバーを表示すると (Get-WmiObject -Class Win32_SystemDriver | Get-Member -MemberType Property)、State というプロパティが存在すること、および、ドライバーが実行中であるときの値が "Running" であることを確認できます。次のように入力してこれらのシステム ドライバーをフィルター処理することによって、実行中のシステム ドライバーだけを選択できます。
Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"}
これでも、非常に多くの情報が出力されます。そこで、StartMode 値も条件に追加し、自動的に開始するように設定されたドライバーだけをフィルター処理で選択してみます。
PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Auto"} DisplayName : RAS Asynchronous Media Driver Name : AsyncMac State : Running Status : OK Started : True DisplayName : Audio Stub Driver Name : audstub State : Running Status : OK Started : True
ドライバーが実行中であることはわかっているので、これには必要でない情報も多く含まれていることになります。実際、この時点で必要となる情報は、おそらく名前と表示名だけです。次のコマンドでは、この 2 つのプロパティのみを追加することによって、よりシンプルな出力結果を取得しています。
PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Manual"} | Format-Table -Property Name,DisplayName Name DisplayName ---- ----------- AsyncMac RAS Asynchronous Media Driver Fdc Floppy Disk Controller Driver Flpydisk Floppy Disk Driver Gpc Generic Packet Classifier IpNat IP Network Address Translator mouhid Mouse HID Driver MRxDAV WebDav Client Redirector mssmbios Microsoft System Management BIOS Driver
上のコマンド例では、Where-Object 要素が 2 つ使用されていますが、次のように、-and 論理演算子を使用すると、これを 1 つの Where-Object 要素で表すことができます。
Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript { ($_.State -eq "Running") -and ($_.StartMode -eq "Manual") } | Format-Table -Property Name,DisplayName
標準的な論理演算子を次の表に示します。
論理演算子 | 意味 | 例 (戻り値は True) |
---|---|---|
-and |
論理積 (2 つの項がどちらも真の場合に True) |
(1 -eq 1) -and (2 -eq 2) |
-or |
論理和 (いずれかの項が真の場合に True) |
(1 -eq 1) -or (1 -eq 2) |
-not |
論理否定 (True と False の反転) |
-not (1 -eq 2) |
! |
論理否定 (True と False の反転) |
!(1 -eq 2) |