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")
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")
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 149575
Url: https://administrator.de/forum/script-um-prozesse-excel-zu-beenden-149575.html
Ausgedruckt am: 29.04.2025 um 02:04 Uhr
6 Kommentare
Neuester Kommentar

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

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.
Gruß Dieter
[edit] In Codezeile 32 und 40 Time durch Now ersetzt [/edit]
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]

Hallo Volti!
Yepp, gern geschehen
Gruß Dieter
Yepp, gern geschehen
Gruß Dieter

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)
Gruß Dieter
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)
Gruß Dieter