0

问候,

我有以下 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'”。奇怪的是,当我取消注释注释行并注释掉问题行时,我没有收到此错误。

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

4

2 回答 2

1

由于MsgBox需要显示字符串并且 Null 不能被字符串化,因此您的MsgBox行(顺便说一句:不允许使用括号)将因 nasty 而失败.ExecutablePathes;但是,InStr() 允许第一个参数为 Null(请参阅文档)。证据:

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

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

于 2012-11-14T18:25:15.303 回答
1

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

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

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
于 2012-11-14T20:56:29.283 回答