Dela via


about_WQL

Kort beskrivning

Beskriver WMI Query Language (WQL), som kan användas för att hämta WMI-objekt i Windows PowerShell.

Lång beskrivning

WQL är WMI-frågespråket (Windows Management Instrumentation), som är det språk som används för att hämta information från WMI.

Du behöver inte använda WQL för att utföra en WMI-fråga i Windows PowerShell. I stället kan du använda parametrarna Get-WmiObject för cmdletarna eller Get-CimInstance . WQL-frågor är något snabbare än standardkommandon Get-WmiObject och den förbättrade prestandan är tydlig när kommandona körs på hundratals system. Se dock till att den tid du lägger på att skriva en lyckad WQL-fråga inte uppväger prestandaförbättringen.

De grundläggande WQL-instruktioner som du behöver använda WQL är SELECT, WHEREoch FROM.

När du ska använda WQL

När du arbetar med WMI, och särskilt med WQL, glöm inte att du också använder Windows PowerShell. Om en WQL-fråga inte fungerar som förväntat är det ofta enklare att använda ett Windows PowerShell-standardkommando än att felsöka WQL-frågan.

Om du inte returnerar enorma mängder data från bandbreddsbegränsade fjärrsystem är det sällan produktivt att ägna timmar åt att försöka fullända en komplicerad WQL-fråga när det finns en acceptabel PowerShell-cmdlet som gör samma sak.

Använda SELECT-instruktionen

En typisk WMI-fråga börjar med en SELECT instruktion som hämtar alla egenskaper eller särskilda egenskaper för en WMI-klass. Om du vill välja alla egenskaper för en WMI-klass använder du en asterisk (*). Nyckelordet FROM anger WMI-klassen.

En SELECT instruktion har följande format:

SELECT <property> FROM <WMI-class>

Följande instruktion väljer till exempel SELECT alla egenskaper (*) från instanserna av Win32_Bios WMI-klassen.

SELECT * FROM Win32_Bios

Kommentar

PowerShell visar bara standardobjektegenskaperna. Dessa egenskaper definieras i Types.ps1xml filen. Använd cmdleten Select-Object eller en Format-* cmdlet för att visa ytterligare egenskaper.

Om du vill välja en viss egenskap för en WMI-klass placerar du egenskapsnamnet mellan nyckelorden SELECT och FROM .

Följande fråga väljer endast namnet på BIOS från klassen Win32_Bios WMI. Kommandot sparar frågan i variabeln $queryName .

SELECT Name FROM Win32_Bios

Om du vill välja fler än en egenskap använder du kommatecken för att avgränsa egenskapsnamnen. Följande WMI-fråga väljer namnet och versionen av Win32_Bios WMI-klassen. Kommandot sparar frågan i variabeln $queryNameVersion .

SELECT name, version FROM Win32_Bios

Använda WQL-frågan

Det finns tre sätt att använda WQL-fråga i Windows PowerShell-kommandot.

  • Använda cmdleten Get-WmiObject
  • Använda cmdleten Get-CimInstance
  • [wmisearcher] Använd typacceleratorn.

Använda cmdleten Get-WmiObject

Det mest grundläggande sättet att använda WQL-frågan är att omsluta den inom citattecken (som en sträng) och sedan använda frågesträngen som värdet för frågeparametern för cmdletenGet-WmiObject, som du ser i följande exempel.

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

Du kan också spara WQL-instruktionen i en variabel och sedan använda variabeln som värdet för frågeparametern , som du ser i följande kommando.

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

Du kan använda något av formaten med valfri WQL-instruktion. Följande kommando använder frågan i variabeln $queryName för att endast hämta egenskaperna Namn och Version för systemets BIOS.

$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   :

Kom ihåg att du kan använda cmdletens Get-WmiObject parametrar för att få samma resultat. Följande kommando hämtar till exempel även värdena för egenskaperna Namn och Version för instanser av klassen Win32_Bios WMI.

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   :

Använda cmdleten Get-CimInstance

Från och med Windows PowerShell 3.0 kan du använda cmdleten Get-CimInstance för att köra WQL-frågor.

Get-CimInstance hämtar instanser av CIM-kompatibla klasser, inklusive WMI-klasser. CIM-cmdletarna, som introducerade Windows PowerShell 3.0, utför samma uppgifter som WMI-cmdletarna. CIM-cmdletarna följer WS-Management-standarderna (WSMan) och standarden Common Information Model (CIM), som gör det möjligt för cmdletarna att använda samma tekniker för att hantera Windows-datorer och -datorer som kör andra operativsystem.

