about_WQL

適用対象: Windows PowerShell 2.0, Windows PowerShell 3.0

トピック

about_WQL

概要

Windows PowerShell® で WMI オブジェクトを取得するために使用できる WMI Query Language (WQL) について説明します。

詳細説明

WQL は、Windows Management Instrumentation (WMI) のクエリ言語であり、WMI から情報を取得するために使用します。

Windows PowerShell で WMI クエリを実行するにあたり、WQL の使用は必須ではありません。代わりに、コマンドレット Get-WmiObject または Get-CimInstance のパラメーターを使用することができます。WQL クエリは、Get-WmiObject の標準的なコマンドよりも若干高速であり、コマンドを何百台のシステムで実行した場合にパフォーマンスの向上が明らかになります。ただし、正しい WQL クエリを記述するために費やした時間がパフォーマンス向上を上回ることはないという点に注意してください。

WQL を使用するために必要な基本的な WQL ステートメントは、Select、Where、および From です。

WQL を使用すべき場合

WMI を使用する場合 (特に WQL とともに使用する場合) は、必ず Windows PowerShell も使用することになる点に注意してください。多くの場合、WQL クエリが期待どおりに機能しないときは、WQL クエリをデバッグするよりも、Windows PowerShell の標準的なコマンドを使用するほうが簡単です。

帯域幅が限られているリモート システムから膨大な量のデータを返す場合を除き、若干低速ではあっても、同じことを行う Windows コマンドレットを問題なく使用できるのであれば、複雑で入り組んだ WQL クエリを完成させるために何時間もかけても、ほぼ確実に生産性が低くなります。

Select ステートメントの使用方法

一般的な WMI クエリは、WMI クラスのすべてのプロパティまたは特定のプロパティを取得する Select ステートメントで開始します。WMI クラスのすべてのプロパティを選択するには、アスタリスク (*) を使用します。From キーワードは WMI クラスを指定します。

Select ステートメントの形式は次のとおりです。

        Select <property> from <WMI-class>

たとえば、次の Select ステートメントでは、Win32_Bios WMI クラスのインスタンスからすべてのプロパティ (*) を選択します。

        Select * from Win32_Bios

WMI クラスの特定のプロパティを選択するには、プロパティ名を Select キーワードと From キーワードの間に配置します。

次のクエリは、Win32_Bios WMI クラスから BIOS の名前のみを選択します。このコマンドは、クエリを $queryName 変数に保存します。

        Select Name from Win32_Bios

複数のプロパティを選択するには、コンマを使用してプロパティ名を区切ります。次の WMI クエリは、Win32_Bios WMI クラスの名前とバージョンを選択します。このコマンドは、$queryNameVersion 変数にクエリを保存します。

        Select name, version from Win32_Bios

WQL クエリの使用方法

WQL クエリを Windows PowerShell コマンドで使用するには 2 つの方法があります。

Get-WmiObject コマンドレットを使用する。

Get-CimInstance コマンドレットを使用する。

[wmisearcher] 型アクセラレータを使用する。

Get-WmiObject コマンドレットの使用方法

WQL クエリを使用するための最も基本的な方法は、次の例で示すように、引用符で (文字列として) 囲み、Get-WmiObject コマンドレットの Query パラメーターの値としてクエリ文字列を使用することです。

        PS C:\> Get-WmiObject -Query "Select * from Win32_Bios"
        SMBIOSBIOSVersion : 8BET56WW (1.36 )
        Manufacturer      : LENOVO
        Name              : Default System BIOS
        SerialNumber      : R9FPY3P
        Version           : LENOVO – 1360

また、次のコマンドに示すように、WQL ステートメントを変数に保存し、Query パラメーターの値としてその変数を使用することもできます。

        PS C:\> $query = "Select * from Win32_Bios"
        PS C:\> Get-WmiObject –Query $query

どちらの形式もすべての WQL ステートメントに使用できます。次のコマンドは、$queryName 変数に保存されているクエリを使用して、システム BIOS の名前とバージョンのプロパティのみを取得します。

        PS C:\> $queryNameVersion = "Select Name, Version from Win32_Bios"
        PS C:\> Get-WmiObject -Query $queryNameVersion
        
        __GENUS          : 2
        __CLASS          : Win32_BIOS
        __SUPERCLASS     :
        __DYNASTY        :
        __RELPATH        :
        __PROPERTY_COUNT : 1
        __DERIVATION     : {}
        __SERVER         :
        __NAMESPACE      :
        __PATH           :
        Name             : Default System BIOS
        Version          : LENOVO - 1360

Get-WmiObject コマンドレットのパラメーターを使用しても同じ結果を得ることができる点に注意してください。たとえば、次のコマンドも、Win32_Bios WMI クラスのインスタンスの Name および Version プロパティの値を取得します。

        PS C:\> Get-WmiObject –Class Win32_Bios -Property Name, Version
        __GENUS          : 2
        __CLASS          : Win32_BIOS
        __SUPERCLASS     :
        __DYNASTY        :
        __RELPATH        :
        __PROPERTY_COUNT : 1
        __DERIVATION     : {}
        __SERVER         :
        __NAMESPACE      :
        __PATH           :
        Name             : Default System BIOS
        Version          : LENOVO - 1360

Get-CimInstance コマンドレットの使用方法

Windows PowerShell 3.0 以降では、Get-CimInstance コマンドレットを使用して WQL クエリを実行できます。

Get-CimInstance は、WMI クラスを含む、CIM 準拠のクラスのインスタンスを取得します。Windows PowerShell 3.0 で導入された CIM コマンドレットは、WMI コマンドレットと同じタスクを実行します。CIM コマンドレットは、WS-Management (WSMan) 標準と Common Information Model (CIM) 標準に準拠しています。そのため、コマンドレットは、Windows コンピューターと他のオペレーティング システムを実行しているコンピューターを、同じ手法で管理できます。

次のコマンドでは、Get-CimInstance コマンドレットを使用して WQL クエリを実行します。

Get-WmiObject で使用できる WQL クエリは、すべて Get-CimInstance でも使用できます。

        PS C:\> Get-CimInstance -Query "Select * from Win32_Bios"
        SMBIOSBIOSVersion : 8BET56WW (1.36 )
        Manufacturer      : LENOVO
        Name              : Default System BIOS
        SerialNumber      : R9FPY3P
        Version           : LENOVO – 1360

Get-WmiObject は ManagementObject を返しますが、Get-CimInstance は CimInstance オブジェクトを返します。ただし、どちらのオブジェクトも非常に似ています。

        PS C:\>(Get-CimInstance -Query "Select * from Win32_Bios").GetType().FullName
        Microsoft.Management.Infrastructure.CimInstance
        PS C:\>(Get-WmiObject -Query "Select * from Win32_Bios").GetType().FullName
        System.Management.ManagementObject

[wmisearcher] 型アクセラレータの使用方法

[wmisearcher] 型アクセラレータは、WQL ステートメントの文字列から ManagementObjectSearcher オブジェクトを作成します。ManagementObjectSearcher オブジェクトには多数のプロパティとメソッドがありますが、最も基本的なメソッドは Get メソッドです。これは、指定された WMI クエリを実行し、結果のオブジェクトを返します。

[wmisearcher] を使用することで、ManagementObjectSearcher .NET Framework クラスに簡単にアクセスできます。これにより、WMI に対してクエリを実行し、クエリを実行する方法を構成できます。

[wmisearcher] 型アクセラレータを使用するには、以下の手順を実行します。

1. WQL 文字列を ManagementObjectSearcher オブジェクトにキャストします。

2. ManagementObjectSearcher オブジェクトの Get メソッドを呼び出します。

たとえば、次のコマンドは、"select all" クエリをキャストして結果を $bios 変数に保存し、$bios 変数内の ManagementObjectSearcher オブジェクトの Get メソッドを呼び出します。

        PS C:\> $bios = [wmisearcher]"Select * from Win32_Bios"
        PS C:\> $bios.Get()
        
        SMBIOSBIOSVersion : 8BET56WW (1.36 )
        Manufacturer      : LENOVO
        Name              : Default System BIOS
        SerialNumber      : R9FPY3P
        Version           : LENOVO – 1360

