none
Batch Script: When ProgramA is opened, ProgramB opens/ProgramA is closed, ProgramB is closed RRS feed

  • Allgemeine Diskussion

  • Hallo,

    Ich möchte gerne eine Batch-Datei erstellen, welches mir erlaubt von einem zum anderen Computer zu synchronisieren.

    Ich möchte gerne, dass wenn ich Minecraft öffne, dass der Sync automatisch ausgeführt wird (wie eine Anwendung) und andersrum wenn ich Minecraft schließe, dieser auch automatisch schließt.

    Ist das möglich, so einen Script herzustellen?

    Das ist mein Code, welcher leider nicht funktioniert:

    @echo off
    :main
    set MINECRAFT = "MinecraftLauncher.exe"
    set SYNC = "C:\Users\Viktor\Documents\FreeFileSync Aufträge\RealTimeSync Aufträge\Batchrun_(.minecraft-GoogleDrive)_[Mirror].ffs_real"
    IF %MINECRAFT%==tasklist /FI "IMAGENAME eq %MINECRAFT" (start "" %SYNC%)
    IF %MINECRAFT%==tasklist /FI "IMAGENAME ne %MINECRAFT" (taskkill /F /IM RealTimeSync_x64.exe /T)
    goto main


    • Bearbeitet Vikiller94 Mittwoch, 11. September 2019 13:58
    Mittwoch, 11. September 2019 12:31

