WQL

 

查询 WHERE 子句中的值

编写 WQL 查询时,通常查找的是完整的值。例如,如果想返回计算机上名称为 SCRIPTS 的所有文件夹的集合,则需要使用与以下内容类似的查询:

 

"SELECT * FROM WIN32_DIRECTORY WHERE FILENAME = 'SCRIPTS'"

 

不过,有时您关注的是部分值而不是完整值,此时需要进行某种模式匹配。例如,假设有一组名称与以下内容类似的文件夹:

 

SCRIPTS-1

SCRIPTS-2

SCRIPTS-3

SCRIPTS-4

 

您清楚地知道自己想要做什么:您想要返回一个集合,其中包含名称以字符 SCRIPTS- 开头(连字号后可能有某个其他字符或一组字符)的所有文件夹。在 WINDOWS 2000 中,无法编写能够进行这种模式匹配的查询。您只能返回文件系统中所有文件夹的集合(这本身可能就是一个很漫长的过程),然后检查每个文件夹名称,看其是否与模式匹配。例如:

 

IF (LEFT, OBJFOLDER.FILENAME, 8) = "SCRIPTS-" THEN

 

这种方法虽然有效,但无疑速度很慢,并且也不够巧妙。

 

LIKE 运算符简介

这正是 LIKE 运算符可以发挥作用的地方。可以使用 LIKE 运算符(同样只能在 WINDOWS SERVER 2003 WINDOWS XP 中使用)在查询中包含模式匹配。想要返回一个由名称以字符 SCRIPTS- 开头的所有文件夹组成的集合吗?请使用以下查询:

 

"SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE 'SCRIPTS-%'"

 

我们稍后会说明该查询的工作方式。暂时可以这样讲,查询的内容基本上可以反映它的工作方式:显示 FILENAME 属性值类似于 SCRIPTS- 的所有文件夹的列表。为什么不干脆说“...FILENAME 属性的值是‘SCRIPTS-’...”呢?如果这样做的话,将只返回实际名称是“SCRIPTS-”的文件夹。我们想要的不是名称本身就是“SCRIPTS-”的文件夹,而是名称与之类似的文件夹。这就是我们使用 LIKE 运算符而不是等号的原因。

不要担心:我们会阐述如何在脚本中使用 LIKE 运算符。何时开始阐述?现在就开始如何?

 

使用通配符

LIKE 查询中最常用的字符可能就是 % 字符。% 字符的作用与命令外壳程序中使用的 * 通配符非常相似。例如,假设要列出文件名以字母 X 开头的所有文件。在命令提示符中键入以下内容并按 ENTER 键,即可实现该目的:

 

DIR X*

 

要列出以 X 结尾的所有文件名,请键入以下内容并按 ENTER 键:

 

DIR *X

 

最后一种情况,要列出文件名中的某个位置包含字母 X 的所有文件,请键入以下内容并按 ENTER 键:

 

DIR *X*

 

对您而言,以上内容多半是老调重弹,因为大多数系统管理员都知道 *(至少在 DIR 命令中使用时)是一个通配符,表示任意字符或一组字符。例如,可以像下面这样解释命令“DIR *X*”显示名称以任意字符(哪个字符都可以)开头、名称中的某个位置包含字符 X 并且以任意字符结尾的所有文件。同样,命令“DIR X*”的意思就是显示名称以 X 开头,其后可以是任意字符(也可以没有任何字符)的所有文件。就是显示那些以 X 开头的文件

您是说对上述内容全都了解吗?好极了,这样在编写使用 LIKE 运算符的查询时就轻松多了。

 

创建开头为查询

WQL LIKE 查询中,% 的作用与 * 非常类似。例如,假设要列出名称以字母 X 开头的所有文件夹。以下就是用于完成此操作的脚本:

 

STRCOMPUTER = "."

SET OBJWMISERVICE = GETOBJECT("WINMGMTS:\\" & STRCOMPUTER & "\ROOT\CIMV2")

 

SET COLFOLDERS = OBJWMISERVICE.EXECQUERY _

    ("SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE 'X%'")

 

FOR EACH OBJFOLDER IN COLFOLDERS

    WSCRIPT.ECHO "NAME: " & OBJFOLDER.FILENAME

NEXT

 

请注意 WQL 查询和 WHERE 子句的结构,尤其是要注意 WHERE 子句的结构:

 

"SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE 'X%'"

 

我们想要达到的目的是:显示 FILENAME 属性以字母 X 开头的所有文件夹的列表。就是这样,与命令“DIR X*”非常相似。我们只是使用了 LIKE 运算符,并指定了文件名“X%”。还要注意,% 字符包含在单引号内;必须将通配符当作是文件夹名称本身的实际组成部分。

 

创建结尾为查询

以下是另一个示例。在此示例中,我们调换了 % 字符与字母 X 的位置:

 

"SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE '%X'"

 

这是什么意思?它的含义是,现在我们要查找以 X 结尾的文件夹名称。我们不关心字母 X(也就是 % 字符)前面有哪些字符(或是否有字符);我们只关心最后一个字母恰好是 X

以下是完整的脚本,它返回名称以 X 结尾的所有文件夹:

 

STRCOMPUTER = "."

SET OBJWMISERVICE = GETOBJECT("WINMGMTS:\\" & STRCOMPUTER & "\ROOT\CIMV2")

 

SET COLFOLDERS = OBJWMISERVICE.EXECQUERY _

    ("SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE '%X'")

 

FOR EACH OBJFOLDER IN COLFOLDERS

    WSCRIPT.ECHO "NAME: " & OBJFOLDER.FILENAME

NEXT

 

 

创建包含查询

