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