Script springt zurück, oder was ist falsch?

  • hallo,

    habe folgende 2 probs (nachdem ich endlich mal wieder dazu gekommen bei, mein shutdown-script weiter zu entwickeln)

    ich würde gern ein programm schreiben, dass ich per cmd bedienen kann, was den pc runterfährt (der ein oder andere hat schonmal nen thread dazu gelesen *g*)

    nun habe ich eine case select anweisung, die wunderbar funktioniert. nachdem alle parameter geprüft wurden, wird eine funktion ausgeführt (timer) und danach soll der pc runter gefahren werden.
    bevor aber der shutdown-befehl ausgeführt wird, springt das script aus der schleife wieder in die case select anweisung.
    bastel ich jedoch eine msgbox anstelle der shutdown-anweisung, wird die msgbox ausgeführt. was ist hier falsch?

    dazu kommt, dass $CmdLine[3] eine Zahl sein MUSS. aus testzwecken hab ich sie zZ auf 3 gesetzt, aber normalerweise würde ich was wie case IsNumber($CmdLine[3]) ... was aber leider nicht geht =/

    wer kann mir helfen?

    Spoiler anzeigen
    [autoit]


    #include <date.au3>
    #include <Process.au3>

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

    HotKeySet("{End}", "_kill")

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

    If $CmdLine[0] > 0 And $CmdLine[0] < 4 Then
    Select
    Case $CmdLine[1] = "-l" Or $CmdLine[1] = "-s" Or $CmdLine[1] = "-r"
    $Funktion = $CmdLine[1]
    Select
    Case $CmdLine[2] = "-t" Or $CmdLine[2] = "-h" Or $CmdLine[2] = "-m" Or $CmdLine[2] = "-s"
    $TimeZone = $CmdLine[2]
    Select
    Case $CmdLine[3] = 3
    $Countdown = $CmdLine[3]
    _countdown($Countdown)
    Case Else
    MsgBox(16, 'Fehler 4', "Parameter 3 muss eine Zahl sein")
    EndSelect
    Case Else
    MsgBox(16, 'Fehler 3', "Falsche Parameter verwendet")
    EndSelect
    Case Else
    MsgBox(16, 'Fehler 2', "Falsche Parameter verwendet")
    EndSelect
    Else
    MsgBox(16, 'Fehler 1', "Kein oder zuviele Parameter angegeben")
    EndIf

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

    Func _countDown($Countdown)
    If $CmdLine[2] = "-s" Then
    Local $begin = TimerInit(), $diff
    Do
    $diff = TimerDiff($begin)
    ToolTip("Noch " & Round(($Countdown*1000 -$diff)/1000) & " Sekunden",0,0,"Countdown")
    Sleep(100)
    Until $diff >= $Countdown*1000
    If $CmdLine[1] = "-l" Then
    _RunDOS('shutdown -l -f')
    ElseIf $CmdLine[1] = "-s" Then
    _RunDOS('shutdown -s -f')
    ElseIf $CmdLine[1] = "-r" Then
    _RunDOS('shutdown -r -f')
    EndIf
    EndIf
    EndFunc

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

    Func _kill()
    Exit
    EndFunc

    [/autoit]

    PS: wieso postet der meinen code immer 2-3 mal?

    • Offizieller Beitrag

    So sollte es gehen! Ich habe mal die Select-Anweisungen durch einfach If...Then...Else ersetzt, Select braucht man nur wenn man mehrere Fälle unterscheiden will, ausserdem habe ich die Shutdown-Funktion von AutoIt eingesetzt.

    [autoit]


    #include <date.au3>
    ;~ #include <Process.au3>

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

    HotKeySet("{End}", "_kill")

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

    If $CmdLine[0] > 0 And $CmdLine[0] < 4 Then
    If $CmdLine[1] = "-l" Or $CmdLine[1] = "-s" Or $CmdLine[1] = "-r" Then
    $Funktion = $CmdLine[1]
    If $CmdLine[2] = "-t" Or $CmdLine[2] = "-h" Or $CmdLine[2] = "-m" Or $CmdLine[2] = "-s" Then
    $TimeZone = $CmdLine[2]
    If StringRegExp($CmdLine[3], "[0-9]+") Then
    $Countdown = $CmdLine[3]
    _countDown($Countdown)
    Else
    MsgBox(16, 'Fehler 4', "Parameter 3 muss eine Zahl sein")
    EndIf
    Else
    MsgBox(16, 'Fehler 3', "Falsche Parameter verwendet")
    EndIf
    Else
    MsgBox(16, 'Fehler 2', "Falsche Parameter verwendet")
    EndIf
    Else
    MsgBox(16, 'Fehler 1', "Kein oder zuviele Parameter angegeben")
    EndIf

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

    Func _countDown($Countdown)
    If $CmdLine[2] = "-s" Then
    Local $begin = TimerInit(), $diff
    Do
    $diff = TimerDiff($begin)
    ToolTip("Noch " & Round(($Countdown * 1000 - $diff) / 1000) & " Sekunden", 0, 0, "Countdown")
    Sleep(100)
    Until $diff >= $Countdown * 1000
    If $CmdLine[1] = "-l" Then
    Shutdown(4) ; Logoff und Force
    ;~ _RunDOS('shutdown -l -f')
    ElseIf $CmdLine[1] = "-s" Then
    Shutdown(13) ; Shutdown, Powerdown und Force
    ;~ _RunDOS('shutdown -s -f')
    ElseIf $CmdLine[1] = "-r" Then
    Shutdown(6) ; Reboot und Force
    ;~ _RunDOS('shutdown -r -f')
    EndIf
    EndIf
    EndFunc ;==>_countDown

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

    Func _kill()
    Exit
    EndFunc ;==>_kill

    [/autoit]
  • vielen dank, ich werde es testen. wollte eigentlich auch noch einbauen, dass man mit kommentar runterfahren kann, aber ehrlich gesagt, braucht ich das doch nicht =)

    thx

    PS: klappt wunderbar. so kann man es eigentlich schon benutzen, nur 1 sachen gefällt mir noch nicht so, bzw eine weitere funzt noch nicht *g*

    zum einem soll man auch minuten eingeben können, die funktion dahinter ist folgende

    [autoit]

    If $CmdLine[2] = "-m" Then
    Local $begin = TimerInit(), $diff
    Do
    $diff = TimerDiff($begin)
    ToolTip("in " & Round(($Countdown *60 * 1000 - $diff) / 1000) & " Seconds", 0, 0, $head)
    Sleep(100)
    Until $diff >= $Countdown * 60 * 1000
    EndIf

    [/autoit]

    er rechnet die minuten in sekunden um, um gibt dann den coutdown in sekunden an. geb ich aber 60 oder 90 minuten ein, wirds irgendwann ziemlich blöd. besser wäre es, wenn er dann anzeigen würde: "in 59 Minutes & 55 Seconds" oder "in 59:55 Minutes"

    die andere sache wäre, eine uhrzeit einzugeben, und die differenz zwischen der uhrzeit und jetzt berechnet wird, was im selben format ausgegeben werden soll, bzw "in hh:mm:ss"

    bin leider noch nicht dahinter gestiegen, wie das geht =/

    • Offizieller Beitrag

    Hallo,

    so geht es!

    [autoit]

    If $CmdLine[2] = "-m" Then
    Local $begin = TimerInit(), $diff
    $Countdown *= 60000
    Do
    $diff = TimerDiff($begin)
    ;~ ToolTip("in " & Round(($Countdown *60 * 1000 - $diff) / 1000) & " Seconds", 0, 0, $head)
    ToolTip(StringFormat("in %02i:%02i Minuten", Floor(($Countdown - $diff) / 60000), Floor(Mod($Countdown - $diff, 60000)/1000)), 0, 0, "Countdown")
    Sleep(100)
    Until $diff >= $Countdown
    EndIf

    [/autoit]
  • ui, super, klappt wunderbar für minuten und stunden (war nicht viel zu ändern *g*)

    nun aber eine letzte frage:

    ich würde auch gerne eingeben können, dass der pc zu einer bestimmten uhrzeit runterfährt.
    meine idee ist, dass die zeit eingegeben wird (hh:mm) und anschließend davon die aktuelle uhrzeit abgezogen wird. dann bleibt z.b. 2:55 über, was ich dann wieder an die funktion von bernd übergeben kann.

    leider klappt das nicht so einfach wie gedacht. die eigegebene zeit - _NowTime(3) ergibt immer 0.

    gibts da eine andere idee für ... spontan würde mir noch stringsplit einfallen, aber irgendwie bin ich mir recht unsicher ob das funktionieren würde (kanns auch grad auf der arbeit nicht testen) =(

    • Offizieller Beitrag
    [autoit]

    #include <Date.au3>

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

    $ShutDownTime = '17:30' ; per InputBox
    $min = _DateDiff('n', _NowCalc(), _NowCalcDate( ) & ' ' & $ShutDownTime )
    $h = Floor($min/60)
    $m = $min - $h*60
    $h_m = $h & ':' & $m
    MsgBox(0,'',"verbleibende Zeit: " & $h_m)

    [/autoit]
    • Offizieller Beitrag

    Hi,

    hab noch 'ne Ergänzung.
    So wird das Datum geprüft und ggf. angepaßt falls die Zielzeit kleiner als die aktuelle Zeit ist.

    [autoit]

    #include <Date.au3>

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

    $ShutDownTime = '18:10'
    If $ShutDownTime < @HOUR & ':' & @MIN Then
    $now = @YEAR & '/' & @MON & '/' & @MDAY+1
    Else
    $now = @YEAR & '/' & @MON & '/' & @MDAY
    EndIf

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

    $min = _DateDiff('n', _NowCalc(), $now & ' ' & $ShutDownTime )
    $h = Floor($min/60)
    $m = $min - $h*60
    $h_m = StringFormat("%02u" & ":" & "%02u", $h, $m)

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

    MsgBox(0,'',"verbleibende Zeit: " & $h_m )

    [/autoit]
  • dank dir bugfix, hab ich natürlich sofort eingebaut *g*

    hab aber noch ne frage. du gibst das so schön in stunden und minuten aus, aber wie muss die rechnung im tooltip aussehen?

    so würde es bei min+sek aussehen

    [autoit]

    ToolTip(StringFormat("in %02i:%02i Minuten", Floor(($Countdown - $diff) / 60000), Floor(Mod($Countdown - $diff, 60000)/1000)), 0, 0, "Countdown")

    [/autoit]

    hab jetzt schon soviel rumprobiert und es trotzdem nicht geschafft =(