Synchronisations-Tool

  • Da das hier mein erster Beitrag ist wollte ich erstmal Hallo an alle sagen!!!
    Ich spiele erst seit ein paar Wochen mit Autoit herum, bin also (noch) nicht besonders gut...

    ich habe folgendes Problem:

    Ich habe eine externe Festplatte, die ich als Backup-Medium benutze.
    Um bestimmte Ordner zu sichern, hätte ich gern ein kleines Synchronisations-
    tool, auf das ich klicken könnte und es würde
    direkt anfangen, zu kopieren. Gibt es einen Befehl, mit dem direkt Daten
    kopiert werden können (möglichst ohne den hier eigentlich überflüssigen
    Fortschrittsbalken)??

    Ein weiteres Problem wäre, dass sich manchmal der Laufwerksbuchstaben
    ändert, ich bräuchte also sowohl ein Auswahlfenster für den Quell- als auch den Zielordner.

    Ich hoffe, ich habe mein Problem relativ verständlich ausgedrückt...

    mfg | -nuclear

    • Offizieller Beitrag

    Hallo und :willkommen: im Forum!

    Probiere Es mal mit FileCopy()! Hier Ein bsp, aber warnung!!! Er wird wenn du auf ja klickst alle daten überschreiben!!!!

    Code
    $lauf = InputBox("","Laufwersbuchstabe:","F:")
    $lauf = InputBox("","Laufwersbuchstabe Zum überschreiben:","D:")
    If MsgBox(4,"","Warnung! Wenn Sie jetzt auf ja klicken werden alle daten von "&$lauf&" nach "&$lauf2&" Überschrieben d.h.: Alle momentanexistierenden Dateien werde Überschrieben!!"&@CR&"Wollen Sie wirklich Alle daten Überschreiben?") = 6 Then
    	;Wenn auf ja Geklickt wird:
    	DirCopy($lauf,"D:",1)
    Else
    	;Wenn auf nein oder auf Schließen Geklickt wird
    	Exit
    EndIf
  • Hallo Leute,

    ich hoffe ich bringe mich nicht in Ungnade bei den Moderatoren des Forums,
    aber ich habe mit Hilfe von Auto IT und einem supertollen Freewaretool
    (Unison) schon mehrere Sicherungslösungen dieser Art gebaut.

    Ich denke in der Kombination, könnte das vielleicht für einige Leute mehr noch interessant sein.

    Schaut Euch doch mal das freeware Tool (Unison) hier an:
    http://www.cis.upenn.edu/~bcpierce/unison/

    Was toll an der Sache ist, es funktioniert so ähnlich wie "RSync", das heisst man kann auch inkrementelle Backups (kopien) durchführen.

    Den Rahmen drumrum um den Aufruf würde ich dann mit AutoIT bauen.

    Vielleicht hilfts.... :)

    Grüße
    Christian

  • GtaSpider

    joa so ungefähr hab ich mir das schon vorgestellt.
    Hier mal mein Beispiel:
    Auf der externen Festplatte habe ich einen Backupordner (LW:/Backup/Fotos, LW= platzhalter für buchstaben ;) ) für meine Fotos angelegt.

    Als Backupquellen kommen mehrere Ordner (die unterschiedliche Namen haben) mit Fotos in Frage.
    Ich bräuchte also ein Ordnerauswahlfenster für einen Ordner auf der internen Festplatte und so eine Dialogbox, in die ich nur den Laufwerksbuchstaben eintrage (so wie sie ja schon in deinem Skript drin ist.)
    'ne Ahnung, wie ich das hinkrieg??

    @basler: is mir zu kompliziert :rolleyes:

    mfg | -nuclear

    edit: aja, was genau bedeutet denn das hier:

    Code
    DirCopy($lauf,"D:",1)


    ?

    Einmal editiert, zuletzt von nuclear (13. Mai 2006 um 16:39)

    • Offizieller Beitrag

    Hallo

    So sollte es ungefähr gehen:

    Zu DirCopy:

  • yep das sieht doch schon mal ziemlich nach dem aus, wie ichs gern hätte!

    Vielen Dank erstmal, wenn ich noch Probleme habe, werd ich euchs mitteilen aber im Moment siehts schon sehr gut aus!

    thx
    -nuclear

  • Hallo,

    ich möchte von meiner Festplatte auf eine externe Platte MP3s sichern.

    Dazu habe ich deinen Skript GtaSpider bearbeitet:

    Spoiler anzeigen

    ;;Zielverzeichnis ausw4hlen
    $lauf2 = FileSelectFolder("Wo sollen die Dateien hinkopiert werden?","",2)
    If @error Then Exit ;Wenn Abbrechen gedruckt wird
    If MsgBox(4,"","Sollen die Dateien nach "&$lauf2&" kopiert werden?") = 6 Then
    ;Wenn auf ja Geklickt wird:
    DirCopy("G:\MP3",$lauf2,1)
    Else
    Exit
    EndIf

    Was ich möchte ist, dass der Skript nur neuere Dateien kopiert und nicht komplette Ordner ersetzt.
    Ist das möglich? Bei Batch war das ja möglich.

  • @redbull80

    Hier kommt ein schnell gemachten Skript furs Thema, soll Funktionieren.


    [autoit]

    $BackupVonDir = "c:\MyDocs"
    $BackupNachDir = "f:\MyBackup\Mydocs"
    $backupLog = StringLeft(StringReplace(_NowCalc(), "/", ""), 8) & "_BackUpReport.log"

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

    If Not FileExists($BackupNachDir) Then DirCreate($BackupNachDir)

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

    $search = FileFindFirstFile($BackupVonDir & "\*.*")
    ; Test ob gefunden
    If $search = -1 Then
    MsgBox(0, "Error", "Keine Kwelle von Dir/Datei vom Mask")
    Exit
    EndIf

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

    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    DateiKopyInkrementelle($file, $BackupNachDir & "\" & $file, 1, $backupLog)
    WEnd

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

    ; Handle Zu machen
    FileClose($search)
    Run("Notepad.exe " & $backupLog)
    exit
    Func DateiKopyInkrementelle($fromfile, $tofile, $NeuKopieren, $backupLog)
    If Not FileExists($tofile) Then
    If $NeuKopieren Then
    If Not FileCopy($fromfile, $tofile,1) Then
    _FileWriteLog(@ScriptDir & "\" & $backupLog, "***Fehler Kopiert... " & $fromfile & "->" & $tofile)
    Else
    _FileWriteLog(@ScriptDir & "\" & $backupLog, "+++Richtig Kopiert.. " & $fromfile & "->" & $tofile)
    EndIf
    EndIf
    Else
    $fromCrc = FileGetAttrib($fromfile) & FileGetSize($fromfile) & FileGetTime($fromfile)
    $toCrc = FileGetAttrib($tofile) & FileGetSize($tofile) & FileGetTime($tofile)
    If $fromCrc <> $toCrc Then
    If Not FileCopy($fromfile, $tofile,1) Then
    _FileWriteLog(@ScriptDir & "\" & $backupLog, "***Fehler Kopiert... " & $fromfile & "->" & $tofile)
    Else
    _FileWriteLog(@ScriptDir & "\" & $backupLog, "+++Richtig Kopiert.. " & $fromfile & "->" & $tofile)
    EndIf
    EndIf
    EndIf
    EndFunc ;==>DateiKopyInkrementelle

    [/autoit]

    Noch bitte Sprache Fehler Korrektur, eventuell Autoit-Fehler auch ..

    Congratulations fuer Alle die Helfen im Autoit.de, die Hilfe-Antworte sind so schnell -- Sekunden - :stolz_bin:-
    Dass Nicht Extra Hilfe gegraucht ist. Aber dies mal mache ich gern.
    Edit: Korrekt . filecopy flag eins

    2 Mal editiert, zuletzt von BasicOs (14. November 2006 um 17:52)

  • Hallo @BasicOs


    Danke für die Mühe.

    Leider erhalte ich eine Fehlermeldung beim ausführen des Scripts:

    Line 14 (File "G:\Test.au3"):

    $backupLog = StringLeft(StringReplace(_NowCalc(), "/", ""), 8) & "_BackUpReport.log"
    $backupLog = StringLeft(StringReplace(^ERROR

    Error: Unknown function name.

  • hab jetzt #include <Date.au3> hinzugefügt und schon gehts weiter zur nächsten Fehlermeldung:

    Spoiler anzeigen
    [autoit]

    ; Script Start - Add your code below here
    #include <Date.au3>
    $BackupVonDir = "g:\Test"
    $BackupNachDir = "g:\BackupTest"
    $backupLog = StringLeft(StringReplace(_NowCalc(), "/", "";), 8) & "_BackUpReport.log"

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

    If Not FileExists($BackupNachDir) Then DirCreate($BackupNachDir)

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

    $search = FileFindFirstFile($BackupVonDir & "\*.*";)
    ; Test ob gefunden
    If $search = -1 Then
    MsgBox(0, "Error", "Keine Kwelle von Dir/Datei vom Mask";)
    Exit
    EndIf

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

    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    DateiKopyInkrementelle($file, $BackupNachDir & "\" & $file, 1, $backupLog)
    WEnd

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

    ; Handle Zu machen
    FileClose($search)
    Run("Notepad.exe " & $backupLog)
    exit
    Func DateiKopyInkrementelle($fromfile, $tofile, $NeuKopieren, $backupLog)
    If Not FileExists($tofile) Then
    If $NeuKopieren Then
    If Not FileCopy($fromfile, $tofile,1) Then
    _FileWriteLog(@ScriptDir & "\" & $backupLog, "***Fehler Kopiert... " & $fromfile & "->" & $tofile)
    Else
    _FileWriteLog(@ScriptDir & "\" & $backupLog, "+++Richtig Kopiert.. " & $fromfile & "->" & $tofile)
    EndIf
    EndIf
    Else
    $fromCrc = FileGetAttrib($fromfile) & FileGetSize($fromfile) & FileGetTime($fromfile)
    $toCrc = FileGetAttrib($tofile) & FileGetSize($tofile) & FileGetTime($tofile)
    If $fromCrc <> $toCrc Then
    If Not FileCopy($fromfile, $tofile,1) Then
    _FileWriteLog(@ScriptDir & "\" & $backupLog, "***Fehler Kopiert... " & $fromfile & "->" & $tofile)
    Else
    _FileWriteLog(@ScriptDir & "\" & $backupLog, "+++Richtig Kopiert.. " & $fromfile & "->" & $tofile)
    EndIf
    EndIf
    EndIf
    EndFunc ;==>DateiKopyInkrementelle

    [/autoit]
    • Offizieller Beitrag

    Hi,

    :schild4: weil dir auch noch #include <File.au3> fehlt.

    Spoiler anzeigen
    [autoit]

    ; Script Start - Add your code below here
    #include <Date.au3>
    #include <file.au3>
    $BackupVonDir = "g:\Test"
    $BackupNachDir = "g:\BackupTest"
    $backupLog = StringLeft(StringReplace(_NowCalc(), "/", ""), 8) & "_BackUpReport.log"

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

    If Not FileExists($BackupNachDir) Then DirCreate($BackupNachDir)

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

    $search = FileFindFirstFile($BackupVonDir & "\*.*")
    ; Test ob gefunden
    If $search = -1 Then
    MsgBox(0, "Error", "Keine Kwelle von Dir/Datei vom Mask")
    Exit
    EndIf

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

    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    DateiKopyInkrementelle($file, $BackupNachDir & "\" & $file, 1, $backupLog)
    WEnd

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

    ; Handle Zu machen
    FileClose($search)
    Run("Notepad.exe " & $backupLog)
    Exit
    Func DateiKopyInkrementelle($fromfile, $tofile, $NeuKopieren, $backupLog)
    If Not FileExists($tofile) Then
    If $NeuKopieren Then
    If Not FileCopy($fromfile, $tofile, 1) Then
    _FileWriteLog(@ScriptDir & "\" & $backupLog, "***Fehler Kopiert... " & $fromfile & "->" & $tofile)
    Else
    _FileWriteLog(@ScriptDir & "\" & $backupLog, "+++Richtig Kopiert.. " & $fromfile & "->" & $tofile)
    EndIf
    EndIf
    Else
    $fromCrc = FileGetAttrib($fromfile) & FileGetSize($fromfile) & FileGetTime($fromfile)
    $toCrc = FileGetAttrib($tofile) & FileGetSize($tofile) & FileGetTime($tofile)
    If $fromCrc <> $toCrc Then
    If Not FileCopy($fromfile, $tofile, 1) Then
    _FileWriteLog(@ScriptDir & "\" & $backupLog, "***Fehler Kopiert... " & $fromfile & "->" & $tofile)
    Else
    _FileWriteLog(@ScriptDir & "\" & $backupLog, "+++Richtig Kopiert.. " & $fromfile & "->" & $tofile)
    EndIf
    EndIf
    EndIf
    EndFunc ;==>DateiKopyInkrementelle

    [/autoit]

    Edit: Habe nur die Fehler ausgebaut, das Skript selbst habe ich mir nicht angeguckt!

    So long,

    Mega

  • Erste Emphelung bei Autoit, Alt+F1, da kommt Hilfe, das Hilfe in Autoit ist nicht wie in Andere Programierung Sprache schlecht, sonde WUNDERWAR, AUSGEZEICHNET ... :klatschen:

    so Eine gute Idee Hilfe zu benutzen am benutzung vom Skripts.

    Noch fehlt an meinen Skript, wenn du es brauchst. rekursive zu machen.
    Ich lasse das oefen fuer andere Skripters.
    Mach einfach eine UDF zum erkennen wann an stelle vom Datei, ein Verzeichnis ist, und dannach benutzt diese Verzeichnis wie parameter vom Gleiche Funktion........ so Ungefaehr.

    Viel Spass beim Koding :musik1: ;)

  • Danke für die Hilfe ;)

    Wieso funktioniert der Skript nur wenn er selber im quell-Verzeichnis ist?

    Wenn er an einem anderen Ort ist kopiert er keine dateien und in der Log Datei steht "Fehler beim kopieren".

  • quell-Verzeichnis ist woher die Datei kopiert werden?

    such mal ein variable das heisst $backupVondir und schreib genauso das Pfad
    :hammer:
    $backupVondir="c:\deindir"

    da gibt es ein LOG, was kommt am Log,

    Einmal editiert, zuletzt von BasicOs (16. November 2006 um 01:05)

  • @BasicOs

    ja das ist mir klar.

    Beispiel was ich meine:

    $BackupVonDir = "G:\Test"
    $BackupNachDir = "G:\Backup"

    und der Skript selber befindet sich bei G:\Test -> Dann kopiert er die Dateien

    und wenn der Skript sich bei G:\ befindet -> Dann wird nur ein Ordner G:\Backup erstellt der aber leer bleibt und in der Log steht, Fehler beim kopieren.

    Also irgendwo ist da noch ein Fehler.

  • das war ein $var nicht im richtigem Platz, jetzt habe ich ganz regeschrieben,
    damit es:
    Rekursive ist
    Besser Log Datei
    Splash fuer info
    Noch hier und da .. was ..
    Noch kommt wie eine UDF:
    DateiKopyDirInkre($BackupVonDir, $BackupNachDir, $backupLog,$iRekursive)

    Viel Spass .. nicht vergessen deine au3 Skripts Taeglich Kopieren:) ...

    Mich ueberlege, warum nicht zum Dvdrw Kopieren.... noch jemand kennt sich gut beim Batch nerocmd.exe ? ...


    Rekursive nicht viel getestet keine Zeit heute mal sehen...

    [autoit]

    #include <Date.au3>
    #include <file.au3>
    Opt("trayicondebug", 1)
    Global $BackupVonDir = "g:\test", $BackupNachDir = "g:\Mybackup"
    $iRekursive=0
    $message = ""
    $backupName=StringLeft(StringReplace(_NowCalc(), "/", ""), 6) & "_BackUpReport.log"
    $backupLog = @ScriptDir & "\" & $backupName
    SplashTextOn("My Backup", "", 800, 600, 100, 200, 4, "")
    _FileWriteLog($backupLog, @CRLF &@CRLF & "Results vom Verzeichnis Kopy Inkrementelle von " & $BackupVonDir & " nach " & $BackupNachDir & "..:" & @CRLF)
    DateiKopyDirInkre($BackupVonDir, $BackupNachDir, $backupLog,$iRekursive)
    Run("Notepad.exe " & $backupLog)
    WinWait($backupName,"")
    If Not WinActive($backupName,"") Then WinActivate($backupName)
    WinWaitActive($backupName,"",5)
    Send("{CTRLDOWN}{END}{CTRLUP}")
    Exit

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

    Func DateiKopyDirInkre($BackupVonDir, $BackupNachDir, $backupLog,$iRekursive)
    _FileWriteLog($backupLog, @crlf&"Zum Verzeichnis.... " & $BackupNachDir)
    ;FileChangeDir($BackupVonDir)
    $search = FileFindFirstFile($BackupVonDir & "\*.*")
    ; Test ob gefunden
    If $search = -1 Then
    ControlSetText("My Backup", "", "Static1", $message & " Keine Kwelle von Dir/Datei vom Mask " & $BackupVonDir)
    _FileWriteLog($backupLog, "*Fehler Kopiert... " & " Keine Kwelle von Dir/Datei vom Mask " & $BackupVonDir)
    Else
    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    If FileGetAttrib($BackupVonDir & "\" & $file) = "D" Then
    if $iRekursive then DateiKopyDirInkre($BackupVonDir & "\" & $file, $BackupNachDir & "\" & $file, $backupLog,$iRekursive)
    Else
    DateiKopyInkrementelle($BackupVonDir & "\" & $file, $BackupNachDir & "\" & $file, 1, $backupLog)
    EndIf
    WEnd
    ; Handle Zu machen
    FileClose($search)
    EndIf
    EndFunc ;==>DateiKopyDirInkre

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

    Func DateiKopyInkrementelle($fromfile, $tofile, $NeuKopieren, $backupLog)
    $wFehler = ""
    If Not FileExists($tofile) Then
    If $NeuKopieren Then
    If Not FileCopy($fromfile, $tofile, 9) Then
    _FileWriteLog($backupLog, "*Fehler Kopiert... " & FileGetShortName($fromfile) & "->" & FileGetShortName($tofile))
    $wFehler = " nicht kopiert"
    Else
    _FileWriteLog($backupLog, "+Richtig Kopiert.. " & FileGetShortName($fromfile) & "->" & FileGetShortName($tofile))
    EndIf
    EndIf
    Else
    $fromCrc = FileGetAttrib($fromfile) & FileGetSize($fromfile) & FileGetTime($fromfile)
    $toCrc = FileGetAttrib($tofile) & FileGetSize($tofile) & FileGetTime($tofile)
    If $fromCrc <> $toCrc Then
    If Not FileCopy($fromfile, $tofile, 9) Then
    _FileWriteLog($backupLog, "*Fehler Kopiert.." & FileGetShortName($fromfile) & "->" & FileGetShortName($tofile))
    $wFehler = "<-nicht kopiert"
    Else
    _FileWriteLog($backupLog, "+Richtig Kopiert. " & FileGetShortName($fromfile) & "->" & FileGetShortName($tofile))
    EndIf
    Else
    _FileWriteLog($backupLog, "=Schon Existiert. " & FileGetShortName($fromfile) & "->" & FileGetShortName($tofile))
    EndIf
    EndIf
    $message &= "Kopy " & $fromfile & " nach " & $tofile & $wFehler & @CRLF
    ControlSetText("My Backup", "", "Static1", $message)
    EndFunc ;==>DateiKopyInkrementelle

    [/autoit]

    2 Mal editiert, zuletzt von BasicOs (16. November 2006 um 18:58)

  • Vielen Dank. Funktioniert jetzt

    Ich blicke da überhaupt nicht mehr durch. Ist kompliziert geworden.