Vorstellung + Frage

  • Hi Leute, ich heiße Eddy und bin neu hier im Forum.

    Was meine Autoit Kenntnisse angeht, sind sie recht übersichtlich. Deshalb wollte ich hier gleich mit einer frage beginnen, die Euch Profis vor Augen führen wird, was für ein blutiger Anfänger ich bin.

    Nun zu meiner Frage: Ich würde gerne ein Script schreiben, welches einen bestimmten Ordner alle 10 Minuten auf Veränderungen überwacht (z.B. Gesamtgröße oder sonstiges) und falls sich die Größe ändert, sollen die Daten auf eine andere Festplatte in einen gleichnamigen Ordner kopiert werden.

    Ich bin mir sicher, dass dieses Script nicht viele Zeilen Quelltext enthalten wird, aber mir fehlt echt die Erfahrung das Problem zu lösen.

    Vielen dank im Voraus für Eure Antworten, Gruß, Eddy.

  • Als erstes mal "Herzlich Willkommen" ^^ Es gäbe auch ein extra Uservorstellungs Forum.

    Für mich hört sich das eher so an, als würde es zum Forum "Ohne Gegenleitung" gehören, aber um dir einen Denkanstoß zu geben:

    Zum Kopieren:

    [autoit]

    FileMove()

    [/autoit]

    Größe einer Datei bekommen:

    [autoit]

    FileGetSize()

    [/autoit]

    Alle 10 Min. "überwachen":

    [autoit]

    $hTimer = TimerInit()
    While Sleep (50)
    If TimerDiff ($hTimer) >= 10* 60* 1000 Then
    ;; Was gemacht werden soll
    EndIf
    Wend

    [/autoit]

    Am besten schaust du dir die Funktionen mal in der Hilfe an, dann lernst du direkt schon was :)

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

    Einmal editiert, zuletzt von BadBunny (30. August 2011 um 22:31)

  • Erst einmal danke für die Antwort.

    Ich hab deine tipps etwas näher angeschaut und hab gesehen, dass

    [autoit]

    filemove()

    [/autoit]

    Dateien Verschieben bedeutet. Ok danach habe ich

    [autoit]

    filecopy()

    [/autoit]

    und

    [autoit]

    dircopy()

    [/autoit]

    gefunden hab.

    Ok soweit sogut, aber da habe ich ja nur die größe einer Datei abgefragt. Ich wollte aber die größe eines ganzen Ordners überwachen.

    Bitte um weitere Tipps und Anregungen.

    Man bin ich ein Newbie. ?(

  • Du kannst auch alle Dateien auflisten und die Größe in ein Array schreiben und jedes mal überprüfen ob sich die Größe geändert hat. Oder auch einfach das Änderungsdatum überprüfen.

    [autoit]

    _FileListToArray() ;; Zum Auflisten

    [/autoit][autoit]

    FileGetTime () ;; Kann auch das Änderungsdatum zurückgeben, siehe Hilfe

    [/autoit]

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • viel prozessorschonender sollte

    [autoit]

    AdlibRegister

    [/autoit]


    in verwendung mit


    [autoit]


    While 1
    Sleep(500)
    Wend

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

    sein

    -

  • Kann man das denn nicht einfach so machen, als wenn man auf den Ordner mit rechter Maustaste klickt, dann auf Eigenschaften und sich dort die Größe des Ordners zieht, um sie dann weiter zu verwenden?

    Gibt es nicht so eine Funktion wie

    [autoit]

    filegetsize()

    [/autoit]

    nur für Ordner?

    Ich bin für jeden Tipp dankbar.


    Schönen Gruß, Eddy...

  • Auch von mir ersteinmal ein herzliches Willkommen.
    Ja, es gibt FileGetSize() für Ordner:

    [autoit]

    DirGetSize

    [/autoit]


    Damit dürftest du eigentlich alles für dein Programm haben.

    MfG, James C.

  • Oh man so einfach ist das? Vielen Dank an alle die mir in meiner schweren Stunde beigestanden haben. ;)

    eigentlich wäre DirGetSize eine verwandte Funktion zu FileGetSize, aber ich habe diese nicht finden können.

    Jedenfalls vielen Dank nochmal an alle.

    Schönen Gruß, Eddy...

    Eine Frage hätte ich doch noch: Nehmen wir an, im Ordner hat sich was verändert"eine Datei hinzugekommen" wie würdet Ihr sie Identifizieren um sie dann zu kopieren?

    Mir schwebt da vor das Datum dieser besagten Datei zu scannen und mit dem Datum von "heute" zu vergleichen. Wären sie identisch, dann den Kopiervorgang auslösen.

    Oder gibts da vielleicht eine elegantere Lösung?

    2 Mal editiert, zuletzt von hexpirator (31. August 2011 um 12:34)

  • Schau dir mal

    [autoit]

    FileFindFirstFile

    [/autoit]


    und

    [autoit]

    FileFindNextFile

    [/autoit]


    an. Damit kann man die Dateien in einem Ordner auflisten. Dann müsste man für jede Datei das Datum mit

    [autoit]

    FileGetTime

    [/autoit]


    überprüfen. Die Idee ist nicht ideal, aber momentan fällt mir auch nichts besseres ein.

    MfG, James C.

    EDIT #1:
    Eine andere Idee wäre, ein Liste aller Dateien anlegen zu lassen und dann den aktuellen Ordnerinhalt mit der Liste zu vergleichen.

  • Hi Leute. Soweit so gut. Den Teil habe ich verstanden.

    Nun kommt gleich die nächste Frage hinterher. Wie kann ich das denn realisieren, dass in dem Ordner jede datei nacheinander auf ihr datum geprüft wird? a.* , b.* usw...

    Ich weiß, für einen Neuling habe ich mir gleich etwas schwieriges ausgesucht, aber man lernt schneller, wenn man gleich ins kalte Wasser springt.

    Ich bin für jeden Denkanstoß dankbar.

    Gruß, Eddy...

  • Hi Leute.

    Irgendwie komme ich absolut nicht klar.

    Kann mir vielleicht einer von euch erklären, was ich falsch mache?
    Ich bekomme eine riesenliste an fehlermeldungen.
    Hier mein Script:

    [autoit]

    $Quellverzeichnis = (C:\Dokumente und Einstellungen\Admin\Desktop\quell)
    $Zielverzeichnis = (C:\Dokumente und Einstellungen\Admin\Desktop\ziel)
    while
    Sleep (50)
    WEnd

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

    Func
    DirGetSize ($Quellverzeichnis)
    DirGetSize ($Zielverzeichnis)

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

    IF ($Quellverzeichnis <> $Zielverzeichnis)

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

    then DirCopy ($Quellverzeichnis, $Zielverzeichnis)

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

    Sleep (100000)
    EndFunc

    [/autoit]

    Vielen Dank im Voraus. Gruß, Eddy.

  • Das ist total falsch... schau dir am besten erstmal ein paar anfangs Tutorials an... Bei Strings (Texten) benutzt man " "
    Bsp:
    "String"
    While läuft ohne Parameter

    Func hat keinen Namen

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Hi Leute, hier ist der Noob schon wieder.

    Hier ist mein verändertes Script, aber kopieren will es immer noch nicht.

    Ich bin am verzweifeln. Bitte um Hilfe.

    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: Hexpirator

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

    Script Function:
    Das Programm soll einen Quellordner auf Veränderungen überwachen und in
    bestimmten Zeitintervalen die neu hinzugefügten Dateien in einen Zielordner
    kopieren. Also quasi eine Sicherheitskopie erstellen.

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

    #ce ----------------------------------------------------------------------------
    $Quellverzeichnis = DirGetSize ("C:\Dokumente und Einstellungen\Admin\Desktop\quell,0")
    $Zielverzeichnis = DirGetSize ("C:\Dokumente und Einstellungen\Admin\Desktop\ziel,0")
    $quelle = "C:\Dokumente und Einstellungen\Admin\Desktop\quell"
    $Ziel = "C:\Dokumente und Einstellungen\Admin\Desktop\ziel"

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

    while 1
    Sleep (50)
    WEnd

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

    Func vergleich()

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

    If $Quellverzeichnis > $Zielverzeichnis then
    DirCopy ($quelle, $Ziel)

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

    ElseIf $Quellverzeichnis = $Zielverzeichnis Then
    MsgBox (0, "", "keine Änderung")
    EndIf
    Sleep (100000)
    EndFunc

    [/autoit]
  • Teste mal das:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: Hexpirator

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

    Script Function:
    Das Programm soll einen Quellordner auf Veränderungen überwachen und in
    bestimmten Zeitintervalen die neu hinzugefügten Dateien in einen Zielordner
    kopieren. Also quasi eine Sicherheitskopie erstellen.

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

    #ce ----------------------------------------------------------------------------

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

    Global $quelle = "C:\Dokumente und Einstellungen\Admin\Desktop\quell"
    Global $Ziel = "C:\Dokumente und Einstellungen\Admin\Desktop\ziel"

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

    ;Wenn sich keine Ordner im Quellordner befinden
    Global $Quellverzeichnis = DirGetSize ($quelle,0)
    Global $Zielverzeichnis = DirGetSize ($Ziel,0)

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

    ;Wenn sich Ordner im Quellordner befinden: Rekursivmodus
    ;Global $Quellverzeichnis = DirGetSize ($quelle,2)
    ;Global $Zielverzeichnis = DirGetSize ($Ziel,2)

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

    $Zeitintervall = 600000

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

    AdlibRegister("vergleich",$Zeitintervall)

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

    while 1
    Sleep (500)
    WEnd

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

    Func vergleich()

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

    $Quellverzeichnis = DirGetSize ($quelle,2)
    $Zielverzeichnis = DirGetSize ($Ziel,2)

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

    If $Quellverzeichnis > $Zielverzeichnis then
    DirCopy ($quelle, $Ziel)
    ElseIf $Quellverzeichnis = $ZielverzeichnisThen
    MsgBox (0, "", "keine Änderung")
    EndIf

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

    EndFunc

    [/autoit]

    Nicht getestet...

    Kann evtl Fehler enthalten

    ist allerdings nicht optimal, weil der Kopiervorgang je nach Ordnergröße sehr lange braucht.

    Warum kopierst du nicht einfach die neuen Dateien anstatt den ganzen Ordner?

    Einmal editiert, zuletzt von 4Soldier93 (3. September 2011 um 14:19)

  • Mit den Variablen läuft es bei mir nicht bei FileCopy, deshalb musste ich den gesamten Dateipfad eingeben. Ich wüsste nur gerne warum das nicht geht. Hat da einer eine Idee???

    Hier das lauffähige Script:

    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: Hexpirator

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

    Script Function:
    Das Programm soll einen Quellordner auf Veränderungen überwachen und in
    bestimmten Zeitintervalen die neu hinzugefügten Dateien in einen Zielordner
    kopieren. Also quasi eine Sicherheitskopie erstellen.

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

    #ce ----------------------------------------------------------------------------
    HotKeySet("+c", "vergleich") ;Shift_und_c
    Global $quelle = "C:\Dokumente und Einstellungen\Admin\Desktop\quell\"
    Global $Ziel = "C:\Dokumente und Einstellungen\Admin\Desktop\ziel\"

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

    ;Wenn sich keine Ordner im Quellordner befinden
    ;Global $Quellverzeichnis = DirGetSize ($quelle,0)
    ;Global $Zielverzeichnis = DirGetSize ($Ziel,0)

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

    ;Wenn sich Ordner im Quellordner befinden: Rekursivmodus
    Global $Quellverzeichnis = DirGetSize ($quelle,2)
    Global $Zielverzeichnis = DirGetSize ($Ziel,2)

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

    $Zeitintervall = 600000

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

    AdlibRegister("vergleich",$Zeitintervall)

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

    while 1
    Sleep (500)
    WEnd

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

    Func vergleich()

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

    $Quellverzeichnis = DirGetSize ($quelle,2)
    $Zielverzeichnis = DirGetSize ($Ziel,2)

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

    If $Quellverzeichnis > $Zielverzeichnis Then
    FileCopy ("C:\Dokumente und Einstellungen\Admin\Desktop\quell\*.*", "C:\Dokumente und Einstellungen\Admin\Desktop\ziel\*.*", 1);($quelle, $Ziel, 1)
    MsgBox (0, "Hinweis", "Vom Quellordner in den Zielordner kopiert.")
    ElseIf $Quellverzeichnis = $Zielverzeichnis Then
    ;MsgBox (0, "Hinweis", "keine Änderung")
    Else
    If $Quellverzeichnis < $Zielverzeichnis Then

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

    FileCopy ("C:\Dokumente und Einstellungen\Admin\Desktop\ziel\*.*", "C:\Dokumente und Einstellungen\Admin\Desktop\quell\*.*", 1)
    MsgBox (0, "Hinweis", "Vom Zielordner in den Quellordner kopiert.")

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

    EndIf

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

    EndIf

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

    EndFunc

    [/autoit]

    Außerdem ist mir im nach hinein aufgefallen, dass wenn ich einen Ordner mit ins Quellverzeichnis reinkopiere, dieser nicht ins Zielverzeichnis kopiert wird. geschweige denn, wenn sich im Unterordner etwas ändert.
    Ich weiß, dass dieses Script nicht die optimale Lösung ist, aber für mein zweites Script ist es schon toll für mich. Natürlich mit Hilfe die User hier.

    2 Mal editiert, zuletzt von hexpirator (7. September 2011 um 12:23)

  • Bitte den Thread auf [gelöst] stellen :) Danke

    Einfach den ersten Post bearbeiten und Präfix auf [gelöst] stellen ^^

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Zu dem ersten Problem mit dem Dateipfad per Varaible:
    Das Problem liegt daran, dass in deiner Variable zwar der Pfad drin ist, allerdings wird nicht definiert welche daten,bzw. welche Typ Daten kopiert werden sollen ("C:\Pfad\Zur\Datei\*.*")

    Das zweite problem kann mit der Funktion DirCopy gelöst werden (Siehe mein Bsp. Skript)!

    Die optimale Lösung wäre aber immer noch NUR die neusten daten zu kopieren. Da ich so einen "Syncro"-Manager auch derzeit benötige, werde ich mich evtl mal hinsetzen und einen Programmieren (je nachdem ob ich Zeit finde)!

  • mal eine einfache Lösung, ohne Extras...

    Spoiler anzeigen
    [autoit]

    HotKeySet("{Esc}", "_Exit") ; Script Beenden mit Esc

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

    Global $Quelle = "C:\quelle"
    Global $Ziel = "C:\ziel"
    Global $Zeitintervall = 1000 ; in MilliSekunden
    If FileExists($Quelle) = 0 Or FileExists($Ziel) = 0 Then Exit SetError(1,0,0)
    AdlibRegister("DirCheck",$Zeitintervall)

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

    While Sleep (10)
    WEnd

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

    Func DirCheck()
    AdlibUnRegister("DirCheck")
    If DirGetSize ($Quelle) <> DirGetSize ($Ziel) Then
    RunWait(@ComSpec & " /c " & "xcopy " & $Quelle & " " & $Ziel & " /D /E /C /I /Q /H /R /K /Y /J", "", @SW_HIDE)
    EndIf
    AdlibRegister("DirCheck",$Zeitintervall)
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)