WinFuture-Forum.de: Batch Programmierung - WinFuture-Forum.de

Zum Inhalt wechseln

Alle Informationen zum Thema Windows 7 in unserem Special. Windows 7 Download, FAQ und neue Funktionen im Überblick.
Seite 1 von 1

Batch Programmierung Wenn ProgrammA schließt, schließt ProgrammB


#1 Mitglied ist offline   Vikiller94 

geschrieben 12. September 2019 - 12:17

Hallo,

ich habe eine Batch Datei erstellt, welcher bei Ausführung 3 Prozesse öffnet.
Danach geht das System zu Active und prüft, ob der "MinecraftLauncher.exe" in der tasklist verfügbar ist. Wenn ich Minecraft beispielsweise spiele, führt die Batch einen Loop aus. Da Errorlevel == 0 besagt, dass ein Programm (in diesem Fall Minecraft) erfolgreich geschlossen wurde, springt das System zu Dead. Ab hier schließt sich FreefileSync und die batch pausiert.

Also ist meine Intension folgende: Wenn ich Minecraft manuell schließe (per Kreuz oder taskmanager) schließt direkt automatisch FreefileSync.

Hier ist mein Code:

@echo off
start "" "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-GoogleDrive)_[Mirror].ffs_real"
start "" "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-Backupfolder)_[Mirror].ffs_real"

start "" "C:\Program Files (x86)\Minecraft\MinecraftLauncher.exe"
:Active
tasklist /v | find "MinecraftLauncher.exe"
if %errorlevel%=="1" goto Dead
goto Active
:Dead
taskkill /F /IM "RealTimeSync_x64.exe"
pause



Leider ist hier ein Fehler, da wenn ich Minecraft schließe, schließt sich Freefilesync NICHT! Wo ist der Fehler?

Dieser Beitrag wurde von Vikiller94 bearbeitet: 12. September 2019 - 13:15

0

Anzeige



#2 Mitglied ist offline   Stefan_der_held 

  • Gruppe: Offizieller Support
  • Beiträge: 13.604
  • Beigetreten: 08. April 06
  • Reputation: 620

geschrieben 12. September 2019 - 12:52

Bin zwar schon etwas eingerostet was BATCH angeht aber:

Soweit ich das noch kenne MUSS "errorlevel" in % gesetzt werden:

if %errorlevel%=="0" goto Dead



allerdings ist im "errorlevel" bei ein Denkfehler drin:

errorlevel 0: Task existiert
errorlevel 1: Task existiert NICHT



Was ja auch logisch ist denn:

Taskliste | finde "MinecraftLauncher.exe"
Wenn ERRORLEVEL == 0 goto Dead <== also "wenn existiert da kein Fehler gehe zu Dead



:)

Dieser Beitrag wurde von Stefan_der_held bearbeitet: 12. September 2019 - 12:54

0

#3 Mitglied ist offline   Vikiller94 

geschrieben 12. September 2019 - 12:57

Beitrag anzeigenZitat (Stefan_der_held: 12. September 2019 - 12:52)

Bin zwar schon etwas eingerostet was BATCH angeht aber:

Soweit ich das noch kenne MUSS "errorlevel" in % gesetzt werden:

if %errorlevel%=="0" goto Dead



allerdings ist im "errorlevel" bei ein Denkfehler drin:

errorlevel 0: Task existiert
errorlevel 1: Task existiert NICHT



Was ja auch logisch ist denn:

Taskliste | finde "MinecraftLauncher.exe"
Wenn ERRORLEVEL == 0 goto Dead <== also "wenn existiert da kein Fehler gehe zu Dead



:)



Hallo :),

