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
, WHERE
och 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:
- Omvandla WQL-strängen till ett ManagementObjectSearcher-objekt .
- 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.exe
eller 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.exe
eller 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