Batch Script Installer ausführen auf Benutzereingabe warten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Batch Script Installer ausführen auf Benutzereingabe warten

    Hi Leute, ich bin neu hier im Forum, und hoffe ich finde hier die Lösung zu einem Problem wo ich schon eine Weile dran hänge. :)

    Zu meinem Problem. Ich versuche schon seit geraumer Zeit ein Script zu erstellen welches einen Installer ausführt und auf bestimmte Aktion eine weitere Aktion ausführt oder eben wartet bis eine Benutzeraktion getan wird.
    Das ganze ist vermutlich bisschen schwer zu verstehen..... Ok ich versuch es mal etwas detaillierter...

    Folgendes habe ich vor. Ich möchte ein Programm installieren welches aber 2 mal neugestartet werden muss bis die entgültige Aktion passiert. Das heisst die Batch muss eben zwischenzeitlich warten bis die erste Aktion beendet ist. Das sähe folgendermaßen aus:

    1.) Starte den Installer und warte bis der Task davon wieder geschlossen ist. Gehe danach in den Ordner "PROG1Folder" und öffne dort das Programm PROG1.exe und warte wieder.

    2.) PROG1 öffnet in diesem Fall einmalig 2 Tasks mit dem selben Namen

    3.) Jetzt soll das Script warten bis ein Task davon mit dem selben Namen beendet wurde, und dann automatisch den zweiten nachträglich gleich mit beenden.

    4.) Nach der Beendigung soll PROG1 wieder automatisch gestartet werden und ein weiteres Tool (Nennen wir es mal TOOL1) in den selben Ordner kopieren wo PROG1 liegt und eine Verknüpfung zum Desktop zu TOOL1 anlegen.


    Bisher sehen meine Scripte so aus (3 Batch Dateien):

    INSTALLER

    Quellcode

    1. @Echo Off
    2. start /wait installer.exe
    3. set "Tsk=installer.exe"
    4. set Running=
    5. for /f %%i in ('tasklist') do echo (%%i)|findstr /C:"(%%)" >nul && set Running=False
    6. if not defined Running goto :Call1



    CALL1

    Quellcode

    1. @Echo Off
    2. cd C:\PROG1Folder
    3. start /wait PROG1.exe
    4. set "Tsk=installer.exe"
    5. set Running=
    6. for /f %%i in ('tasklist') do echo (%%i)|findstr /C:"(%%)" >nul && set Running=False
    7. if not defined Running goto :CHECK_PROC_1
    8. :CHECK_PROC_1
    9. tasklist | find /i "PROG1.exe" >nul && GOTO :CHECK_PROC_2
    10. taskkill PROG1.exe
    11. GOTO :CHECK_PROG_2
    12. :CHECK_PROC_2
    13. tasklist | find /i "PROG1.exe" >nul && GOTO :END
    14. taskkill PROG1.exe goto :call2
    15. exit
    Alles anzeigen


    CALL2

    Quellcode

    1. @ECHO off
    2. cd C:\PROG1Folder
    3. start PROG1.exe
    4. exit



    Also irgendwo haut da was nicht hin.
    Problem 1: CALL1 wird nicht ausgeführt
    Problem 2: Wenn es ausgeführt wird, dann öffnet sich PROG1 zweimal gleichzeitig, und das soll er ja nicht. Und wie man doppelte Tasks abfragt hab ich bisher auch noch nicht herausgefunden. Ich sitze da schon enige Wochen dran und habe schon alles mögliche probiert, aber es will perdu nicht funktionieren so wie ich mir das vorstelle.

    Ich hoffe mir kann da jemand weiterhelfen. Ich bin noch ziemlicher Anfänger in Batch. Kleiner Programme kein Problem solange sie simpel sind, aber hier hören meine Kenntnisse schon wieder auf.^^

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von deejay2302 ()

  • Paar Tips, die dir evtl. weiterhelfen können:

    Zählen von Tasks:

    Quellcode

    1. set num=
    2. for /F %%i in ('tasklist ^| find /i "taskname.exe"') do set /a num=num+1
    3. echo %num%


    Kleine Schleife, um aktive Prozesse zu zählen (Hingefuscht, aber funktioniert)

    Quellcode

    1. :check
    2. set num=
    3. for /F %%i in ('tasklist ^| find /i "notepad.exe" ') do set /a tasknum=tasknum+1
    4. if /I %tasknum% == 2 (
    5. echo "Jetzt sind nur noch 2 Prozesse geöffnet"
    6. ) else (
    7. timeout /t 1 >nul
    8. goto check
    9. )


    Aufrufen einer anderen Batch File: (sobald die andere Batch File durchgelaufen ist, bist du wieder im Ursprungsscript)

    Quellcode

    1. call xyz.cmd
    Lerne nicht Programmiersprachen, lerne Programmieren...

    :D Alles andere ist Syntax :D

    [Blockierte Grafik: http://www.xing.com/img/buttons/10_en_btn.gif]

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Nebu ()

  • Nebu schrieb:

    Zu Problem 1:
    Wo wird auf CALL1 zugegriffen?


    In der ersten Batch Zeile 9 greife ich auf die CALL1 per goto zu. Hab es aber nochmal etwas überarbeitet und alles in eine Datei gepackt. Poste ich dannn später wenn ich ausgeschlafen habe. ;)

    Nebu schrieb:


    Zu Problem 2:
    In der Sequenz, wenn :CHECK_PROC_1 ausgeführt wird, führst du automatisch :CHECK_PROC_2 aus. (Sequenzielle Verarbeitung des Scriptes)


    Das heißt ? Wo liegt da der Fehler? Ich frage mich warum er beide gleichzeitig ausführt?

    Ok danke erstmal für die Tips. Schaue ich mir dann mal genauer an wenn ich ausgeschlafen bin. Meld mich dann nochmal.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von deejay2302 ()

  • Also geht irgendwie nicht. Bisher läuft es so ab.

    Es öffnet sich das Programm. Ich gebe die Daten. Klick auf OK, das Programm schließt sich, es öffnet sich das 2te. Programm. Soweit funktioniert es schonmal, aber soweit war ich auch vorher schon.

    Nun habe ich dein Script mit eingearbeitet. Wenn ich aber bei Programm2 den ersten Task Close, schließt sich der 2te nicht mit, was er aber eigentlich tun sollte.
    Und danach soll er das Prog 1 nochmal starten.

    Warum klemmt es da ? Ich verweise ja eigentlich auf:

    Teste ob ein zweiter Task läuft, wenn JA dann WARTE bis dieser geschlossen ist. Wenn NICHT, dann schließe das gesamte Programm und starte es erneut.

    So schauts bis jetzt aus:

    Quellcode

    1. @Echo Off
    2. ################ Hier wird der Installer gestartet ###################
    3. start /wait installer.exe
    4. set "Tsk=installer.exe"
    5. set Running=
    6. for /f %%i in ('tasklist') do echo (%%i)|findstr /C:"(%%)" >nul && set Running=False
    7. if not defined Running goto :start
    8. ############### Überprüfung ob der Installer läuft, läuft er NICHT gehe zu :start ######################
    9. :start
    10. cd C:\Ordner1
    11. start /wait PROG1.exe GOTO :prog1
    12. ################ Prüfe ob der Task 2x vorhanden ist. Wenn JA, warte. Wenn NEIN starte :kill ######### <-- Da klemmts
    13. :prog1
    14. set num=
    15. for /F %%i in ('tasklist ^| find /i "PROG1.exe" ') do set /a tasknum=tasknum+1
    16. if /I %tasknum% == 2 (
    17. ) else (
    18. timeout /t 1 >nul
    19. goto :kill
    20. )
    21. ################# Kille PROG1.exe und gehe danach zu :login #####################
    22. :kill
    23. taskkill /IM PROG1.exe goto :login
    24. ################# Prüfe ob PROG1 aktiv ist. Wenn NEIN, starte PROG1.exe #########
    25. :login
    26. set "Tsk=PROG1.exe"
    27. set Running=
    28. for /f %%i in ('tasklist') do echo (%%i)|findstr /C:"(%%)" >nul && start Running=False
    29. if not defined Running goto :prog2
    30. :prog2
    31. cd C:\Ordner1
    32. start PROG1.exe
    33. exit
    Alles anzeigen


    Sind so Begriffe wie else oder die Klammern überhaupt erlaubt in Batch? Kenn ich nur aus anderen Programmiersprachen?!

    Wenn ich das richtig verstanden habe heisst dein Sript ja:


    set num=
    for /F %%i in ('tasklist ^| find /i "PROG1.exe" ') do set /a tasknum=tasknum+1 ----> Für PROG1 zähle 1 Prozess <----
    if /I %tasknum% == 2 ( ------> Wenn 2 Prozesse laufen <-----
    ) else ( --------> Wenn nicht <-------
    timeout /t 1 >nul >>>>> Prüfe so lange ob der Task läuft???? <<<<<<
    goto :kill

    Wie setze ich da nun aber ein WARTE auf den Prozess rein? Ich weiß ja nicht wie lange der User braucht um seine Daten anzugeben, also wäre das mit einem Timeout-Zähler also unsinnig oder?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von deejay2302 ()

  • Hab es nochmal so probiert, ergibt aber einen Syntaxierten Fehler oder so ähnlich.

    Quellcode

    1. set num=
    2. for /F %%i in ('tasklist ^| find /i "PROG1.exe" ') do set /a tasknum=tasknum+1
    3. if /I %tasknum% == 2 (/wait PROG1.exe) else goto :kill


    Irgendwie hat er Probleme entweder mit den Klammern oder mit /wait. in der Batch FAQ steht aber das die ELSE Zeile mit auf der IF Zeile liegen muss. und zwar so: IF EXIST test.txt (del text.txt) else echo test.txt fehlt.
    Ich brauche aber keine ECHO Ausgabe, da die Batch eh im Hintergrund läuft und man sie nicht sehen soll.

    Nur warum geht es dann in meiner Zeile nicht?

    PS: Ich arbeite NICHT mit Powershell, sondern mit einer normalen Textdatei. Nicht das es da Verwechslung gibt mit den Befehlen ;)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von deejay2302 ()