共用方式為


about_WQL

簡短描述

描述 WMI 查詢語言 (WQL),可用來在 Windows PowerShell 中取得 WMI 物件。

詳細描述

WQL 是 Windows Management Instrumentation (WMI) 查詢語言,這是用來從 WMI 取得信息的語言。

您不需要使用 WQL 在 Windows PowerShell 中執行 WMI 查詢。 相反地,您可以使用 Get-WmiObjectGet-CimInstance Cmdlet 的參數。 WQL 查詢比標準 Get-WmiObject 命令快一些,而且當命令在數百個系統上執行時,效能會明顯改善。 不過,請確定您花費在撰寫成功的 WQL 查詢所花費的時間不會超過效能改善。

您需要使用 WQL 的基本 WQL 語句為 SELECTWHEREFROM

使用 WQL 的時機

使用 WMI,特別是使用 WQL 時,別忘了您也使用 Windows PowerShell。 通常,如果 WQL 查詢無法如預期般運作,使用標準 Windows PowerShell 命令會比偵錯 WQL 查詢更容易。

除非您從頻寬限制的遠端系統傳回大量數據,否則當有可接受的 PowerShell Cmdlet 執行相同動作時,花費數小時嘗試完善複雜的 WQL 查詢會非常有效率。

使用 SELECT 陳述式

一般的 WMI 查詢會 SELECT 從取得 WMI 類別的所有屬性或特定屬性的 語句開始。 若要選取 WMI 類別的所有屬性,請使用星號 (*)。 FROM關鍵詞會指定 WMI 類別。

語句 SELECT 的格式如下:

SELECT <property> FROM <WMI-class>

例如,下列SELECT語句會從 Win32_Bios WMI 類別的實例中選取所有屬性 (*)。

SELECT * FROM Win32_Bios

注意

PowerShell 只會顯示預設物件屬性。 這些屬性定義於檔案中 Types.ps1xmlSelect-Object使用 Cmdlet 或 Format-* Cmdlet 來顯示其他屬性。

若要選取 WMI 類別的特定屬性,請將屬性名稱放在 和 FROM 關鍵詞之間SELECT

下列查詢只會從 Win32_Bios WMI 類別選取 BIOS 的名稱。 命令會將查詢儲存在變數中 $queryName

SELECT Name FROM Win32_Bios

若要選取多個屬性,請使用逗號來分隔屬性名稱。 下列 WMI 查詢會選取Win32_Bios WMI 類別的名稱和版本。 命令會將查詢儲存在變數中 $queryNameVersion

SELECT name, version FROM Win32_Bios

使用 WQL 查詢

在 Windows PowerShell 命令中使用 WQL 查詢的方法有三種。

  • 使用 Get-WmiObject cmdlet
  • 使用 Get-CimInstance cmdlet
  • [wmisearcher]使用類型加速器。

使用 Get-WmiObject Cmdlet

使用 WQL 查詢的最基本方法是以引弧括住它(以字串表示),然後使用查詢字串作為 Cmdlet 的 Query 參數Get-WmiObject,如下列範例所示。

Get-WmiObject -Query "SELECT * FROM Win32_Bios"
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer      : LENOVO
Name              : Default System BIOS
SerialNumber      : R9FPY3P
Version           : LENOVO - 1360

您也可以將 WQL 語句儲存在變數中,然後使用 變數作為 Query 參數的值,如下列命令所示。

$query = "SELECT * FROM Win32_Bios"
Get-WmiObject -Query $query

您可以使用任一格式搭配任何 WQL 語句。 下列命令會使用 變數中的 $queryName 查詢,只 取得系統 BIOS 的 NameVersion 屬性。

$queryNameVersion = "SELECT Name, Version FROM Win32_Bios"
Get-WmiObject -Query $queryNameVersion
__GENUS          : 2
__CLASS          : Win32_BIOS
__SUPERCLASS     :
__DYNASTY        :
__RELPATH        :
__PROPERTY_COUNT : 2
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
Name             : S03KT39A
Version          : LENOVO - 1270
PSComputerName   :

請記住,您可以使用 Cmdlet 的參數 Get-WmiObject 來取得相同的結果。 例如,下列命令也會取得Win32_Bios WMI 類別實例之 NameVersion 屬性的值

Get-WmiObject -Class Win32_Bios -Property Name, Version
__GENUS          : 2
__CLASS          : Win32_BIOS
__SUPERCLASS     :
__DYNASTY        :
__RELPATH        :
__PROPERTY_COUNT : 2
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
Name             : S03KT39A
Version          : LENOVO - 1270
PSComputerName   :

使用 Get-CimInstance Cmdlet

從 Windows PowerShell 3.0 開始,您可以使用 Get-CimInstance Cmdlet 來執行 WQL 查詢。

Get-CimInstance 會取得 CIM 相容類別的實例,包括 WMI 類別。 引進 Windows PowerShell 3.0 的 CIM Cmdlet 會執行與 WMI Cmdlet 相同的工作。 CIM Cmdlet 符合 WS-Management (WSMan) 標準和 Common Information Model (CIM) 標準,這可讓 Cmdlet 使用相同的技術來管理執行其他操作系統的 Windows 計算機和計算機。

下列命令會 Get-CimInstance 使用 Cmdlet 來執行 WQL 查詢。

任何可與 搭配使用的 Get-WmiObject WQL 查詢也可以搭配 Get-CimInstance使用。

Get-CimInstance -Query "SELECT * FROM Win32_Bios"
SMBIOSBIOSVersion : S03KT39A
Manufacturer      : LENOVO
Name              : S03KT39A
SerialNumber      : MJ0AETTX
Version           : LENOVO - 1270

Get-CimInstance會傳回 CimInstance 物件,而不是傳回的 ManagementObjectGet-WmiObject,但對象相當類似。

PS> (Get-CimInstance -Query "SELECT * FROM Win32_Bios").GetType().FullName
Microsoft.Management.Infrastructure.CimInstance

PS> (Get-WmiObject -Query "SELECT * FROM Win32_Bios").GetType().FullName
System.Management.ManagementObject

使用 wmisearcher 類型加速器

[wmisearcher]類型加速器會從 WQL 語句字串建立 ManagementObjectSearcher 物件。 ManagementObjectSearcher 對象有許多屬性和方法,但最基本的方法是 Get 方法,它會叫用指定的 WMI 查詢並傳回產生的物件。

您可以使用 [wmisearcher],輕鬆存取 ManagementObjectSearcher .NET 類別。 這可讓您查詢 WMI,並設定查詢的執行方式。

若要使用 [wmisearcher] 類型加速器:

  1. 將 WQL 字串轉換成 ManagementObjectSearcher 物件。
  2. 呼叫 ManagementObjectSearcher 物件的 Get 方法

例如,下列命令會轉換 「select all」 查詢、將結果儲存在變數中$bios,然後在變數中$bios呼叫 Get() ManagementObjectSearcher 物件的 方法

$bios = [wmisearcher]"SELECT * FROM Win32_Bios"
$bios.Get()
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer      : LENOVO
Name              : Default System BIOS
SerialNumber      : R9FPY3P
Version           : LENOVO - 1360

您可以使用 [wmisearcher] 型別加速器來轉換查詢或變數。 在下列範例中 [wmisearcher] ,類型加速器是用來轉換變數。 結果相同。

[wmisearcher]$bios = "SELECT * FROM Win32_Bios"
$bios.Get()
SMBIOSBIOSVersion : S03KT39A
Manufacturer      : LENOVO
Name              : S03KT39A
SerialNumber      : MJ0AETTX
Version           : LENOVO - 1270

當您使用 [wmisearcher] 類型加速器時,它會將查詢字串變更為 ManagementObjectSearcher 物件,如下列命令所示。

$a = "SELECT * FROM Win32_Bios"
$a.GetType().FullName
System.String

$a = [wmisearcher]"SELECT * FROM Win32_Bios"
$a.GetType().FullName
System.Management.ManagementObjectSearcher

此命令格式適用於任何查詢。 下列命令會取得Win32_Bios WMI 類別之 Name 屬性的值

$biosname = [wmisearcher]"Select Name from Win32_Bios"
$biosname.Get()
__GENUS          : 2
__CLASS          : Win32_BIOS
__SUPERCLASS     :
__DYNASTY        :
__RELPATH        :
__PROPERTY_COUNT : 1
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
Name             : S03KT39A
PSComputerName   :

使用基本 WQL WHERE 語句

WHERE語句會為語句傳回的數據SELECT建立條件。

WHERE語句的格式如下:

WHERE <property> <operator> <value>

例如:

WHERE Name = 'Notepad.exe'

WHERE語句會與語句搭配SELECT使用,如下列範例所示。

SELECT * FROM Win32_Process WHERE Name = 'Notepad.exe'

使用 WHERE 語句時,屬性名稱和值必須正確無誤。

例如,下列命令會取得本機計算機上的 記事本進程。

Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE name='Notepad.exe'"

不過,下列命令失敗,因為進程名稱包含 .exe 擴展名。

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

還有其他運算子,但這些運算符是用來進行比較的運算符。