注記:

既定では、選択されたオブジェクト プロパティのみが表示されます。これらのプロパティは、Types.ps1xml ファイルで定義されます。

[wmisearcher] 型アクセラレータを使用して、クエリまたは変数をキャストすることができます。次の例では、[wmisearcher] 型アクセラレータを使用して変数をキャストします。結果は同じです。

        PS C:\> [wmisearcher]$bios = "Select * from Win32_Bios"
        PS C:\> $bios.Get()
        
        SMBIOSBIOSVersion : 8BET56WW (1.36 )
        Manufacturer      : LENOVO
        Name              : Default System BIOS
        SerialNumber      : R9FPY3P
        Version           : LENOVO – 1360

[wmisearcher] 型アクセラレータを使用すると、次のコマンドに示すように、クエリ文字列が ManagementObjectSearcher オブジェクトに変換されます。

        PS C:\>$a = "Select * from Win32_Bios"
        PS C:\>$a.GetType().FullName
        System.String
        PS C:\>$a = [wmisearcher]"Select * from Win32_Bios"
        PS C:\>$a.GetType().FullName
        System.Management.ManagementObjectSearcher

このコマンド形式は、任意のクエリで使用できます。次のコマンドは、Win32_Bios WMI クラスの Name プロパティの値を取得します。

        PS C:\> $biosname = [wmisearcher]"Select Name from Win32_Bios"
        PS C:\> $biosname.Get()
        
        __GENUS          : 2
        __CLASS          : Win32_BIOS
        __SUPERCLASS     :
        __DYNASTY        :
        __RELPATH        :
        __PROPERTY_COUNT : 1
        __DERIVATION     : {}
        __SERVER         :
        __NAMESPACE      :
        __PATH           :
        Name             : Default System BIOS

この操作は 1 つのコマンドで実行できますが、コマンドの解釈が若干難しくなります。

この形式では、[wmisearcher] 型アクセラレータを使用して WQL クエリ文字列を ManagementObjectSearcher にキャストし、オブジェクトに対して Get メソッドを呼び出すというすべての操作を、1 つのコマンドで行っています。キャストした文字列を囲んでいるかっこ () は、Windows PowerShell に対し、メソッドを呼び出す前に文字列をキャストするよう指示します。

        PS C:\> ([wmisearcher]"Select name from Win32_Bios").Get()
        __GENUS          : 2
        __CLASS          : Win32_BIOS
        __SUPERCLASS     :
        __DYNASTY        :
        __RELPATH        :
        __PROPERTY_COUNT : 1
        __DERIVATION     : {}
        __SERVER         :
        __NAMESPACE      :
        __PATH           :
        Name             : Default System BIOS

WQL の Where ステートメントの基本的な使用方法

Where ステートメントは、Select ステートメントで返されるデータの条件を規定します。

Where ステートメントの形式は次のとおりです。

        where <property> <operator> <value>

たとえば、次のように入力します。

        where Name = 'Notepad.exe'

Where ステートメントは、次の例に示すように、Select ステートメントとともに使用します。

        Select * from Win32_Process where Name = 'Notepad.exe'

Where ステートメントを使用する場合、プロパティの名前と値が正確である必要があります。

たとえば、次のコマンドでは、ローカル コンピューター上のメモ帳のプロセスを取得します。

        PS C:\> Get-WmiObject -Query "Select * from Win32_Process where name = 'Notepad.exe'"

ただし、次のコマンドは失敗します。なぜなら、プロセス名にファイル名拡張子 ".exe" が含まれているためです。

        PS C:\> Get-WmiObject -Query "Select * from Win32_Process where name = 'Notepad'"

Where ステートメントの比較演算子

WQL の Where ステートメントでは、次の演算子が有効です。

    Operator    Description
    -----------------------
    =           Equal
    !=          Not equal
    <>          Not equal
    <           Less than
    >           Greater than
    <=          Less than or equal
    >=          Greater than or equal
    LIKE        Wildcard match
    IS          Evaluates null 
    ISNOT       Evaluates not null
    ISA         Evaluates a member of a WMI class

他の演算子もありますが、比較を行うために使用するのはこれらの演算子です。

たとえば、次のクエリでは、Win32_Process クラスのプロセスから、プロセスの優先度が 11 以上のものについて、Name および Priority プロパティを選択します。Get-WmiObject コマンドレットがクエリを実行します。

        $highPriority = "Select Name, Priority from Win32_Process where Priority >= 11"
        Get-WmiObject -Query $highPriority

フィルター パラメーターでの WQL 演算子の使用方法

WQL 演算子は、コマンドレット Get-WmiObject および Get-CimInstance の Query パラメーターの値としてだけでなく、これらのコマンドレットの Filter パラメーターの値としても使用できます。

たとえば、次のコマンドでは、ProcessID の値が 1004 より大きな最後の 5 個のプロセスの Name および ProcessID プロパティを取得します。このコマンドでは、ProcessID 条件を指定するために Filter パラメーターを使用しています。

        PS C:\> Get-WmiObject -Class Win32_Process `
        -Property Name, ProcessID -Filter "ProcessID >= 1004" | 
        Sort ProcessID | Select Name, ProcessID -Last 5
        
        Name                                 ProcessID
        ----                                 ---------
        SROSVC.exe                                4220
        WINWORD.EXE                               4664
        TscHelp.exe                               4744
        SnagIt32.exe                              4748
        WmiPrvSE.exe                              5056

Like 演算子の使用方法

Like 演算子を使用すると、ワイルドカード文字を使用して、WQL クエリの結果をフィルター処理することができます。

Like 演算子の説明

[]

範囲 [a-f] または文字セット [abcdef] の文字。セット内の項目は、連続していなくてもよく、アルファベット順に列挙する必要もありません。

^

範囲 [^a-f] またはセット [^abcdef] 内にない文字。セット内の項目は、連続していなくてもよく、アルファベット順に列挙する必要もありません。

%

0 個以上の文字からなる文字列。

_

1 個の文字。

(アンダースコア)

注記:

クエリ文字列でリテラルのアンダースコアを使用するには、[_] のように角かっこで囲みます。

ワイルドカード文字や範囲演算子を使用せずに Like 演算子を使用すると、等値演算子 (=) のように動作し、パターンと正確に一致する場合にのみオブジェクトを返します。

範囲演算をパーセント ワイルドカード文字と共に使用することによって、単純かつ強力なフィルターを作成できます。

Like 演算子の例

例 1: [<範囲>]

次のコマンドは、メモ帳を起動し、"H" と "N" の間の文字 (大文字と小文字を区別しない) で始まる名前を持つ Win32_Process クラスのインスタンスを検索します。

このクエリは、Hotepad.exe から Notepad.exe までのすべてのプロセスを返します。

        PS C:\> Notepad   # Starts Notepad
        PS C:\> $query = "Select * from win32_Process where Name LIKE '[H-N]otepad.exe'"
        PS C:\> Get-WmiObject -Query $query | Select Name, ProcessID
        
        Name                                ProcessID
        ----                                ---------
        notepad.exe                              1740

例 2: [<範囲>] と %

次のコマンドは、A から P までの文字 (大文字と小文字を区別しない) で始まり、任意の組み合わせの 0 個以上の文字が続く名前を持つ、すべてのプロセスを選択します。

Get-WmiObject コマンドレットがクエリを実行し、Select-Object コマンドレットが、Name プロパティと ProcessID プロパティを取得し、Sort-Object コマンドレットが結果を名前のアルファベット順に並べ替えます。

        PS C:\>$query = "Select * from win32_Process where name LIKE '[A-P]%'"
        PS C:\>Get-WmiObject -Query $query | 
                  Select-Object -Property Name, ProcessID | 
                  Sort-Object -Property Name

例 3: 範囲外 (^)

次のコマンドでは、A、S、W、P、R、C、U、N 以外の文字で始まり、0 個以上の文字が続く名前を持つプロセスを取得します。

        PS C:\>$query = "Select * from win32_Process where name LIKE '[^ASWPRCUN]%'"
        PS C:\>Get-WmiObject -Query $query | 
                  Select-Object -Property Name, ProcessID | 
                  Sort-Object -Property Name

例 4: ゼロ個以上の任意の文字 (%)

次のコマンドは、名前が「calc」で始まるプロセスを取得します。WQL の記号 % は、正規表現のアスタリスク (*) 記号に相当します。

        PS C:\> $query = "Select * from win32_Process where Name LIKE 'calc%'"
        PS C:\> Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
        
        Name                               ProcessID
        ----                               ---------
        calc.exe                                4424

例 5: 1 文字 (_)

次のコマンドでは、名前がパターン "c_lc.exe" に一致するプロセスを取得します。ここで、アンダースコア文字は任意の 1 文字を表します。このパターンは、calc.exe から czlc.exe、または c9lc.exe などの任意の名前に一致しますが、"c" と "l" の間に 2 個以上の文字が入っている名前には一致しません。

      PS C:\> $query = "Select * from Win32_Process where Name LIKE 'c_lc.exe'"
      PS C:\> Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
        
        Name                                 ProcessID
        ----                                 ---------
        calc.exe                                  4424

例 6: 完全一致

次のコマンドは、WLIDSVC.exe という名前のプロセスを取得します。クエリでは、Like キーワードを使用していますが、値にワイルドカード文字が含まれていないため、完全一致が必要となります。

        $query = "Select * from win32_Process where name LIKE 'WLIDSVC.exe'"
        Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
        Name                                 ProcessID
        ----                                 ---------
        WLIDSVC.exe                                84

Or 演算子の使用方法

複数の独立した条件を指定するには、Or キーワードを使用します。Or キーワードは Where 句の中で使用します。Or キーワードは、2 つ以上の条件に対して包含的 OR 演算を実行し、いずれかの条件を満たす項目を返します。

Or 演算子の形式は次のとおりです。

        Where <property> <operator> <value> or <property> <operator> <value> ...

たとえば、次のコマンドは、Win32_Process WMI クラスのすべてのインスタンスを取得しますが、プロセス名が winword.exe または excel.exe である場合にのみにインスタンスを返します。

        PS C:\>$q = "Select * from Win32_Process where Name = 'winword.exe' or Name = 'excel.exe'"
        PS C:\>Get-WmiObject -Query $q

Or ステートメントは、3 つ以上の条件とともに使用できます。次のクエリの Or ステートメントは、Winword.exe、Excel.exe、または Powershell.exe を取得します。

        $q = "Select * from Win32_Process where Name = 'winword.exe' or Name = 'excel.exe' or Name = 'powershell.exe'"

And 演算子の使用方法

複数の関連する条件を指定するには、And キーワードを使用します。And キーワードは Where 句の中で使用します。And キーワードは、すべての条件に一致する項目を返します。

And 演算子の形式は次のとおりです。

        Where <property> <operator> <value> and <property> <operator> <value> ...

たとえば、次のコマンドは、名前が "Winword.exe" でプロセス ID が 6512 のプロセスを取得します。

このコマンドは Get-CimInstance コマンドレットを使用することに注意してください。

        PS C:\>$q = "Select * from Win32_Process where Name = 'winword.exe' and ProcessID =6512"
        PS C:\> Get-CimInstance -Query $q
        ProcessId        Name             HandleCount      WorkingSetSize   VirtualSize
        ---------        ----             -----------      --------------   -----------
        6512             WINWORD.EXE      768              117170176        633028608

Like 演算子を含むすべての演算子は、Or および And 演算子とともに使用できます。また、Or 演算子と And 演算子を 1 つのクエリ内で組み合わせることができます。その際、かっこを使用して、最初に処理する句を Windows PowerShell に指示します。

このコマンドでは、Windows PowerShell の継続文字 (`) を使用して、コマンドを 2 つの行に分割しています。

        PS C:\> $q = "Select * from Win32_Process `
        where (Name = 'winword.exe' or Name = 'excel.exe') and HandleCount > 700"
        PS C:\> Get-CimInstance -Query $q
        ProcessId        Name             HandleCount      WorkingSetSize   VirtualSize
        ---------        ----             -----------      --------------   -----------
        6512             WINWORD.EXE      797              117268480        634425344
        9610             EXCEL.EXE        727               38858752        323227648

