Batch Problem - prozess erkennen

03/29/2012 01:56 Oberbratze#1
hi leute

ich brauche eure hilfe.
mein plan is folgender: eine batch datei, die eine seite aufrufen soll und anschließend nach einer pause wieder schließen soll.
ist der prozess, sprich firefox vorher offen gewesen soll er offen bleiben. ist er nicht offen gewesen soll er danach wieder geschlossen werden.

ich kenne mich eig gar nich aus damit , habe jedoch durch googlen und bisschen ausprobieren/basteln mir ein paar zeilen geschrieben und brauche eine kleine fehleranalyse :D
von der hälfte weiß ich nichma was es genau bedeutet/macht ;)

Meine Idee:
Code:
if tasklist /FI "IMAGENAME eq firefox.exe" | find /i "firefox.exe" && GOTO nokill
else GOTO killfirefox

:nokill
start "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" "Internetseite"
ping -n 4 127.0.0.1 > NUL
GOTO End

:killfirefox
start "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" "Internetseite"
ping -n 4 127.0.0.1 > NUL
taskkill /F /IM firefox.exe
GOTO End

:End
03/29/2012 14:43 jacky919#2
Benutz doch einfach eine vernünftige Programmiersprache.
03/29/2012 15:27 Oberbratze#3
hehe
ich brauche das aber für den jdownloader als reconnect methode.

von daher würde ich mich über hilfe immernoch freuen :)
03/29/2012 16:29 link#4
Dein If-Konstrukt ist doppelt-gemoppelt, da der &&-Operator eine indirekte If-Abfrage ist. Außerdem weiß ich nicht, ob sich das else einfach so dahinterstellen lässt, ansonsten müsste der Rest funktionieren.
Hab's gerade mal bei mir getestet:
Code:
@echo off

tasklist | find /i "opera.exe" > nul
if errorlevel == 1 (
set WasAlreadyRunning=
) else (
set WasAlreadyRunning=Yep
)

if "%ProgramFiles(x86)%"=="" ( 
  set "x86root=%ProgramFiles%" 
) else ( 
  set "x86root=%ProgramFiles(x86)%" 
) 

start "%x86root%\opera\opera.exe" "http://google.de"
ping -n 4 127.0.0.1 > nul

if "%WasAlreadyRunning%"=="" (
  taskkill /IM "opera.exe" > nul
)
Du könntest das aber auch mit Netcat ohne Umweg über den Browser machen, also das HTTP-Request direkt an das WebInterface deines Routers senden.
Hab mir irgendwann mal ein kleines Batch-Skript dafür geschrieben und könnte es raussuchen, falls du es brauchst (das Request hängt natürlich immer vom Interface des Routers ab, ist also nicht universell)
03/29/2012 17:04 Oberbratze#5
danke für deine Antwort. Jedoch gibts es noch ein kleines Problem damit ich es für mich zurechtbasteln kann.

Quote:
Originally Posted by link View Post
Code:
@echo off

tasklist | find /i "opera.exe" > nul
if errorlevel == 1 (
[B]set WasAlreadyRunning=                         //Ab hier verstehe ich nicht 
) else (                                                    //ganz die Vorgehensweise
set WasAlreadyRunning=Yep
)

if "%ProgramFiles(x86)%"=="" ( 
  set "x86root=%ProgramFiles%" 
) else ( 
  set "x86root=%ProgramFiles(x86)%" 
) [/B]                                                      // Bis hier :D

start "%x86root%\opera\opera.exe" "http://google.de"
ping -n 4 127.0.0.1 > nul

if "%WasAlreadyRunning%"=="" (
  taskkill /IM "opera.exe" > nul
)
03/29/2012 17:13 0x539#6
Ok, ja das stimmt.
03/29/2012 17:23 link#7
1. Tasklist erstellt eine Liste aller laufenden Prozesse
2. Über den Pipe-Operator wird diese Liste in den Find-Befehl eingespeist
3. Dieser sucht nach "opera.exe", wenn nichts gefunden wird, wird die vordefinierte Variable errorlevel (Rückgabewert des letzten Aufrufs) auf 1 (bzw. höher als 0) gesetzt
4. Heißt wenn opera.exe gefunden wurde, wird die Variable WasAlreadyRunning auf "Yep" gesetzt, ansonsten wird sie als leer definiert
5. Da sich Opera auf einem 64bit-System im 32bit-Programme-Verzeichnis befindet, unter 32bit aber lediglich im Programme-Verzeichnis, wird überprüft, ob es ein 32bit-Programme-Verzeichnis gibt (Indikator für 64bit) und dementsprechend wird das richtige Programme-Verzeichnis ausgewählt
6. Jetzt wird Opera mit dem gewünschten Parameter gestartet
7. Das Ping localhost dient als Sleep, um den Programmablauf kurzzeitig zu pausieren
8. Als letztes wird abgefragt, ob Opera beim Start des Skripts schon lief, wenn nicht (Opera also erst durch das Skript gestartet wurde), wird es wieder geschlossen

Btw. ohne "@echo off" werden die einzelnen Befehle, die du aufrufst, nochmal selber ausgegeben
und "> nul" sorgt dafür, dass die Rückgaben der einzelnen Befehle nicht ausgegeben werden (find gibt z.B. die Zeile zurück, in der der gesuchte String gefunden wurde, und durch "> nul" wird's einfach verworfen und es wird nichts angezeigt)

@0x539:
Tasklist gibt nur 0 zurück, weshalb sich dann mit errorlevel nicht arbeiten lässt
03/29/2012 17:41 Oberbratze#8
wow super, danke dir
hab nur schnell opera mit firefox ersetzt und alles hat geklappt.

is ja auch nur reine vorbeugung damit nich firefox 1000 tabs öffnet sollte ich mal afk sein :D
wenn ich da bin schließe ich die tabs dann manuell, deswegen der aufwand. :)