highxvoltage1989
Goto Top

Script um Prozesse (excel) zu beenden

Hey Leute,

ich wollte folgendes basteln, und zwar wird das Skript gestartet.
Nun soll es schaun, ob ein Excel-Prozess läuft...wenn ja, dann soll dieser nach 3 Minuten beenden werden.
Sollte in der Zwischenzeit ein weiterer Excel-Prozess auftauchen, soll dieser natürlich auch nach 3 Minuten beendet werden usw.
Habe jedoch das Problem, dass er mir sofort alle Excel-Prozesse abschießt.
Wenn kein Excel läuft, soll halt ständig überprüft werden, ob ein Excel-Prozess läuft oder nicht....
Das Skript funktioniert teilweise, seht ihr paar Fehler oder die Möglichkeit es einfacher zu gestalten?!

(PID? also Prozess ID um Excel-Prozesse zu unterscheiden?!)

Folgender Fehler taucht auch unteranderem auf:
Objekt erforderlich "WshShell"

Danke und Gruß
Volti ;)

'Zeit: WScript.Sleep 1000 * 60 * 3 'ms * secs per min * minutes
'---------------------------------------------------------------------------------------

'Überprüft ob EXCEL läuft:
'------------------------------------------
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'excel.exe'")


'Wenn EXCEL läuft, wird eine Info ausgeworfen und der Prozess wird dann nach 3 Minuten beendet:
'-------------------------------------------------------------------------------------------------

If colProcesses.Count = 1 Then

Dim Answer
Set WshShell = WScript.CreateObject("WScript.Shell")
Answer = WshShell.Popup("Excel wird in 3 Minuten beendet!", 3, "Info", 0 + 64)
WScript.Sleep 1000 * 60 * 3 'ms * secs per min * minutes

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

i=kill
Do while i=kill
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'excel.exe'")
For Each objProcess in colProcessList
objProcess.Terminate()
Next
WScript.Sleep 1000 * 60 * 3 'ms * secs per min * minutes
Loop

'Wenn EXCEL nicht läuft, dann überprüfe in 5 Minuten wieder nach ob es läuft (=BEGINNE DIESES SCRIPT VON VORNE)
'-------------------------------------------------------------------------------------------------------------------

Else
Wscript.Sleep 1000 * 60 * 5 'ms * secs per min * minutes
end if

'Hier den Pfad Eingeben, wo dieses Script liegt.
'------------------------------------------------------------------------------------------------------

Return = WshShell.Run ("Pfad")

Content-Key: 149575

Url: https://administrator.de/contentid/149575

Printed on: May 7, 2024 at 21:05 o'clock

Mitglied: 76109
76109 Aug 25, 2010 at 08:22:03 (UTC)
Goto Top
Hallo highxvoltage1989!

Worin liegt eigentlich der Sinn des Ganzen?

Falls mehrere Excel-Apps geöffnet sind, woher soll man bezüglich der PopUp-Meldungen wissen, welche Excel-App geschlossen wird?

Soll es für das Skript ein Zeitfenster geben? Anzahl Stunden nach Start des Skripts, bis zu einer bestimmten Zeit z.B. bis 17:00 Uhr, sowas in der Art?

Gruß Dieter
Member: highxvoltage1989
highxvoltage1989 Aug 25, 2010 at 09:51:51 (UTC)
Goto Top
Hi Dieter!

Der Sinn liegt darin, dass die einzelnen Excel-Applikationen auf dem Server nicht länger als 3 Minuten für ihre Verarbeitung brauchen! Wenn´s länger dauert, hat sich nämlich ein Fehler eingefangen.

Das PopUp-Fenster war für mich nur eine Orientierung und kann eig. wegfallen. Der User braucht nicht über die Beendigung der Excel-Instanz verständigt werden, es soll alles schön auto. ablaufen.

1. Excel-Instanz gestartet ...läuft...3.Minute = Exit
2. Excel-Instanz 1 Minute später gestartet ...läuft...3.Minute = Exit
3. ...

bei mir jedoch

1. Excel-Instanz gestartet ...läuft...3.Minute = Exit
2. Excel-Instanz 1 Minute später gestartet ...wird jedoch auch zur 3.Minute der ersten Excel-Instanz gestoppt.

Nein, das Skript sollte schon "non-stop" durchlaufen, also kein Zeitfenster.

Gruß Volti
Mitglied: 76109
76109 Aug 25, 2010 at 12:22:23 (UTC)
Goto Top
Hallo Volti!

Dieses Script könnte eventuell Deine Anforderungen erfüllen?

Strategie:
Ein Listenarray erstellen, die derzeit für maximal 20 gleichzeitige Prozesse ausgelegt ist. Eine Endlosschleife, in der die jeweiligen Prozesse mit Prozess-ID und der aktuellen Zeit + 3 Minuten (Schließzeit) in der Liste registriert und bei überschreiten der zulässigen Zeit aus der Liste gelöscht und terminiert werden.

Testen kannst Du einfach, in dem Du die Zeit zu Testzwecken mal auf 1 Minute änderst (siehe Codezeile 42) und anstatt Excel.Exe die NotePad.Exe o.ä. verwendest.
Const ProcessListMax = 20
Const ProcessListId = 0
Const ProcessListTime = 1

Dim strComputer, objWMIService, colProcesses, objProcess, ProcessList, i

    strComputer = "."  
    
    ReDim ProcessList(ProcessListMax, 1)
    
    For i = 0 To UBound(ProcessList)
        ProcessList(i, ProcessListId) = 0
    Next
    
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
    
    Do While 1
        Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process Where Name = 'Excel.exe'")  
        
        For Each objProcess In colProcesses
            If ProcessTerminate(objProcess.Properties_("ProcessId")) = True Then objProcess.Terminate  
        Next
    Loop

Private Function ProcessTerminate(ByVal Id)
    Dim i
    
    ProcessTerminate = False
    
    For i = 0 To UBound(ProcessList)
        If ProcessList(i, ProcessListId) = Id Then
            If Now >= ProcessList(i, ProcessListTime) Then ProcessList(i, ProcessListId) = 0:  ProcessTerminate = True
            Exit Function
        End If
    Next
    
    For i = 0 To UBound(ProcessList)
        If ProcessList(i, ProcessListId) = 0 Then
            ProcessList(i, ProcessListId) = Id
            ProcessList(i, ProcessListTime) = DateAdd("n", 3, Now)  
            Exit For
        End If
    Next
    
    If i > UBound(ProcessList) Then MsgBox "Die ProzessListe ist Voll!", vbExclamation, "Fehler":  Exit Function   
End Function

Gruß Dieter

[edit] In Codezeile 32 und 40 Time durch Now ersetzt [/edit]
Member: highxvoltage1989
highxvoltage1989 Aug 25, 2010 at 13:39:39 (UTC)
Goto Top
Hi Dieter!

wow...echt Spitze, ich danke dir vielmals für deine Bemühung face-smile

Gruß
Mitglied: 76109
76109 Aug 25, 2010 at 13:51:24 (UTC)
Goto Top
Hallo Volti!

Zitat von @highxvoltage1989:
wow...echt Spitze, ich danke dir vielmals für deine Bemühung face-smile
Yepp, gern geschehenface-wink

Gruß Dieter
Mitglied: 76109
76109 Aug 25, 2010 at 14:22:13 (UTC)
Goto Top
Hallo nochmal!

Habe noch eine kleine Änderung im Code in Codezeile 32/40 vorgenommen, weil ich nicht die Zeit um Mitternacht (00:00) bedacht habe. Anstatt Time jetzt Now (Datum + Zeit)face-wink

Gruß Dieter