Learn How to Use the WQL Comparison Operators with PowerShell

Learn How to Use the WQL Comparison Operators with PowerShell

  • Comments 2
  • Likes

Summary: Microsoft Scripting Guy, Ed Wilson, shows how to use the WQL comparison operators with Windows PowerShell in a WQL query and in a filter.

Hey, Scripting Guy! Question  Hey, Scripting Guy! Your WMI blogs this week have been awesome. I have learned a lot about using WMI that I did not know. One thing you mentioned yesterday was the operators, but you only talked about using the equals’ operator. I would like to see some examples of using the different operators.

—SM

Hey, Scripting Guy! Answer Hello SM,

Microsoft Scripting Guy, Ed Wilson, is here. The Scripting Wife decided to surprise me this morning. She told me that she was going to take me out to lunch. Now this is something she never does. In fact, on many days during the week, she will actually bring food to my desk to keep me working through lunch. I, on the other hand, prefer to get up from my desk and actually enjoy eating my food elsewhere during lunch. I also like to do a bit of reading while I am eating lunch. Currently, I have the Encyclopedia Mysteriosa on the table. The short articles are perfect for perusing during lunch. I am not doing anything like actually reading through in sequence; instead, I open random pages and begin reading. It is the literary equivalent to diving into a box of assorted chocolates without reading the schematic on the lid (sorry Forest Gump). So the Scripting Wife found a new German Restaurant that we went to for lunch. I love German food, so it was a special treat (although we had iced tea instead of one of the other beverages that Germany is famous for).

Understanding and using WQL operators in a WQL query

The WQL operators are fairly straightforward to use. It really only takes a bit of practice to use them effectively. In addition, the comparison operators are pretty basic, and they do not have many idiosyncrasies.

Using not equal

For example, to use the not equal operator (<>), you express a condition on the left side of the operator and specify that that condition does not equal what is placed on the right side of the operator. This is easier than it sounds. For example, the clause appearing here says that the state is not equal to stopped. If this condition was for services, running and paused services would be allowed through the filter, but stopped services would be filtered out of the result.

where state <> 'stopped'

The query that follows returns the name and the state properties from services, but it only does this if the state of the service is not equal to stopped. The Get-WmiObject cmdlet is used to perform the query, and a table is created that lists the name and the state of each service.

$query = "Select name,state from win32_service where state <> 'stopped'"

Get-WmiObject -Query $query | Format-Table name, state

The image that follows illustrates running this query and shows a sample of the output from the query.

Image of command output

The following table lists comparison operators that are used in WQL.

Operator

Meaning

=

Equal

<> 

Not equal

Less than

Greater than

<=

Less than or equal

>=

Greater than or equal

!=

Not equal

This table shows that the not equal operator (<>) can also be written as (!=). This is shown here:

$query = "Select name,state from win32_service where state != 'stopped'"

Get-WmiObject -Query $query | Format-Table name, state

Using the greater than or less than operators

The greater than and the less than operators work with letters and numbers. For example, in the following query, the name of each process is selected from all the Win32_Process objects. But this only takes place if the name is less than the letter ‘e’. To make it easier to understand, the results show that the Select-Object cmdlet selects the name, and the Sort-Object cmdlet sorts the output based on the name property. The query and the results from calling the query are shown here.

PS C:\> $query = "select name from win32_process where name < 'e'"

PS C:\> Get-WmiObject -Query $query | select name | sort name

 

name

----

armsvc.exe

BTStackServer.exe

BTTray.exe

btwdins.exe

conhost.exe

csrss.exe

csrss.exe

CxAudMsg64.exe

dpupdchk.exe

dwm.exe

DZSVC64.EXE

Flipping the operator from less than to greater than, produces a list of the other processes. The only thing that appears a bit strange is that the explorer.exe process appears in this listing. But that is because “ex” is “greater than” ‘e’. The query is shown here:

$query = "select name from win32_process where name > 'e'"

Get-WmiObject -Query $query | select name | sort name

Using the less than or equal to operator

The less than or equal to operator filter values that are equivalent to or less than a particular value. In the query that follows, the name and the processID properties from the Win32_Process class are chosen, but only if the processID value is less than or equal to 1004. When evaluating numbers, they do not need to be placed inside quotation marks. The query, and the information associated with the query are shown here:

PS C:\> $query = "select name, processID from win32_process where processID <= 1004"

PS C:\> Get-WmiObject -Query $query | select name, processID | sort processID

 

name                                                                       processID

----                                                                       ---------

System Idle Process                                                                0

System                                                                             4

smss.exe                                                                         316

svchost.exe                                                                      336

csrss.exe                                                                        448

svchost.exe                                                                      456

svchost.exe                                                                      504

wininit.exe                                                                      572

csrss.exe                                                                        580

services.exe                                                                     620

lsass.exe                                                                        644

lsm.exe        &nbsp

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment
  • Hi Ed,

    this is another thing we've got to know about WMI queries.

    Choosing the wrong comparison operator might lead to strange results :-)

    Klaus.

  • @K_Schulte you are correct using the wrong operator will definitely cause strange things to happen. In addition, it can be really hard to detect when you are debugging the script because everything runs properly ... just the results are wrong.