habe die Fehler behoben, leider schließt das System den Synctask nicht. :(

@echo off
start "" "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-GoogleDrive)_[Mirror].ffs_real"
start "" "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-Backupfolder)_[Mirror].ffs_real"

start "" "C:\Program Files (x86)\Minecraft\MinecraftLauncher.exe"

:Active
tasklist /v | find "MinecraftLauncher.exe"
if %errorlevel%=="1" goto Dead
goto Active

:Dead
taskkill /FI /IM "RealTimeSync_x64.exe"

pause


Dieser Beitrag wurde von Vikiller94 bearbeitet: 12. September 2019 - 12:59

0

#4 Mitglied ist offline   Stefan_der_held 

  • Gruppe: Offizieller Support
  • Beiträge: 13.604
  • Beigetreten: 08. April 06
  • Reputation: 620

geschrieben 12. September 2019 - 13:23

ggf. greift da noch ein Prozess drauf zu....

prüfe mal testweise ob du im Taskkill- Prozess was mit dem erzwingenden Parameter erreichst

 taskkill /FI /IM "RealTimeSync_x64.exe" /f


wenn nein:
Prüfe die genaue Schreibweise des Prozesses noch einmal

wenn ja:
Müsste man prüfen welche Prozesse da ggf. noch nicht "beenden-Bereit" sind - also den RealTimeSync blockieren.
0

#5 Mitglied ist offline   Vikiller94 

geschrieben 12. September 2019 - 13:26

Beitrag anzeigenZitat (Stefan_der_held: 12. September 2019 - 13:23)

ggf. greift da noch ein Prozess drauf zu....

prüfe mal testweise ob du im Taskkill- Prozess was mit dem erzwingenden Parameter erreichst

 taskkill /FI /IM "RealTimeSync_x64.exe" /f


wenn nein:
Prüfe die genaue Schreibweise des Prozesses noch einmal

wenn ja:
Müsste man prüfen welche Prozesse da ggf. noch nicht "beenden-Bereit" sind - also den RealTimeSync blockieren.



taskkill /F /IM "RealTimeSync_x64.exe"


Ich habe das so stehen. Wenn ich in CMD das eingebe, klappt alles wunderbar

Die Log schreibt mir das:

Der Befehl "tasklist" ist entweder falsch geschrieben oder konnte nicht gefunden werden :blink:

EDIT:
Wenn ich mit Adminrechte öffne erscheint bei mir ein CMD Fenster wo es jede Sekunde anzeigt ob MinecraftLauncher.exe is running or Unknown.
Leider hier wenn es unknown steht wird der Sync nicht geschlossen

EDIT 2:
Es hat funktioniert aber da muss noch was verbessert werden. Nämlich:

1. Ohne Adminrechte die Batch zu öffnen
2. Das Cmd Fenster soll nicht angezeigt werden
3. Die beliebige Taste drücken... Fenster soll nicht angezeigt werden. (gelöst: statt pause = exit)

Code der funktioniert:
@echo off
start "" "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-GoogleDrive)_[Mirror].ffs_real"
start "" "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-Backupfolder)_[Mirror].ffs_real"

start "" "C:\Program Files (x86)\Minecraft\MinecraftLauncher.exe"
:Active
tasklist /v | find "MinecraftLauncher.exe"
if %errorlevel% == 1 goto Dead
goto Active
:Dead
taskkill /F /IM "RealTimeSync_x64.exe"
pause


Dieser Beitrag wurde von Vikiller94 bearbeitet: 12. September 2019 - 14:21

0

#6 Mitglied ist offline   Stefan_der_held 

  • Gruppe: Offizieller Support
  • Beiträge: 13.604
  • Beigetreten: 08. April 06
  • Reputation: 620

geschrieben 12. September 2019 - 13:58

Hm... wie schaut es denn mit einem Workaround aus indem du Minecraft mittels

start/wait "C:\Program Files (x86)\Minecraft\MinecraftLauncher.exe"


startest, den Tasklist befehl rausnimmst.

Sofern du das Fenster von Minecraft nicht schließt pausiert die Batch solange an der Position...

im Ganzen also (Pi-mal-Daumen)

@echo off
start "" "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-GoogleDrive)_[Mirror].ffs_real"
start "" "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-Backupfolder)_[Mirror].ffs_real"


start/wait "C:\Program Files (x86)\Minecraft\MinecraftLauncher.exe"

:Dead
taskkill /FI /IM "RealTimeSync_x64.exe"

pause


:unsure:

btw: gerade mal wieder mit Tasklist gearbeitet... für eine Batch ist das irgendwie zu unperform bis die ganze Taskliste durch gegangen wurde.
0

#7 Mitglied ist offline   Vikiller94 

geschrieben 12. September 2019 - 14:19

Beitrag anzeigenZitat (Stefan_der_held: 12. September 2019 - 13:58)

Hm... wie schaut es denn mit einem Workaround aus indem du Minecraft mittels

start/wait "C:\Program Files (x86)\Minecraft\MinecraftLauncher.exe"


startest, den Tasklist befehl rausnimmst.

Sofern du das Fenster von Minecraft nicht schließt pausiert die Batch solange an der Position...

im Ganzen also (Pi-mal-Daumen)

@echo off
start "" "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-GoogleDrive)_[Mirror].ffs_real"
start "" "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-Backupfolder)_[Mirror].ffs_real"


start/wait "C:\Program Files (x86)\Minecraft\MinecraftLauncher.exe"

:Dead
taskkill /FI /IM "RealTimeSync_x64.exe"

pause


:unsure:

btw: gerade mal wieder mit Tasklist gearbeitet... für eine Batch ist das irgendwie zu unperform bis die ganze Taskliste durch gegangen wurde.


Ich habe dort einen Timeoutbefehl eingebaut. Alles klappt wunderbar.
Kann man oben so machen, dass die Batch wartet bis ein Programm geöffnet wird?

EDIT:

:Anfang
tasklist /FI "IMAGENAME eq javaw.exe" 2>NUL | find /I /N "javaw.exe">NUL
if %errorlevel% == 0  goto Active
GOTO Anfang



Dieser Befehl macht es möglich. Batch wartet bis Java ausgeführt wird.

Code:
@echo off
start "" "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-GoogleDrive)_[Mirror].ffs_real"
start "" "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-Backupfolder)_[Mirror].ffs_real"

start "" "C:\Program Files (x86)\Minecraft\MinecraftLauncher.exe"

:Anfang
tasklist /FI "IMAGENAME eq javaw.exe" 2>NUL | find /I /N "javaw.exe">NUL
if %errorlevel% == 0  goto Active
GOTO Anfang

:Active
tasklist /v | find "javaw.exe"
if %errorlevel% == 1 goto Dead
goto Active

:Dead
timeout 60
taskkill /F /IM "RealTimeSync_x64.exe"
exit



Bleibt noch die Frage, wie man die Batch ausführt OHNE :rolleyes: Administratorechte

Dieser Beitrag wurde von Vikiller94 bearbeitet: 12. September 2019 - 14:55

0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0