Abfrage in der Registry ob ein bestimmtes Programm installiert ist

  • Hallo AutoItler :thumbup:

    ich habe mal wieder ein Problem und hoffe das ihr mir helfen könnt.

    Ich möchte mir gerne verschiedene Installationsskripte für Programme (hier z.B. foobar2000 :rock: ) erstellen. Dabei möchte ich vor der Installation überprüfen lassen ob "meine" Systemvariable besteht (funktioniert), ob der Installations-Ordner des Programms existiert (funktioniert) und ob das Programm schon in der Registry steht (funktioniert nicht ;( ).

    So das wäre die Vorgeschichte :D

    Nun erstmal das Skript mit allem was dazu gehört

    [autoit]

    #Region - Globale Voraussetzungen
    Dim $Software = "Foobar2000 0.9.6.8"
    Dim $env_string=EnvGet("SOFTWARE")
    Dim $VariableSoftware = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment","SOFTWARE")
    Dim $SoftwareReg = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\foobar2000\","DisplayName")
    #EndRegion - Globale Voraussetzungen

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

    If $VariableSoftware = 1 Then
    SplashTextOn("SystemVariable nicht vorhanden !!","Da die Systemvariable `SOFTWARE´ nicht existiert, kann die verwendete Software
    nicht installiert werden. Bitte erstellen Sie umgehend diese Systemvariable", 500, 200, -1, -1, 0, "", 16, "")
    Sleep(10000)
    SplashOff()

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

    ElseIf FileExists($env_string & $Software & $SoftwareExe) Then
    SplashTextOn("Die zu installierende Software ist bereits installiert","Der Installations-Ordner von " & $Software & " ist bereits vorhanden. Für eine Neuinstallation bitte löschen", 500, 200, -1, -1, 0, "", 16, "")
    Sleep(10000)
    SplashOff()

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

    ElseIf $SoftwareReg = 0 Then
    SplashTextOn("Programm noch installiert !!","Das Programm ist in der Registry noch registriert. Bitte deinstallieren", 500, 200, -1, -1, 0,
    "", 16, "")
    Sleep(10000)
    SplashOff()

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

    Else

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

    ShellExecute("Foobar2000 0.9.6.8.exe")

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

    ; Installationsabfolge

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

    Exit

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

    EndIf

    [/autoit]

    So nun wirds ernst (wenigstens für mich :D ). Wie ich schon oben geschrieben habe funktionieren 2 von den 3 Abfragen, nur die letzte die
    nach dem Programm in der Registry suchen soll funktioniert nicht.

    [autoit]


    Dim $SoftwareReg = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\foobar2000\","DisplayName")

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

    ElseIf $SoftwareReg = 0 Then
    SplashTextOn("Programm noch installiert !!","Das Programm ist in der Registry noch registriert. Bitte deinstallieren", 500, 200, -1, -1, 0,
    "", 16, "")
    Sleep(10000)
    SplashOff()

    [/autoit]



    Wie schon erwähnt soll bei dieser Abfrage in der Registry überprüft werden, ob das Programm schon installiert wurde (egal welche Fassung bzw. Version) und wenn dies so ist eine Fehlermeldung in Form einer MessageBox mit Warnhinweis (Die Messagebox funktioniert, nur das andere nicht ;( ).

    Ich habe auch schon statt "RegRead" auch "RegEnumVal" und "RegEnumKey" verwendet, funktioniert mit meinem "beschränktem" AutoIt-Wissen leider auch nicht.

    Hoffe das Ihr mir helfen könnt 8)

    MfG
    JeanLuc

    autoit.de/wcf/attachment/5456/

    Einer muss immer der Dumme sein ;)

    Einmal editiert, zuletzt von JeanLuc2204 (17. Juli 2009 um 00:13)

  • [autoit]

    Dim $SoftwareReg = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\foobar2000\","DisplayName")

    [/autoit]

    Das habe ich mir schon gedacht, das Programme dort liegen. Nur mein Problem ist ich weiss nicht mit welcher Funktion (z.B. RegRead) ich diese in einer If-Abfrage überprüfen kann.
    Nämlich mit meiner Abfrage (s.o.) kriege ich entweder nur die Fehlermeldung gezeigt oder es wird das Programm installiert. Dabei ist egal ob das Programm installiert ist oder nicht ;( .

    Kann mir einer dabei helfen :whistling:

    MfG
    JeanLuc

    Einer muss immer der Dumme sein ;)

  • nimm mal statt 0 ""

    ich prüfe immer den regEintrag unserer Software indem ich das Bin Verzeichnis abfrage
    und dann mit fileexists ob der Pfad auch vorhanden ist

    HKLM\Software\[Firma]\Programm\etwas zum prüfen

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Sorry ich glaube ich verblöde diese Woche noch ganz, kriege einfach nichts mehr auf die Reihe.

    [autoit]


    #Region - Globale Voraussetzungen
    Dim $Software = "Disk Explorer Professional 3.60"
    Dim $SoftwareExe = "\depro.exe"
    Dim $Title1 = "Installation: License Agreement"
    Dim $Title2 = "Installation"
    Dim $env_string=EnvGet("SOFTWARE")
    Dim $SoftwareUninstall = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE", "foobar2000")
    #EndRegion - Globale Voraussetzungen

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

    If FileExists($SoftwareUninstall) Then
    SplashTextOn("Programm noch installiert !!","Das Programm ist in der Registry noch registriert. Bitte deinstallieren", 500, 200, -1, -1, 0, "", 16, "")
    Sleep(10000)
    SplashOff()
    Else

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

    ShellExecute("Foobar2000 0.9.6.8.exe")

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

    ;Installation des Programms (dieses kriege ich noch hin :whistling:

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

    Exit
    EndIf

    [/autoit]
    Zitat


    ich prüfe immer den regEintrag unserer Software indem ich das Bin Verzeichnis abfrage
    und dann mit fileexists ob der Pfad auch vorhanden ist

    HKLM\Software\[Firma]\Programm\etwas zum prüfen


    Dietmar
    Das habe ich gerade mehrmals probiert. Habe dies in eine Variable geschrieben und dann in der If-Abfrage nachgefragt "Wenn dieses Vorhanden dann Fehlermeldung sonst Setup". Es kommt immer noch wie davor entweder nur Fehlermeldung oder nur Setup, egal ob das Programm installiert ist oder nicht.
    Ich bin langsam am verzweifeln ;( Kriege es seit Tagen nicht hin :cursing:

    Hoffe es hilft mir jemand dabei meine Dummheit zu verbessern ;)

    MfG
    JeanLuc

    PS: Sorry hatte vergessen ne andere Abfrage (Systemvariable) zu entfernen. Jetzt ist nur noch alles vorhanden was für diese Abfrage nötig ist :whistling:

    Einer muss immer der Dumme sein ;)

    Einmal editiert, zuletzt von JeanLuc2204 (16. Juli 2009 um 16:45)

  • Mal ein Beispiel + Test Regkey

    [autoit]

    $mozilla_installiert = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox 3.0.11\bin","PathToExe")
    If $mozilla_installiert <> "" Then
    If FileExists($mozilla_installiert) Then
    MsgBox(0,"Regkey & File vorhanden",$mozilla_installiert)
    Else
    MsgBox(0,$mozilla_installiert,"Regkey vorhanden " & @CRLF & "aber File nicht vorhanden")
    EndIf
    Else
    MsgBox(0,"Mozilla nicht installiert","Regkey nicht vorhanden")
    EndIf

    [/autoit]

    Was suchst Du denn unter CurrentControllSet stehen da nicht die Dienste?

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

    Einmal editiert, zuletzt von Dietmar (16. Juli 2009 um 16:27)

  • Juhuu, endlich es funktioniert einwandfrei :rock:

    Danke Dietmar :thumbup: Vielen vielen Dank :rock::thumbup::love:

    Für spätere Zuschauer und Interessierte träge ich mal noch den kompletten Code hier ein ;)

    [autoit]

    #Region - Globale Voraussetzungen

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

    Dim $Software = "Disk Explorer Professional 3.60"
    Dim $SoftwareExe = "\depro.exe"
    Dim $Title1 = "Installation: License Agreement"
    Dim $Title2 = "Installation"
    Dim $env_string=EnvGet("SOFTWARE")
    Dim $VariableSoftware = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment","SOFTWARE") ; Registry-Zweig für Systemvariable
    Dim $SoftwareInstallUnterMenu = "Antelope Studios\Disk Explorer Professional 3"
    Dim $SoftwareInstallWert = "path"
    Dim $SoftwareInstall = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\" & $SoftwareInstallUnterMenu, $SoftwareInstallWert)
    Dim $Title1 = "Installation: License Agreement"
    Dim $Title2 = "Installation"
    Dim $Fenster1 = "Please read carefully"
    Dim $Fenster2 = "Install to &folder"
    Dim $Fenster3 = "Installation finished"
    Dim $Fenster4 = "Installation of the additional"
    Dim $Fenster5 = "Installation finished"
    Dim $Button1 = "Button1"
    Dim $Button5 = "Button5"
    Dim $Edit1 = "Edit1"

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

    #EndRegion - Globale Voraussetzungen

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

    If $VariableSoftware = 1 Then ; Überprüfung ob die Systemvariable gegeben ist

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

    SplashTextOn("SystemVariable nicht vorhanden !!","Da die Systemvariable `SOFTWARE´ nicht existiert, kann die verwendete Software nicht installiert werden. Bitte erstellen Sie umgehend diese Systemvariable", 500, 200, -1, -1, 0, "", 16, "")
    Sleep(10000)
    SplashOff()

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

    ElseIf FileExists($env_string & $Software & $SoftwareExe) Then ; Überprüfung ob Programm-Ordner auf der Festplatte vorliegt

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

    SplashTextOn("Die zu installierende Software ist bereits installiert","Der Installations-Ordner von " & $Software & " ist bereits vorhanden. Für eine Neuinstallation bitte löschen", 500, 200, -1, -1, 0, "", 16, "")
    Sleep(10000)
    SplashOff()

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

    ElseIf FileExists($SoftwareInstall) <> "" Then ; Überprüfung ob das Programm in der Registry vorhanden ist (funktioniert endlich :thumbup: )

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

    SplashTextOn("Programm noch installiert !!","Das Programm ist in der Registry noch registriert. Bitte deinstallieren", 500, 200, -1, -1, 0, "", 16, "")
    Sleep(10000)
    SplashOff()

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

    Else

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

    ; BlockInput(1) - Ab hier erfolgt die Installation

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

    ShellExecute($Software & ".exe")

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

    ;Warten auf Installations-Fenster
    WinWaitActive($Title1,$Fenster1)
    ControlClick($Title1,$Fenster1,$Button1)

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

    ;Warten auf Installations-Verzeichnis
    WinWaitActive($Title2,$Fenster2)
    ControlSetText($Title2,$Fenster2,$Edit1, $env_string & $Software & "\")
    ControlClick($Title2,$Fenster2,$Button5)

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

    ;Installation des Programms

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

    ;Fertigstellen des Programms
    WinWaitActive($Title2,$Fenster3)
    ControlClick($Title2,$Fenster3,$Button1)

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

    WinClose("Disk Explorer Professional 3","FolderView")

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

    ;German-Sprachdatei installieren
    ShellExecute($Software & " German-Patch.exe")

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

    ;Warten auf Installations-Fenster
    WinWaitActive($Title2,$Fenster4)
    ControlClick($Title2,$Fenster4,$Button1)

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

    ;Fertigstellen des Programms
    WinWaitActive($Title2,$Fenster5)
    ControlClick($Title2,$Fenster5,$Button1)

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

    WinClose("Disk Explorer Professional 3","FolderView")

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

    ; BlockInput(0)

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

    Exit

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

    EndIf

    [/autoit]

    Dieses Script installiert den sehr guten Medien-Katalog Disk Explorer Professional 3.60 unbeaufsichtigt auf einen vorgegebenen Pfad (Systemvariable "Software" muss dabei vorliegen). Außerdem überprüft das Script ob der Programm-Ordner auf der Festplatte vorliegt, ob die Systemvariable gegeben ist und ob das Programm schon in der Registry verewigt wurde :D
    Und ab jetzt sogar voll funktionstüchtig :D Dank Mithilfe von Dietmar :rolleyes:

    MfG
    JeanLuc

    PS: Damit wird das Thema von mir aus von "offen" auf "gelöst" umgestellt 8)

    Einer muss immer der Dumme sein ;)

  • RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001

    Das ist ganz gefährlich !

    Nimm lieber "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet...".

    Denn Du weißt nie, wie lange das CurrentControlSet das ControlSet001 bleibt bzw. ist.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Das ist ganz gefährlich !

    Nimm lieber "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet...".

    Denn Du weißt nie, wie lange das CurrentControlSet das ControlSet001 bleibt bzw. ist.

    Dies dient eigentlich nur der Überprüfung ob meine Systemvariable vorhanden ist. Habe mich darüber informiert und es wurde gesagt das alle Systemvariablen dort eingetragen sind.

    Systemvariable 1

    Systemvariable 2

    Was wäre den jetzt, universel gesehen, das bessere zur Überprüfung einer Systemvariablen ? ?(

    MfG
    JeanLuc

    Einer muss immer der Dumme sein ;)

  • Du kannst das natürlich so abfragen und es funktioniert auch, solange das 'CURRENT' das ControlSet 1 ist.

    Schau Dir mal den Schlüssel "HKEY_LOCAL_MACHINE\SYSTEM\Select" an. Hier steht welches ControlSet das aktuell, das Default bzw. das "letzte als funktionierend bekannte" ist.

    Solange nichts an Deinem System passiert, nimmt er immer wieder das gleiche. Nur wenn diese mal wechselt, dann funktioniert Dein Script nicht mehr richtig. Und wenn Du Dein Script auf verschiedenen Rechnern startest, hast Du den Effekt, das es auf einigen einwandfrei läuft und auf einigen eben nicht (bei denen eben das ControlSet002 das aktuelle ist).

    Das "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet" ist nur eine "KOPIE" (eigentlich nur ein Alias) von einem der ControlSet's.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"