vbScript进程对象中的NULL ExecutablePath

时间:2012-11-14 18:09:26

标签: vbscript executable-path

拜,

我有以下VBScript:

Option Explicit
Dim objWMIService, objProcess, colProcess
Dim strComputer, strList

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _ 
& strComputer & "\root\cimv2") 

Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process")

For Each objProcess in colProcess
   MsgBox(objProcess.ExecutablePath)
   'If InStr(objProcess.ExecutablePath, "EASE") <> 0 Then
   '   MsgBox("TERMINATING")
   '   objProcess.Terminate()
   'End If
Next

由于某种原因,我在行MsgBox(objProcess.ExecutablePath)上收到错误。它说“无效使用Null:'ExecutablePath'”。奇怪的是,当我取消注释注释行并注释掉问题行时,我没有收到此错误。

正如您所看到的,我正在尝试使用特定路径名终止所有进程,但看起来字符串匹配不起作用,就像可执行路径有问题一样。

2 个答案:

答案 0 :(得分:1)

由于MsgBox需要显示一个字符串而Null无法进行字符串化,因此MsgBox行(顺便说一句:没有括号)将因令人讨厌的.ExecutablePathes而失败;但是,InStr()允许第一个参数为Null(参见文档)。证据:

>> MsgBox Null
>>
Error Number:       94
Error Description:  Invalid use of Null
>> p = Instr(Null, "whatever")
>>
>> WScript.Echo TypeName(p)
>>
Null

因此,以适当的方式摆脱诊断或编写一个处理Null的子/函数(以及可能的其他边界线情况,如空)。

答案 1 :(得分:1)

Ekkehard对这个问题给出了很好的解释,即Null不能隐式转换为字符串。现在,这是一种解决问题的方法。

在尝试使用objProcess.ExecutablePath之前,检查它是否为null:

For Each objProcess in colProcess
   if not isnull(objProcess.ExecutablePath) then
    MsgBox objProcess.ExecutablePath
   'If InStr(objProcess.ExecutablePath, "EASE") <> 0 Then
   '   MsgBox("TERMINATING")
   '   objProcess.Terminate()
   'End If
   end if
Next