Alle Antworten

  • Hi,

    as this is the german board, please edit your request to german or repost it at the english board.

    If I get you right, you want to sync a folder, as long as minecraft is running.

    In this case, you will need to write a powershell script instead of batch. 

    And what you need is a hotfolder monitoring, this can be done with the IO.FileSystemWatcher Class.

    _____________________________________________________________________________________

    Hi,

    da dies das deutsche Forum ist, ändere deine Frage bitte in deutsch um oder poste sie im englischen Forum.

    Wenn ich dich richtig verstanden habe, willst du, dass ein Ordner solange synchronisiert wird, wie minecraft am laufen ist.

    In dem Fall musst du ein Skript in powershell statt in batch schreiben.

    Und was du brauchst, ist ein "hotfolder monitoring", das kann man mit der IO.FileSystemWatcher Klasse machen.

    Mittwoch, 11. September 2019 13:41
  • Tut mir Leid. Ich werde meinen Text übersetzen. Ich werde mich darüber schlau machen. Danke marc-sysadmn. 

    Edit: Habe nochmal dein Kommentar durchgelesen. Nein, nicht ganz. Ich will, dass ein Programm sich öffnet (In diesem Fall: Minecraft) und daraufhin ein anderes Program (Ein Syncprogramm) geöffnet wird. Und andersrum, wenn geschlossen wird.

    Es ist eigentlich nicht anderes, außer Öffnen und Schließen einer Datei bei Ausführen eines anderen Programms.


    • Bearbeitet Vikiller94 Mittwoch, 11. September 2019 14:12
    Mittwoch, 11. September 2019 13:55
  • Tut mir Leid. Ich werde meinen Text übersetzen. Ich werde mich darüber schlau machen. Danke marc-sysadmn. 

    Edit: Habe nochmal dein Kommentar durchgelesen. Nein, nicht ganz. Ich will, dass ein Programm sich öffnet (In diesem Fall: Minecraft) und daraufhin ein anderes Program (Ein Syncprogramm) geöffnet wird. Und andersrum, wenn geschlossen wird.

    Es ist eigentlich nicht anderes, außer Öffnen und Schließen einer Datei bei Ausführen eines anderen Programms.


    Achso, dass kannst du tatsächlich zum Teil mit batch machen.

    Nur beim Start mit ausführen wäre einfach, da baust du eine batch, die sowohl die exe von minecraft als auch von deinem sync Programm startet.

    Beim beenden von Minecraft ist etwas tricky.

    Varianate 1:

    Du baust einen Task in der Aufgabenplanung und stellst als Event das Beenden des Minecraft Prozesses ein und als Aufgabe gibst du ihm wieder das batchskript zum ausführen.

    Hier müsstest du erstmal schauen, wie das Event in der Ereignisanzeige aussieht, damit du es dann korrekt in der Aufgabenplanung angeben kannst.

    Variante 2:

    Du baust ein Powershell Skript, dass beim starten von minecraft einmal das sync Programm startet und ab dann in einer Schleife prüft, ob der Minecraft Prozess noch läuft und wieder das sync Programm startet, sobald der Prozess beendet wird. Hat halt einen leichten Overhead, da das Skript im hintergrund weiter läuft.

    Gruß

    Mittwoch, 11. September 2019 15:19
  • Ich habe das so erstellt.

    Leider wenn ich Minecraft beende, beendet es nicht das Sync Programm.

    @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"
    timeout 3 >nul
    start "" "C:\Program Files (x86)\Minecraft\MinecraftLauncher.exe"
    :main
    If MinecraftLauncher.exe tasklist /FI "IMAGENAME nq %MINECRAFT%"
    (Taskkill /F /IM "RealTimeSync_x64.exe"
    pause)
    else (goto main)

    Leider habe ich dort beim If Statement irgendwo vertan.

    Ich will, dass dieser If-statement solange ausgeführt wird, bis Minecraft sich schliesst. Deshalb auch der jumper. In If-Statement habe ich das so überlegt, dass das System immer überprüft ob der MinecraftLauncher task ausgeführt oder beendet ist. Wenn er ausgeführt ist, jumpt er nach oben und führt ihn erneut aus. Wenn es merkt das Minecraft geschlossen ist, schliesst er auch das sync programm mit taskkill.

    Das war die Idee.




    • Bearbeitet Vikiller94 Mittwoch, 11. September 2019 16:48
    Mittwoch, 11. September 2019 16:17
  • Das ist sicherer mit Powershell, da man dann gezielter auf das Ende eines Prozesses warten kann.
    Für Taskkill werden u.U. höhere Rechte benötigt.
    Lass dam mal unter Admin laufen.

    Mittwoch, 11. September 2019 17:16
  • Kannst du mir helfen bei Powershell? Ich habe diesen Code zusammengebastelt nur leider funktioniert er nicht richtig :(

    Der if Satz ist korrupt.

    Mittwoch, 11. September 2019 17:21
  • Ich habe das so erstellt.

    Leider wenn ich Minecraft beende, beendet es nicht das Sync Programm.

    @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"
    timeout 3 >nul
    start "" "C:\Program Files (x86)\Minecraft\MinecraftLauncher.exe"
    :main
    If MinecraftLauncher.exe tasklist /FI "IMAGENAME nq %MINECRAFT%"
    (Taskkill /F /IM "RealTimeSync_x64.exe"
    pause)
    else (goto main)

    Leider habe ich dort beim If Statement irgendwo vertan.

    Ich will, dass dieser If-statement solange ausgeführt wird, bis Minecraft sich schliesst. Deshalb auch der jumper. In If-Statement habe ich das so überlegt, dass das System immer überprüft ob der MinecraftLauncher task ausgeführt oder beendet ist. Wenn er ausgeführt ist, jumpt er nach oben und führt ihn erneut aus. Wenn es merkt das Minecraft geschlossen ist, schliesst er auch das sync programm mit taskkill.

    Das war die Idee.




    Das Problem ist, dass tasklist nicht mit Wildcards arbeiten kann. Du musst also die komplette tasklist nach dem String durchsuchen. Find kann mit Wildcards umgehen. Also so:

    tasklist /v | find "minecraft"
    Ich weiß allerdings nicht, ob man das dann in batch noch in einer If schleife verarbeiten kann.Sollte es gehen, ist es natürlich sehr ineffizient und dauert länger.

    Wie heißt es so schön. Kann man so machen, ist dann halt scheiße.

    Mit powershell würde man sowas z.B. mit einer while Schleife machen, dass sieht dann in etwa so aus:

    while(

    (Get-Process -Name *minecraft*) -ne $True) { Get-Process -Name *RealTimeSync_x64* | Stop-Process }


    Gruß









    • Bearbeitet marc-sysadmn Mittwoch, 11. September 2019 20:11
    Mittwoch, 11. September 2019 19:23
  • Hallo nochmal,

    ich führe diesen Code aus.

    Start-Process -FilePath "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-Backupfolder)_[Mirror].ffs_real" Start-Process -FilePath "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-GoogleDrive)_[Mirror].ffs_real" Start-Process -FilePath "C:\Program Files (x86)\Minecraft\MinecraftLauncher.exe" while((ps -Name *minecraft*) -ne $true)

    {

    GetProcess -Name *RealTimeSync_x64* | Stop-Process

    } exit

    Nun habe ich das Problem wenn ich Minecraft schließe, dass Realfilesync immer noch an ist

    Log: 

    Die Benennung "GetProcess" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vor
    gang.
    Bei C:\Users\Viktor\Desktop\Com.ps1:10 Zeichen:11
    + GetProcess <<<<  -Name *RealTimeSync_x64* | Stop-Process
        + CategoryInfo          : ObjectNotFound: (GetProcess:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException



    • Bearbeitet Vikiller94 Mittwoch, 11. September 2019 20:19
    Mittwoch, 11. September 2019 20:00
  • Hallo nochmal,

    ich führe diesen Code aus.

    Start-Process -NoNewWindow -FilePath "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-Backupfolder)_[Mirror].ffs_real" Start-Process -NoNewWindow -FilePath "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-GoogleDrive)_[Mirror].ffs_real" Start-Process -NoNewWindow -FilePath "C:\Program Files (x86)\Minecraft\MinecraftLauncher.exe" while((ps -Name *minecraft*) -ne $true)

    {

    GetProcess -Name *RealTimeSync_x64* | Stop-Process

    } exit

    Leider führt er nur Minecraft aus aber nicht die oberen Dateien. Woran liegt das denn?

    Log: 

     

    Start-Process : Dieser Befehl kann aufgrund des folgenden Fehlers nicht ausgeführt werden: Das System kann die angegebene Datei nicht finden.
    Bei C:\Users\Viktor\Desktop\Com.ps1:1 Zeichen:14
    + Start-Process <<<<  -NoNewWindow -FilePath "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-Backupfolder)_[Mirror]"
        + CategoryInfo          : InvalidOperation: (:) [Start-Process], InvalidOperationException
        + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand

    Start-Process : Dieser Befehl kann aufgrund des folgenden Fehlers nicht ausgeführt werden: Das System kann die angegebene Datei nicht finden.
    Bei C:\Users\Viktor\Desktop\Com.ps1:3 Zeichen:14
    + Start-Process <<<<  -NoNewWindow -FilePath "C:\Users\Viktor\Documents\FreeFileSync Auftraege\RealTimeSync Auftraege\RealTime_(.minecraft-GoogleDrive)_[Mirror]"
        + CategoryInfo          : InvalidOperation: (:) [Start-Process], InvalidOperationException
        + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand

    Und ich bekomme auch das:

    Die Benennung "GetProcess" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vor
    gang.



    Es heißt get-process.

    Der Pfad zum Programm darf nicht maskiert sein.

    Das Programm muss ausführbar sein, keine Ahnung was

    RealTime_(.minecraft-GoogleDrive)_[Mirror].ffs_real

    sein soll. Klingt so, als  ob irgendwelche Parameter mit übergeben werden. Keine Ahnung ob das funktionieren kann. Wenn das Parameter sind, dann würde ich den Programmaufruf und die überhabe der Parameter in eine Batch packen und diese dann mit get-process aufrufen.

    Mittwoch, 11. September 2019 20:18
  • Ich habe herausgefunden, dass wenn Minecraft geöffnet wird, dass die Syncprozesse starten wenn in

    Get-Process -Name *RealTimeSync_x64* | Stop-Process

    RealTimeSync_x64 nicht steht. Alles was hier steht wird nach Ausführung dieser Datei geschlossen.


    Ich möchte gerne wenn ich die Script ausführe, Minecraft und Sync sich öffnen und wenn ich Minecraft schliesse, diese Syncs ausgehen.
    • Bearbeitet Vikiller94 Mittwoch, 11. September 2019 20:43
    Mittwoch, 11. September 2019 20:24
  • Naja ein bischen was musst du dir schon selbst erarbeiten. Ich hab dir schon aufgezeigt, über welchen Weg man Code auf Events reagieren lässt.

    Das Forum ist nicht dafür da, Musterlösungen auf Anfrage zu bauen, sondern um Wege Aufzuzeigen.

    Mittwoch, 11. September 2019 21:00
  • Ich habe niemals mit Powershell gearbeitet. Ich habe mir schon ein Konzept entwickelt, aber kann es halt in einem Code nicht zusammenbauen. 

    Meine Idee wäre es:

    Sync und Minecraft gleichzeitig zu öffnen

    main

    if (Minecraftlauncher = Ausgeführt in taskleiste) { goto Main } 

    bis if (Minecraftlauncher != Ausgeführt in taskleiste) {taskkill realfilesync}

    exit

    kann man das ungefähr in einem Code zusammenfassen?

    So möchte ich es gerne in Powershell eingeben aber kenne ich die Spache erst seit heute

    • Bearbeitet Vikiller94 Mittwoch, 11. September 2019 21:18
    Mittwoch, 11. September 2019 21:04
  • Das verstehe ich. Aber dann musst du eben Zeit investieren und es lernen.

    Wenn du erwartest, hier komplett fertigen code zu erhalten, dann ist das nichts anderes, als unbezahlt arbeit auslagern. Du sparst dir Zeit fürs lernen indem ich oder sonst wer hier seine investiert.

    Wenn du irgendwelche Mechaniken im Code nicht verstehst, hilft dir gerne jmd. aber es gibt hier eben keinen fertigen Code.

    Die meisten hier im Forum sind Profis und machen das alles beruflich und dieses Forum ist eigentlich dafür da, dass sich Profis untereinander helfen, wenn sie ihre eigenen Möglichkeiten (auch intensive Recherche und Knowhow Aufbau) ausgereizt haben.

    Mittwoch, 11. September 2019 21:17
  • Na gut verstehe. Dann werde ich halt weiter 24/7 im Internet schmoren. Danke trotzdem für den Ansatz.
    Mittwoch, 11. September 2019 21:20
  • Das auslesen von Daten/Objekten und deren Weiterverarbeitung mit Schleifen gehört zu den absoluten Basics und kann in wenigen Stunden verstanden werden.

    Stell dir einfach vor, wir sind eine Community von Schreinern, die sich untereinander austauschen und bei Problemen mit Werkzeugen, Techniken und Werkstoffen helfen.

    Jetzt kommst du und hättest gerne einen Schrank, du hast aber noch nie mit einem Hammer oder einer Säge gearbeitet.

    Was die Community leisten kann/will, ist dir dabei zu helfen, wenn du lernen willst wie man einen Schrank baut und bereit bist, dafür Zeit zu investieren und dann Probleme mit einem der Werkzeuge oder den Werkstoffen hast.

    Was die Community nicht leisten kann/will, ist dir den Schrank zu bauen.

    Wenn du das willst, gehst du einfach zu einem Schreiner, sagst ihm, was du willst und bezahlst ihn dafür.

    Gruß


    • Bearbeitet marc-sysadmn Donnerstag, 12. September 2019 12:18
    Mittwoch, 11. September 2019 21:51
  • Ja gut das stimmt. Wenn man random Codes nimmt versteht man die in der Regel nicht. Aber wenn ich jetzt meinen Code hier reintue, kann ich diesen hier posten um auf Fehler zu prüfen?
    Donnerstag, 12. September 2019 11:29
  • Da hat noch nie jemand Probleme drin gesehen. Ganz im Gegenteil: Häufig ist ohne den Code das Problem nicht zu verstehen.

    Schau dir mal Diese befehle an:
    https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-process?view=powershell-6

    https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-6

    https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/stop-process?view=powershell-6

    https://docs.microsoft.com/de-de/powershell/scripting/samples/managing-processes-with-process-cmdlets?view=powershell-6

    https://docs.microsoft.com/en-us/previous-versions//dd315272(v=technet.10)?redirectedfrom=MSDN

    Mittels letzterem kann  man gezielt auf das Ende eines Prozesses warten, ohne dauernd Schleifen zu durchlaufen um dann die nächste Aktion zu starten.

    Viel Spaß beim Probieren.

    Donnerstag, 12. September 2019 14:50