又一个脚本。此脚本查找文件夹名称中的任意位置包含字母 X 的文件夹,这就是将字母 X 夹在两个 % 字符间的原因。我们不关心字母 X 前有哪些字符,也不关心字母 X 后有哪些字符。我们所要做的就是在文件夹名称中查找字母 X

 

STRCOMPUTER = "."

SET OBJWMISERVICE = GETOBJECT("WINMGMTS:\\" & STRCOMPUTER & "\ROOT\CIMV2")

 

SET COLFOLDERS = OBJWMISERVICE.EXECQUERY _

    ("SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE '%X%'")

 

FOR EACH OBJFOLDER IN COLFOLDERS

    WSCRIPT.ECHO "NAME: " & OBJFOLDER.FILENAME

NEXT

 

当然,并不仅限于在查询中只使用一个字母。例如,要列出文件夹名称中包含 APRIL 一词的所有文件夹,请使用以下查询:

 

"SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE '%APRIL%'"

 

 

使用一组字符

您会说,不错,已经相当好了。但假设您想获得名称以字母 X、字母 Y 或字母 Z 开头的所有文件夹的集合,是否只能使用各种 OR 运算符来编写查询(如下所示)?

 

"SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE 'X%' OR FILENAME LIKE 'Y%' OR FILENAME LIKE 'Z%'"

 

不必如此。可以将这些字符括在方括号内来指定一组字符:[]。例如,如果要列出名称以 X Y Z 开头的文件夹,请使用以下查询:

 

"SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE '[XYZ]%'"

 

在以上查询中,将三个目标字符“XYZ”括在方括号内;此外,方括号(及括号内的字符)都位于单引号内。还要注意,此结构 - [XYZ] - 的处理方式与任何其他字符完全一样。在上一查询中,字母 X 后跟 % 字符:‘X%’。在此查询中,[XYZ] 字符后跟百分号字符:‘[XYZ]%’。运行一下完整的脚本,看看效果如何:

 

STRCOMPUTER = "."

SET OBJWMISERVICE = GETOBJECT("WINMGMTS:\\" & STRCOMPUTER & "\ROOT\CIMV2")

 

SET COLFOLDERS = OBJWMISERVICE.EXECQUERY _

    ("SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE '[XYZ]%'")

 

FOR EACH OBJFOLDER IN COLFOLDERS

    WSCRIPT.ECHO "NAME: " & OBJFOLDER.FILENAME

NEXT

 

 

创建例外查询

您说以上内容仍未正中下怀,这是何意?噢,一定是了:您想要检索的是名称不是以字母 XY Z 开头的所有文件夹的集合。您猜怎么样?事实证明,使用 LIKE 查询就可以完成此项任务。您所要做的就是使用刚才示范的方法,即将所需字符集置于方括号内。不过,这一次要在这些字符前添加脱字号:^。脱字号指示脚本检索方括号内包含的字符以外的所有内容。要返回名称不是以 XY Z 开头的所有文件夹,只需使用以下查询:

 

"SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE '[^XYZ]%'"

 

以下是用来执行该任务的完整脚本:

 

STRCOMPUTER = "."

SET OBJWMISERVICE = GETOBJECT("WINMGMTS:\\" & STRCOMPUTER & "\ROOT\CIMV2")

 

SET COLFOLDERS = OBJWMISERVICE.EXECQUERY _

    ("SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE '[^XYZ]%'")

 

FOR EACH OBJFOLDER IN COLFOLDERS

    WSCRIPT.ECHO "NAME: " & OBJFOLDER.FILENAME

NEXT

 

是的:很酷。现在轮到最后一个查询了,看上去有点古怪,不过您可能会发现它非常有用。

 

使用单字符通配符

假设有一组名称与以下内容类似的文件夹:

 

B010105X

B010205X

B010305X

B010405X

 

换言之,每个文件夹名称均以字母 B 开头,然后是表示日期的六位数字(010105 表示 2005 1 1 日),最后是字母 X。多半没有办法编写一个查询来返回所有这些文件夹的列表,不是吗?

是啊,几乎无法做到。事实证明,可以使用下划线 (_) 来表示字符串中的任何单个字符。文件夹名称中的第一个字符已知:B。文件夹名称中的最后一个字母已知:X。我们还知道 B X 间有六个字符,只是不能确定地知道这六个字符是什么。但那没有关系:我们使用与以下内容类似的查询就可以了,它使用六个下划线来表示六个未知字符:

 

"SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE 'B______X'"

 

是的,我们知道它看上去怪怪的;我们可是告诉过您它的样子有点古怪。不过效果蛮好。以下是完整的脚本,可以自己试着运行一下:

 

STRCOMPUTER = "."

SET OBJWMISERVICE = GETOBJECT("WINMGMTS:\\" & STRCOMPUTER & "\ROOT\CIMV2")

 

SET COLFOLDERS = OBJWMISERVICE.EXECQUERY _

    ("SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE 'B______X'")

 

FOR EACH OBJFOLDER IN COLFOLDERS

    WSCRIPT.ECHO "NAME: " & OBJFOLDER.FILENAME

NEXT

 

请注意,此类查询的运行速度相对较慢,查找字符串中的字符的任何查询都有这个缺点。(查找字符串开头或结尾处通配符的查询的运行速度要快得多。)尽管如此,查询效果很好,它将返回所有 B______X 文件夹的集合。最惬意的是,下次有人问你您为何要升级到 WINDOWS SERVER 2003?有什么是 2003 可以做到而 WINDOWS 2000 做不到的吗?,想象一下,当您向他们展示这个脚本时,您会有多么得意!

 

posted @ 2011-12-27 11:05  ahuo  阅读(2307)  评论(0编辑  收藏  举报