imkrl001
Goto Top

Batch kontrolliert, ob ein Task gestartet ist, und startet ein Program

Hallo,
bin neu hier, und habe leider wenug Erfahrung mit Batch-Datein...

kann jemand eine Batch-Datei erzeugen, die ständig läuft
(kann auch alternativ minutlich als 'Geplannten Task' gestartet werden)
und minutlich abfragt, ob ein bestimmtes Program(Task: hier scgui32.exe) läuft,
dann, wenn das Program läuft, wird ein weiteres Program (hier c:\temp\cercala.exe) gestartet und das 1. Program (scgui32.exe) gekillt.

Hintergrund: das 1. Program wird nicht wahrgenommen welches aus einer Anwendung gelegentlich gestartet wird. Damit es akustisch und visuell Wahrgenommen werden kann, wird das 2. Program gestartet. Damit das ganze auch ein weiteres mal klappt, muß das 1. Program wieder geschlossen werden.

Danke im vorraus

Content-Key: 73443

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

Ausgedruckt am: 28.03.2024 um 20:03 Uhr

Mitglied: bastla
bastla 13.11.2007 um 13:39:47 Uhr
Goto Top
Hallo imkrl001 und willkommen im Forum!

Da Du Dein Betriebssystem nicht genannt hast, unterstelle ich einmal XP oder später (ich war versucht, "höher" zu schreiben, fand das aber im Hinblick auf Vista nicht unbedingt angemessen).

Ein Endlosbatch dafür könnte so aussehen:
@echo off & setlocal
set "Tsk=scgui32.exe"  
set "Prog=c:\temp\cercala.exe"  

:Loop
set Running=
for /f %%i in ('tasklist') do echo (%%i)|findstr /C:"(%Tsk%)" >nul && set Running=True  
if not defined Running goto :Pause

start "" "%Prog%"  
taskkill /IM "%Tsk%" >nul  

:Pause
::15 s Pause
ping -n 15 localhost>nul
goto :Loop
Falls Du die Pause zwischen den Überprüfungen nicht benötigst, einfach "::" vor die Zeile "ping ..." schreiben - damit wird die Zeile zum Kommentar und nicht ausgeführt (natürlich kannst Du sie auch ganz entfernen, wenn Du sie sicher nicht brauchen wirst).

Grüße
bastla
Mitglied: imkrl001
imkrl001 15.11.2007 um 07:08:00 Uhr
Goto Top
Ja, klappt super. Tausend dank...


Mir fällt gerade noch ne Möglichkeit ein, die Batch zu nutzen...

Kann man die Batch so umschreiben, das sie erkennt, wenn eine bestimmte Task mehr als einmal läuft (also 2 mal) und dann ein Program startet, evt. auch dann noch die neuere der beiden Task killt ??
Mitglied: imkrl001
imkrl001 15.11.2007 um 09:48:14 Uhr
Goto Top
OK, habe selber ein wenig Programmiert... und eine Lösung gefunden....

die 2. Task mit gleichen Namen hat in der Taskleist einen anderen Namen, den man abfragen kann...

@echo off & setlocal
set "Prog=c:\temp\cercala1.exe"  

:Loop
set Running=
for /f %%i in ('tasklist /FI "WINDOWTITLE eq Active Notes"') do echo (%%i)|findstr /C:======= >nul && set Running=True  
if not defined Running goto :Pause

start "" "%Prog%"  
taskkill /FI "WINDOWTITLE eq Active Notes" >nul  

:Pause
::30 s Pause
ping -n 30 localhost>nul
goto :Loop

kann man das noch was verschönern ??
die Ausgabe ins echo -> '========'
gefällt mit nicht,
evt kann man auch den "WINDOWTITLE eq Active Notes" als Kürzrl hinterlegen...
Mitglied: bastla
bastla 15.11.2007 um 19:17:36 Uhr
Goto Top
Hallo imkrl001!

Für die Anforderung "wenn eine bestimmte Task mehr als einmal läuft ... ein Program startet, ... die neuere der beiden Task killt" würde ich eher auf VBScript zurückgreifen. Ebenfalls als Endlosschleife laufend könnte das so aussehen:
strTask = "scgui32.exe"  
strProg = "c:\temp\cercala.exe"  

Set WshShell = WScript.CreateObject("WScript.Shell")  
strComputer = "."   

Do
	Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")   
	Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process",,48)   
	strOldest = "9"  
	For Each objItem in colItems
		If LCase(objItem.Name) = strTask Then
			If objItem.CreationDate < strOldest Then strOldest = objItem.CreationDate
		End If
	Next
	
	bRun = False
	Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process",,48)   
	For Each objItem in colItems
		If LCase(objItem.Name) = strTask Then
			If objItem.CreationDate <> strOldest Then
				objItem.Terminate
				bRun = True
			End If
		End If
	Next

	If bRun Then WshShell.Run strProg 'Programm starten  

	WScript.Sleep 30000 '30 Sekunden Pause  
Loop
Das Script killt alle "scgui32.exe"-Tasks mit Ausnahme des ältesten (festgestellt anhand des "CreationDate" im Format "20071115191028.750000+060") und startet für den Fall, dass zumindest ein Task beendet werden musste (und demnach gleichzeitig mindestens zwei aktiv waren) das angegebene Programm ("cercala.exe"). Beendet wird dieses Programm allerdings nicht wieder durch das Script, sodass also zwar nach spätestens 30 Sekunden immer nur ein "scgui32.exe"-Task läuft, es aber viele "cercala.exe"-Tasks geben könnte.

Das Script selbst läuft übrigens als Task "wscript.exe" (nur für den Fall, dass Du es auch wieder beenden wolltest face-wink).

In diesem Zusammenhang wäre vielleicht auch noch ein Hinweis auf den "ProcessExplorer" (einstmals von "SysInternals", jetzt MS) angebracht. Damit kannst Du die laufenden Tasks viel besser, als dies mit dem Taskmanager oder über die Kommandozeile möglich ist, überblicken.

Grüße
bastla