Batch und laufende Programme

Mit tskill muss ich nun alle Parameter streichen. Und nu will der mir auch noch weismachen, dass es den Prozess notepad.exe nciht gibt. Naja, seis drum; wenn dein Programm läuft ist das ja eh hinfällig ;)
Ist kein Problem, wenns was länger dauert ;)


mfg
mP765
 
Hm, Du hattest oben geschrieben, dass Du tasklist verwendest. Das wiederum gehört zusammen mit taskkill zu Windows XP-Pro (die Home-Edition sollte weder das eine, noch das andere kennen). Deshalb wundert es mich, dass tasklist auf Deinem Computer läuft, während taskkill nicht funzt. Was hast Du für eine Windows-Verison?

Wie dem auch sei, tskill gibt es unter der Pro- und Home-Edition, wobei dieser Befehl nicht mit der Extension zurechtkommt. Also musst Du ?tskill notepad? und nicht ?tskill notepad.exe? schreiben. Die Funktion müsstest Du wie folgt anpassen:

Code:
:FncAskKillOrRunApp
::Parameters: <NameOfApp>
  setlocal EnableDelayedExpansion
  tasklist | find "%~nx1" > NULL
  if %ERRORLEVEL% == 0 (
    set /p ask=Soll das Programm "%~nx1" beendet werden ^(j/n; enter=n^)^?
    if /i "!ask!" == "j" tskill "%~n1"
  ) else (
    set /p ask=Soll das Programm "%~nx1" gestartet werden ^(j/n; enter=n^)^?
    if /i "!ask!" == "j" start "" "%~1"
  )
 exit /b 0

Der Aufruf der batch-Funktion bleibt unverändert, wobei Du allerdings für den eventuellen Start des Programms nun (optional) auch den kompletten Pfad mit angeben kannst (also ?call :FncAskKillOrRunApp c:\windows\system32\notepad.exe?).

Bye, nz
 
Ja, so funktionierts.
Zur Erklärung: Ich hab WinXP Home und hab mir irgendwann mal tasklist.exe runtergeladen.
Vielen Dank

EDIT: Noch ne Frage: Wo bzw. wie füge ich weitere Programme ein?


mfg
mP765
 
Einfach in dem Loop-Block einfügen. Hier der komplette Code:

Code:
@echo off

:LOOP
  call :FncAskKillOrRunApp c:\windows\system32\notepad.exe
  call :FncAskKillOrRunApp Programm2.exe
  call :FncAskKillOrRunApp Programm3.exe
  :: ...
  call :FncSleep 5
 goto :LOOP

goto :EOF

:FncAskKillOrRunApp
::Parameters: <NameOfApp>
  setlocal EnableDelayedExpansion
  tasklist | find "%~nx1" > NULL
  if %ERRORLEVEL% == 0 (
    set /p ask=Soll das Programm "%~nx1" beendet werden ^(j/n; enter=n^)^?
    if /i "!ask!" == "j" tskill "%~n1"
  ) else (
    set /p ask=Soll das Programm "%~nx1" gestartet werden ^(j/n; enter=n^)^?
    if /i "!ask!" == "j" start "" "%~1"
  )
 exit /b 0

:FncSleep
::Parameters: <seconds to wait>
  set /a _FncSleep_seconds"=(%1 +1)"
  ping -n %_FncSleep_seconds% -w 1000 127.0.0.1 >NUL
 exit /b 0

Bye, nz
 
Vielen Dank ;)

EDIT: @IsNull: Ich will dich nicht hetzen, aber ich frag mal nach: Wie siehts denn mit dem Programm für ahk aus?


mfg
mP765
 
Code:
/***********************************************************

name	...	procControl
ver		... alpha
coder	... IsNull

securityvision.ch
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
descrp.:
Minimales Tool um (im Vorfeld definierte) Prozesse zu
kontrollieren. Eine aktivierte Checkbox bedeutet dass der
jeweilige Prozess läuft. Mit einem Doppelklick auf einen
Prozess kann dieser gestartet bez. beendet werden.
************************************************************
*/



/**********************************************************
conf:
Syntax: 
NameDesProzesses | PfadZumProgramm
***********************************************************
*/
proclist =
(
Hallo.exe|Path to my exe
explorer.exe|C:\Windows\Explorer.exe
habadaba.exe|C:\wayne.exe
test.exe|C:\test.exe
usw...
)
delay := 2000
;**********************************************************

/**********************************************************
-----------------------GUI
minimales GUI aufsetzten
***********************************************************
*/

Gui, Add, text, x10 y20,Liste der zu überwachenden Programme:
Gui, Add, ListView, r20 w700 gMyListView Checked, Prozess Name|Path|Info
gui, show
gosub, checkProcs
SetTimer,checkProcs, %delay%
return


/**********************************************************
-----------------------Eventhandler
reagiert auf User-Interaktionen:
Doppelklick
***********************************************************
*/
MyListView:
if A_GuiEvent = DoubleClick
{
    LV_GetText(RowText, A_EventInfo,1) ;1 Zelle 
	LV_GetText(path2proc, A_EventInfo,2) ;2 Zelle 
	
	Gui +LastFound
	SendMessage, 4140, A_EventInfo - 1, 0xF000, SysListView321  ; 4140 is LVM_GETITEMSTATE.  0xF000 is LVIS_STATEIMAGEMASK.
	IsChecked := (ErrorLevel >> 12) - 1 
	
	if (!IsChecked){
		;prozess läuft nicht -> starten
		
		IfNotExist, %path2proc%
		{
			msgbox "%path2proc%" nicht gefunden!
			return
		}
		run, %path2proc%,,UseErrorLevel
		if (errorlevel){
			msgbox Prozess kann nicht gestartet werden!
		}
		return
	}else{
		;prozess läuft -> schliessen?!
		msgbox,4,Close Process, Soll der Prozess %RowText% geschlossen werden?
		IfMsgBox, Yes
		{
			Process, close, %RowText%
		}
	}
GoSub, checkProcs
}
return



