Batch und laufende Programme

Hallo,

nach 5 Stunden Google hab ichs aufgegeben mir selbst ne Lösung zu suchen... Falls ich was übersehen habe: Ich bin für alle Links offen ;)

Also, nun zu meiner Frage/meinem Problem:

Ich würde gerne eine Batchdatei schreiben, in der folgendes abläuft:

Es wird überprüft, ob ein Programm läuft. Falls dies so ist, soll eine Abfrage kommen, ob das Programm beendet werden soll. Wird diese mit der Eingabe J beantwortet, soll das Programm beendet werden. Bei anderen Eingaben wird das nächste Programm überprüft. Falls das Programm noch nicht läuft, soll die gleiche Prozedur kommen, nur eben, dass das Programm bei Eingabe von "J" gestartet werden soll. So werden insgesamt ca. 10 Programm überprüft und dann fängt das ganze wieder von vorne an.
Hoffe mal, dass das einigermaßen verständlich war.

So weit bin ich nu gekommen (das funktioniert allerdings rein gar nicht...):
Code:
 @echo off
title Starter-Batch

:start
echo.
echo ==========================================
echo.
:ICQ
echo ---ICQ---
tasklist | find "ICQ.exe" 1>NUL 2>&1 || goto ICQend
:ICQstart
echo ICQ starten?
set /P ICQ=
echo %ICQ%
if /I %ICQ%=="j" (
start ICQ.exe 
)
goto Thunderbird
:ICQend
echo ICQ beenden?
set /P ICQ=
echo %ICQ%
if /I %ICQ%=="j" (
kill /f ICQ.exe 
)
goto Thunderbird
:Thunderbird
echo ---Thunderbird---
pause
ende

Das Ende ist was seltsam, aber ich wollte bevor ich zum nächsten Programm springe erstmal eines hinbekommen...

Als dies dann alles nicht funktionierte hab ich mir überlegt, dass man das Ergebnis der tasklist.exe doch eigentlich in ne Textdatei schreiben könnte. Allerdings weiß ich nicht genau, wie man das dann ausliest usw. Diese Möglichkeit möchte ic
h aber nur verwenden, wenns ohne nicht geht. Am liebsten wäre es mir ganz ohne zusätzliche Dateien.


Hoffe, dass man so ungefähr meine Gedankengänge nachvollziehen kann. Vllt. hat ja sogar jemand eine Idee zur Lösung meines Problems. dazu sei vielleicht noch gesagt, dass ich recht wenig Ahnung von Batch-Dateien hab..

Vielen Dank im Voraus
mfg
mP765
 
Von Batch versteh ich wenigstens noch ein bisschen, aber von VBS hab ich so rein gar keine Ahnung. Aber wenn mir jemand den ganzen Code schreibt (vllt . auch mit ein paar kleinen Erläuterungen), ist es meiner Meinung nach kein Problem. Oder braucht man irgendwelche Zusatzprogramme?


mfg
mP765
 
Hab da mal was gebastelt.
Musst du aber noch für dich anpassen.

Bin mir aber nicht sicher ob es genau sowas ist was du suchst.
Aber schau es dir mal an.

mfg
 
In Autohotkey...
Code:
proclist =
(
Hallo.exe
explorer.exe
habadaba.exe
usw...
) ;kann natürlich auch in eine separate Datei ausgelagert werden.