例如,下列查詢會從進程優先順序大於或等於11的Win32_Process類別中,選取 [名稱] 和 [優先順序] 屬性。 Cmdlet 會 Get-WmiObject 執行查詢。

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

在 -Filter 參數中使用 WQL 運算子

WQL 運算子也可以用於 或 Get-CimInstance Cmdlet 之 Get-WmiObjectFilter 參數的值,以及這些 Cmdlet 的 Query 參數值。

例如,下列命令會取得前五個進程的名稱ProcessID 屬性,其 ProcessID 值大於 1004。 命令會 使用 Filter 參數來指定 ProcessID 條件。

$getWmiObjectSplat = @{
    Class = 'Win32_Process'
    Property = 'Name', 'ProcessID'
    Filter = "ProcessID >= 1004"
}
Get-WmiObject @getWmiObjectSplat |
    Sort-Object ProcessID |
    Select-Object 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 Operator  Description
--------------------------------------------------
[]             Character in a range [a-f] or a set
               of characters [abcdef]. The items in
               a set don't need to be consecutive or
               listed in alphabetical order.

^              Character not in a range [^a-f] or
               not in a set [^abcdef]. The items in
               a set don't need to be consecutive or
               listed in alphabetical order.

%              A string of zero or more characters

_              One character.
(underscore)   NOTE: To use a literal underscore
               in a query string, enclose it in
               square brackets [_].

LIKE當運算符不使用任何通配符或範圍運算符時,其行為就像等號運算符 (=) ,而且只有在物件與模式完全相符時,才會傳回物件。

您可以將範圍作業與百分比 (%) 通配符結合,以建立簡單且功能強大的篩選。

LIKE 運算元範例

範例 1:[<range>]

下列命令會開始 記事本,然後搜尋名稱開頭為 “H” 與 “N” 之間字母之Win32_Process類別的實例(不區分大小寫)。

查詢應該從 Hotepad.exeNotepad.exe傳回任何進程。

Notepad   # Starts Notepad
$query = "SELECT * FROM Win32_Process WHERE Name LIKE '[H-N]otepad.exe'"
Get-WmiObject -Query $query | Select Name, ProcessID
Name                                ProcessID
----                                ---------
notepad.exe                              1740

範例 2:[<range>] 和 %

下列命令會選取名稱開頭為 A 與 P 之間字母的所有進程(不區分大小寫),後面接著任何組合中的零個或多個字母。

Cmdlet 會 Get-WmiObject 執行查詢、 Select-Object Cmdlet 取得 NameProcessID 屬性,而 Sort-Object Cmdlet 會依名稱依字母順序排序結果。

$query = "SELECT * FROM Win32_Process WHERE name LIKE '[A-P]%'"
Get-WmiObject -Query $query |
    Select-Object -Property Name, ProcessID |
    Sort-Object -Property Name

範例 3:不在範圍中 (^)

下列命令會取得名稱不是以下列任何字母開頭的處理程式:A、S、W、P、R、C、U、N

和後接零或多個字母。

$query = "SELECT * FROM Win32_Process WHERE name LIKE '[^ASWPRCUN]%'"
Get-WmiObject -Query $query |
    Select-Object -Property Name, ProcessID |
    Sort-Object -Property Name

範例 4:任何字元 -- 或無 \

下列命令會取得名稱開頭 calc為的進程。 百分比 (%) 符號是 WQL 通配符。 這相當於PowerShell中的星號 (*) 通配符。

$query = "SELECT * FROM Win32_Process WHERE Name LIKE 'calc%'"
Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
Name                               ProcessID
----                               ---------
calc.exe                                4424

範例 5:一個字元 (_)

下列命令會取得具有下列模式名稱的進程, c_lc.exe 其中底線字元代表任何一個字元。 此模式會比對來自 calc.execzlc.exe、 或 c9lc.exe的任何名稱,但不符合 「c」 和 「l」 以多個字元分隔的名稱。

$query = "SELECT * FROM Win32_Process WHERE Name LIKE 'c_lc.exe'"
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
```powershell

```output
Name                                 ProcessID
----                                 ---------
WLIDSVC.exe                                84

使用 OR 運算子

若要指定多個獨立條件,請使用 OR 關鍵詞。 關鍵詞 OR 會出現在 子句中 WHERE 。 它會在兩個或更多條件上執行包容性 OR 作業,並傳回符合任何條件的專案。

運算子 OR 格式如下:

WHERE <property> <operator> <value> OR <property> <operator> <value> ...

例如,下列命令會取得Win32_Process WMI 類別的所有實例,但只有在進程名稱為 winword.exeexcel.exe時,才會傳回這些實例

$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
  " OR Name='excel.exe'"
