Hallo zusammen
Es würde mich freuen, wenn Ihr mal das Skript Testen könntet. Nur wer Lust und Laune hat.
Ich Arbeite viel im gleichen Ordner und mache gelegentlich ein Backup von dem Ordner.
Da ich nicht immer weis was im Kopie Ordner aktuell ist, vergleiche ich mit dem Skript zwei Ordner miteinander.
In einem ListView wird die Abweichung vom Original zur Kopie aufgelistet und sehe welche Dateien noch nicht gesichert wurden.
Mit dem Button Robocopy werden alle fehlenden Dateien in der Kopie ergänzt.
Robocopy ist so eingestellt das keine Datein gelöscht werden, es wird nur kopiert.
Habe versucht die Fehlerquellen abzufangen wenn man die Quelle mit dem Ziel versehentlich vertauscht.
Bin mir aber nicht sicher ob die Lösung von mir korrekt ist.
Der Syntax Code wird nicht sauber angezeigt. Vermutlich habe ich zu lange Zeilen.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <FindFiles.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <GuiStatusBar.au3>
#include <StaticConstants.au3>
#include <Array.au3>
#include <GuiImageList.au3>
_Main()
Func _Main()
;Initialize variables
Global $dir ;Variable Folder Pfad
Global $exStyles = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES) ;ListViews Stile
Global $Pfad_1, $Pfad_2 ;Ordner auswahl in Variable speichern
Global $idListview
Global $StatusBar1
Global $FileList_1, $FileList_2 ; Variablen für Ordner durchsuchen "_FileListToArrayRec" Folder 1 & Folder 2
Global $iIndex
Global $hImage ; Variable Array vergleichen
Global $Labinfo_1, $Labinfo_2 ;Ausgewählte Pfade in Label anzeigen
Global $Copy_Btn ; Button für Robocopy
Local $Icon1Pfad = @ScriptDir & "\Icons\Punkt2.ico"
Local $Icon2Pfad = @ScriptDir & "\Icons\Punkt3.ico"
;------------------Create window
$hGui = GUICreate("Ordner Vergleichen auf Dateiebene", 600, 745, -1, -1)
;------------------Create an Open Pfad 1 Button
$Dir1_Btn = GUICtrlCreateButton("Ordner 1 auswählen (Original)", 27, 10, 250, 25)
GUICtrlSetFont($Dir1_Btn, 11, "", "", "") ;font size
;------------------Create an Open Pfad 2 Button
$Dir2_Btn = GUICtrlCreateButton("Ordner 2 auswählen (Kopie)", 27, 45, 250, 25)
GUICtrlSetFont($Dir2_Btn, 11, "", "", "") ;font size
GUICtrlSetState(-1, $GUI_DISABLE) ;Button Deaktivieren
;------------------Create an Open Folder Ordner 1 Button
$FolderOpen_Btn = GUICtrlCreateButton("Dateipfad öffnen (Original)", 320, 10, 250, 25)
GUICtrlSetFont($FolderOpen_Btn, 11, "", "", "") ;font size
;------------------Create an Copy_Btn Button
$Copy_Btn = GUICtrlCreateButton("Mit ROBOCOPY abgleichen", 320, 45, 250, 25)
GUICtrlSetFont($Copy_Btn, 11, "", "", "") ;font size
GUICtrlSetState($Copy_Btn, $GUI_DISABLE) ;Button Deaktivieren
;------------------Create an Label-Pfad Ordner 1
$Labpfad_1 = GUICtrlCreateLabel("Ordner 1: ", 27, 82, 550, 20)
GUICtrlSetFont(-1, 10, "", "", "") ;font size
GUICtrlSetColor($Labpfad_1, 0x0000FF) ;font farbe
;------------------Create an Label-Pfad Ordner 2
$Labpfad_2 = GUICtrlCreateLabel("Ordner 2: ", 27, 105, 550, 20)
GUICtrlSetFont(-1, 10, "", "", "") ;font size
GUICtrlSetColor($Labpfad_2, 0xFF0000) ;font farbe
;------------------Create an ListView
$idListview = GUICtrlCreateListView("", 25, 150, 550, 560) ;,$LVS_SORTDESCENDING)
_GUICtrlListView_AddColumn($idListview, "", 20) ;Spalte 1
_GUICtrlListView_AddColumn($idListview, "Dateien", 200) ;Spalte 2
_GUICtrlListView_AddColumn($idListview, "Pfad (Original)", 550) ;Spalte 3
_GUICtrlListView_SetExtendedListViewStyle($idListview, BitOR($exStyles, $LVS_EX_GRIDLINES)) ;listView Stile
;------------------Create an StatusBar
$StatusBar1 = _GUICtrlStatusBar_Create($hGui) ;Statusbar generieren
_GUICtrlStatusBar_SetMinHeight($StatusBar1, 20) ;Statusbar Höhe
_GUICtrlStatusBar_SetParts($StatusBar1, 2, 250) ;Statusbar aufteilen
_GUICtrlStatusBar_SetText($StatusBar1, " Bereit ") ;Text in Statusbar links
_GUICtrlStatusBar_SetText($StatusBar1, " Dateien in Ordner 1: " & " Dateien in Ordner 2: ", 1) ;Text in Statusbar rechts
;------------------Create an Icon-Control
$Icon1 = GUICtrlCreateIcon($Icon1Pfad, -1, 25, 125, 20, 20)
$Icon2 = GUICtrlCreateIcon($Icon2Pfad, -1, 250, 125, 20, 20)
;------------------Create an Label Icon1-Control
GUICtrlCreateLabel("In beiden Ordner vorhanden", 50, 127, 190, 20)
GUICtrlSetFont(-1, 10, "", "", "") ;font size
;------------------Create an Label Icon2-Control
GUICtrlCreateLabel("In Ordner 2 nicht vorhanden", 275, 127, 190, 20)
GUICtrlSetFont(-1, 10, "", "", "") ;font size
GUISetState(@SW_SHOW) ;Show window/Make the window visible
; Lädt die Bilder
$hImage = _GUIImageList_Create(16, 16, 5, 3) ;ImageList generieren Breite / Höhe / 5 = 32Bit / 1 - verwendet eine Maske & 2 - Bilder werden gespiegelt
_GUIImageList_AddIcon($hImage, $Icon1Pfad) ;Gruen / Fügt ein Icon der Imagelist hinzu
_GUIImageList_AddIcon($hImage, $Icon2Pfad); Rot / Fügt ein Icon der Imagelist hinzu
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
GUIDelete() ;Destroy the GUI including the controls
_GUICtrlListView_UnRegisterSortCallBack($idListview);Deregistriert die Sortier-Callback Funktion
Exit
Case $Dir1_Btn ;Ordner_1 Button
_GUICtrlListView_DeleteAllItems($idListview) ;Alle einträge in ListView Löschen
_GUICtrlStatusBar_SetText($StatusBar1, "Bearbeitung gestartet") ;Text in Statusbar links
$dir = FileSelectFolder("Ordner auswählen","") ;Ordner auswahl starten
$Pfad_1 = $dir & "\" ;Ausgewählten Pfad in eine Variable speichern
If $dir = "" Then
GUICtrlSetState($Dir2_Btn, $GUI_DISABLE) ;Button Deaktivieren
Else
GUICtrlSetState($Dir2_Btn, $GUI_ENABLE) ;Button Aktivieren
GUICtrlSetData($Labpfad_1, "Ordner_1: " & $Pfad_1) ;Pfad an Label übergeben
GUICtrlSetTip($Labpfad_1, GUICtrlRead($Labpfad_1, 1))
EndIf
Case $Dir2_Btn ; Ordner_2 Button
_GUICtrlListView_DeleteAllItems($idListview) ;Alle einträge in ListView Löschen
$dir = FileSelectFolder("Ordner auswählen","") ;Ordner auswahl starten
$Pfad_2 = $dir & "\" ; Ausgewählten Pfad in eine Variable speichern
If $dir = "" Then
Else
GUICtrlSetData($Labpfad_2, "Ordner_2: " & $Pfad_2) ;;Pfad an Label übergeben
GUICtrlSetTip($Labpfad_2, GUICtrlRead($Labpfad_2, 1))
_Ordner1Array() ;In ausgewählten Ordner nach Dateien suchen
EndIf
Case $FolderOpen_Btn ;Button Pfad öffnen
$LvAuswahl = _GUICtrlListView_GetSelectedIndices($idListview, True) ;Ausgewählte Zeile kompletten Text auslesen
If $LvAuswahl[0] = "" Then ;Wenn keine auswahl vorhanden in ListView
MsgBox(0,"Info....", "Es wurde keine Zeile augewählt!")
Else
$aLVPfad = _GUICtrlListView_GetItemText($idListView, $LvAuswahl[1], 2) ; Kompletter Text aus Spalte 3 ermitteln
$result = StringInStr($aLVPfad, "\", 0, -1) ; erstes zeichen "\" von rechts suchen in Text & Anzahl von Zeichen in Variable speichern
$sOpenPfad = StringLeft ($aLVPfad, $result) ; Gibt eine Anzahl von Zeichen, links ausgehend von dem String zurück
ShellExecute($sOpenPfad) ;Oeffnet den Pfad von ausgewähler Zeile in ListView
EndIf
Case $Copy_Btn
#Region --- CodeWizard generated code Start ---
;MsgBox features: Title=Yes, Text=Yes, Buttons=Yes and No, Default Button=Second, Icon=Warning
If Not IsDeclared("iMsgBoxAnswer") Then Local $iMsgBoxAnswer
$iMsgBoxAnswer = MsgBox(324,"Robocopy...","Robocopy vergleicht Ordner_1 mit Ordner_2" & @CRLF & _
"und kopiert fehlende Dateien nach Ordner_2!" & @CRLF & @CRLF & _
"Robocopy ist so eingestellt, dass Dateien kopiert werden" & @CRLF & _
"aber keine Dateien gelöscht werden!" & @CRLF & @CRLF & _
"Eingesellte Parameter Robocopy:" & @CRLF & _
"/E /R:10 /W:1 /TEE /V /X /LOG: @ScriptDir & \RoboBackupLOG.txt" & @CRLF & @CRLF & _
"/E = Kopiert Unterverzeichnisse" & @CRLF & _
"/R:10 = Anzahl Wiederholungsversuchen" & @CRLF & _
"/W:1 = Wartezeit zwischen Wiederholungsversuchen in sek." & @CRLF & _
"/TEE = Daten im Konsolenfenster in % anzeigen" & @CRLF & _
"/V = Erstelt ein ausfuehrliches Log-File mit (errors)" & @CRLF & _
"/X = Alle Daten werden im Log-File eingetragen" & @CRLF & @CRLF & _
"Bitte Start & Ziel Ordner überprüfen!" & @CRLF & @CRLF & _
"Start Ordner: " & $Pfad_1 & @CRLF & "Ziel Ordner: " & $Pfad_2)
Select
Case $iMsgBoxAnswer = 6 ;Yes Button Click
$sP1 = StringTrimRight ($Pfad_1, 1) ;Ordner_1 Pfad Trimmen 1_Zeichen von rechts "\" für Robocopy
$sP2 = StringTrimRight ($Pfad_2, 1) ;Ordner_2 Pfad Trimmen 1_Zeichen von rechts "\" für Robocopy
$source = '"' & $sP1 & '"' ;Pfad Ordner_1
$dest = '"' & $sP2 & '"' ;Pfad Ordner_2
$log = @ScriptDir & "\RoboBackupLOG.txt" ;Log File erstellen
;~ MsgBox(0,"Kopieren", $source & " " & $dest)
RunWait(@ComSpec & " /c ROBOCOPY " & $source & " " & $dest & " /E /R:10 /W:1 /TEE /V /X /LOG:" & '"' & $log & '"') ;Run RoboCopy
Sleep(2000) ; Warte 2 Sek.
_GUICtrlListView_BeginUpdate($idListView);ListView Aktuallisierung Stoppen
ProgressOn("Bitte warten...", "Ordner 2 neu einlesen", "") ;Progress Start
_Ordner2Array() ;Ordner_2 nochmals in die Array schreiben damit der Ordner Vergleich neu ausgefürt werden kann
GUICtrlSetState($Copy_Btn, $GUI_DISABLE) ;Button Deaktivieren
Case $iMsgBoxAnswer = 7 ;No
EndSelect
#EndRegion --- CodeWizard generated code End ---
;~ Case $idListview;Spalten sortieren
;~ _GUICtrlListView_RegisterSortCallBack($idListview);Registriert die "Simple Sort callback" Funktion
;~ _GUICtrlListView_SortItems($idListview, GUICtrlGetState($idListview));Startet die Sortier-Callback Funktion ListView
EndSwitch
WEnd
EndFunc ;==>_Main
Func _Vergleich() ;Ordner vergleichen (in zwei Arrays)
Local $z = 0 ;Wird benötigt für ListView Icon
For $i = 1 To UBound($FileList_1) - 1 ;Anzahl einträge in Array ermitteln (Ordner_1)
$iIndex = _ArraySearch($FileList_2, $FileList_1 [$i], 0, 0, 0, 0, 0, 0) ;In Array vom Ordner_1 in Ordner_2 vergleichen
;~ MsgBox(0,"",UBound ($FileList_1) -1)
If @error = 6 Then ;Wird benötigt für ListView Icon. Bei jedem "@error = 6" wird die Variable um 1 erhöt & ein Rotes Icon gesetzt
$z = $z + 1 ;Wird benötigt für ListView Icon
_GUICtrlListView_SetImageList($idListview, $hImage, 1) ;Weist eine Imagelist einem Control zu
_GUICtrlListView_SetItem($idListview, " " & $i, $i - 1, 0, 1) ;Rotes Icon setzen in Spalte 1 wenn Datei in der Arrays von Ordner_2 nicht vorhanden ist
_GUICtrlStatusBar_SetText($StatusBar1, " Fehlende Datei(en) in Kopie: " & $z) ;Text in Statubar links
;~ ConsoleWrite("Zeile " & $iIndex & "=" & $FileList_1 [$i] & @crlf)
Else
_GUICtrlListView_SetImageList($idListview, $hImage, 1) ;Weist eine Imagelist einem Control zu
_GUICtrlListView_SetItem($idListview, " " & $i, $i - 1, 0, 0) ;Grünes Icon setzen in Spalte 1 wenn Datei in beiden Arrays vorkommt (Ordner_1 & Ordner_2)
EndIf
ProgressSet((100/$FileList_1[0]) * $i, $i & " von " & $FileList_1[0] & " Dateien werden untersucht", "Vergleichen der Ordner") ;Progress aktuallisieren
Next
_GUICtrlListView_EndUpdate($idListView); ListView Aktuallisierung Starten
Sleep(1000) ;Warten 1 Sek.
ProgressOff() ;Progress auschalten
If $FileList_1[0] = $z Then ;Wenn source(Ordner 1) = $z ($z = Fehlende Dateien in destinatoin(Ordner 2)
MsgBox(32,"Info...","Im Destinations(Ordner 2) sind keine Dateien vorhanden die mit Source(Ordner 1) übereinstimmen!" & @CRLF & @CRLF & @CRLF & _
"Bitte überprüfen Sie ob die richtigen Ordner Pfade ausgewält wurden!")
Else
If $z = 0 Then
_GUICtrlStatusBar_SetText($StatusBar1, " Fehlende Datei(en) in Kopie: " & $z) ;Text in Statusbar links
MsgBox(0,"Info...","Dateien von Original zur Kopie sind identisch.")
GUICtrlSetState($Copy_Btn, $GUI_DISABLE) ;Button Deaktivieren
Else
MsgBox(0,"Info...","In Ordner_2 (Kopie) wurden Fehlende Datei(en) gefunden: " & $z)
GUICtrlSetState($Copy_Btn, $GUI_ENABLE) ;Button aktivieren
EndIf
EndIf
EndFunc
Alles anzeigen
#Include <File.au3>
Func _Ordner1Array()
ProgressOn("Bitte warten...", "Dateien werden gesucht", "") ;Progress Start
$FileList_1 =_FileListToArrayRec($Pfad_1, "*", 1, 1) ;Alle Datein suchen von Ordner_1 & in Array schreiben
;~ _ArrayDisplay($FileList_1, "1D Anzeige")
If @Error = 1 Then ;Wenn keine Datein gefunden
ProgressOff() ;Progress ausschalten
MsgBox (0,"","Keine Dateien gefunden in Ordner 1!")
Else
_GUICtrlListView_BeginUpdate($idListView);ListView Aktuallisierung Stoppen
For $i = 1 to UBound($FileList_1) -1 ;Anzahl Index einträge in Array von Ordner_1
ProgressSet((100/$FileList_1[0]) * $i, $i & " von " & $FileList_1[0], "Dateien von Ordner 1 einlesen") ;Progrssbar aktuallisieren
$search = FileFindFirstFile($Pfad_1 & $FileList_1[$i]) ;Erzeugt ein Suchhandle
$file = FileFindNextFile($search) ;Gibt den nächsten Dateinamen
$PfadKomplet = $Pfad_1 & $FileList_1[$i] ;Kompletter Pfad ermitteln
_GUICtrlListView_AddItem($idListview, "", 0) ;Spalte1 Icon
_GUICtrlListView_AddSubItem($idListview, $i -1, $file, 1) ;Spalte2 Datei
_GUICtrlListView_AddSubItem($idListview, $i -1, $PfadKomplet , 2) ;Spalte3 Pfad
Next
FileClose($search)
EndIf
_Ordner2Array()
EndFunc
Func _Ordner2Array()
$FileList_2 =_FileListToArrayRec($Pfad_2, "*", 1, 1) ;Alle Datein suchen von Ordner_2 & in Array schreiben
;~ _ArrayDisplay($FileList_2, "1D Anzeige")
If @Error = 1 Then ;Wenn keine Datein gefunden
ProgressOff() ;Progress ausschalten
MsgBox (0,"","Keine Dateien gefunden in Ordner 2!")
Else
For $i = 1 to UBound($FileList_2) -1 ;Anzahl Index einträge in Array von Ordner_2
ProgressSet((100/$FileList_2[0]) * $i, $i & " von " & $FileList_2[0], "Dateien von Ordner 2 einlesen") ;Progrssbar aktuallisieren
$search = FileFindFirstFile($Pfad_2 & $FileList_2[$i]) ;Erzeugt ein Suchhandle
$file = FileFindNextFile($search) ;Gibt den nächsten Dateinamen
Next
_GUICtrlStatusBar_SetText($StatusBar1, " Dateien in Ordner 1: " & $FileList_1[0] & " Dateien in Ordner 2: " & $FileList_2[0], 1) ;Text Statusbar rechts
FileClose($search)
EndIf
If $FileList_1[0] < $FileList_2[0] Then ;Wenn in der destination(Ordner 2) mehr Dateien vorhanden sind als im source(Ordner 1)
ProgressOff() ;Progress ausschalten
MsgBox(32,"Info...","Im Destination(Ordner 2) sind mehr Dateien vorhanden als im Source(Ordner 1)!" & @CRLF & @CRLF & @CRLF & _
"Bitte überprüfen Sie ob die richtigen Ordner Pfade ausgewält wurden!")
Else
_Vergleich() ;Vergleich starten der beiden Arrays von Ordner_1 & Ordner_2
EndIf
EndFunc
Alles anzeigen
Mir ist bewusst, dass ich auch alles mit Robocopy direkt machen könnte. Auf jeden fall wahr das für mich eine interessante Erfahrung.
Trotzdem wäre es für mich hilfreich was ich besser machen könnte oder was ich eventuell falsch gemacht habe im Skript.
Ich versuche das meiste immer selber zu lösen anhand der Hilfe von Autoit,
ob wohl für mich in der Hilfe nicht immer alles verständlich ist.
Mir fehlt auch die Erfahrung, da ich nur sporadisch mit Autoit programmiere.
Ich bitte euch, ein Auge zuzudrücken bei meiner Rechtschreibung, ist nicht so meine Stärke.
Gruss aus der Schweiz