Backupscript

  • Hallo zusammen,


    Ich habe mir heute Morgen vorgenommen, ein Backupscript mithilfe vom
    Cmdbefehl xcopy mit AutoIT zu schreiben, was den Vorteil hat, dass nur
    neue/geänderte Daten kopiert werden.

    Die Voraussetzung ist, das ich zwischen Laufwerken und 3 Wochentagen
    unterscheiden kann. Herausgekommen ist bis jetzt der untenstehende
    Code...

    Nun bin ich mir nicht ganz sicher, ob das ganze so funktionieren wird,
    ausserdem komme ich mit dem Run(@ComSpec... nicht ganz klar,

    Ich möchte xcopy mit dem Parametern /d /y /e verwenden doch wie muss das ganze geordnet sein mit den Variablen...

    Ausserdem wäre es schön, wenn ich die GUI per TryIcon aufrufen könnte
    (z.B mit Doppelklick oder Rechtsklick), ist sowas realisierbar?

    Bitte entschuldigt den noch unformatierten Code :rolleyes:

    Wichtig ist vielleicht noch, dass bei @WDay 1 Sonnatg ist, 2 Montag etc...

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>




    #Region ;Überprüft ob BackupRabbit.exe im Autostart ist, wenn nicht wird eine Kopie von sich selbst in den Autostart erstellt und löscht sich anschliessend selbst
    If not FileExists(@StartupDir & "/" & "BackupRabbit.exe") Then
    FileCopy(@ScriptFullPath, @StartupDir)
    MsgBox(4096, 'Erste Benutzung', 'Sie müssen den Computer neu starten um das Programm nutzen zu können.')
    MsgBox(4096, 'Erste Benutzung', 'Den Backupplaner öffnen Sie mit F8 oder über das TryIcon.')
    _selfdelete()
    EndIf
    #EndRegion




    While 1

    HotKeySet("{F8}", "Fenster")
    $Eingabe1 = IniRead(@UserName & "\BackupRabbit.ini", "Daten", "Von", "")
    $Eingabe2 = IniRead(@UserName & "\BackupRabbit.ini", "Daten", "Nach", "")
    $Eingabe4 = IniRead(@UserName & "\BackupRabbit.ini", "Daten", "Mittwoch", "")
    $Eingabe5 = IniRead(@UserName & "\BackupRabbit.ini", "Daten", "Donnerstag", "")
    $Eingabe6 = IniRead(@UserName & "\BackupRabbit.ini", "Daten", "Freitag", "")

    If @WDAY = 4 Then
    If $Eingabe4 = 1 Then
    Run(@ComSpec .....???????????????????
    EndIf
    EndIf

    If @WDAY = 5 Then
    If $Eingabe5 = 1 Then
    Run(@ComSpec .....???????????????????
    EndIf
    EndIf

    If @WDAY = 6 Then
    If $Eingabe6 = 1 Then
    Run(@ComSpec .....???????????????????
    EndIf
    EndIf


    WEnd





    Func Fenster()

    #Region ; GUI Daten
    $BackupRabbit = GUICreate("BackupRabbit", 253, 137, 327, 131)
    $Label1 = GUICtrlCreateLabel("Von:", 8, 32, 26, 17)
    $Label2 = GUICtrlCreateLabel("Nach:", 8, 56, 33, 17)
    $Label3 = GUICtrlCreateLabel("Wo?", 8, 8, 30, 17)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $Input1 = GUICtrlCreateInput("D:", 48, 32, 57, 21)
    $Input2 = GUICtrlCreateInput("E:", 48, 56, 57, 21)
    $Mittwoch = GUICtrlCreateCheckbox("Mittwoch", 136, 32, 97, 17)
    $Donnerstag = GUICtrlCreateCheckbox("Donnerstag", 136, 64, 97, 17)
    $Freitag = GUICtrlCreateCheckbox("Freitag", 136, 96, 97, 17)
    $Label4 = GUICtrlCreateLabel("Wann?", 136, 8, 44, 17)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $Speichern = GUICtrlCreateButton("Speichern", 8, 80, 113, 33)
    GUISetState(@SW_SHOW)
    #EndRegion

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg

    Case $Speichern

    #Region ;Liesst Wert von Checkboxen aus und schreibt sie in BackupRabbit.ini

    If GUICtrlRead($Mittwoch) = 1 Then
    IniWrite(@UserName & "\BackupRabbit.ini", "Daten", "Mittwoch", "1")
    Else
    IniWrite(@UserName & "\BackupRabbit.ini", "Daten", "Mittwoch", "0")
    Endif

    If GUICtrlRead($Donnerstag) = 1 Then
    IniWrite(@UserName & "\BackupRabbit.ini", "Daten", "Donnerstag", "1")
    Else
    IniWrite(@UserName & "\BackupRabbit.ini", "Daten", "Donnerstag", "0")
    Endif

    If GUICtrlRead($Freitag) = 1 Then
    IniWrite(@UserName & "\BackupRabbit.ini", "Daten", "Freitag", "1")
    Else
    IniWrite(@UserName & "\BackupRabbit.ini", "Daten", "Freitag", "0")
    Endif

    #EndRegion


    #Region ;Liesst Wert von Inputboxen aus und schreibt sie in BackupRabbit.ini
    $Von = Guictrlread($Input1)
    $Nach = Guictrlread($input2)
    IniWrite(@UserName & "\BackupRabbit.ini", "Daten", "Von", $Von)
    IniWrite(@UserName & "\BackupRabbit.ini", "Daten", "Nach", $Nach)
    #EndRegion

    Case $GUI_EVENT_CLOSE

    Exit

    EndSwitch
    WEnd



    Endfunc


    Func _selfdelete($iWait = 1000) ;irgendwo hier im forum gefunden ^^
    ShellExecute(@ComSpec, '/c ping 0.0.0.1 -n 1 -w ' & $iWait & ' & del "' & @ScriptFullPath & '"', @ScriptDir, 'open', @SW_HIDE)
    Exit
    EndFunc

    [/autoit]

    Edit Oscar: Spoiler eingefügt. Bitte bei längeren Quelltexten den Spoiler benutzen.

    Einmal editiert, zuletzt von Oscar (15. November 2012 um 06:39)

  • Ich habe mir heute Morgen vorgenommen, ein Backupscript mithilfe vom Cmdbefehl xcopy mit AutoIT zu schreiben, was den Vorteil hat, dass nur neue/geänderte Daten kopiert werden.

    Wieso willst du den Umweg über den Konsolen-Befehl denn überhaupt gehen? Ich hab mal schnell eine "Quick and Dirty" Version mit Autoit geschrieben:

    Spoiler anzeigen
    [autoit]

    #include <Crypt.au3>
    _xCopy(@ScriptDir, @ScriptDir & "\backup\")
    ; neue Dateien werden kopiert
    ; veränderte Dateien werden ersetzt/erneuert

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

    Func _xCopy($sSourceDir, $sDestinationDir, $sMotherDir = -1) ; Bitte den letzten Parameter nicht setzen!
    If StringRight($sSourceDir, 1) <> "\" Then $sSourceDir &= "\"
    If StringRight($sDestinationDir, 1) <> "\" Then $sDestinationDir &= "\"
    If Not FileExists($sSourceDir) Then Return -1
    If Not FileExists($sDestinationDir) Then DirCreate($sDestinationDir)
    If $sSourceDir = $sDestinationDir Then Return -2
    If $sMotherDir = -1 Then $sMotherDir = StringLen($sSourceDir)
    Local $hSearch = FileFindFirstFile($sSourceDir & "*"), $sNewPath, $sMD5
    While 1 ; by Christoph54 (http://www.autoit.de)
    $sFile = FileFindNextFile($hSearch)
    If @error Then
    ExitLoop
    ElseIf @extended Then
    $sNewPath = $sDestinationDir & StringTrimLeft($sSourceDir & $sFile & "\", $sMotherDir)
    If Not FileExists($sNewPath) Then DirCreate($sNewPath)
    _xCopy($sSourceDir & $sFile & "\", $sDestinationDir, $sMotherDir)
    Else
    $sNewPath = $sDestinationDir & StringTrimLeft($sSourceDir, $sMotherDir)
    If Not FileExists($sNewPath & $sFile) Then
    FileCopy($sSourceDir & $sFile, $sNewPath & $sFile)
    ConsoleWrite("Kopiert" & @TAB & $sSourceDir & $sFile & @LF)
    Else
    If _Crypt_HashFile($sSourceDir & $sFile, $CALG_MD5) <> _Crypt_HashFile($sNewPath & $sFile, $CALG_MD5) Then
    FileCopy($sSourceDir & $sFile, $sNewPath & $sFile, 1)
    ConsoleWrite("Ersetzt" & @TAB & $sSourceDir & $sFile & @LF & @TAB & $sNewPath & $sFile & @LF)
    EndIf
    EndIf
    EndIf
    WEnd
    EndFunc ;==>_xCopy

    [/autoit]

    LG
    Christoph :)

    Einmal editiert, zuletzt von BinDannMalWeg (15. November 2012 um 00:13)

  • Da meine AutoIT Kentnisse nur sehr beschränk sind, dachte ich es ist einfacher das ganze über die Konsole laufen zu lassen, und wenn ich deinen "Quick and Dirty :P" Code anguck, bin ich mir nicht sicher, welcher Weg jetzt ein Umweg ist :huh: ... Da ich ihn nicht versteh und ich das Backupscript selber machen möchte, versuche ich noch einen anderen Weg zu suchen bzw. das mit dem CMD-Befehl hinzukriegen :rolleyes: .

  • Da meine AutoIT Kentnisse nur sehr beschränk sind, dachte ich es ist einfacher das ganze über die Konsole laufen zu lassen, und wenn ich deinen "Quick and Dirty :P" Code anguck, bin ich mir nicht sicher, welcher Weg jetzt ein Umweg ist :huh: ... Da ich ihn nicht versteh und ich das Backupscript selber machen möchte, versuche ich noch einen anderen Weg zu suchen bzw. das mit dem CMD-Befehl hinzukriegen :rolleyes: .

    Das du meine Funktion vielleicht nicht verstehst, ist die eine Sache, aber das hindert dich ja nicht daran sie einfach zu benutzen oder? :D Tut sie nicht genau das was du möchtest? Du übergibst ein "Von-Verzeichnis" und ein "Backup-Verzeichnis" dann werden automatische alle neuen Dateien/Ordner in das Backup Verzeichnis kopiert und alle veränderten Dateien werden geupdatet. Noch dazu habe ich Rekursion implementiert was bedeutet, dass auch alle Unterordner durchsucht werden... ;)

    LG
    Christoph :)

  • Nun ja, was ist denn besser? Das zu verstehen und das ggf. Später für anderes zu verwenden, oder einfach nur vorgegebenes benutzen und nichts (bzw. wenig) dabei lernen?


    Ich bin dafür, dass man wenigsten verstehen sollte was man da verwendet ^^ Deshalb schaue ich mir jede UDF die ich verwende auch genaustens an.
    Nur mal als zwischenkommentar von mir.

  • Die Sache ist, das ich den Code ie ine Dokuenation nehmen möchte, und daher selber gemacht bzw. verstanden habe, eigentlich wollte ich nur wissen, wie genau man einen Befehl an die Kosole gibt... Habe gerade in der AutoIT Hilfe gefuden
    :rolleyes:

    Zitat

    Run(@ComSpec & " /c " & "commandName") ; don't forget " " before "/c"

    wofür ist das " /c " ?

  • Hi,
    das " /C" ist ein Parameter von cmd.exe und bewirkt, dass cmd nach Ausführen des jeweiligen Befehls automatisch geschlossen wird. (das siehst du auch, wenn du cmd/? in die Konsole eingibst)

    Ich würde die Windows Kommandozeilen-Kopiertools nutzen, da diese sehr zuverlässig arbeiten und für dein Ziel in jedem Fall ausreichen sollten.

    [autoit]

    _RunCommand('echo Hello && pause')

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

    Func _RunCommand($sCommand, $iState = @SW_SHOW)
    RunWait(@ComSpec & ' /C ' & $sCommand, '', $iState)
    EndFunc

    [/autoit]

    Robocopy ist auch eine Option und Alternative zu xcopy (sofern die Parameter davon nicht mehr ausreichen)

    Einmal editiert, zuletzt von CyRoX (15. November 2012 um 19:27)

  • Hallo Nici96,

    @Comspec wird nur für fest in die Konsole integrierten Befehle wie Dir, Copy etc. benötigt. Da XCopy ber ein eigenständiges Prgramm ist wird hier der Aufruf von @Comspec nicht benötigt. Hier ein kleines Kopiertool das mit XCopy arbeitet:

    Spoiler anzeigen
    [autoit]

    CopyWithProgress("d:\Programme\AutoIt3","c:\test") ;kopiert den kompletten AutoIt-Ordner nach c:\test

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

    #Include <Date.au3>
    Func CopyWithProgress($srcDir, $destDir) ;Original gigx siehe https://autoit.de/index.php?page…25989#post25989
    Local $tsBeginn = _NowCalc(), $tsDiff =-1, $tsRest ;eingefügt für Restdauer
    If StringRight($srcDir, 1) = "\" Then $srcDir = StringLeft($srcDir, StringLen($srcDir) - 1)
    If StringRight($destDir, 1) <> "\" Then $destDir = $destDir & "\"
    If Not FileExists($destDir) Then DirCreate($destDir)
    $srcSize = DirGetSize($srcDir, 1)
    $1_percent = $srcSize[0] / 100
    Run('XCOPY "'& $srcDir & '" "' & $destDir & '" /D /S /E /V /C /H /R /O /Y /F /G',"",@SW_HIDE)
    ProgressOn("Advanced status of file copying", "", "",10,10)
    Do
    if $tsDiff < 0 Then Sleep(5000)
    $destSize = DirGetSize($destDir, 1)
    $tsDiff = _DateDiff("s",$tsBeginn,_NowCalc())
    $tsRest = round($tsDiff / ($destSize[0] / $1_percent) * 100,0) - $tsDiff
    ConsoleWrite($tsDiff & " " & $1_percent & " " & $tsRest &@CRLF)
    ProgressSet(Round($destSize[0] / $1_percent, 2), Round($destSize[0] / (1024 * 1024), 2) & " MB of " & Round($srcSize[0] / (1024 * 1024), 2)& " MB copied" & @CRLF _
    & $destSize[1] & " of " & $srcSize[1] & " Files copied." & @CRLF _
    & $destSize[2] & " of " & $srcSize[2] & " Folders copied.", Round($destSize[0] / $1_percent, 2) & "% - Done! " & $tsRest & " sec. Rest")
    Sleep(($tsDiff+$tsRest)/2)
    Until $destSize[0] >= $srcSize[0]
    MsgBox(0,"Fertig in " & $tsDiff & " sec.",Round($destSize[0] / (1024 * 1024), 2) & " MB of " & Round($srcSize[0] / (1024 * 1024), 2)& " MB copied" & @CRLF _
    & $destSize[1] & " of " & $srcSize[1] & " Files copied." & @CRLF _
    & $destSize[2] & " of " & $srcSize[2] & " Folders copied." & @CRLF & Round($destSize[0] / $1_percent, 2) & "% - Done! ")
    ProgressOff()
    EndFunc

    [/autoit]

    mfg autoBert