loop, parse, proclist, `n
{
	process, Exist, %a_loopfield%
	if (!errorlevel){
			;nicht gefunden
		}else{
			msgbox,4, ProcessCloser,Wollen Sie das Programm %a_loopfield% beenden?
			IfMsgBox, Yes
			{
			process, Close, %a_loopfield%
			}
		}
}
msgbox fertisch.
ExitApp
ahk rocks :D
 
Danke für eure Antworten.
Ich gehe auf mal auf den Vorschlag von shodan ein.

Das sieht schon sehr gut aus. Kleine Anpassungen kann ich selbst machen.
Wie kann ichs noch hinbekommen, dass das Programm immer weiter in einer Schleife läuft?

Nun stellt sich mir aber auch die Frage, ob man das ganze nicht auch in ein Fester machen könnte. Also so:
In einem Fenster stehen die ganzen Boxen, die nun nacheinander kommen einfach untereinander (aber dann aber nur in einem Fenster). Dort dann wieder die Abfrage (die sich dann jedoch entsprechend aktualisieren müsste, sobald man bei einem auf Starten oder beenden klickt). Wenn ich übermütig werde, sag Bescheid ;)

EDIT: Da fällt mir grad noch was auf: Wenn ich bei der Beenden-Abfrage von z.B. 'cmd.exe' auf Ja klicke, kommt keine weitere Abfrage mehr.


mfg
mP765
 
Da fällt mir grad noch was auf: Wenn ich bei der Beenden-Abfrage von z.B. 'cmd.exe' auf Ja klicke, kommt keine weitere Abfrage mehr.

Ich dachte das sei gewollt? Aber egal is ganz easy.
Code:
 ...
 If wert_mbox = vbYes then
           For Each objProcess in Ergebnis
                objProcess.Terminate()
            Next
           Exit For  <--- Das einfach entfernen
	    End If

mfg
 
@IsNull: Danke. Aber lass dir Zeit, ich hab sie nämlich ;) Übrigens: ahk rockt wirklich :D
@shodan: Ja, so gehts. Jetzt nur noch das andere und mein Problem ist gelöst :)


mfg
mP765
 
So hab jetzt noch ne Endlosschleife eingebaut.
Sie läuft solange bis Abbrechen gedrückt wird.

mfg

Edit: Beschreib mal etwas genauer wie das Script haben möchtes.
Ich werd aus diesem "alles in einem Fenster" nich schlau.
 
Hoffe du siehst durch - du musst nur den delay und die proclist editieren. Wenn du AHK nicht installieren möchtest, kann ich dir auch eine Variante mit einer Ini schreiben und die dann kompilieren. :)

Das Programm prüft alle %delay% die Prozesse und macht ein Häckchen bei denen, welche laufen. Wenn du z.B. nur die laufenden angezeigt haben möchtest, must du dich melden.
ps: Das GUI ist ein 1min Stück - evtl. baue ich es noch etwas aus^^
Code:
/**********************************************************
variabeln:
***********************************************************
*/
proclist =
(
Hallo.exe
explorer.exe
habadaba.exe
usw...
)
delay := 5000
;**********************************************************



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


;--------------------------------------
MyListView:
if A_GuiEvent = DoubleClick
{
    LV_GetText(RowText, A_EventInfo)
	Gui +LastFound
	SendMessage, 4140, A_EventInfo - 1, 0xF000, SysListView321  ; 4140 is LVM_GETITEMSTATE.  0xF000 is LVIS_STATEIMAGEMASK.
	IsChecked := (ErrorLevel >> 12) - 1 
	
	if (!IsChecked){
		msgbox Dieser Prozess läuft momentan nicht!
		return
	}
	
    msgbox,4,Close Process, Soll der Prozess %RowText% geschlossen werden?
	IfMsgBox, Yes
	{
		Process, close, %RowText%
		LV_Modify(A_EventInfo, "-Check").
	}
}
return

;--------------------------------------
checkProcs:
LV_Delete()
loop, parse, proclist, `n
{
	process, Exist, %a_loopfield%
	if (!errorlevel){
			LV_Add("", a_loopfield)
		}else{
			LV_Add("Check", a_loopfield)		
		}
}
LV_ModifyCol()  ; Auto-size each column to fit its contents.
return

;--------------------------------------
GuiClose:
exitapp
 
@IsNull: Das ist verwirrend... Aber auch gut :) Nur eines: Es ist keine Option zum Starten des entsprechenden Programmes enthalten (oder ich sehs nich). Wenn das Ganze jetzt auch noch mit einem Einfach- statt eines Doppelklickes gehen würde und im Fenster nur eine Spalte ist, gefällts mir zu 99% ;) Aber wie immer: Wenn du keine Zeit/Lust hast, ist das für mich auch verständlich.
Noch eine Verständnisfrage: Im Entwurf von shodan ist noch der Pfad enthalten, den man zum Starten braucht. Wie geht das bei deinem?

@shodan: Danke für deinen zweiten Entwurf. Mit den Fenstern meinte ich das in etwa so:

