about_WQL
簡短描述
描述 WMI 查詢語言 (WQL),可用來在 Windows PowerShell 中取得 WMI 物件。
詳細描述
WQL 是 Windows Management Instrumentation (WMI) 查詢語言,這是用來從 WMI 取得信息的語言。
您不需要使用 WQL 在 Windows PowerShell 中執行 WMI 查詢。
相反地,您可以使用 Get-WmiObject
或 Get-CimInstance
Cmdlet 的參數。 WQL 查詢比標準 Get-WmiObject
命令快一些,而且當命令在數百個系統上執行時,效能會明顯改善。 不過,請確定您花費在撰寫成功的 WQL 查詢所花費的時間不會超過效能改善。
您需要使用 WQL 的基本 WQL 語句為 SELECT
、 WHERE
與 FROM
。
使用 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.ps1xml
。 Select-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 的 Name 和 Version 屬性。
$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 類別實例之 Name 和 Version 屬性的值。
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]
類型加速器:
- 將 WQL 字串轉換成 ManagementObjectSearcher 物件。
- 呼叫 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-WmiObject
Filter 參數的值,以及這些 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.exe
Notepad.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 取得 Name 和 ProcessID 屬性,而 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.exe
czlc.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.exe
或excel.exe
時,才會傳回這些實例。
$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
" OR Name='excel.exe'"
Get-WmiObject -Query $q
OR
語句可以搭配兩個以上的條件使用。 在下列查詢中 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
格式如下:
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
有效。 此外,您可以在單一查詢中結合 OR
和 AND
運算符與括弧,告知 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 物件的屬性中取得布林值,請使用 True
和 False
。
它們不區分大小寫。
下列 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