为什么WQL LIKE运算符不能在驱动器c上工作,但在驱动器d上工作正常?

时间:2012-10-23 23:26:19

标签: file wmi monitoring wildcard wql

我正在学习文件系统监控,以加快我的邮件服务器的第3和第4次备份。我有一个很好的VB脚本在驱动器D上完美运行,但是当我查询驱动器C的更改时,如果我使用通配符,则不会返回任何内容。

以下是我的疑问:

这适用于c:\ sc,但不会返回子文件夹更改:

     Select * From __InstanceOperationEvent Within 10 Where TargetInstance Isa 'CIM_DataFile' And ((TargetInstance.Drive='c:' And TargetInstance.Path = '\\sc\\'))

这适用于d:\ sc,并确实返回子文件夹更改:

     Select * From __InstanceOperationEvent Within 10 Where TargetInstance Isa 'CIM_DataFile' And ((TargetInstance.Drive='d:' And TargetInstance.Path LIKE '\\sc\\%'))

这个没有任何变化。不返回任何错误消息,脚本继续运行:

     Select * From __InstanceOperationEvent Within 10 Where TargetInstance Isa 'CIM_DataFile' And ((TargetInstance.Drive='c:' And TargetInstance.Path LIKE '\\sc\\%'))

双括号是我可以添加与“OR”连接的类似查询。

我的系统驱动器是驱动器C.
Drive D是可移动的USB驱动器。

我是否在系统驱动器上更改了一些阻止其工作的设置?
或者查询返回的结果太多了?

我一直在搜索这个问题几个小时。任何见解将不胜感激。

1 个答案:

答案 0 :(得分:3)

这是因为当您在具有CIM_DataFile类的WQL语句中使用LIKE运算符时,WMI会扫描整个驱动器以找到匹配项,现在因为您的USB驱动器有一个更小的(和简单的)树文件夹结构WMI可以更快地返回结果。但是当您使用C驱动器时,WMI仍然运行查询,直到找到所有匹配项。因此建议不要将{LIK运算符与CIM_DataFile一起使用,而只需使用=运算符,如下所示:

Select * From __InstanceOperationEvent Within 1 Where TargetInstance ISA 'CIM_DataFile' And ((TargetInstance.Drive='c:' And TargetInstance.Path = '\\sc\\'))

P.D:如果您正在使用LIKE运算符,因为您希望在多个文件夹中更改监视器,则无法进行此操作,而是必须为每个文件夹使用一个WQL和事件监视器。