null 値の検索

WMI で null 値を検索するのは困難です。なぜなら、予期しない結果を招く可能性があるためです。null は 0 ではなく、空文字列と等しくもありません。WMI クラスのプロパティの中には、初期化されるものとそうでないものがあるため、null の検索をすべてのプロパティに使用できない場合があります。

null 値を検索するには、Is 演算子と値 "null" を使用します。

たとえば、次のコマンドは、IntallDate プロパティの値が null のプロセスを取得します。このコマンドは多数のプロセスを返します。

PS C:\>$q = "Select * from Win32_Process where InstallDate is null"
        PS C:\>Get-WmiObject -Query $q

これに対し、次のコマンドは、Description プロパティの値が null のユーザー アカウントを取得します。このコマンドは、ほとんどのユーザー アカウントの Description プロパティに値が設定されていない場合でも、ユーザー アカウントをまったく返しません。

        PS C:\>$q = "Select * from Win32_UserAccount where Description is null"
        PS C:\>Get-WmiObject -Query $q

Description プロパティに値が設定されていないユーザー アカウントを検索するには、等値演算子を使用して空文字列を取得します。空文字列を表現するには、2 つの連続する単一引用符を使用します。

        $q = "Select * from Win32_UserAccount where Description = '' "

True または False の使用方法

