about_WQL
適用於: Windows PowerShell 2.0, Windows PowerShell 3.0
主題
about_WQL
簡短描述
描述 WMI 查詢語言 (WQL),這可用於取得 Windows PowerShell® 中的 WMI 物件。
詳細描述
WQL 是 Windows Management Instrumentation (WMI) 查詢語言,這是用來從 WMI 取得資訊的語言。
若要在 Windows PowerShell 中執行 WMI 查詢,您不需要使用 WQL。相反地,您可以使用 Get-WmiObject 或 Get-CimInstance Cmdlet 的參數。WQL 查詢速度比標準 Get-WmiObject 命令稍微快,在數百部系統上執行命令時,會明顯提升效能。不過,請確保您花在撰寫成功 WQL 查詢的時間對提升效能有所助益。
使用 WQL 所需的基本 WQL 陳述式包括 Select、Where 和 From。
使用 WQL 的時機
使用 WMI 時 (特別是使用 WQL),請記得也會使用 Windows PowerShell。如果 WQL 查詢無法如預期運作,使用標準 Windows PowerShell 命令通常會比偵錯 WQL 查詢來得容易。
除非您想要從多部頻寬受限的遠端系統傳回大量資料,否則在有適用的 Windows Cmdlet 可以執行相同作業的情況下 (可能稍微慢一些),卻花很多時間嘗試改善錯綜複雜的 WQL 查詢,這對提升效能並不會有太多助益。
使用 SELECT 陳述式
典型的 WMI 查詢是以 Select 陳述式為開頭,該陳述式可取得 WMI 類別的所有屬性或特定屬性。若要選取 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 查詢
在 Windows PowerShell 命令中使用 WQL 查詢的方式有兩種。
使用 Get-WmiObject Cmdlet
使用 Get-CimInstance Cmdlet
使用 [wmisearcher] 類型快速鍵。
使用 GET-WMIOBJECT CMDLET
使用 WQL 查詢的最基本方式是以引號括住查詢 (做為字串),然後使用查詢字串做為 Get-WmiObject Cmdlet 的 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 Cmdlet 的參數來取得相同的結果。例如,下列命令也會取得 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 CMDLET
從 Windows PowerShell 3.0 開始,您可以使用 Get-CimInstance Cmdlet 來執行 WQL 查詢。
Get-CimInstance 可取得與 CIM 相容的類別執行個體,包括 WMI 類別。CIM Cmdlet 是在 Windows PowerShell 3.0 中引進的,可執行與 WMI Cmdlet 相同的工作。CIM Cmdlet 符合 WS-Management (WSMan) 標準和「通用訊息模型」(CIM) 標準,可讓 Cmdlet 使用相同的技術來管理 Windows 電腦和執行其他作業系統的電腦。
下列命令使用 Get-CimInstance Cmdlet 來執行 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-CimInstance 會傳回 CimInstance 物件,而不是 Get-WmiObject 所傳回的 ManagementObject,但這兩種物件相當類似。
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 方法。
例如,下列命令會轉型 [全選] 查詢,將結果儲存在 $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
您可以在單一命令中執行這項作業,不過該命令在解譯方面比較困難。
在這種格式中,您可以使用 [wmisearcher] 類型快速鍵將 WQL 查詢字串轉型為 ManagementObjectSearcher,然後對物件呼叫 Get 方法;全部都在單一命令中完成。括住轉型字串的括號 () 會指示 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 類別中處理序的 Name 和 Priority 屬性,其中處理序優先順序大於或等於 11。Get-WmiObject 會執行查詢。
$highPriority = "Select Name, Priority from Win32_Process where Priority >= 11"
Get-WmiObject -Query $highPriority
在 FILTER 參數中使用 WQL 運算子
WQL 運算子也可用於 Get-WmiObject 或 Get-CimInstance Cmdlet 的 Filter 參數值,以及用於這些 Cmdlet 的 Query 參數值。
例如,下列命令會取得其 ProcessID 值大於 1004 之最後五個處理序的 Name 和 ProcessID 屬性。該命令使用 Filter 參數來指定 ProcessID 條件。
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] 中的字元。集合中的項目不需要是連續的或依字母順序列出。
%
零或多個字元的字串
_
一個字元。
(底線)
注意:
若要在查詢字串中使用常值底線,請以方括號括住底線 [_]。
如果使用 Like 運算子時未搭配任何萬用字元或範圍運算子,其運作方式會類似等號比較運算子 (=),並僅在完全符合模式時才會傳回物件。
您可以結合範圍運算和百分比萬用字元,以建立簡單卻功能強大的篩選器。
LIKE 運算子範例
範例 1:[<range>]
下列命令會啟動 [記事本],然後搜尋以介於 "H" 和 "N" 之間的字母 (不區分大小寫) 為名稱開頭的 Win32_Process 類別執行個體。
該查詢應該會傳回從 Hotpad.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:[<range>] 和 %
下列命令會選取以介於 A 和 P 之間的字母 (不區分大小寫),後面接著零或多個任意組合的字母為名稱開頭的所有處理序。
Get-WmiObject Cmdlet 會執行查詢,Select-Object Cmdlet 會取得 Name 和 ProcessID 屬性,而 Sort-Object Cmdlet 會依名稱字母順序排序結果。
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,且後面接著零或多個字母的處理序。
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:一個字元 (_)
下列命令會取得其名稱具有模式 "c_lc.exe" 的處理序,其中底線字元可以是任何一個字元。這個模式會比對從 calc.exe 到 czlc.exe 的任何名稱,或比對 c9lc.exe,但不會比對以多個字元分隔 "c" 和 "l" 的名稱。
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 運算,並傳回符合任何條件的項目。
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 陳述式可搭配兩個以上的條件使用。在下列查詢中,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。
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 運算子,以指示 Windows PowerShell 先處理哪些子句。
這個命令使用 Windows PowerShell 接續字元 (') 將命令分成兩行。
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 既不是零,也不是空字串。由於某些 WMI 類別屬性已初始化,而某些屬性尚未初始化,因此不是所有屬性都能夠搜尋 null。
若要搜尋 null 值,請搭配 "null" 值使用 Is 運算子。
例如,下列命令會取得其 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 屬性值的使用者帳戶,請使用等號比較運算子來取得空字串。若要表示空字串,請使用兩個連續的單引號。
$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 值中有反斜線。
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
若要逸出反斜線,請使用第二個反斜線字元,如下列命令所示。
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