/**********************************************************
-----------------------Sub Section
checkProcs: überprüft die Programme und schreibt die 
Ergebnisse in das GUI.
***********************************************************
*/
checkProcs:
LV_Delete()
loop, parse, proclist, `n
{

	procPathState := ""
	procName := ""
	procPath := ""
	loop, parse, a_loopfield,|
	{
		if (a_index = 1){
			procName := a_loopfield
		}else{
			procPath := a_loopfield
		}
	}
	
	ifexist, %procPath%
	{
			procPathState := "ok"
	}Else{	
			procPathState := "File not found!"
	}
	
	process, Exist, %procName%
	if (!errorlevel){
			LV_Add("", procName, procPath, procPathState)
		}else{
			LV_Add("Check", procName, procPath, procPathState)		
		}
}
LV_ModifyCol()  ; Auto-size each column to fit its contents.
return

GuiClose:
exitapp
Kannst natürlich weitere Änderungen/Wünsche äussern. :) Erst muss dir ja mal der Grundaufbau gefallen...

lg
IsNull
 
Vielen Dank!
Mir gefällts so sehr gut. Aber noch was, was ich bei mir schon geändert hab (weiß ja nicht, ob du den Code weiterverwenden willst): 'Path' ist englisch in einer Spalte. In den anderen ('Prozess Name' und 'Info') ists Deutsch. Rein optischer Aspekt also ;)
Aber sonst sehr schön!

EDIT: Kann man das auch noch irgendwie hinbekommen, dass man keinen Doppelklick sondern nur eine Einfachklick braucht?


mfg
mP765
 
Code:
/***********************************************************

name	... procControl
ver	... alpha
coder	... IsNull

securityvision.ch
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
descrp.:
Minimales Tool um (im Vorfeld definierte) Prozesse zu
kontrollieren. Eine aktivierte Checkbox bedeutet dass der
jeweilige Prozess läuft. Mit einem Doppelklick auf einen
Prozess kann dieser gestartet bez. beendet werden.
************************************************************
*/



/**********************************************************
conf:
Syntax: 
NameDesProzesses | PfadZumProgramm
***********************************************************
*/
proclist =
(
Hallo.exe|Path to my exe
explorer.exe|C:\Windows\Explorer.exe
habadaba.exe|C:\wayne.exe
test.exe|C:\test.exe
usw...
)
delay := 2000
;**********************************************************

/**********************************************************
-----------------------GUI
minimales GUI aufsetzten
***********************************************************
*/

Gui, Add, text, x10 y20,Liste der zu überwachenden Programme:
Gui, Add, ListView, r20 w700 gMyListView Checked AltSubmit, Prozess Name|Pfad|Info
gui, show
gosub, checkProcs
SetTimer,checkProcs, %delay%
return


/**********************************************************
-----------------------Eventhandler
reagiert auf User-Interaktinen:
Leftclick
***********************************************************
*/
MyListView:
if A_GuiEvent = Normal
{
    LV_GetText(RowText, A_EventInfo,1) ;1 Zelle 
	LV_GetText(path2proc, A_EventInfo,2) ;2 Zelle 
	
	Gui +LastFound
	SendMessage, 4140, A_EventInfo - 1, 0xF000, SysListView321  ; 4140 is LVM_GETITEMSTATE.  0xF000 is LVIS_STATEIMAGEMASK.
	IsChecked := (ErrorLevel >> 12) - 1 
	
	if (!IsChecked){
		;prozess läuft nicht -> starten
		
		IfNotExist, %path2proc%
		{
			msgbox "%path2proc%" nicht gefunden!
			return
		}
		run, %path2proc%,,UseErrorLevel
		if (errorlevel){
			msgbox Prozess kann nicht gestartet werden!
		}
		return
	}else{
		;prozess läuft -> schliessen?!
		msgbox,4,Close Process, Soll der Prozess %RowText% geschlossen werden?
		IfMsgBox, Yes
		{
			Process, close, %RowText%
		}
	}
GoSub, checkProcs
}
return



/**********************************************************
-----------------------Sub Section
checkProcs: überprüft die Programme und schreibt die 
Ergebnisse in das GUI.
***********************************************************
*/
checkProcs:
LV_Delete()
loop, parse, proclist, `n
{

	procPathState := ""
	procName := ""
	procPath := ""
	loop, parse, a_loopfield,|
	{
		if (a_index = 1){
			procName := a_loopfield
		}else{
			procPath := a_loopfield
		}
	}
	
	ifexist, %procPath%
	{
			procPathState := "ok"
	}Else{	
			procPathState := "Datei nicht gefunden!"
	}
	
	process, Exist, %procName%
	if (!errorlevel){
			LV_Add("", procName, procPath, procPathState)
		}else{
			LV_Add("Check", procName, procPath, procPathState)		
		}
}
LV_ModifyCol()  ; Auto-size each column to fit its contents.
return

GuiClose:
exitapp
eingedeutscht und reagiert jetzt bei einem leftclick ;)

lg
IsNull
 
Zurück
Oben