WMI オブジェクトのプロパティ内のブール値を取得するには、True と False を使用します。大文字と小文字は区別されません。

次の WQL クエリは、ドメインに参加しているコンピューターからローカル ユーザー アカウントのみを返します。

        PS C:\>$q = "Select * from Win32_UserAccount where LocalAccount = True"
        PS C:\>Get-CimInstance -Query $q

ドメイン アカウントを検索するには、次の例に示すように値 False を使用します。

        PS C:\>$q = "Select * from Win32_UserAccount where LocalAccount = False"
        PS C:\>Get-CimInstance -Query $q

エスケープ文字の使用方法

WQL では、エスケープ文字としてバックスラッシュ (\) を使用します。これは、バッククォート文字 (`) を使用する Windows PowerShell とは異なります。

引用符や、引用マークとして使用される文字は、誤って解釈されないように、多くの場合エスケープする必要があります。

名前に単一引用符を含むユーザーを検索するには、次のコマンドに示すように、バックスラッシュを使用して単一引用符をエスケープします。

        PS C:\> $q = "Select * from Win32_UserAccount where Name = 'Tim O\'Brian'"
        PS C:\> Get-CimInstance -Query $q
        Name             Caption          AccountType      SID              Domain
        ----             -------          -----------      ---              ------
        Tim O'Brian      FABRIKAM\TimO    512              S-1-5-21-1457... FABRIKAM

バックスラッシュのエスケープが必要な場合もあります。たとえば、次のコマンドでは、Caption 値の中にバックスラッシュがあるため、Invalid Query エラーが発生します。

        PS C:\> $q = "Select * from Win32_UserAccount where Caption = 'Fabrikam\TimO'"
        PS C:\> Get-CimInstance -Query $q
        Get-CimInstance : Invalid query
        At line:1 char:1
        + Get-CimInstance -Query $q
        + ~~~~~~~~~~~~~~~~~~~~~~~~~
            + CategoryInfo          : InvalidArgument: (:) [Get-CimInstance], CimException
            + FullyQualifiedErrorId : HRESULT 0x80041017,Microsoft.Management.Infrastructure.CimCmdlets

バックスラッシュをエスケープするには、次のコマンドに示すように、2 つ目のバックスラッシュを使用します。

        PS C:\> $q = "Select * from Win32_UserAccount where Caption = 'Fabrikam\\TimO'"
        PS C:\> Get-CimInstance -Query $q

関連項目

about_Escape_Characters

about_Quoting_Rules

about_WMI

about_WMI_Cmdlets