batch starten beenden nach uhrzeit

  • Hallo zusammen

    Könnte mir mal jemand einen Tipp geben,
    warum die Batch sich nicht Beendet?

    Spoiler anzeigen
    [autoit]


    $ZeitStart = InputBox("Uhrzeit", "Starten (HH:MM)", @HOUR & ":" & @MIN & ':' & @SEC)
    $ZeitStop = InputBox("Uhrzeit", "Beenden(HH:MM)", @HOUR & ":" & @MIN & ':' & @SEC)
    ;$process = "CMD.exe"

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)

    [/autoit] [autoit][/autoit] [autoit]

    If $ZeitStart = @HOUR & ":" & @MIN & ':' & @SEC Then
    ShellExecute(@ScriptDir & "\test.bat")
    ;MsgBox (64,"","Batch Gestartet!")
    ;ExitLoop

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If $ZeitStop = @HOUR & ":" & @MIN & ':' & @SEC Then
    ;ProcessClose (@ScriptDir & "\test.bat")
    ProcessClose("CMD.exe")
    ExitLoop
    EndIf
    EndIf
    WEnd

    [/autoit]

    Einmal editiert, zuletzt von Rombur (17. August 2011 um 23:43)

  • Ich würde das Script mit Run starten. Da bekommste eine pid zurück. Diese kannste dann beenden. Dann erwischt du auch nicht ein anderes Script was zufällig gerade läuft.

    21 is only half the truth.

  • Kann es nicht auch sein, dass es an dem

    [autoit]

    sleep(100)

    [/autoit]


    liegt?
    Denn er trifft dann ja nicht mehr genau die Sekunde, wo es passieren soll.

  • Zitat

    Denn er trifft dann ja nicht mehr genau die Sekunde, wo es passieren soll.


    Das würde ja heißen, dass der Ablauf nach dem Sleep 900ms oder mehr dauern würde.

    Die Ursache liegt in der Verschachtelung des IF-Teils:

    Code
    Wenn die Startzeit erreicht ist tue:
          Starte das Programm();
          Wenn die Stoppzeit erreicht ist tue //zu diesem zeitpunkt ist das startkriterium noch erfüllt => wenn stopp <> start ist wirds nie ausgeführt
               beende das Programm();
          Stoppzeit If ist hier zu Ende
    Startzeit If ist hier zu Ende

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Dein Script wird die Batch so wohl nie beenden, ausserdem wird die Batch mehrfach gestartet werden.

    Deine Beenden Bedingung befindet sich innerhalb der Starten Bedingung. Das bedeutet es kann nur beendet werden, wenn es zufälligerweise auch innerhalb dieser Sekunde gestartet wurde und die maximale Laufzeit 0.xxxx Sekunden beträgt. Sobald die Batch länger als eine Sekunde läuft erfüllst du die äussere Bedingung erst in 24h wieder und somit wird die innere Bedingung zum Beenden auch erst wieder in 24h geprüft. Bis dahin läuft dann aber mindestens ein 2. Prozess der Batch, eher 11 Prozesse, da du die erste Bedingung wohl bis zu 10 Schleifendurchläufe lang erfüllst.

    Du solltest das eher so machen:

    [autoit]


    $ZeitStart = InputBox("Uhrzeit", "Starten (HH:MM)", @HOUR & ":" & @MIN+1 & ':' & @SEC) ; Startzeit sollt in der Zukunft liegen, ansonsten könnte es 24h dauern, je nachdem wielange der user für die Eingaben braucht
    $ZeitStop = InputBox("Uhrzeit", "Beenden(HH:MM)", @HOUR & ":" & @MIN+2 & ':' & @SEC) ; +2 deshalb, damit niemand versehentlich einfach die Standardzeit bestätigt, das würde eine identische Start und Stop Zeit bedeuten
    ;$process = "CMD.exe"
    $processRuns=False ; es läuft noch kein Prozess

    [/autoit][autoit][/autoit][autoit]

    While 1
    ; Sleep(100) ; brauchste nicht und könnte Probleme mit den Zeiten machen...

    [/autoit][autoit][/autoit][autoit]

    If $ZeitStart = @HOUR & ":" & @MIN & ':' & @SEC And $processRuns=False Then ; nur wenn noch kein Prozess läuft und die Startbedingung erfüllt ist
    ShellExecute(@ScriptDir & "\test.bat") ; verwende run und speichere die PID in einer Variable
    $processRuns=True ; Prozess läuft
    ;MsgBox (64,"","Batch Gestartet!")
    ;ExitLoop
    endif

    [/autoit][autoit][/autoit][autoit]

    If $ZeitStop = @HOUR & ":" & @MIN & ':' & @SEC And $processRuns=True Then ; nur wenn Stoppzeit erfüllt und ein Prozess läuft
    ;ProcessClose (@ScriptDir & "\test.bat")
    ProcessClose("CMD.exe") ; wie bereits erwähnt wurde solltest du run verwenden und die zurückgegeben PID zum beenden verwenden, da eindeutiger...
    $processRuns=False ; Prozess läuft nicht mehr
    ExitLoop
    EndIf
    WEnd

    [/autoit]
  • Danke an euch dreien,für die Hilfe.

    mit

    [autoit]

    $pid = Run('cmd.exe /c "' & @ScriptDir & '\test.bat"')

    [/autoit]

    startet es auch,aber gleich 5 mal,aber es wird nicht beendet.

    das sleep bringt auch nichts,wenn ich es weglasse.

    und XovoxKingdom das was du meinst, hab ich nicht so richtig verstanden.
    ich versuche ja die batch zu beenden.
    meinst du das so?

    [autoit]


    $ZeitStart = InputBox("Uhrzeit", "Starten (HH:MM)", @HOUR & ":" & @MIN & ':' & @SEC)
    $ZeitStop = InputBox("Uhrzeit", "Beenden(HH:MM)", @HOUR & ":" & @MIN & ':' & @SEC)
    ;$process = "CMD.exe"

    [/autoit][autoit][/autoit][autoit]

    While 1
    Sleep(100)

    [/autoit][autoit][/autoit][autoit]

    If $ZeitStart = @HOUR & ":" & @MIN & ':' & @SEC Then
    ShellExecute (@ScriptDir & "\test.bat")
    ;MsgBox (64,"","Batch Gestartet!")
    ;ExitLoop
    EndIf
    WEnd
    If $ZeitStop = @HOUR & ":" & @MIN & ':' & @SEC Then
    ProcessClose (@ScriptDir & "\test.bat")
    ;ProcessClose("CMD.exe")
    ;ExitLoop
    EndIf

    [/autoit]


    So wird es auch nicht Beendet.

    edit: es hat sich etwas überlagert,misterspeed ich teste das gleich mal aus.
    Danke

    Einmal editiert, zuletzt von Rombur (17. August 2011 um 12:47)

  • Schau dir mein Script an, die Tatsache, dass es 5mal startet und nicht beendet wurde ist völlig richtig, das sollte bei shellexecute aber auch so passiert sein, denn genau das macht dein Script.
    Mit meiner Variante und am besten noch mit run sollte das nicht passieren. ;)

  • Spoiler anzeigen
    [autoit]

    $ZeitStart = InputBox("Uhrzeit", "Starten (HH:MM)", @HOUR & ":" & @MIN+1 & ':' & @SEC) ; Startzeit sollt in der Zukunft liegen, ansonsten könnte es 24h dauern, je nachdem wielange der user für die Eingaben braucht
    $ZeitStop = InputBox("Uhrzeit", "Beenden(HH:MM)", @HOUR & ":" & @MIN+2 & ':' & @SEC) ; +2 deshalb, damit niemand versehentlich einfach die Standardzeit bestätigt, das würde eine identische Start und Stop Zeit bedeuten
    ;$process = "CMD.exe"
    $pid = Run('cmd.exe /c "' & @ScriptDir & '\test.bat"')

    [/autoit] [autoit][/autoit] [autoit]

    $processRuns=False ; es läuft noch kein Prozess

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    ; Sleep(100) ; brauchste nicht und könnte Probleme mit den Zeiten machen...

    [/autoit] [autoit][/autoit] [autoit]

    If $ZeitStart = @HOUR & ":" & @MIN & ':' & @SEC And $processRuns=False Then ; nur wenn noch kein Prozess läuft und die Startbedingung erfüllt ist
    ;ShellExecute(@ScriptDir & "\test.bat") ; verwende run und speichere die PID in einer Variable
    Run($pid)
    $processRuns=True ; Prozess läuft
    ;MsgBox (64,"","Batch Gestartet!")
    ;ExitLoop
    endif

    [/autoit] [autoit][/autoit] [autoit]

    If $ZeitStop = @HOUR & ":" & @MIN & ':' & @SEC And $processRuns=True Then ; nur wenn Stoppzeit erfüllt und ein Prozess läuft
    ;ProcessClose (@ScriptDir & "\test.bat")
    ;ProcessClose("CMD.exe") ; wie bereits erwähnt wurde solltest du run verwenden und die zurückgegeben PID zum beenden verwenden, da eindeutiger...
    ProcessClose($pid)
    $processRuns=False ; Prozess läuft nicht mehr
    ExitLoop
    EndIf
    WEnd

    [/autoit]

    Die Batch wird nach der angegebenen Zeit gestartet,aber nach der Stopzeit beenden sich Autoit und die Batch läuft weiter.
    ich gebs auf und mache 2 exen eine zum starten und eine zum beenden.

    ich bedanke mich nochmal für die hilfe :thumbup:

  • Wenn sich das Script beendet wurde wohl auch der Prozess beendet, sofern er denn überhaupt noch existiert hat. Aber jenachdem was deine Batch macht kann es ja sein, dass die Prozesse die die Batch startet noch laufen.
    Wenn deine Batch Programm x startet hilft es dir nichts die batch zu beenden, das Programm x läuft dann trotzdem noch.

  • Wenn ich das richtig sehe, dann startet er die batch 2x!
    Durch Zeile 4 startet er es sofort und dann noch im Fall, dass die Zeit erreicht wurde
    => lösche Zeile 4 und alles sollte klappen.
    Nen Sleep von ~10(0) ms würde ich empfehlen => wieder einkommentieren :)

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Wenn sich das Script beendet wurde wohl auch der Prozess beendet, sofern er denn überhaupt noch existiert hat. Aber jenachdem was deine Batch macht kann es ja sein, dass die Prozesse die die Batch startet noch laufen.
    Wenn deine Batch Programm x startet hilft es dir nichts die batch zu beenden, das Programm x läuft dann trotzdem noch.

    genau das war es, die Batch startet eine flv.exe,die einen stream downloadet.
    und man muß die flv.exe beenden und nicht die batch.

    o man das war hart :D

    Danke nochmal

  • Nunja aber wozu brauchst du die Batch denn eigentlich? Du könntest den Aufruf dieser flv.exe und alles andere was du in der Batch vielleicht noch machst auch komplett in autoit realisieren.

  • wieder n batchbefehl

    taskkill /im cmd.exe /f

    oder

    ProcessClose("cmd.exe")

    inner schleife :D schiest alle cmd's ab^^
    wennde weiter hilfe brauchst meld dich per pm ich denk da kann ich dir weiterhelfen


    Um deine exe nicht mit cmd zu starten nutze ShellExecute ;)

    -

  • Kleine Idee, wie man das Ganze auch per Batch implementieren könnte...

    http://www.administrator.de/index.php?content=31727

    Man erstellt einfach x-Minuten von jetzt an einen AT-Job, der dann eine Batch startet oder einen Befehl ausführt, z. B. einen Takskil...

    Mittels der Batch wird die Uhrzeit in der Zukunft ermittelt und anschließend als Parameter für den AT-Job verwendet.
    Der Aufruf sieht dann ungefähr so aus:

    Code
    rem start a AT-Job in the next minutes.
    rem With the command timeadd.cmd <minutes> you can set a time schedule in the next minutes
    rem from now, without knowledge of the actual time, here 2 minutes:
    call timeadd.cmd 2
    echo %newtime%
    at %newTime% /interactive "MyFamousTaskkillBatch.cmd"
    REM oder ungetestet:
    REM at %newTime% /interactive taskkill /im cmd.exe /f


    Die Batch timeadd:

    Spoiler anzeigen

    mfg
    Axel

    There exist 10 different kind of people on earth.
    Those who understand binary, and those who don't.