Get-WmiObject -Query $q

OR語句可以搭配兩個以上的條件使用。 在下列查詢中 OR ,語句會取得 Winword.exeExcel.exePowershell.exe

$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
  " OR Name='excel.exe' OR Name='powershell.exe'"

使用 AND 運算子

若要指定多個相關條件,請使用 AND 關鍵詞。 關鍵詞 AND 會出現在 子句中 WHERE 。 它會傳回符合所有條件的專案。

運算子 AND 格式如下:

WHERE <property> <operator> <value> `AND` <property> <operator> <value> ...

例如,下列命令會取得名稱 Winword.exe 為 且進程標識碼為6512的進程。

請注意,命令會使用 Get-CimInstance Cmdlet。

$q = "SELECT * FROM Win32_Process WHERE Name = 'winword.exe' " +
  "AND ProcessID =6512"
Get-CimInstance -Query $q
ProcessId   Name             HandleCount      WorkingSetSize   VirtualSize
---------   ----             -----------      --------------   -----------
# 6512      WINWORD.EXE      768              117170176        633028608

所有運算子,包括 LIKE 運算子都與 和 AND 運算子一起OR有效。 此外,您可以在單一查詢中結合 ORAND 運算符與括弧,告知 WMI 要先處理哪些子句。

此命令使用 Windows PowerShell 接續字元 (`) 將命令分成兩行。

搜尋 Null 值

在 WMI 中搜尋 Null 值具有挑戰性,因為它可能會導致無法預測的結果。 Null 不是零,而且不等於空字串。 某些 WMI 類別屬性已初始化,而其他屬性則不是,因此搜尋 null 可能無法用於所有屬性。

若要搜尋 Null 值,請使用 Is 運算子搭配 的值 null

例如,下列命令會取得具有 IntallDate 屬性 Null 值的進程。 命令會傳回許多進程。

$q = "SELECT * FROM Win32_Process WHERE InstallDate is null"
Get-WmiObject -Query $q

相反地,下列命令會取得具有 Description 屬性 Null 值的用戶帳戶。 此命令不會傳回任何用戶帳戶,即使大部分的用戶帳戶沒有 Description 屬性的任何值也一樣。

$q = "SELECT * FROM Win32_UserAccount WHERE Description is null"
Get-WmiObject -Query $q

若要尋找沒有 Description 屬性值的用戶帳戶,請使用等號運算符來取得空字串。 若要表示空字串,請使用兩個連續單引號。

$q = "SELECT * FROM Win32_UserAccount WHERE Description = '' "

使用 true 或 false

若要在 WMI 物件的屬性中取得布林值,請使用 TrueFalse。 它們不區分大小寫。

下列 WQL 查詢只會從已加入網域的電腦傳回本機用戶帳戶。

$q = "SELECT * FROM Win32_UserAccount WHERE LocalAccount = True"
Get-CimInstance -Query $q

若要尋找網域帳戶,請使用 False 的值,如下列範例所示。

$q = "SELECT * FROM Win32_UserAccount WHERE LocalAccount = False"
Get-CimInstance -Query $q

使用逸出字元

WQL 會使用反斜杠 (\) 作為其逸出字元。 這與 Windows PowerShell 不同,它使用反引號字元 (`)。

引號和用於引號的字元通常必須逸出,使其不會被誤解。

若要尋找名稱包含單引號的使用者,請使用反斜杠逸出單引號,如下列命令所示。

$q = "SELECT * FROM Win32_UserAccount WHERE Name = 'Tim O\'Brian'"
Get-CimInstance -Query $q
Name             Caption          AccountType      SID              Domain
----             -------          -----------      ---              ------
Tim O'Brian      FABRIKAM\TimO    512              S-1-5-21-1457... FABRIKAM

在某些情況下,反斜杠也需要逸出。 例如,下列命令會產生無效的查詢錯誤,因為 Caption 值中的反斜杠。

$q = "SELECT * FROM Win32_UserAccount WHERE Caption = 'Fabrikam\TimO'"
Get-CimInstance -Query $q
Get-CimInstance : Invalid query
At line:1 char:1
+ Get-CimInstance -Query $q
+ ~~~~~~~~~~~
  + CategoryInfo          : InvalidArgument: (:) [Get-CimInstance], CimExcep
  + FullyQualifiedErrorId : HRESULT 0x80041017,Microsoft.Management.Infrastr

若要逸出反斜杠,請使用第二個反斜杠字元,如下列命令所示。

$q = "SELECT * FROM Win32_UserAccount WHERE Caption = 'Fabrikam\\TimO'"
Get-CimInstance -Query $q

另請參閱