--------------------------------------
/....bla.exe läuft. schließen?.. /
/.....Ja........ Nein.................. /
--------------------------------------
/...ert.exe läuft. schließen?..../
/......Ja........ Nein................. /
--------------------------------------
/...gnu.exe läuft. schließen?../
/........Ja........ Nein................ /
--------------------------------------

Aber wenn das mit dem Programm von IsNull hinhaut, brauch ich dies so nicht mehr.


mfg
mP765
 
@IsNull: Das ist verwirrend... Aber auch gut smile Nur eines: Es ist keine Option zum Starten des entsprechenden Programmes enthalten (oder ich sehs nich). Wenn das Ganze jetzt auch noch mit einem Einfach- statt eines Doppelklickes gehen würde und im Fenster nur eine Spalte ist, gefällts mir zu 99% Augenzwinkern Aber wie immer: Wenn du keine Zeit/Lust hast, ist das für mich auch verständlich.
Noch eine Verständnisfrage: Im Entwurf von shodan ist noch der Pfad enthalten, den man zum Starten braucht. Wie geht das bei deinem?

hehe, ok ich mache die Anpasungen. Den Pfad brauche ich wahrscheinlich nicht, den kann man auslesen. Fragt sich noch wo, pff :)

EDIT:
Also, natürlich brauche ich den Pfad von allen Prozessen, die zu Beginn nicht laufen :rolleyes: :D Also doch mit Prozessliste^^
 
Was mir da so noch einfällt, man könnte auf der Basis des VBS Codes
bestimmt ne schöne bunte HTML Seite basteln.
So mit übersicht welche der Prozesse gerade laufen usw, das ganze dann
mit Buttons zum starten oder beenden.

Allerdings sind meine HTML künste extrem begrenzt :(

Naja is ja nur so ne Idee.

mfg
 
Original von shodan
Was mir da so noch einfällt, man könnte auf der Basis des VBS Codes
bestimmt ne schöne bunte HTML Seite basteln.
So mit übersicht welche der Prozesse gerade laufen usw, das ganze dann
mit Buttons zum starten oder beenden.

Allerdings sind meine HTML künste extrem begrenzt :(

Naja is ja nur so ne Idee.

mfg
Genau das macht der obige AHK Code -@ least ansatzweise. Hier mein aktueller (unfertiger stand:)

Morgen mache ich weiter...
 
Hatte mP765 nicht nach einer batch gefragt?

Code:
@echo off
 
call :FncAskKillOrRunApp notepad.exe

goto :EOF

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

Die geforderte Schleife lässt sich wie folgt realisieren (einfach die obige Zeile "call :FncAskKillOrRunApp notepad.exe" durch die folgenden 4 Zeilen ersetzen) ...

Code:
:LOOP
  call :FncAskKillOrRunApp notepad.exe
  call :FncSleep 5
 goto :LOOP

...wobei die sleep-Funktion wie folgt aussieht (und nur benötigt wird, wenn zwischen den einzelnen Schleifen die angegebene Anzahl Sekunden gewartet werden soll):

Code:
: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
 
Hatte mP765 nicht nach einer batch gefragt?
anfänglich schon. Jetzt sind wir ja schon bei einer GUI Auswertung angelangt :)

btw. Ich wusste nicht mal, dass man mit batch funktionen definieren kann o.0
 
So, nun meine Antworten:

@shodan: Da hab ich leider auch keine Ahnung von...
@IsNull: Schonmal vielen Dank für den Entwurf ;) Du sagtest ja, dass du noch weiter dran arbeitest, hier noch was: Wenn man einen Prozess schließt, kommt immer die Meldung "Prozess konnte nicht beendet werden". Vllt. weißt du das bereits, aber bevor du dich dann nochmal drangeben musst, sag ich lieber mal Bescheid ;)
@NeonZero: Ja, zuerst war eine Batch geplant, da cih von dem anderen keine Ahnung habe ;) Vielen Dank für den Code, allerdings wird bei mir der Befehl "taskkill" nicht erkannt.


mfg
mP765
 
Wegen der batch: versuche mal ?tskill? ;)

Kein Problem, ich werde das heute Abend so einbauen und testen. evtl.musst dich aber auch 2-3 Tage gedulden.

Lg
IsNull
 
Zurück
Oben