WHERE 子句 (WMI)
使用 WHERE 子句可缩小数据、事件或架构查询的范围。 有关详细信息,请参阅使用 WQL 进行查询。 WHERE 子句由属性或关键字、运算符和常量组成。 所有 WHERE 子句都必须指定 Windows Management Instrumentation (WMI) 查询语言 (WQL) 中包含的预定义运算符之一。 可以使用以下形式之一将 WHERE 子句追加到 SELECT 语句中:
SELECT * FROM class WHERE property operator constant
SELECT * FROM class WHERE constant operator property
其中 * 是查询的相关项,class 是要在其中查询的类,constant、operator 和 property 是要使用的常量、运算符和属性或关键字。 有关 SELECT 语句的详细信息,请参阅用于数据查询的 SELECT 语句、用于事件查询的 SELECT 语句或用于架构查询的 SELECT 语句。
常量的值必须为属性的正确类型。 此外,运算符必须是有效的 WQL 运算符列表中的项。 在 WHERE 子句中,属性名称或常量必须出现在运算符的任一侧。
可以在 WHERE 子句中使用字符串文本,例如“NTFS”。 如果要在字符串中包含以下特殊字符,必须先在字符前面加上反斜杠 (\) 来转义字符:
- 反斜杠 (\\)
- 双引号 (\")
- 单引号 (\')
不能使用任意算术表达式。 例如,以下查询仅返回表示 NTFS 驱动器的 Win32_LogicalDisk 类的实例:
SELECT * FROM Win32_LogicalDisk WHERE FileSystem = "NTFS"
属性名称不能都出现在运算符的两侧。 以下查询是一个无效查询的示例:
SELECT * FROM PhysicalDisk WHERE Partitions < (4 + 7 - 2)
OR (Partitions = SectorsPerTrack / 7)
对于 WHERE 子句中大多数类描述符的使用,WMI 会将查询标记为无效并返回错误。 但是,请将点 (.) 运算符用于 WMI 中类型对象的属性。 例如,如果 Prop 是 MyClass 的有效属性并且是类型对象,则以下查询有效:
SELECT * FROM MyClass WHERE Prop.embedprop = 5
比较测试始终不区分大小写。 也就是说,以下三个语句的计算结果均为 TRUE:
SELECT * FROM MyClass WHERE Prop1 = "cat"
SELECT * FROM MyClass WHERE Prop1 = "CAT"
SELECT * FROM MyClass WHERE Prop1 = "cAt"
可以构造包含布尔数据类型的查询,但唯一有效的布尔操作数类型是 =、!= 和 <> 类型。 值 TRUE 等效于数字 1,值 FALSE 等效于数字 0。 以下示例是将布尔值与值 TRUE 或 FALSE 进行比较的查询。
SELECT * FROM MyClass WHERE BoolProp = 1
SELECT * FROM MyClass WHERE BoolProp = TRUE
SELECT * FROM MyClass WHERE BoolProp <> FALSE
SELECT * FROM MyClass WHERE BoolProp = 0
SELECT * FROM MyClass WHERE BoolProp = FALSE
SELECT * FROM MyClass WHERE BoolProp != 1
SELECT * FROM MyClass WHERE BoolProp != FALSE
SELECT * FROM MyClass WHERE BoolProp <> FALSE
以下示例是尝试使用无效操作数的无效查询。
SELECT * FROM MyClass WHERE BoolProp <= TRUE
SELECT * FROM MyClass WHERE BoolProp >= 0
SELECT * FROM MyClass WHERE BoolProp > FALSE
SELECT * FROM win32_computersystem WHERE infraredsupported >= null
可以使用逻辑运算符和括号子表达式在一个 WHERE 子句中组合多组属性、运算符和常量。 每组都必须使用 AND、OR 或 NOT 运算符联接,如以下查询所示。 第一个查询检索 Name 属性设置为 C 或 D 的 Win32_LogicalDisk 类的所有实例:
SELECT * FROM Win32_LogicalDisk WHERE Name = "C:" OR Name = "D:"
第二个查询检索名为“C:”或“D:”的磁盘,但只有当它们剩余有一定量的可用空间并且具有 NTFS 文件系统时才会检索:
SELECT * FROM Win32_LogicalDisk WHERE (Name = "C:" OR Name = "D:")
AND FreeSpace > 2000000 AND FileSystem = "NTFS"
此示例演示使用 WHERE 子句的架构查询。
SELECT * FROM meta_class WHERE __this ISA "myClassName"
类 meta_class 将这标识为架构查询,名为 __this 的属性标识查询的目标类,ISA 运算符请求目标类的子类的定义。 因此,上述查询返回 myClassName 类的定义及其所有子类的定义。
以下示例是结合使用 ASSOCIATORS OF 语句与 WHERE 的数据查询:
ASSOCIATORS OF {myClass.keyVal="Value1"} WHERE ClassDefsOnly
下一个示例演示结合使用 ASSOCIATORS OF 与 WHERE 的架构查询:
ASSOCIATORS OF {myClass} WHERE SchemaOnly
以下示例是结合使用 REFERENCES OF 语句与 WHERE 的数据查询:
REFERENCES OF {myClass.keyVal="Value1"}
WHERE RequiredQualifier = myQual
此最后一个示例是结合使用 REFERENCES OF 与 WHERE 的架构查询:
REFERENCES OF {myClass} WHERE SchemaOnly
除了 WMI DATETIME 格式外,WQL WHERE 子句还支持多种其他日期和时间格式: