Hallo,
jetzt ist das Programm fast (etwas verschönern fehlt noch) fertig und somit poste ich das Script mal hier.
(Das Programm soll mir helfen die geänderten und neu kompilierten Script, in zuvor fest gelegte Ordner zu kopieren).
Gerade der Hinweis von BugFix hat mir wirklich viel Arbeit erspart.
Das Programm besteht aus zwei Teilen.
Der erste Teil dient nur zum einrichten des Kontextmenüs, damit man das eigentliche Programm einfacher aufrufen kann.
Spoiler anzeigen
; #SCRIPT# ----------------------------------------------------------------------------------------------------------------------------------------------
; Script Name : AutoIt Synchronisation einrichten.au3
; Beschreibung : Programm, um die AutoIt-Synchronisaton auf dem Rechner einzurichten.
;
; Includes : Keine
; AutoIt Version : 3.3.8.1
; Script Autor : BigRox
; -------------------------------------------------------------------------------------------------------------------------------------------------------
Local $Alter_Standardwert
; Abfragen, ob sich die neuen Einträge schon in der Registry befinden.
If RegRead("HKCR\Folder\shell\","") <> "Synchronize" Then
; Den alten Standardwert (Standardvorgang) aus der Registry auslesen und in einer Variable abspeichern abspeichern.
$Alter_Standardwert = RegRead("HKCR\Folder\shell\","")
; Den alten Standardwert in die Registry schreiben (sichern)).
RegWrite("HKCR\Folder\shell\","AlterStandard", "REG_SZ", $Alter_Standardwert)
; Den neuen Standardwert (Standardvorgang) in die Registry schreiben (damit der neue Eintrag fett und ganz oben im Menü erscheint).
RegWrite("HKCR\Folder\shell\","", "REG_SZ", "Synchronize")
; Die neuen Schlüssel und Werte, für das Synchronisations-Programm, erstellen/erzeugen.
RegWrite("HKCR\Folder\shell\Synchronize\","", "REG_SZ", "! ! ! AutoIt-Script usw. synchronisieren ! ! !")
; Mit diesem Eintrag, können sich auch Leerzeichen im Pfad befinden und es werden auch Pfade mit Leerzeichen richtig zurückgegeben.
RegWrite("HKCR\Folder\shell\Synchronize\command","", "REG_SZ", '"C:\AutoIt Synchronisation"' & ' "%1"')
; Datei für die AutoIt-Synchronisierung kopieren.
FileCopy(@ScriptDir & "\AutoIt Synchronisation.exe", @HomeDrive & "\", 1)
MsgBox(262208, "! ! ! E R F O L G ! ! !", "Die AutoIt-Synchronisation wurde erfolgreich eingerichtet !", 3) ; Flag: 1, 5, 1, 1, 2.
Else ; Befehle, falls die AutoIt-Synchronisierung schon eingerichtet ist.
; Alle neuerstellten Schlüssel usw. wieder aus der Registry entfernen.
RegDelete("HKCR\Folder\shell\Synchronize")
; Abfragen, ob ein überhaupt ein alter Standardvorgang in der Registry eingetragen war.
If RegRead("HKCR\Folder\shell\", "AlterStandard") = "" Then
RegDelete("HKCR\Folder\shell\", "") ; Den neuen Standardwert einfach löschen.
Else
; Den alten Standardwert (Standardvorgang) aus der Registry auslesen und in einer Variable abspeichern abspeichern.
$Alter_Standardwert = RegRead("HKCR\Folder\shell\","AlterStandard")
; Den alten Standardwert wieder als Standardvorgang in die Registry schreiben.
RegWrite("HKCR\Folder\shell\","", "REG_SZ", RegRead("HKCR\Folder\shell\", $Alter_Standardwert))
EndIf
; Den Eintrag, der nur zur Sicherung des alten Standardwertes diente, wieder aus der Registry löschen.
RegDelete("HKCR\Folder\shell\", "AlterStandard")
; Datei für die AutoIt-Synchronisierung löschen.
FileDelete(@HomeDrive & "\AutoIt Synchronisation.exe")
MsgBox(262208, "! ! ! E R F O L G ! ! !", "Die AutoIt-Synchronisation wurde erfolgreich entfernt !", 3) ; Flag: 1, 5, 1, 1, 2.
EndIf
Exit
[/autoit]Der zweite Teil erledigt die eigentliche Arbeit.
Spoiler anzeigen
; #SCRIPT# ----------------------------------------------------------------------------------------------------------------------------------------------
; Script Name : AutoIt Synchronisation.au3
; Beschreibung : Programm, um geänderte AutoIt-Scripte usw. automatisch zu sichern.
;
; Includes : <File.au3> wird für den _PathSplit()-Befehl gebraucht.
; AutoIt Version : 3.3.8.1
; Script Autor : BigRox
; Anmerkung(en) : Es werden aber NUR die Scripte und die kompilierten exe-Dateien gesichert !
; -------------------------------------------------------------------------------------------------------------------------------------------------------
; Sonstiges für dieses Script festlegen.
#RequireAdmin
; Dateien einbinden.
#include-once
#include <File.au3>
; Festlegen das alle verwendeten Variablen auch deklariert werden müssen.
Opt("MustDeclareVars", 1)
Local $Dateiliste_Quelle[15], $Dateiname_Ziel, $LV, $Ordner_Name_Quelle, $Programme_Ziel_Pfad, $Scripte_Ziel_Pfad, $Ziel_Pfad
Local $Fehler = 0, $Dateizeit_Quelle, $Dateizeit_Ziel
$Scripte_Ziel_Pfad = "E:\USB_Blau\AutoIt\Eigene Install Scripte"
$Programme_Ziel_Pfad = "E:\USB_Blau\Neuer Install mit AutoIt"
; Testen, ob überhaupt .au3-Dateien in dem Quellordner existieren (wenn Nein, ist es der falsche Ordner !)
If FileExists($CMDLine[1] & "\*.au3") = 0 Then
MsgBox(262192, "! ! ! F E H L E R ! ! !", "Dieser Ordner enthält keine AutoIt-Scripte," & @LF & " daher wird das Programm abgebrochen !") ; Flag: 1, 4, 1, 1, 2.
Exit
EndIf
; Feststellen, ob mehrere Parameter zurückgegeben wurden.
If $CMDLine[0] = 1 Then
; Die Funktion zum ermitteln des Ordnernamen aus dem zurückgegebenen Parameter (enthält den ganzen Pfad ohne Backslash am Ende) aufrufen.
$Ordner_Name_Quelle = OrdnerDateiName($CMDLine[1])
#region .au3-Dateien kopieren.
$Dateiliste_Quelle = DateienAuflisten($CMDLine[1], "*.au3")
For $LV = 1 To UBound($Dateiliste_Quelle) - 1
; Die "geändert" Dateizeit der Quell-.au3-Datei auslesen.
$Dateizeit_Quelle = FileGetTime($Dateiliste_Quelle[$LV], 0, 1)
$Dateiname_Ziel = OrdnerDateiName($Dateiliste_Quelle[$LV]) & ".au3"
; Die Attribute der Zieldatei ändern (damit die Datei auch sicher überschrieben werden kann).
FileSetAttrib($Scripte_Ziel_Pfad & "\" & $Ordner_Name_Quelle & "\" & $Dateiname_Ziel, "-RSH")
; Die neue .au3-Datei aus der Quelle, ans Ziel kopieren.
FileCopy($CMDLine[1] & "\" & $Dateiname_Ziel, $Scripte_Ziel_Pfad & "\" & $Ordner_Name_Quelle & "\", 1)
; Die "geändert" Dateizeit der Ziel-.au3-Datei auslesen.
$Dateizeit_Ziel = FileGetTime($Scripte_Ziel_Pfad & "\" & $Ordner_Name_Quelle & "\" & $Dateiname_Ziel, 0, 1)
; Die "geändert"-Dateizeit der Quelle mit der des Ziels vergleichen, um festzustellen, ob die Datei auch wirklich kopiert wurde.
If $Dateizeit_Quelle <> $Dateizeit_Ziel Then
; Den Wert der Variable $Fehler um eins erhöhen, falls die Zeiten nicht identisch sind.
$Fehler = $Fehler + 1
EndIf
Next
;MsgBox(0, "", $Fehler & " Fehler beim Kopieren der .au3-Dateien !")
#endregion .au3-Dateien kopieren.
#region exe-Dateien kopieren.
Local $Dateiliste_Quelle[15] ; dadurch werden alle Werte im Array gelöscht.
$Dateiliste_Quelle = DateienAuflisten($CMDLine[1], "*.exe")
For $LV = 1 To UBound($Dateiliste_Quelle) - 1
; Die "geändert" Dateizeit der Quell-.exe-Datei auslesen.
$Dateizeit_Quelle = FileGetTime($Dateiliste_Quelle[$LV], 0, 1)
; Die Funktion zum ermitteln des Dateinamens aus dem Array-Element (enthält den ganzen Pfad, mit Erweiterung) aufrufen.
$Dateiname_Ziel = OrdnerDateiName($Dateiliste_Quelle[$LV])
; Den passenden Pfad zum Ziel ermitteln.
$Ziel_Pfad = _PfadErmitteln($Programme_Ziel_Pfad, $Dateiname_Ziel & ".exe")
; Die Attribute der Zieldateien ändern (damit die Datei auch sicher überschrieben werden kann.
FileSetAttrib($Ziel_Pfad, "-RSH")
; Die neue .exe-Datei aus der Quelle, ans Ziel kopieren.
FileCopy($Dateiliste_Quelle[$LV], $Ziel_Pfad, 1)
; Die "geändert" Dateizeit der Ziel-.exe-Datei auslesen.
$Dateizeit_Ziel = FileGetTime($Ziel_Pfad, 0, 1)
; Die "geändert"-Dateizeit der Quelle mit der des Ziels vergleichen, um festzustellen, ob die Datei auch wirklich kopiert wurde.
If $Dateizeit_Quelle <> $Dateizeit_Ziel Then
; Den Wert der Variable $Fehler um eins erhöhen, falls die Zeiten nicht identisch sind.
$Fehler = $Fehler + 1
EndIf
Next
;MsgBox(0, "", $Fehler & " Fehler beim Kopieren der .exe-Dateien !")
#endregion .exe-Dateien kopieren.
Else
; Fehlermeldung ausgeben, falls mehrere Parameter zurückgegeben wurden.
MsgBox(0, "! ! ! F E H L E R ! ! !", "Es wurden zu viele Parameter zurückgegeben !")
EndIf
; Feststellen, ob beim Kopieren der Dateien ein Fehler aufgetreten ist.
If $Fehler = 0 Then
; Erfolgsmeldung ausgeben und den Quellordner löschen.
MsgBox(262208, "! ! ! E R F O L G ! ! !", "Alle Dateien wurden erfolgreich kopiert.") ; Flag: 1, 5, 1, 1, 2.
DirRemove($CMDLine{0})
Else
; Fehlermeldung ausgeben und nichts löschen.
MsgBox(262192, "! ! ! F E H L E R ! ! !", "! ! ! Beim kopieren ist ein Fehler aufgetreten ! ! !") ; Flag: 1, 4, 1, 1, 2.
EndIf
Exit
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func OrdnerDateiName($_Whole_Path)
Local $_Drive, $_Path, $_Name, $_Extension
_PathSplit($_Whole_Path, $_Drive, $_Path, $_Name, $_Extension)
Return $_Name
EndFunc
; Die folgende Funktion stammt von http://www.autoit.de.
Func DateienAuflisten($_recdir, $_Fsrch = "*.*", $_rcend = 1)
Local $_rcstrt, $_rcffnf, $_rectmpdrs, $_rci, $_recdirobj, $_recdirpth, $_recdirsmlng, $_recdirec
$_recdir = StringRegExpReplace($_recdir, "\\ *$", "")
[/autoit] [autoit][/autoit] [autoit]If $_rcend Then
Global $_rcfls[200000]
$_rcfls[0] = 0
EndIf
If Not FileExists($_recdir) Then
SetError(1)
Dim $_rcfls[1]
Return $_rcfls
EndIf
$_rcstrt = FileFindFirstFile($_recdir & "\" & $_Fsrch)
[/autoit] [autoit][/autoit] [autoit]If $_rcstrt <> -1 Then
While 1
$_rcffnf = FileFindNextFile($_rcstrt)
If @error Then
ExitLoop
EndIf
$_rcfls[0] += 1
$_rcfls[$_rcfls[0]] = $_recdir & "\" & $_rcffnf
WEnd
EndIf
FileClose($_rcstrt)
$_recdirobj = ObjCreate("Scripting.FileSystemObject")
If Not @error Then
$_recdirpth = $_recdirobj.GetFolder($_recdir & "\")
$_recdirsmlng = $_recdirpth.SubFolders
For $_recdirec In $_recdirsmlng
DateienAuflisten($_recdir & "\" & $_recdirec.Name, $_Fsrch, 0)
Next
EndIf
If $_rcend Then
ReDim $_rcfls[$_rcfls[0] + 1]
EndIf
If $_rcfls[0] = 0 Then
SetError(1)
EndIf
Return $_rcfls ; Das Array mit allen gefundenen Dateipfaden übergeben.
EndFunc ; DateienAuflisten()
; Die folgende Funktion stammt teilweise von http://www.autoit.de.
Func PfadErmitteln($_Start_Folder, $_Filename, $_W_Path = True, $_Message = True, $_Finish = False)
Global $_Found_Path = "" ; Die Variable muss global sein, damit sie in allen Funktionen abgefragt werden kann, aber sie ist dann auch, nach dem Aufruf der Funktion, im ganzen Script gültig !
Local $_Chk_1 = 0, $_Chk_2 = 0, $_FSO
$_Start_Folder = $_Start_Folder & "\" ; Einen Backslash an den Pfad anhängen (damit der Pfad immer mit Backslash zurückgegeben wird).
[/autoit] [autoit][/autoit] [autoit]; Testen ob überhaupt ein Start-Ordner und/oder Dateiname übergeben wurde.
If $_Filename = "" Or $_Start_Folder = "" Then
If $_Message Then
MsgBox(262192, "! ! ! F E H L E R ! ! !", '"leerer" Pfad- oder/und Datei-Namen !') ; Flag = 1, 4, 1, 1, 2.
EndIf
If $_Finish Then
Exit (1)
Else
Return SetError(1, 0, 0)
EndIf
EndIf
; Testen ob der Start-Ordner auch existiert.
If Not FileExists($_Start_Folder) Then
MsgBox(0, "", $_Start_Folder)
If $_Message Then
MsgBox(262192, "! ! ! F E H L E R ! ! !", 'Der "Start-Ordner" existiert nicht !') ; Flag = 1, 4, 1, 1, 2.
EndIf
If $_Finish Then
Exit (1)
Else
Return SetError(2, 0, 0)
EndIf
EndIf
If FileExists($_Start_Folder & $_Filename) Then ; Wird gebraucht wenn die Datei nicht in einem Unterverzeichnis. sonder direkt im angegeben Suchpfad liegt.
Return $_Start_Folder & $_Filename
EndIf
; Ein neues Objekt erstellen.
$_FSO = ObjCreate("Scripting.FileSystemObject")
UnterordnerAnzeigen($_FSO.GetFolder($_Start_Folder), $_Filename, $_W_Path)
; Testen ob ein "leerer" Pfad zurückgegeben wurde (wird ein "leerer" Pfad zurückgegeben, so wurde keine Datei gefunden).
If $_Found_Path = "" Then
If $_Message Then
MsgBox(262192, "! ! ! F E H L E R ! ! !", "Die Datei wurde nicht gefunden !") ; Flag = 1, 4, 1, 1, 2.
EndIf
If $_Finish Then
Exit (1)
Else
Return SetError(3, 0, 0)
EndIf
Else
Return $_Found_Path
EndIf
EndFunc ; PfadErmitteln()
; Die folgende Funktion stammt teilweise von http://www.autoit.de.
Func UnterordnerAnzeigen($_Folder, $_File, $_W_Path)
For $_Subfolder In $_Folder.SubFolders
If FileExists($_Subfolder.Path & "\" & $_File) Then
If $_W_Path Then ; Den gefundenen Pfad mit- oder ohne Dateinamen zurückgeben.
$_Found_Path = $_Subfolder.Path & "\" & $_File
Else
$_Found_Path = $_Subfolder.Path & "\"
EndIf
ExitLoop
EndIf
UnterordnerAnzeigen($_Subfolder, $_File, $_W_Path) ; Da es sich um eine rekursive Suche handelt, ruft die Funktion sich selber wieder auf.
Next
EndFunc ; UnterordnerAnzeigen()
Eventuell kann ja der eine oder der andere etwas davon brauchen.
Verbesserungsvorschläge, sind natürlich auch willkommen.
MfG:
BigRox