Batch Batch als "Ein-Aus-Schalter" für Programm

zyto-K

Newbie
Registriert
Okt. 2014
Beiträge
4
Hallo!

Ich versuche folgendes per Batch umzusetzen, und finde irgendwie nicht den richtige Ansatz dafür:

Ich will per Batch ein Programm ein- und ausschalten, d.h. also bei Ausführung der Batch soll erst geprüft werden ob das Programm läuft, wenn ja, dann soll es beendet werden, wenn nein, soll es gestartet werden.

Dass dabei TASKLIST und TASKILL und START beteiligt sein müssen habe ich herausgefunden ;)

Etwas komplizierter wird es dadurch, dass das Programm immer in 2 Instanzen gestartet werden soll (es ist ein Anzeige-Panel, welches beim Start mit 2 verschiedenen Parametern unterschiedliche Informationen anzeigt).

Die "Schalt-Logik" bei Batch-Ausführung soll also sein: läuft mind. 1 Instanz, dann beende alle / läuft keine Instanz dann starte 2 (mit dem jew. Parameter). Beide Instanzen werden natürlich in der TASKLIST mit dem gleichen Abbildnamen angezeigt. Da ja aber entweder beide gleichzeitig gestartet oder aber beide gleichzeitig geschlossen werden ist eine Unterscheidung hier ja auch nicht nötig.

Was die Sache noch ein klein wenig komplizierter macht, ist, dass das ganze auf einem Windows Server 2008 R2 läuft, d.h. mit TASKLIST bekomme ich nicht nur die eigenen Instanzen des Programms geliefert, sondern auch die der anderen Benutzer :freak:
Das Starten+Beenden darf natürlich nur die eigenen Instanzen des Programms betreffen.

Hat da jemand einen Ansatz für mich?

Vielen Dank!

Gruß, Klaus

PS: Gibt es eine Möglichkeit, dass während der Ausfürhung der Batch das CMD-Fenster nicht aufpoppt...?
 
Also das aufpoppen ist immer da soweit ich weiss.

Bzgl. Der Benutzer: Tasklist /fi ist deine Lösung ;) da kannste nach Benutzer filtern!
 
ryan_blackdrago schrieb:
Die beiden Tasks heißen wahrscheinlich im Taskmanager gleich?
Ja, beide gleich.
ryan_blackdrago schrieb:
Wäre es evtl. noch eine Alternative, daß die beiden Tasks (bzw. der eine Task) einfach in einem bestimmten Intervall automatisch gekillt (auch wenn kein Fehler vorliegt) & beide frisch und neu gestartet werden?
Nicht wirklich, denn die Anzeigen werden vom Benutzer nur bei Bedarf zur Ansicht aufgerufen und zumeist kurz darauf wieder geschlossen, und sollen i.d.R. nicht ständig laufen. Deshalb möchte ich das ganze ja als Ein-Klick-Version gestalten (mal eben reinschauen-klick, und wieder weg-klick). Würden sie die ganze Zeit laufen sollen, wäre der Aufwand jede Instanz einzeln zu starten und zu beenden ja nicht so groß, weil nicht ständig wiederkehrend.
 
Vor und Nach dem Starten müsste zu jedem betreffenden Task die PID ausgelesen und in eine Variable gepackt werden. Damit kannst du dann gezielt Starten, bzw. Beenden.

lg
fire
 
dcc22 schrieb:
Versuch es mit Autohotkey, [...]
Ist leider keine Option. Da das ganze auf dem Server läuft muss ich mit Bordmitteln auskommen. Zusätzl. Software dafür installieren ist nicht drin.
 
zyto-K schrieb:
Ist leider keine Option. Da das ganze auf dem Server läuft muss ich mit Bordmitteln auskommen. Zusätzl. Software dafür installieren ist nicht drin.

Muss man auch nicht, die .exe kann danach auf jedes System geschoben werden.
Autohotkey kann auch die kill.exe etc. vom OS aufrufen.
 
dcc22 schrieb:
Muss man auch nicht, die .exe kann danach auf jedes System geschoben werden.
Autohotkey kann auch die kill.exe etc. vom OS aufrufen.
Du hast natürlich Recht... ich sollte sorgfältiger lesen, bevor ich antworte ;)
Jaaa - das sieht in der Tat ganz brauchbar aus. Ich denke, da kann ich mir was zusammenstricken. Ich schau mir das mal genauer an...

Vielen Dank!
 
Prüfen ob ein Prozess läuft kann man so machen:
Code:
tasklist /FI "IMAGENAME eq test.exe" 2>NUL | find /I /N "test.exe">NUL
if "%ERRORLEVEL%"=="0" (echo Test positiv, Prozess läuft.)
if NOT "%ERRORLEVEL%"=="0" (
	echo echo Test negativ, Prozess läuft nicht.
	)

Unsichtbare Command Line geht per Windows Scripting Host:
Code:
Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "test.exe" & Chr(34), 0
Set WinScriptHost = Nothing

Und, weil ich gerade dabei bin: Admin-Rechte checken und ggf. besorgen kann man so machen (die Variante mit NET SESSION benötigt laufenden „Server“-Dienst):
Code:
@echo off
net session >nul 2>&1
REM "net file 1>nul 2>nul" geht auch
if %errorLevel% == 0 (
    REM Admin-Rechte vorhanden
) else (
    REM Admin-Rechte besorgen
    setlocal DisableDelayedExpansion
    set "batchPath=%~0"
    setlocal EnableDelayedExpansion
    ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs" 
    ECHO UAC.ShellExecute "!batchPath!", "ELEV", "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs" 
    "%temp%\OEgetPrivileges.vbs" 
    exit /B 
)

Damit solltest du dir zusammenbauen können, was du brauchst. ;)
 
Stimmt, mit dem Errorlevel von find klappt das ja super. Für alle, die später mal auf den Thread hier stoßen; Eine Batch die das macht könnte etwa so aussehen:

Code:
@echo off

set "application_name=notepad.exe"
set "username=Peter"
set "parameters="

tasklist /FI "imagename eq %application_name%" | find /I /N "%application_name%">NUL
if "%errorlevel%"=="0" (
		for /F "tokens=2 skip=3" %%a in ('tasklist /FI "username eq %username%" /FI "imagename eq %application_name%"') do (
			taskkill /PID %%a
		)
) else (
start %application_name% %parameters%
)

Und wenn man eine Verknüpfung auf die Batch macht, kann man dort unter "Ausführen" "Minimiert" wählen und muss dann auch nicht das cmd-Fenster angucken.
 
Zurück
Oben