Bitte um Hilfe! Prüft bitte ein Skript, das einem Bekannten beim Einstieg in AutoIt helfen soll.

  • Ich möchte einem Bekannten, der bisher nur mit Batch gespielt hat, AutoIt näher bringen.

    Er meinte ein Projekt, dass ihn interessieren würde, wäre der Download von Bildern vom eigenen Webspace.
    Ich glaube zwar mittlerweile, dass ich ihm zu einem Skript ohne GUI hätte raten sollen, aber ich versprach ihm ein Beispielskript zu verfassen.

    Nun bin ich begeistert von AutoIt, aber beileibe kein wirklicher Kenner! Daher möchte ich euch bitten, mein Erklär-Skript zu lesen, zu bewerten, und Verbesserungen erklärt zu posten. Ich möchte, dass er sich hier anmeldet, und gleich zu meinem Skript die Kommentare sehen kann. Damit er nicht zum Einen meinen schlechten Stil annimmt und zum anderen meine Fehler von Anfang an lernt.

    Ich hänge das Skript in einer kommentierten und in einer unkommentierten Variante an, wie ich es ihm auch geben möchte.

    Über eure Unterstützung würde ich mich echt freuen.

    Kommentiert:

    Spoiler anzeigen

    Unkommentiert:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>#include <InetConstants.au3>#include <GUIConstantsEx.au3>#include <StaticConstants.au3>Local $URLStart = "http://"Local $Host = "192.168.123.5:80"Local $Indexfile = "/tmp/Bilderindex.png"Local $Bilderordner = "/tmp/Bilderordner"Local $nLinks = "", $nLinks = "", $nDaten = "", $oDaten = "", $Anzahl = "", $KeinArray = "", $Error = "", $Durchlaeufe = ""$Form1 = GUICreate("Bilder", 578, 296)GUISetBkColor(0xEAEAEA, $Form1)$Suche = GUICtrlCreateButton("Suche starten", 180, 240, 217, 33)$Reaktion = GUICtrlCreateButton("", 180, 240, 217, 33)$Label1 = GUICtrlCreateLabel("", 34, 100, 508, 129, $SS_Center)$Label2 = GUICtrlCreateLabel("", 500, 43, 50, 50, $SS_Center)GUICtrlSetState($Reaktion, $GUI_HIDE)GUISetState(@SW_SHOW)While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE FileDelete(@ScriptDir & "\Index_neu.txt") Exit Case $Suche GUICtrlSetData($Label1, "Suche gestartet...") _Suche() Case $Reaktion _Laden() EndSwitchWEndFunc _Suche() $nLinks = "" $nDaten = "" $oDaten = "" $Anzahl = "" $LoadIndex = InetGet($URLStart & $Host & $Indexfile, @ScriptDir & "\Index_neu.txt", 1, 1) If Not @error Then Do Sleep(250) Until InetGetInfo($LoadIndex, $INET_DOWNLOADCOMPLETE) $nDaten = FileReadToArray(@ScriptDir & "\Index_neu.txt") If FileExists(@ScriptDir & "\Index_alt.txt") Then $oDaten = FileReadToArray(@ScriptDir & "\Index_alt.txt") If IsArray($nDaten) And IsArray($oDaten) Then For $i = 0 To UBound($nDaten) - 1 _ArraySearch($oDaten, $nDaten[$i]) If @error Then $nLinks &= $nDaten[$i] & "|" $Anzahl = $Anzahl + 1 EndIf Next EndIf If IsArray($nDaten) And $oDaten = "" Then For $i = 0 To UBound($nDaten) - 1 $nLinks &= $nDaten[$i] & "|" $Anzahl = UBound($nDaten) Next EndIf If $nLinks <> "" Then GUICtrlSetState($Reaktion, $GUI_SHOW) GUICtrlSetData($Reaktion, "Laden") GUICtrlSetState($Suche, $GUI_HIDE) GUICtrlSetData($Label1, $Anzahl & " neue Bilder gefunden.") Else GUICtrlSetData($Label1, "Keine neuen Bilder gefunden.") EndIf Else GUICtrlSetData($Label1, "Keine Verbindung vorhanden, oder keine Bilder auf dem Server.") FileDelete(@ScriptDir & "\Index_neu.txt") EndIfEndFunc ;==>_SucheFunc _Laden() $Error = "" GUICtrlSetData($Label1, "Bilder werden geladen") DirCreate(@ScriptDir & "\Bilder") For $i = 1 To $Anzahl GUICtrlSetData($Label2, $i & "/" & $Anzahl) $LinkSplit = StringSplit($nLinks, "|") InetGet($URLStart & $Host & $Bilderordner & "/" & $LinkSplit[$i], @ScriptDir & "\Bilder\" & $LinkSplit[$i], 1, 0) If Not FileExists(@ScriptDir & "\Bilder\" & $LinkSplit[$i]) Then $Error &= $LinkSplit[$i] & @CRLF Sleep(200) Next If $nLinks <> "" Then FileMove(@ScriptDir & "\Index_neu.txt", @ScriptDir & "\Index_alt.txt", 1) GUICtrlSetData($Label2, "") GUICtrlSetData($Label1, "Bilder wurden geladen") GUICtrlSetState($Reaktion, $GUI_HIDE) GUICtrlSetState($Suche, $GUI_SHOW) If $Error <> "" Then FileWrite(@ScriptDir & "\Fehlerlog.txt", @MDAY & "." & @MON & "." & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & @CRLF & $Error & @CRLF) GUICtrlSetData($Label1, "Es traten Fehler auf" & @CRLF & "Folgende Bilder wurden nicht geladen - finden sich auch im Log im Programmverzeichnis:" & @CRLF & $Error) EndIfEndFunc ;==>_Laden

    [/autoit]
  • AutoIt
    ;~ Die Variablen sind hier Local deklariert. Das muss man hier nicht angeben. Variablen die nicht anders deklariert sind, gelten immer lokal.

    Soweit ich mich erinnere gelten Variablen immer als Global wenn sie außerhalb von Funktionen Deklariert werden, unabhängig davon ob Local oder Global davor steht.
    Local hat nur einen Effekt wenn es innerhalb von Funktionen genützt wird.

    Edit:

    If you declare a variable at the start of your script and outside any functions it exists in the global scope and can be read or changed from anywhere in the script.


    Edit:
    Deine Variablen sind wurden etwas ungewöhnlich benannt z.B. $nDaten und $oDaten
    Ich gehe mal davon aus das "o" für alt und "n" für neu steht.
    Natürlich kannst du deine Variablen benennen wie du möchtest, aber allgemein hat sich die Methode bewährt dort den Datentyp hinzuschreiben.
    https://www.autoitscript.com/wiki/Best_coding_practices

    2 Mal editiert, zuletzt von Zeitriss (25. April 2015 um 18:19)

  • Danke dir für den Hinweis mit Link, Zeitriss!
    Das stimmt. Ich habe da bisher überhaupt keine Regeln und vergebe völlig ungeregelt meine Variablen-Bezeichnungen. Das sollte sich tatsächlich keiner abschauen :D

    Edit: Stimmt. Local war auch nicht richtig beschrieben.

    Grüße autoiter