2016-05-25 8 views
1

Ich möchte überprüfen, ob der Prozess seit langer Zeit ausgeführt wurde (sagen wir 5 Minuten) und beenden, wenn dies der Fall ist.Beenden Sie einen Prozess nach Timeout mit VBScript

unten ist das Skript, das ich geschrieben habe, aber es wirft ungültige Eigenschaft/Methode Fehler:

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 

Ich bin unten Störung zu erhalten:
Objekt diese Eigenschaft oder diese Methode nicht unterstützt: ‚objProcess.Timestamp_Object '

Gibt es Möglichkeit, ich kann identifizieren, wenn der Prozess von 5 Minuten ausgeführt wurde?

Antwort

0

Überprüfen Sie den objProcess.CreationDate Wert und vergleichen Sie mit Now Anruf mit einem DateDiff Anruf, und wo die Anzahl der Sekunden> 300, rufen Sie die Terminate Methode?

EDIT: Entschuldigung, dachte, Sie referenziert das Win32_Process Objekt. Für Win32_PerfRawData_PerfProc_Process ist die gewünschte Eigenschaft ElapsedTime, die nach MSDN gibt die Anzahl der Sekunden, die ein Prozess ausgeführt wurde. Wenn dieser Wert über 300 liegt, wird der Prozess seit 5 Minuten oder länger ausgeführt.

intProcDur = objProcess.ElapsedTime sollte intProcDur den entsprechenden Wert für Ihren Vergleich

EDIT 2: Die folgende modifizierte Version des Codes ruft die Sekunden seit einem Prozess gestartet wurde (in meinem Fall vbsedit.exe):

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 
+0

Ich kann es in Win32_Process-Objekt ändern. Ich verstehe den Unterschied zwischen ihnen nicht wirklich. Kannst du mir bitte erklären, wie ich Erstellungsdatum und Now() vergleiche? und Ergebnis in Sekunden erhalten? DateDiff ("S", Date1, Date2) gibt ungültigen Datentyp zurück. –

+0

Siehe zusätzliche EDIT 2 – Dave

+0

Ich hatte vergessen, die Antwort zu akzeptieren :) Danke. –

Verwandte Themen