使用VBScript在超时后终止进程

使用VBScript在超时后终止进程,vbscript,Vbscript,我想检查这个进程是否已经运行了很长时间(比如说5分钟),如果是这样,就终止它 下面是我编写的脚本,但它抛出无效的属性/方法错误: Const MAX_TIME = 300 'seconds const I = 1 arrTargetProcs = Array("example.exe") 'process names without extension do while I = 1 strComputer = "." Set objWMIService = GetObject("winmgmt

我想检查这个进程是否已经运行了很长时间(比如说5分钟),如果是这样,就终止它

下面是我编写的脚本,但它抛出无效的属性/方法错误:

Const MAX_TIME = 300 'seconds
const I = 1
arrTargetProcs = Array("example.exe")
'process names without extension
do while I = 1
strComputer = "."

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

For Each strTargetProc In arrTargetProcs
  Set colProcesses = objWMIService.ExecQuery _
   ("SELECT * FROM Win32_PerfRawData_PerfProc_Process WHERE Name = '" & _
    strTargetProc & "'")
  If colProcesses.Count > 0 Then
    For Each objProcess In colProcesses
      intProcDur = (objProcess.Timestamp_Object - _
       objProcess.ElapsedTime) / objProcess.Frequency_Object
      If Int(intProcDur) > MAX_TIME Then
        'WScript.Echo "Process " & objProcess.Name & " " & _
         'objProcess.IDProcess & " over time limit."
        Set objProc = objWMIService.Get _
         ("Win32_Process.Handle='" & objProcess.IDProcess & "'")
        intReturn = objProc.Terminate()
        If intReturn = 0 Then
          'WScript.Echo "  Process terminated."
        Else
          'WScript.Echo "  Unable to terminate process."
        End If
      Else
        'WScript.Echo "Process " & objProcess.Name & " " & _
        'objProcess.IDProcess & " not over time limit."
      End If
    Next
  Else
    'WScript.Echo "Process " & strTargetProc & " not found."
  End If
Next
WScript.Sleep 50000
Loop
我得到以下错误:
对象不支持此属性或方法:“objProcess.Timestamp\u对象”


是否有办法确定流程是否已从5分钟开始运行

检查
objProcess.CreationDate
值,并与
DateDiff
调用的
Now
进行比较,如果秒数>300,调用
终止
方法

编辑:抱歉,我以为您引用的是
Win32\u进程
对象。对于
Win32\u PerfRawData\u PerfProc\u进程
,您需要的相关属性是
ElapsedTime
,它根据给出进程已运行的秒数。如果该值超过300,则进程已运行5分钟或更长时间

intProcDur=objProcess.ElapsedTime
应将intProcDur设置为相关值以供比较

编辑2:以下修改版本的代码检索进程启动后的秒数(在我的示例中为
vbsedit.exe
):


检查
objProcess.CreationDate
值,并使用
DateDiff
调用与
Now
进行比较,如果秒数>300,调用
Terminate
方法

编辑:抱歉,我以为您引用的是
Win32\u进程
对象。对于
Win32\u PerfRawData\u PerfProc\u进程
,您需要的相关属性是
ElapsedTime
,它根据给出进程已运行的秒数。如果该值超过300,则进程已运行5分钟或更长时间

intProcDur=objProcess.ElapsedTime
应将intProcDur设置为相关值以供比较

编辑2:以下修改版本的代码检索进程启动后的秒数(在我的示例中为
vbsedit.exe
):


我可以将其更改为Win32_进程对象。但是我不太明白他们之间的区别。请您解释一下,我如何比较创建日期和现在()?然后在几秒钟内得到结果?DateDiff(“S”,Date1,Date2)返回无效的数据类型。请参阅附加编辑2。我可以将其更改为Win32_进程对象。但是我不太明白他们之间的区别。请您解释一下,我如何比较创建日期和现在()?然后在几秒钟内得到结果?DateDiff(“S”,Date1,Date2)返回的数据类型无效。请参阅附加编辑2
arrTargetProcs = Array("Vbsedit.exe")
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer)

For Each strTargetProc In arrTargetProcs
    Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" & strTargetProc & "'")
    If colProcesses.Count > 0 Then
        For Each objProcess In colProcesses
            intProcDur = objProcess.CreationDate
            intProcDur = CDate(Mid(intProcDur, 7,2) & "/" & Mid(intProcDur, 5, 2) & "/" & Left(intProcDur,4) & " " & Mid(intProcDur,9,2) & ":" & Mid(intProcDur, 11,2) & ":" & Mid(intProcDur,13,2))

            WScript.Echo objProcess.Name & ": " & intProcDur
            WScript.Echo DateDiff("s", intProcDur, Now) & " seconds since this process began."
        Next
    End If
Next