我遇到了一个非常令人沮丧的错误,有时会出现该错误,并且有时会毫无问题地通过。我的代码是:
function killProcesses(processes) { // A string array of process names.
for (i = 0; i < processes.length; i++) {
var process = Sys.WaitProcess(processes[i])
if (process.Exists) { // Sometimes the script will crash right here
process.Terminate()
}
}
自从我编写函数以来,我一直都传递完全相同的进程名称,有时它们是由其他名称启动的,这从来不是问题。但是有时它会在运行时崩溃并告诉我Object doesn't support this property or method
。就像我说的那样,此函数和调用它的行从未更改,因此我不明白为什么只有有时它会失败。
我之前已经在脚本的其他部分中做到了这一点,所以我想知道它是否与之相关,或者我的系统普遍存在某些问题。真正令我感到困惑的是,Exists
应该始终存在于所有事物上,为什么有时却不存在?
答案 0 :(得分:2)
Sys.WaitProcess(ProcessName)
方法应该返回找到的进程,或者返回一个空的存根对象,该对象仅具有属性Exists
,值为false
,如果未找到该进程。是否找到该进程无关紧要,可以使用Exists
检查是否找到了该进程。
控制对象与Find
方法的结果值存在相同的问题,并且对于从Find
方法返回的所有对象都是普遍的问题。
我找到了一种解决方法:
如果在访问Name
之前访问其他属性(例如Exists
),则没有错误。
obj.Name; // Add this to prevent error in obj.Exists below:
if (obs.Exists)
{
// Do something here
}
这仅在需要对象的情况下有效。以我为例。如果找不到预期的对象,则obj.Name
将抛出一个正常的错误。
在预期找不到对象的情况下,如果Exists
无效,则结果会卡住,因为结果值不为null或不为空,并且obj.Name
会引发错误您想要避免的情况,唯一可以检查的条件是obj.Exists
。
但是,可能值得一试的是,如果找到了该进程,它是否对进程对象有效。
答案 1 :(得分:0)
也许您可以通过拥有
来保护null如果(进程&&进程存在)
为了避免进程终止影响您的进程列表,我还会从顶部向下循环。
答案 2 :(得分:-1)
此代码的问题是,当您终止第一个进程时,其余进程的索引会减少。此版本的代码更好:
function killProcess(pName) {
var p = Sys.WaitProcess(pName, 5000, 1);
while (p.Exists) {
p.Terminate();
while (p.Exists)
Sys.Delay(50);
p = Sys.WaitProcess(pName, 5000, 1)
}
}