Batch Verschaltung von Prozessabfragen

P

psegma

Gast
Hey,

ich wollte ein kleines Batchscript schreiben, dass prüft, ob zwei Prozesse laufen. Im Falle das die Prozesse nicht laufen, sollen sie gestartet werden, ansonsten soll das script beendet werden. Also folgendes Konzept sollte abgearbeitet werden:

(Pseudocode)
Code:
:CHECK_a
if Process a running // läuft eine Instanz von a?
{
    goto :CHECK_b // wenn ja, dann pfüfe ob eine Instanz von b läuft
}
else
{
    Start Process a // wenn nein, dann starte neue Instanz von a
}

:CHECK_b
if Process b running // läuft eine Instanz von b?
{
    goto :EXIT // wenn ja, dann beende Script
}
else
{
    Start Process b // wenn nein, dann starte eine neue Instanz von b
}

:EXIT
exit // beende das Script

Folgendes ist mein Code(Anfänger)
Code:
@ECHO OFF
GOTO :CHECK_PROC_1

:CHECK_PROC_1
tasklist /nh /fi "imagename eq notepad.exe" | find /i "notepad" >nul && (
	GOTO :CHECK_PROC_2
) 
||
(
	cd C:\Test\Batch
	start notepad.exe
)
pause>nul
GOTO :CHECK_PROC_2

:CHECK_PROC_2
tasklist /nh /fi "imagename eq notepadKiller" | find /i "notepadKiller" >nul && (
	GOTO :END
) 
||
(
	cd C:\Test\Batch
	start notpadKiller.exe
)
pause>nul
GOTO :END


:END
EXIT

Das Fenster taucht zwar auf, schließt sich aber sofort wieder und keiner der beiden Prozesse wird ausgeführt.

Die Abfrage, ob eine Instanz läuft habe ich im Internet gefunden.

Zu dem Programm: Es wird so sein, dass manchmal noch eine Kopie von b läuft, aber nicht immer(daher das Konzept der Verschaltung).

Ich hoffe, ihr könnt mir helfen :)

Gruß
 
Das Fenster taucht zwar auf, schließt sich aber sofort wieder und keiner der beiden Prozesse wird ausgeführt.

Baue doch einfach ein paar "pause"n ein um zu schauen was nicht stimmt ;)
 
Was macht die notepadkiller.exe ?

Wenn sie die notepad.exe beendet, was ich mir mal so vom Namen ableite, dann erklärt das doch schon warum du am Ende keinen offenen Prozess mehr hast.
 
Achso, 'tschuldigung.

NotpadKiller.exe durchläuft eine stetige schleife und prüft, ob eine bestimmt Taste (F9) gedrückt wurde, wenn dem so ist wird sie prüfen ob notepad.exe läuft, den prozess beenden und die PID ausgeben, wenn nicht, wird dies ebenfalls gemeldet.

Pseudocode:

Code:
while(true)
{
     if(KeyPressed(F9))
    {
          if ( notepad.exe running)
          {
                  Print(PID von notepad.exe)
                  Kill notepad.exe
           }
           else
                print(notepad not running)
    }
     Wait(200)
}

Jetzt dürfte auch klar sein, warum zum Zeitpunkt des Aufrufens des Batchscripts es durchaus sein kann, dass notpadKiller, im Script b, noch läuft.



Ich hab auch mal ein paar mal pause eingebaut, aber die Konsole geht trotzdem sofort zu.
Eine einzeilige Fehlermeldung ist zu sehen:

Code:
"||"  kann syntaktisch an dieser Stelle nicht verarbeitet werden
(meine ich zumindest)
 
Zuletzt bearbeitet:
Dann mache die beiden "||" einfach weg.
 
Dann geht die Konsole auf und wieder zu, ohne, dass etwas ausgegeben wird, nicht einmal eine Ausgabe auf pause.
 
Jetzt mal unabhängig von der Logik des Programmes sehe ich einige Syntaxfehler:

- Aufruf der notepad bzw notepadkiller in Klammern ist falsch
- doppelte Pipes || sind Unsinn
- pause bzw pause > nul ist unnötig
- exit kann vernachlässigt werden, wird die Batch per Doppelklick aufgerufen beendet sie sich eh von alleine wieder am Ende
- bei tasklist hast du eine doppelte Filterung drin mit /fi und find
- zweizeilige Syntax von

cd C:\Test\Batch
start notepad.exe

ist fehleranfällig, sofern dein Homedrive ungleich Laufwerk C ist. Per default steht der Prompt der Batch immer auf %HOMEDRIVE%. Wenn dein Homedrive also Laufwerk D ist, dann nützt der cd Befehl nichts und die notepad.exe wird weiterhin auf D:\ gesucht.

Alles in allem sieht der Code ohne die Handwerklichen Fehler so aus:

Code:
@ECHO OFF
GOTO :CHECK_PROC_1

:CHECK_PROC_1
tasklist | find /i "notepad" >nul && GOTO :CHECK_PROC_2
start C:\Test\Batch\notepad.exe

GOTO :CHECK_PROC_2


    
:CHECK_PROC_2
tasklist | find /i "notepadKiller" >nul && GOTO :END
start C:\Test\Batch\notpadKiller.exe

GOTO :END

     
     
:END
 
Zuletzt bearbeitet:
Zurück
Oben