about_WQL

適用於: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.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