谁希望成为脚本专家?

每周脚本测验题

每周脚本测验题

2005 年 12 月 2 日:谢谢,但我根本没有问这个问题


好了,所以说此脚本也许并未真的中断了。也可能是真的中断了。坦白地讲,我们确定不了是怎么回事。这正是我们需要您的帮助的原因。

当我们编写 WQL 查询时,通常使用 Select * 语句返回类中所有属性的值。这并没有什么问题,但有时我们需要编写返回大量数据的查询。为减少网络通信量,我们决定试验编写一个仅返回所选属性的值的 WQL 查询。

为此,我们编写了以下这个设计目的为仅返回计算机上运行的所有进程的名称的脚本:

On Error Resume Next

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery ("Select Name from Win32_Process")

For Each objItem in colItems
    Wscript.Echo objItem.Handle
Next

这并没有什么问题,但我们犯了一个错误:在我们的 For Each 循环中,我们不经意间要求脚本回显 Handle 属性的值,而不是 Name 属性的值。因为我们未在 WQL 查询中要求回显 Handle 属性的值,这意味着脚本会失败,是吗?

不对。以下是实际返回的信息的示例:

0
4
644
716
740
784
796
968

实际情况是,这些信息就是 Handle 属性的值。这可怪了,但还有比这更怪的:我们用 objItem.ProcessID(或类似者)替换 objItem.Handle,然后试着重新运行脚本:

On Error Resume Next

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery ("Select Name from Win32_Process")

For Each objItem in colItems
    Wscript.Echo objItem.ProcessID
Next

这样做脚本运行正常吗?不正常。而且如果我们注释掉 On Error Resume Next 语句,然后重新运行该脚本,会得到以下错误消息:

C:\Scripts\q36.vbs(10, 5) Microsoft VBScript runtime error: 
Object doesn't support this property or method: 'objItem.ProcessID'

换句话说,我们会得到进程 Handle,尽管我们并无此要求;但当我们尝试回显 ProcessID 时,我们会被告知该对象不支持 ProcessID 属性。这并没有什么问题,只不过 Win32_Process 类确实支持 ProcessID 属性。天啊!

这个脚本到底问题出在哪儿?


返回页首返回页首