Registry Zweig auslesen und als Reg File speichern

  • Ich habe folgendes Problem. Ich möchte ein Script schreiben, welches mir alle WinRAR Einstellungen die in der Registry liegen komplett speichern.
    Das klappt leider nur mit direkter Pfadangabe. Ich möchte es aber so haben, dass es über "ScriptDir" funktioniert.

    So funktioniert es:

    [autoit]

    ;Run("Regedit /e C:\Users\PolytroX\Desktop\winrar.reg " & "HKEY_CURRENT_USER\Software\WinRAR")

    [/autoit]


    Aber dieses leider nicht:

    [autoit]

    Run('Regedit /e @ScriptDir" & "\winrar.reg" & "HKEY_CURRENT_USER\Software\WinRAR')

    [/autoit]

    Es soll im Script Verzeichnis mit Unterordnern gesichert werden, auch wenn ich den Script verschiebe.


    Ganzer Code sieht so aus:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.4.0
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    #RequireAdmin

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

    $HLM = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\WinRar", "exe64")
    $HCU = RegRead("HKEY_CURRENT_USER\Software\WinRAR", "")
    $themes = @AppDataDir &"\WinRAR\Themes"
    $regsave =

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

    if Not FileExists($HLM) Or ($HCU) Then
    MsgBox(0,"Fehler!", "Winrar ist zur Zeit nicht installiert! Das Programm wird nun beendet.")
    Exit
    EndIf

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

    If FileExists($HLM) Or ($HCU) Then
    IniWrite ("rar.ini","Rar_local_machine", "Install_Pfad", $HLM)
    IniWrite ("rar.ini","Rar_all users", "Install_Pfad", $HCU)
    EndIf

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

    If ProcessExists ( "WinRAR.exe") Then
    MsgBox (0,"Hinweis!", "WinRAR ist derzeit geöffnet. Der Prozess wird nun geschlossen")
    ProcessClose ( "WinRAR.exe")
    Run("Regedit /e C:\Users\PolytroX\Desktop\winrar.reg " & "HKEY_CURRENT_USER\Software\WinRAR") ; diese Stelle soll keine feste Pfadangabe haben
    DirCopy ($themes , @ScriptDir & "\Backups\WinRAR" ,1 )
    MsgBox (0,"WinRAR Backup!", "Die komplette WinRAR sicherung ist nun abgeschlossen Sie können WinRAR nun starten.")
    Exit
    EndIf

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

    If Not ProcessExists ( "WinRAR.exe") Then
    MsgBox (0,"WinRAR Backup!", "WinRAR Einstellungen und gespeicherte Themes werden nun gesichert.")
    Run("Regedit /e C:\Users\PolytroX\Desktop\winrar.reg " & "HKEY_CURRENT_USER\Software\WinRAR"); diese Stelle soll keine feste Pfadangabe haben
    DirCopy ($themes , @ScriptDir & "\Backups\WinRAR" ,1 )
    MsgBox (0,"WinRAR Backup!", "Die komplette WinRAR sicherung ist nun abgeschlossen Sie können WinRAR nun starten.")

    [/autoit]

    Kann mir da bitte Jemand helfen, wie ich es hin bekomme, dass ich es auch verschieben kann?

    Einmal editiert, zuletzt von PolytroX (21. Oktober 2012 um 18:31)

  • Hi,

    das "@ScriptDir" bei deinem Code interpretiert AutoIt als String.
    So sollte es gehen:

    [autoit]

    Run(@ComSpec & ' /C regedit /e ' & @ScriptDir & '\winrar.reg HKEY_CURRENT_USER\Software\WinRAR')

    [/autoit]

    Einmal editiert, zuletzt von CyRoX (21. Oktober 2012 um 18:01)

  • Hab's zu schnell abgeschickt, so sollte es gehen (siehe auch Edit im ersten Post):

    [autoit]

    Run(@ComSpec & ' /C regedit /e ' & @ScriptDir & '\winrar.reg HKEY_CURRENT_USER\Software\WinRAR')

    [/autoit]

    Edit:

    Zitat

    EDIT: Mein Fehler. Nun klappt es perfekt. Vielen DANK !!


    Dann geht's anscheinend auch so wie's vorher war.
    Gerne.
    Der Code oben steuert regedit über CMD an, der hier (vom ersten Post) greift direkt auf regedit zu:

    [autoit]

    Run('regedit /e ' & @ScriptDir & '\winrar.reg HKEY_CURRENT_USER\Software\WinRAR')

    [/autoit]

    Mir wird gerade klar, dass das noch besser ist. Da war ich zu voreilig mit dem Editieren. :D

    2 Mal editiert, zuletzt von CyRoX (21. Oktober 2012 um 18:10)

  • Und ich sitze an diesem Code-Schnipsel schon seit heute Morgen. :S

    EDIT:

    Dank Euch ist es nun fertig. Dieser Script erkennt, ob Winrar installiert ist oder nicht. Es überprüft, ob WinRar gerade im Hintergrund läuft und schließt es gegebenenfalls. Dann wird eine Rar.ini mit dem installiertem WinRar Pfad erstellt (kann man weiter mit arbeiten, ist aber eigentlich unnötig).

    Dann wird der Reg. Zweig mit allen WinRar Einstellungen ausgelesen und im Scriptverzeichnis im Unterordner "Backups\WinRAR" erstellt. Im nächsten Schritt werden dann alle installierten Winrar Themes in das selbe Verzeichnis kopiert.

    Und so siet es dann fertig aus:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.4.0
    Author: PolytroX
    Programmname: WinRar Backup
    Script Function: Sichert alle vorhandenen WinRar Einstellungen und installierten Themes.

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

    #ce ----------------------------------------------------------------------------

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

    #RequireAdmin

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

    $HLM = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\WinRar", "exe64")
    $HCU = RegRead("HKEY_CURRENT_USER\Software\WinRAR", "")
    $themes = @AppDataDir &"\WinRAR\Themes"

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

    if Not FileExists($HLM) Or ($HCU) Then
    MsgBox(0,"Fehler!", "Winrar ist zur Zeit nicht installiert! Das Programm wird nun beendet.")
    Exit
    EndIf

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

    If FileExists($HLM) Or ($HCU) Then
    IniWrite ("rar.ini","Rar_local_machine", "Install_Pfad", $HLM)
    IniWrite ("rar.ini","Rar_all users", "Install_Pfad", $HCU)
    EndIf

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

    If ProcessExists ( "WinRAR.exe") Then
    MsgBox (0,"Hinweis!", "WinRAR ist derzeit geöffnet. Der Prozess wird nun geschlossen")
    ProcessClose ( "WinRAR.exe")
    Run('Regedit /e ' & @ScriptDir & '\Backups\WinRAR\winrar.reg HKEY_CURRENT_USER\Software\WinRAR') ; Liest die Reg aus und speichert sie
    DirCopy ($themes , @ScriptDir & "\Backups\WinRAR" ,1 )
    MsgBox (0,"WinRAR Backup!", "Die komplette WinRAR sicherung ist nun abgeschlossen Sie können WinRAR nun starten.")
    Exit
    EndIf

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

    If Not ProcessExists ( "WinRAR.exe") Then
    MsgBox (0,"WinRAR Backup!", "WinRAR Einstellungen und gespeicherte Themes werden nun gesichert.")
    Run('Regedit /e ' & @ScriptDir & '\Backups\WinRAR\winrar.reg HKEY_CURRENT_USER\Software\WinRAR'); Liest die Reg aus und speichert sie
    DirCopy ($themes , @ScriptDir & "\Backups\WinRAR" ,1 )
    MsgBox (0,"WinRAR Backup!", "Die komplette WinRAR sicherung ist nun abgeschlossen Sie können WinRAR nun starten.")
    Exit
    EndIf

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

    Vielen Dank an alle, die mir dabei geholfen haben. *freu*

    2 Mal editiert, zuletzt von PolytroX (21. Oktober 2012 um 18:29)

  • sind da nicht zu viele If's drin??

    Spoiler anzeigen
    [autoit]


    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.4.0
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    #RequireAdmin

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

    $HLM = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\WinRar", "exe64")
    $HCU = RegRead("HKEY_CURRENT_USER\Software\WinRAR", "")
    $themes = @AppDataDir &"\WinRAR\Themes"

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

    if Not FileExists($HLM) Or ($HCU) Then
    MsgBox(0,"Fehler!", "Winrar ist zur Zeit nicht installiert! Das Programm wird nun beendet.")
    Exit
    Else
    IniWrite ("rar.ini","Rar_local_machine", "Install_Pfad", $HLM)
    IniWrite ("rar.ini","Rar_all users", "Install_Pfad", $HCU)
    EndIf

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

    If ProcessExists ( "WinRAR.exe") Then
    MsgBox (0,"Hinweis!", "WinRAR ist derzeit geöffnet. Der Prozess wird nun geschlossen")
    ProcessClose ( "WinRAR.exe")
    Run('Regedit /e ' & @ScriptDir & '\Backups\WinRAR\winrar.reg HKEY_CURRENT_USER\Software\WinRAR') ; Liest die Reg aus und speichert sie
    DirCopy ($themes , @ScriptDir & "\Backups\WinRAR" ,1 )
    MsgBox (0,"WinRAR Backup!", "Die komplette WinRAR sicherung ist nun abgeschlossen Sie können WinRAR nun starten.")
    Exit
    EndIf

    [/autoit]
  • Es soll auf allen Rechnern laufen, egal ob Win 32 oder 64. Und es soll auch erkennen, ob Winrar für aktuellen Benutzer, oder für alle Benutzer installiert ist. Dementsprechend ändert sich auch der Registry Pfad.
    Deshalb die ganzen If´s. Es soll halt überall laufen. :)

    Bin da noch Anfänger und freu mich, wenn es überhaupt läuft.

    EDIT: Habe Dein Script mal getestet. Da wird lediglich die Ini erstellt, mehr passiert da nicht.

    Einmal editiert, zuletzt von PolytroX (21. Oktober 2012 um 18:43)

  • Meines Wissens nach ist eine solches If-Konstrukt in Autoit nicht gültig:

    [autoit]

    if Not FileExists($HLM) Or ($HCU) Then

    [/autoit]

    Wenn dann müsste es so heißen:

    [autoit]

    if Not FileExists($HLM) Or Not FileExists($HCU) Then

    [/autoit]

    Außerdem ist durch die Verwendung der Or-Verknüpfung der Sinn der Abfrage auch noch verdreht worden: Denn die Fehlermeldung, dass WinRar nicht installiert ist, soll ja nur angezeigt werden wenn Pfad 1 UND Pfad 2 nicht existieren. Oder irre ich mich da? ^^ Wenn nicht dann muss statt der OR- eine AND-Verknüpfung verwendet werden... ;)

    LG
    Christoph :)

  • Ich finde die Idee (übrigens schade, dass nicht alle Programme so eine Funktion integriert haben) und den Skript schon mal gut, würde aber das was Christoph54 geschrieben hat noch abändern, da die Bedingung sonst ihr Ziel verfehlt und das möglicherweise zu Fehlern führt.
    Außerdem würde ich RegRead (statt FileExists) nutzen.