Periodischer Aufruf eines Kommandos

  • Hallo Community,

    ich bastele seit einiger Zeit diverse Scripte mit AutoIt und habe zu den meisten Problemen auch immer Hilfe gefunden ohne einen Beitrag erstellen zu müssen, doch nun stehe ich vor einem Problem bei dem ich so nicht weiter komme.

    Ich habe hier ein Script mit GUI, welches ein in ein Laufwerk eingelegtes Medium an einen Ort auf der Festplatte kopiert.
    Das Script funktioniert soweit.

    Nun wollte ich jedoch noch die Möglichkeit einbauen, den Inhalt des Mediums gleich auf ein Netzlaufwerk/einen Server zu kopieren.
    Dazu will ich einen Radiobutton oder ähnliches auf aktiv setzen wenn der Server erreichbar ist.
    Die überprüfung würde ich mit Ping machen und das ganze eben jede Sekunde ausführen.
    Jedoch weiß ich nicht wie ich das bewältigen soll. Mit meiner Funktion checkdrive, welche Überprüft ob ein Medium eingelegt ist etc. funktioniert das ganze.
    Mache ich jedoch ein weiteres AdLibEnable und rufe die Ping Funktion auf, macht er danach nicht mehr weiter.

    Was macht AdLibEnable überhaupt? Ich weiß zwar das man damit eine Funktion periodisch aufrufen kann aber mehr auch nicht.

    Anbei noch der Quelltext.

    Vielen Dank für Vorschläge.

    Gruß Johannes


    Spoiler anzeigen
    [autoit]


    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>

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

    $main_gui=GuiCreate("CopyGUI",350,210)
    $copybutton=GUICtrlCreateButton("Kopieren",290,180)
    GuiCtrlCreateLabel("Filmname",15,90)
    $moviename=GUICtrlCreateInput("",15,105,220,20,$ES_LOWERCASE)
    GuiCtrlCreateLabel("Staffel",254,90)
    $moviesession=GUICtrlCreateInput("",254,105,31,20,$ES_NUMBER)
    GuiCtrlCreateLabel("Disc",304,90)
    $moviesessiondisc=GUICtrlCreateInput("",304,105,31,20,$ES_NUMBER)
    GuiCtrlCreateGroup("Disc-Info",15,15,320,65)
    GuiCtrlCreateLabel("Disc-Name:",30,35)
    GuiCtrlCreateLabel("Disc-Größe:",30,55)
    $discname=GuiCtrlCreateLabel("",90,35,240,15)
    $discsize=GuiCtrlCreateLabel("",90,55,240,15)
    $drive="E:\"
    $server="192.168.40.225"

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

    $progress=GUICtrlCreateProgress(15,145,320,20)
    GUICtrlSetColor(-1, 32250)
    $source="E:\"
    $dest="D:\ziel\"

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

    GUICtrlSetLimit($moviesession,2)
    GuiCtrlSetLimit($moviesessiondisc,2)
    AdLibEnable("checkdrive")

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

    GUISetState(@SW_SHOW,$main_gui)
    while True
    $msg = GUIGetMsg()

    Switch $msg
    case $gui_event_close
    Exit
    case $copybutton
    $text1=GUICtrlRead($moviename)
    $text2=GUICtrlRead($moviesession)
    $text3=GuiCtrlRead($moviesessiondisc)

    If $text1="" Then
    msgbox(0,"Fehler","Die Eingabe des Titels ist erforderlich")
    Else

    start()
    EndIf
    EndSwitch
    WEnd

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

    func checkdrive()
    $drivestatus=DriveStatus($drive)
    $discfree=DriveSpaceFree($drive)
    $disctotal=DriveSpaceTotal($drive)
    $discused=$disctotal - $discfree
    If $discused < 1000 Then
    $discused=StringLeft($discused,3) & " MB"
    Else
    $discused=StringLeft($discused/1000,3) & " GB"
    EndIf
    If $driveStatus="READY" Then
    GuiCtrlSetData($discname,DriveGetLabel($drive))
    GuiCtrlSetData($discsize,$discused)
    GuiCtrlSetState($moviename,$GUI_ENABLE)
    GuiCtrlSetState($moviesession,$GUI_ENABLE)
    GuiCtrlSetState($moviesessiondisc,$GUI_ENABLE)
    GuiCtrlSetState($copybutton,$GUI_ENABLE)
    Else
    GuiCtrlSetState($moviename,$GUI_DISABLE)
    GuiCtrlSetState($moviesession,$GUI_DISABLE)
    GuiCtrlSetState($moviesessiondisc,$GUI_DISABLE)
    GuiCtrlSetState($copybutton,$GUI_DISABLE)
    GuiCtrlSetData($discname,"Kein Medium eingelegt")
    GuiCtrlSetData($discsize,"")
    EndIf
    EndFunc

    func start()

    If StringLen($text2) = 1 Then
    $text2 = "0"&$text2
    EndIf

    If StringLen($text3) = 1 Then
    $text3 = "0"&$text3
    EndIf

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

    If $text2<>"" Then $text2="_S"&$text2
    If $text3<>"" Then $text3="D"&$text3

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

    $replaced1=StringReplace($text1," ","_")

    $copydir=$dest&$replaced1&$text2&$text3


    If FileExists($copydir) Then
    msgbox(0,"","Film bereits vorhanden.")
    Else

    $data=msgbox(4,"Daten bestätigen","Sind die eingegeben Daten richtig?"&@CRLF&$replaced1&$text2&$text3)

    If $data="6" Then
    DirCreate($copydir)

    $xcopy="xcopy "&$source&"*.* "&$copydir&" /s /e /i"
    TrayTip("Kopieren gestartet","Datenträger wird nach " & $copydir & " kopiert",10)


    Run(@ComSpec & " /c " & $xcopy, "", @SW_Show)


    $source_files=DirGetSize($source,1)
    $dest_files=DirGetSize($copydir,1)

    while $source_files[1]>$dest_files[1]
    while True
    $msg = GUIGetMsg()
    Switch $msg
    case $gui_event_close

    ;~ ProcessClose("C:\windows\system32\cmd.exe")
    Exit
    EndSwitch
    GuiCtrlSetData($progress, Round($dest_files[1]/$source_files[1]*100))
    $dest_files=DirGetSize($copydir,1)
    WEnd


    WEnd
    EndIf
    EndIf

    EndFunc

    [/autoit]
  • Ich würde das nicht mit AdLibEnable machen sondern einfach in die "While true" Schlefie einbauen. Du änderst ja das GUI in der Checkdrive-Funktion, daher passt das sehr gut in die Schleife. Ausserdem führt AdLibEnable dazu, dass das Hauptscript während der Verarbeitung deiner Unterroutine steht.

    [autoit]

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $gui_event_close
    Exit
    Case $copybutton
    $text1 = GUICtrlRead($moviename)
    $text2 = GUICtrlRead($moviesession)
    $text3 = GUICtrlRead($moviesessiondisc)
    If $text1 = "" Then
    MsgBox(0, "Fehler", "Die Eingabe des Titels ist erforderlich")
    Else
    start()
    EndIf
    Case Else
    checkDrive()
    EndSwitch
    WEnd

    [/autoit]
  • Ich werds jetzt mal recht kurz halten; Muss in ein paar Minuten weg. AdlibEnable pausiert dein Script in gegebenen Zeitabständen, um eine bestimmte Funktion aufzurufen. Es kann immer nur ein (!) AdlibEnable pro Skript vorkommen. In der AutoIt Beta Version ist nun AdlibRegister() vorhanden, um mehrere Adlibs zu verwenden.

    In der aktuellen Stable Version kannst du aber mit AdlibEnable und _Timer_SetTimer() arbeiten (bin da jetzt aber nicht 100% sicher). Das ist eigentlich genauso wie 2x AdlibRegister

    (alle angaben im letzten Satz ohne gewähr. Probiers halt aus)