系列1中我们已经介绍了WMI的查询语言WQL中的关键字,相信在看完关键字之后,对于WQL的语句肯定不会那么陌生了,然而,有了关键字,自然还是不够的,至少在使用WHEE子句的时候,我们需要用到一些条件不是,而这些条件自然而然的就需要使用到本文说到的东西——运算符。虽然可以看作是SQL的一个子集,但是关键字会有些不同(前面已经有说过),运算符也会有些诧异。那么让我们看看在WQL中有哪些运算符。
既然WQL是SQL的一个自己,可以预见的是WQL中的运算符和SQL中的运算符应该差别也不是很大,在前面将关键字的时候,我们给出的WQL语句中就有部分运算符在使用了,而在关键字列表中,我们也给出了部分的运算符。先给个例子:
SELECT * FROM Win32_NetworkAdapterConfiguration
WHERE IPEnabled=TRUE
在上面例子中我们在WHERE子句中就使用了=运算符,TRUE运算符。进入主题,WQL的基本运算符有以下这些:
WQL运算符 |
WQL运算符描述 |
使用类型 |
= |
等于 |
string, numeric, reference, datetime |
< |
小于 |
string, numeric, datetime |
> |
大于 |
string, numeric, datetime |
<= |
小于或等于 |
string, numeric, datetime |
>= |
大于或等于 |
string, numeric, datetime |
!= 或者 <> |
不等于 |
string, numeric, reference, datetime |
基本运算符,这类运算符和SQL中的运算符一样,为二元比较运算符,但只是SQL中的一个子集,因为没有!<, !>这些。除了这些基本的运算符之外,WQL还支持下面这些特殊点的运算符
WQL运算符 |
WQL运算符描述 |
适用类型 |
IS |
后面仅能跟NULL |
string, numeric, reference, datetime, object |
IS NOT |
后面仅能跟NULL |
string, numeric, reference, datetime, object |
ISA |
is a关系,具体可以参见关键字中的ISA说明 |
UNKOWN |
LIKE |
类似于 |
string |
/*正确的WQL IS NULL和IS NOT NULL的用法*/
SELECT * FROM Win32_LogicalDisk
WHERE FileSystem IS NULL
SELECT * FROM Win32_LogicalDisk
WHERE FileSystem IS NOT NULL
/*WQL中IS 和 IS NOT的错误用法*/
SELECT * FROM Win32_LogicalDisk
WHERE DriveType IS 5
SELECT * FROM Win32_LogicalDisk
WHERE FileSystem IS NOT "NTFS"
在SQL中,IS [NOT] NULL被作为谓词单独列出讨论,而在WQL中,IS [NOT] NULL被当作运算符来讨论,这点MitchellChu不太能够理解其中奥秘,只能按照官方说法,将其归类为运算符一类,可能是WQL确实比较简单,无需进行复杂分类吧。而上面表中的LIKE运算符比较特殊,因为在LIKE中,我们会使用通配符,因此LIKE对通配符也有一个对照表:
Character |
描述 |
[ ] |
任何一个在指定范围内([a=f]) 或者集合([abcdef])的字符 |
^ |
任何一个不在指定范围内 ([^a=f]) 或集合内([^abcdef])的字符 |
% |
任何0(zero)个或多个字符的字符串 。 |
_ (underscore) |
任何一个字符。任何在查询字符串中的下划线必须放到[](Asquare brackets)内进行转义。 |
LIKE示例:
/*在class名称中包含Win的所有实例*/
SELECT * FROM meta_class
WHERE __Class LIKE "%Win%"
/*转义_下划线*/
SELECT * FROM meta_class
WHERE __CLASS LIKE "%[_][_]%"
此外,为了在WHERE子句能够进行多个条件表达式存在,WQL支持使用简单的AND和OR运算符来连接上面运算符的结果。在SQL中,这类运算符称作为:逻辑运算符。WQL中同样没有明确归类。
WQL运算符 |
WQL运算符描述 |
AND |
连接两个布尔表达式,仅都为TRUE是返回TRUE |
OR |
连接两个布尔表达式,单有一个为TRUE是返回TRUE,当OR和AND同时存在,AND优先级高于OR |
NOT |
布尔表达式取反,TRUE时返回FALSE |
示例:
/*
派生于的类名需要是Win32开头的,并且不是Win32_Account或其子类
*/
SELECT * FROM meta_class
WHERE NOT __class < "Win32" AND NOT __this ISA "Win32_Account"
至此,WQL的运算符涵盖的比较全面了,前面关键字和本文的运算符,再配合SQL中的基本语法,你应该可以初步的写些WQL语句了。
附注:
本文内容来源于微软MSDN:WQL Operators,LIKE Operator