Följande kommando använder cmdleten Get-CimInstance för att köra en WQL-fråga.

Alla WQL-frågor som kan användas med Get-WmiObject kan också användas med Get-CimInstance.

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

Get-CimInstance returnerar ett CimInstance-objekt i stället för det ManagementObject som Get-WmiObject returneras, men objekten är ganska lika.

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

Använda acceleratorn av typen wmisearcher

Typacceleratorn [wmisearcher] skapar ett ManagementObjectSearcher-objekt från en WQL-instruktionssträng. Objektet ManagementObjectSearcher har många egenskaper och metoder, men den mest grundläggande metoden är metoden Get, som anropar den angivna WMI-frågan och returnerar de resulterande objekten.

Med får [wmisearcher]du enkel åtkomst till klassen ManagementObjectSearcher .NET. På så sätt kan du fråga WMI och konfigurera hur frågan utförs.

Så här använder [wmisearcher] du typacceleratorn:

  1. Omvandla WQL-strängen till ett ManagementObjectSearcher-objekt .
  2. Anropa metoden Get för Objektet ManagementObjectSearcher .

Följande kommando genererar till exempel frågan "välj alla", sparar resultatet i variabeln och anropar Get() sedan metoden för Objektet ManagementObjectSearcher i variabeln$bios.$bios

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

Du kan använda [wmisearcher] typacceleratorn för att omvandla frågan eller variabeln. I följande exempel [wmisearcher] används typacceleratorn för att omvandla variabeln. Resultatet är detsamma.

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

När du använder [wmisearcher] typacceleratorn ändras frågesträngen till ett ManagementObjectSearcher-objekt , enligt följande kommandon.

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

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

Det här kommandoformatet fungerar på alla frågor. Följande kommando hämtar värdet för egenskapen Name för klassen Win32_Bios WMI.

$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   :

Använda den grundläggande WQL WHERE-instruktionen

En WHERE instruktion upprättar villkor för de data som en SELECT instruktion returnerar.

Instruktionen WHERE har följande format:

WHERE <property> <operator> <value>

Till exempel:

WHERE Name = 'Notepad.exe'

-instruktionen WHERE används med -instruktionen SELECT , som du ser i följande exempel.

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

När du använder -instruktionen WHERE måste egenskapsnamnet och värdet vara korrekta.

Följande kommando hämtar till exempel Anteckningar-processerna på den lokala datorn.

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

Följande kommando misslyckas dock eftersom processnamnet innehåller filnamnstillägget .exe .

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

WHERE-instruktionsjämförelseoperatorer

Följande operatorer är giltiga i en WQL-instruktion 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

Det finns andra operatorer, men det här är de som används för att göra jämförelser.

Följande fråga väljer till exempel egenskaperna Namn och Prioritet från processer i klassen Win32_Process där processprioriteten är större än eller lika med 11. Cmdleten Get-WmiObject kör frågan.

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

Använda WQL-operatorerna i parametern -Filter

WQL-operatorerna kan också användas i värdet för filterparametern Get-WmiObject för cmdletarna eller Get-CimInstance samt i värdet för frågeparametrarna för dessa cmdletar.

Följande kommando hämtar till exempel egenskaperna Namn och ProcessID för de fem senaste processerna som har ProcessID-värden som är större än 1004. Kommandot använder filterparametern för att ange ProcessID-villkoret .

$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

använda LIKE-operatorn

Med LIKE operatorn kan du använda jokertecken för att filtrera resultatet av en WQL-fråga.

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 [_].

När operatorn LIKE används utan jokertecken eller intervalloperatorer fungerar den som likhetsoperatorn (=) och returnerar endast objekt när de är en exakt matchning för mönstret.

Du kan kombinera intervallåtgärden med jokertecknet procent (%) för att skapa enkla, men ändå kraftfulla filter.

Exempel på LIKE-operator

Exempel 1: [<intervall>]

Följande kommandon startar Anteckningar och söker sedan efter en instans av klassen Win32_Process som har ett namn som börjar med en bokstav mellan "H" och "N" (skiftlägesokänslig).

Frågan ska returnera alla processer från Hotepad.exe och med 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

Exempel 2: [<intervall>] och %

Följande kommandon väljer alla processer som har ett namn som börjar med en bokstav mellan A och P (skiftlägesokänslig) följt av noll eller fler bokstäver i valfri kombination.

Cmdleten Get-WmiObject kör frågan, cmdleten Select-Object hämtar egenskaperna Namn och ProcessID och cmdleten Sort-Object sorterar resultaten i alfabetisk ordning efter namn.

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

