Tipps für ein Programm

  • Hallo,
    ich brauche da mal eine paar Tipps für ein Programm.

    Ich will mir ein Programm in AutoIt basteln, dass mir hilft Ordner und deren Inhalt zu synchronisieren.
    Das Programm soll, wenn ich es starte, sich in die Taskleiste minimieren, sodass sein Fenster nicht stört.
    Aber dieses Programm soll mir einen zusätzlichen Eintrag im Kontextmenü der Ordner erstellen (z.B. einfach "Ordner synchronisieren" o.ä.)
    Dann bräuchte ich ja nur den zu synchronisierenden Ordner mit der rechten Maustaste anzuklicken und bekomme dann im Kontextmenü diesen Eintrag zum anklicken angeboten.

    Nur wie bekomme ich dann diesen, mit rechts angeklickten, Ordnernamen usw. in das Synchronisations-Programm, damit ich damit etwas "anstellen" kann ?

    Und als letztes soll der Kontextmenü-Eintrag auch wieder entfernt werden, wenn ich das Synchronisations-Programm beende.

    Das müsste eigentlich auch mit AutoIt zu machen sein. Nur wie kann man soetwas machen ? Da ich soetwas noch nie gemacht habe, habe ich auch keine Idee, wie man das machen kann.
    Das mit dem synchronisieren usw. bekomme ich dagegen selber hin.

    MfG:
    BigRox

    Einmal editiert, zuletzt von BigRox (19. Februar 2014 um 12:08)

  • Die Einträge in das Kontext-Menü vom Explorer bekommen andere Programm hin, indem sie in der Registry unter HKLM\Software\Classes\*\ShellEx\ContextMenuHandlers ihren Eintrag hinzufügen. Hab ich aber noch nie gemacht, google da einfach mal nach. Ich weiß aber nicht ob das sofort funktioniert oder ob man explorer.exe erst neu starten muss.

    Rechtschreibfehler sind Spezialeffekte meiner Tastatur.

  • Wie schon gesagt wurde musst du das in der Registry ändern ;)
    Dort hinterlegst du dein Synchronisierungsprogramm.
    In dem Programm musst du dann das Array $CMDLINE abfragen. Im Array steht dann der komplette Pfad zum Ordner den du zuvor ausgewählt hast

  • Hallo,
    ich habe soeben mal einen neuen Schlüssel in der Registry erstellt und zwar:

    In HKEY_CLASSES_ROOT\Folder\shell
    den Schlüssel "AutoIt Test"

    und sofort wird mir dieser Eintrag auch im Kontextmenü der Ordner angezeigt.
    Wenn ich diesen Schlüssel wieder lösche, so ist der Eintrag auch sofort wieder weg.

    Es geht also ohne Neustart und Schlüssel erstellen und löschen, dass geht einfach mit AutoIt.

    Nur erscheint da der Eintrag ja irgendwo im Kontextmenü.
    Kann man im Kontextmenü eigentlich auch Trennlinien o.ä. erstellen, sodass der Eintrag besonders hervorgehoben wird und kann man deren Position im Kontextmenü festlegen ?

    MfG:
    BigRox

  • 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
    [autoit]


    ; #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
    ; -------------------------------------------------------------------------------------------------------------------------------------------------------

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

    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)

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

    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")

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

    MsgBox(262208, "! ! ! E R F O L G ! ! !", "Die AutoIt-Synchronisation wurde erfolgreich entfernt !", 3) ; Flag: 1, 5, 1, 1, 2.
    EndIf

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

    Exit

    [/autoit]

    Der zweite Teil erledigt die eigentliche Arbeit.

    Spoiler anzeigen
    [autoit]


    ; #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 !
    ; -------------------------------------------------------------------------------------------------------------------------------------------------------

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

    ; Sonstiges für dieses Script festlegen.
    #RequireAdmin

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

    ; Dateien einbinden.
    #include-once
    #include <File.au3>

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

    ; Festlegen das alle verwendeten Variablen auch deklariert werden müssen.
    Opt("MustDeclareVars", 1)

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

    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

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

    $Scripte_Ziel_Pfad = "E:\USB_Blau\AutoIt\Eigene Install Scripte"
    $Programme_Ziel_Pfad = "E:\USB_Blau\Neuer Install mit AutoIt"

    [/autoit] [autoit][/autoit] [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

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

    ; 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.

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

    #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.

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

    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

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

    ; 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

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

    Exit

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

    Func OrdnerDateiName($_Whole_Path)
    Local $_Drive, $_Path, $_Name, $_Extension

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

    _PathSplit($_Whole_Path, $_Drive, $_Path, $_Name, $_Extension)
    Return $_Name
    EndFunc

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

    ; Die folgende Funktion stammt von http://www.autoit.de.
    Func DateienAuflisten($_recdir, $_Fsrch = "*.*", $_rcend = 1)
    Local $_rcstrt, $_rcffnf, $_rectmpdrs, $_rci, $_recdirobj, $_recdirpth, $_recdirsmlng, $_recdirec

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

    $_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

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

    $_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

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

    Return $_rcfls ; Das Array mit allen gefundenen Dateipfaden übergeben.
    EndFunc ; DateienAuflisten()

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

    ; 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

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

    $_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

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

    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

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

    ; 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

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

    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

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

    ; Ein neues Objekt erstellen.
    $_FSO = ObjCreate("Scripting.FileSystemObject")
    UnterordnerAnzeigen($_FSO.GetFolder($_Start_Folder), $_Filename, $_W_Path)

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

    ; 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()

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

    ; 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()

    [/autoit]

    Eventuell kann ja der eine oder der andere etwas davon brauchen.
    Verbesserungsvorschläge, sind natürlich auch willkommen.

    MfG:
    BigRox