Board logo

标题: [问题求助] [已解决] WQL查询语句 及 WMI路径写法的问题 [打印本页]

作者: wankoilz    时间: 2013-1-22 19:00     标题: [已解决] WQL查询语句 及 WMI路径写法的问题

本帖最后由 wankoilz 于 2013-1-22 23:13 编辑

问题1
在这里http://demon.tw/programming/vbs-usb-insert-remove-2.html看到demon的一个代码,里面一个查询语句不解,望指点一下:
Select * From __InstanceOperationEvent Within 10 Where TargetInstance isa 'Win32_LogicalDisk'
里面有一个 within 10 请问是什么意思?

问题2
比如:
  1. set objprocesses=getobject("winmgmts:\\.\root\cimv2:win32_process")
  2. for each objprocess in objprocesses
  3.     wscript.echo objprocess.name
  4. next
复制代码
这个路径 winmgmts:\\.\root\cimv2:win32_process 应该没问题吧,但为什么执行不成功呢?
作者: batman    时间: 2013-1-22 20:29

本帖最后由 batman 于 2013-1-22 22:43 编辑

因为这个代码所需要达到的目的是监控U盘的插入和移除,所以用到了WMI事件监控的ExecNotificationQuery方法(一般我们使用的是ExecQuery查询方法),使用了这个方法后一旦有了创建、修改和删除WMI事件的发生,系统就会立即发出通知(具体看你用什么样的方式来通知)。而语句中的Within 10所指的是每10秒临控一次,Where TargetInstance isa 'Win32_LogicalDisk'是定义发生创建、修改和删除的事件是Win32_LogicalDisk逻辑磁盘服务发起的。

另外root\cimv2是WMI四类名称空间之一不是路径,它所指向的是WINDOWS管理规范实例空间,而Win32_Process是其下的用来访问进程实例的类,正确的代码如下:
  1. Dim objWMI, objItems, objItem
  2. Set objWMI = GetObject("Winmgmts:\\.\Root\Cimv2")
  3. Set objItems = objWMI.ExecQuery("Select * From Win32_Process")
  4. For Each objItem In objItems
  5.   WScript.Echo objItem.Name
  6. Next
  7. Set objWMI = Nothing
复制代码

作者: wankoilz    时间: 2013-1-22 23:07

呵呵,with in 10 原来是每10秒监视一次啊。难怪,我之前还纳闷儿,do  loop 循环里面没有一个延迟那不是很耗CPU资源么,
原来这个 with in 就有这个作用了,不错!

Winmgmts:\\.\Root\Cimv2 是命名空间,而win32_process是类,嗯,对头。
我是在百度贴吧看了这篇简明文章(http://tieba.baidu.com/p/197779176)以为可以这么写,
看来 winmgmts:\\.\root\cimv2:win32_process 只是一种概念上的表述而已,我误解成代码中可以这么用了。

感谢batman这么详细的回复啊!!




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2