Exempel 3: Inte inom intervallet (^)

Följande kommando hämtar processer vars namn inte börjar med något av följande bokstäver: A, S, W, P, R, C, U, N

och följde noll eller fler bokstäver.

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

Exempel 4: Alla tecken – eller inga (%)

Följande kommandon hämtar processer som har namn som börjar med calc. Symbolen procent (%) är jokertecknet WQL. Det motsvarar jokertecknet asterisk (*) i PowerShell.

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

Exempel 5: Ett tecken (_)

Följande kommandon hämtar processer som har namn som har följande mönster, c_lc.exe där understreckstecknet representerar ett enda tecken. Det här mönstret matchar alla namn från calc.exe , czlc.exeeller c9lc.exe, men matchar inte namn där "c" och "l" avgränsas med mer än ett tecken.

$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

Exempel 6: Exakt matchning

Följande kommandon hämtar processer med namnet WLIDSVC.exe. Även om frågan använder nyckelordet LIKE kräver det en exakt matchning eftersom värdet inte innehåller några jokertecken.

$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

Använda OPERATORN OR

Om du vill ange flera oberoende villkor använder du nyckelordet OR . Nyckelordet OR visas i WHERE -satsen. Den utför en inkluderande OR åtgärd på två (eller flera) villkor och returnerar objekt som uppfyller något av villkoren.

Operatorn OR har följande format:

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

Följande kommandon hämtar till exempel alla instanser av WMI-klassen Win32_Process men returnerar dem endast om processnamnet är winword.exe eller excel.exe.

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

-instruktionen OR kan användas med fler än två villkor. I följande fråga får Winword.exe-instruktionen OR , Excel.exeeller Powershell.exe.

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

Använda OPERATORN AND

Om du vill ange flera relaterade villkor använder du nyckelordet AND . Nyckelordet AND visas i WHERE -satsen. Den returnerar objekt som uppfyller alla villkor.

Operatorn AND har följande format:

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

Följande kommandon hämtar till exempel processer som har namnet Winword.exe och process-ID:t 6512.

Observera att kommandona använder cmdleten Get-CimInstance .

$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

Alla operatorer, inklusive operatorerna LIKE , är giltiga med operatorerna OR och AND . Och du kan kombinera operatorerna OR och AND i en enda fråga med parenteser som talar om för WMI vilka satser som ska bearbetas först.

Det här kommandot använder fortsättningstecknet för Windows PowerShell (`) och delar upp kommandot i två rader.

Söka efter null-värden

Det är svårt att söka efter null-värden i WMI eftersom det kan leda till oförutsägbara resultat. Null är inte noll och motsvarar inte en tom sträng. Vissa WMI-klassegenskaper initieras och andra inte, så en sökning efter null kanske inte fungerar för alla egenskaper.

Om du vill söka efter null-värden använder du operatorn Is med värdet null.

Följande kommandon hämtar till exempel processer som har ett null-värde för egenskapen IntallDate . Kommandona returnerar många processer.

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

Följande kommando hämtar däremot användarkonton som har ett null-värde för egenskapen Description . Det här kommandot returnerar inga användarkonton, även om de flesta användarkonton inte har något värde för egenskapen Description .

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

Om du vill hitta användarkonton som inte har något värde för egenskapen Description använder du likhetsoperatorn för att hämta en tom sträng. Om du vill representera den tomma strängen använder du två enkla citattecken i följd.

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

Använda sant eller falskt

Om du vill hämta booleska värden i egenskaperna för WMI-objekt använder du True och False. De är inte skiftlägeskänsliga.

Följande WQL-fråga returnerar endast lokala användarkonton från en domänansluten dator.

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

Om du vill hitta domänkonton använder du värdet False, som du ser i följande exempel.

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

Använda escape-tecknet

WQL använder omvänt snedstreck (\) som escape-tecken. Detta skiljer sig från Windows PowerShell, som använder backtick-tecknet (`).

Citattecken och de tecken som används för citattecken måste ofta vara undantagna så att de inte misstolkas.

Om du vill hitta en användare vars namn innehåller ett enkelt citattecken använder du ett omvänt snedstreck för att undkomma det enkla citattecknet, som du ser i följande kommando.

$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

I vissa fall måste omvänt snedstreck också vara undantagna. Följande kommandon genererar till exempel ett ogiltigt frågefel på grund av omvänt snedstreck i värdet Bildtext.

$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

Om du vill undvika omvänt snedstreck använder du ett andra omvänt snedstreck, som du ser i följande kommando.

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

Se även