Fragensteller
Batch Script: When ProgramA is opened, ProgramB opens/ProgramA is closed, ProgramB is closed

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
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.
-
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
-
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ß
-
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
-
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
-
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
-
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.
-
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
-
-
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
-
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.
-
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
-
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-6https://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.