Abfrage der Versionsnummer einer exe

  • Mahlzeit,

    ich habe gerade ein kleines Problem an dem ich verzweifel.
    Ich versuche gerade ein Skript zu erstellen, welches ein Setup ausführen soll.
    Wenn eine ältere Version dieses Setups installiert ist, soll er es vorhher deinstallieren. Leider hat diese Software keinen Uninstaller, weswegen ich versuche über die Registry zu gehen. Soweit so gut.

    Leider funktioniert meine Switch...Case anweisung nicht. Kann mir jemand erklären warum?

    [autoit]


    #include <file.au3>

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

    $OS = @OSArch
    $bnCAD_Server = RegRead("HKCU\Environment", "bnCAD_Server")
    MsgBox(0,"OS Architektur", $OS)
    _testinstall()

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

    func _testinstall()
    If FileExists(@ProgramFilesDir & "\DiCaT\CableCaT V2.4\CableCaT.exe") Then
    _FileWriteLog( @TempDir & "\CClog_" & @ComputerName & ".log", "Previous Installation of CableCat was found on " & @ComputerName )
    $CCver = FileGetVersion(@ProgramFilesDir & "\DiCaT\CableCaT V2.4\CableCaT.exe")
    _FileWriteLog( @TempDir & "\CClog_" & @ComputerName & ".log", "Found Version: " & $CCver )
    IF Not $CCver ="2.4.2010.179" Then
    Switch $CCver
    case "2.4.2009.324"
    RunWait("MsiExec.exe /X{5EFE3353-D69C-450C-917E-3EB1D412B3CC} /qn")
    DirRemove(@ProgramFilesDir & "\DiCaT\CableCaT V2.4")
    _instCC()
    case "2.4.2010.85"
    RunWait("MsiExec.exe /X{E4460BDB-BC12-4548-9811-790A678E8BB1} /qn")
    DirRemove(@ProgramFilesDir & "\DiCaT\CableCaT V2.4")
    _instCC()
    case "2.4.2010.89"
    RunWait("MsiExec.exe /X{8D1B398B-970F-4C04-BD6D-B02F1AEDD3C7} /qn")
    DirRemove(@ProgramFilesDir & "\DiCaT\CableCaT V2.4")
    _instCC()
    case "2.4.2009.43"
    RunWait("MsiExec.exe /X{432184D6-8DB9-4214-BE5B-4B0E67FE5787} /qn")
    DirRemove(@ProgramFilesDir & "\DiCaT\CableCaT V2.4")
    _instCC()
    EndSwitch
    Else
    _FileWriteLog( @TempDir & "\CClog_" & @ComputerName & ".log", "Newest Version of CableCaT is installed.")
    Exit
    EndIf
    Else
    _FileWriteLog( @TempDir & "\CClog_" & @ComputerName & ".log", "CableCaT was not installed on this computer")
    If FileExists(@ProgramFilesDir & "\DiCaT\CableCaT V2.4") Then
    DirRemove(@ProgramFilesDir & "\DiCaT\CableCaT V2.4")
    EndIf
    _instCC()
    EndIf
    EndFunc

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

    func _instCC()
    RunWait("msiexec /i " & $bnCAD_Server & "\apps\global\cablecat\CableCaT.msi /qn allusers=1", @TempDir)
    If $OS = "x86" Then
    RunWait($bnCAD_Server & "\apps\global\cablecat\WIBU\WkRuntime\Setup.exe", @TempDir)
    ElseIf $OS = "x64" Then
    RunWait($bnCAD_Server & "\apps\global\cablecat\WIBU\WkRuntime64\Setup64.exe", @TempDir)
    EndIf
    _testinstall()
    EndFunc

    [/autoit]

    MfG
    Alex

  • Nicht direkt dein Problem aber die Guids (432184D6-8DB9-4214-BE5B-4B0E67FE5787)
    bekommst du auch aus der Registry.

    Ab hier nach etwas eindeutigem suchen:
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{GUID}]

    zu Filegetversion
    Stringname kann einer der folgenden allgemeinen Feldnamen sein :
    Comments, InternalName, ProductName, CompanyName, LegalCopyright, ProductVersion,
    FileDescription, LegalTrademarks, PrivateBuild, FileVersion, OriginalFilename, SpecialBuild

    es gibt Datei & Produktversion ;)

    Gruß Dietmar

    Achtung Anfänger! :whistling:

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

  • Hallo 127.0.0.1,
    sieht nach "not" Problem aus.

    Probiers mal mit:

    [autoit]

    Switch FileGetVersion("notepad.exe")
    Case "5.1.2600.5512"
    MsgBox(16, "yes", FileGetVersion("notepad.exe"))
    Case Else
    MsgBox(16, "no", "")
    EndSwitch

    [/autoit]

    vielleicht kannst du es ja so lösen.

    Gruß
    dvmade

    may the source be with you

  • Nicht direkt dein Problem aber die Guids (432184D6-8DB9-4214-BE5B-4B0E67FE5787)
    bekommst du auch aus der Registry.

    Ab hier nach etwas eindeutigem suchen:
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{GUID}]

    Das weiß ich, da hab ich die ja her! Muss nur leider so gemacht werden.

    dvmade
    Was meinst du mit "not" Problem?
    Hab ich noch nie gehört oder gehabt^^

    Ich probier es aber mal mit deiner Lösung.

    €dit:
    Klappt leider auch nicht. Noch for dem

    [autoit]

    If not $newVer = $CCver Then

    [/autoit]

    bricht es ohne Fehlermeldung ab

    Einmal editiert, zuletzt von L0c4lh0sT (12. August 2010 um 14:36)

  • Ich habe auch öfters bei "If Not - Konstrukten" ein Problem und noch keine befriedigende Lösung dafür gefunden. Außer Klammer setzten und/oder Bit-Verknüpfung.

    Hier mein Tip:

    [autoit]

    func _testinstall()
    If FileExists(@ProgramFilesDir & "\DiCaT\CableCaT V2.4\CableCaT.exe") Then
    _FileWriteLog( @TempDir & "\CClog_" & @ComputerName & ".log", "Previous Installation of CableCat was found on " & @ComputerName )
    $CCver = FileGetVersion(@ProgramFilesDir & "\DiCaT\CableCaT V2.4\CableCaT.exe")
    _FileWriteLog( @TempDir & "\CClog_" & @ComputerName & ".log", "Found Version: " & $CCver )
    ; IF Not $CCver ="2.4.2010.179" Then
    Switch $CCver
    case "2.4.2009.324"
    RunWait("MsiExec.exe /X{5EFE3353-D69C-450C-917E-3EB1D412B3CC} /qn")
    DirRemove(@ProgramFilesDir & "\DiCaT\CableCaT V2.4")
    _instCC()
    case "2.4.2010.85"
    RunWait("MsiExec.exe /X{E4460BDB-BC12-4548-9811-790A678E8BB1} /qn")
    DirRemove(@ProgramFilesDir & "\DiCaT\CableCaT V2.4")
    _instCC()
    case "2.4.2010.89"
    RunWait("MsiExec.exe /X{8D1B398B-970F-4C04-BD6D-B02F1AEDD3C7} /qn")
    DirRemove(@ProgramFilesDir & "\DiCaT\CableCaT V2.4")
    _instCC()
    case "2.4.2009.43"
    RunWait("MsiExec.exe /X{432184D6-8DB9-4214-BE5B-4B0E67FE5787} /qn")
    DirRemove(@ProgramFilesDir & "\DiCaT\CableCaT V2.4")
    _instCC()
    Case Else
    _FileWriteLog( @TempDir & "\CClog_" & @ComputerName & ".log", "Newest Version of CableCaT is installed.")
    Exit
    EndSwitch
    ;Else
    ;_FileWriteLog( @TempDir & "\CClog_" & @ComputerName & ".log", "Newest Version of CableCaT is installed.")
    ;Exit
    ;EndIf
    Else
    _FileWriteLog( @TempDir & "\CClog_" & @ComputerName & ".log", "CableCaT was not installed on this computer")
    If FileExists(@ProgramFilesDir & "\DiCaT\CableCaT V2.4") Then
    DirRemove(@ProgramFilesDir & "\DiCaT\CableCaT V2.4")
    EndIf
    _instCC()
    EndIf
    EndFunc

    [/autoit]

    may the source be with you

  • Verstehe ich nicht irgendetwas wird doch wohl eindeutig da zu finden sein, Homepage vom Hersteller o.ä.
    Ansonsten darfst Du ja für zig Versionen eine Weiche basteln.

    Suche z.B. ab Startpfad dann hast Du die Guid / den Pfad wo es installiert ist etc.

    Achtung Anfänger! :whistling:

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

  • Verstehe ich nicht irgendetwas wird doch wohl eindeutig da zu finden sein, Homepage vom Hersteller o.ä.
    Ansonsten darfst Du ja für zig Versionen eine Weiche basteln.

    Suche z.B. ab Startpfad dann hast Du die Guid / den Pfad wo es installiert ist etc.


    Ich hab sogar schon mit den Programmierern der Software gequatscht. Die Deinstallation des Produktes als Automatisierter Prozess ist nicht geplant war eine der Aussagen der Herren.

    Ich muss jede Version, die wir irgendwann mal gekauft haben abfragen. Das ist noch recht beschaulich. Also nicht so wild.

    Der Startpfad oder Installationsordner bringt mir nichts. Da sind ja keine Uninstaller drin^^

    dvmade
    Ich werde mal dein Quellcode ausprobieren und dir sagen ob es läuft.

    Danke

    Funktioniert tadellos und macht was es soll. Danke. Aber ich frag mich woran das mit dem IF Not liegt? Ich habs aber an der Stelle auch mal mit nem einfach if probiert. Genau das selbe... abbruch des Skriptes.

  • Schön ... du verstehst mich nicht...

    Zitat

    Der Startpfad oder Installationsordner bringt mir nichts. Da sind ja keine Uninstaller drin


    Damit war Uninstall von der Registry gemeint, darin suchst Du nach etwas eindeutigen was zum Programm gehört.
    Zum Beispiel die HP vom Erzeuger opyright Kommentar o.ä.
    Wenn es dann gefunden wird hasst Du die GUID und auch weitere Infos die Du mit regread(HKLM...Uninstall\GUID\installdir)
    abfragen kannst.
    Dann musst Du es nicht hartcodiert hinterlegen, sondern suchst Dir die notwendigen Infos zur Laufzeit aus der Registry.

    Z.B. hier für WinCDEmu suche nach sysprogs.org ab dem Uninstall Registry Ordner

    Dateien

    Achtung Anfänger! :whistling:

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

    Einmal editiert, zuletzt von Dietmar (13. August 2010 um 14:31)

  • Hallo L0c4lh0sT,

    Funktioniert tadellos und macht was es soll. Danke. Aber ich frag mich woran das mit dem IF Not liegt? Ich habs aber an der Stelle auch mal mit nem einfach if probiert. Genau das selbe... abbruch des Skriptes.


    Das von dvmade angesprochene "If NOT Problem" lässt sich wie folgt erklären:

    Operatoren werden mit unterschiedlicher Priorität abgearbeitet, wie das z. B. bei der beliebten Punkt- vor Strichrechnung der Fall ist. :D
    Laut AutoIt-Hilfe geschiet dies in nachstehender Reihenfolge:

    NOT
    ^
    * /
    + -
    &
    < > <= >= = <> ==
    AND OR

    In Deinen Fall

    [autoit]

    IF Not $CCver ="2.4.2010.179" Then

    [/autoit]


    wird erst "Not $CCver" ausgeführt und das Ergebnis dann mit "2.4.2010.179" verglichen. Da "Not $CCver" gleich "False" ist, lautet die resultierende If-Anweisung

    [autoit]

    If False = "2.4.2010.179" Then

    [/autoit]


    was aber wiederum "False" ergibt, die Switch-Anweisungen werden also erst gar nicht ausgeführt. Damit die If-Anweisung funktioniert, müssen Klammern gesetzt werden.

    [autoit]

    If Not ($CCver ="2.4.2010.179") Then

    [/autoit]


    Alternativ könnte man auch direkt auf Ungleichheit prüfen, was Du ja letztendlich machst; "nicht gleich" ergibt "ungleich".

    [autoit]

    If $CCver <> "2.4.2010.179" Then

    [/autoit]

    Eine weitere Alternative wäre, das Switch..Case Konstrukt in den "Else"-Teil zu verschieben:

    Spoiler anzeigen
    [autoit]


    Func _testinstall()
    If FileExists(@ProgramFilesDir & "\DiCaT\CableCaT V2.4\CableCaT.exe") Then
    _FileWriteLog(@TempDir & "\CClog_" & @ComputerName & ".log", "Previous Installation of CableCat was found on " & @ComputerName)
    $CCver = FileGetVersion(@ProgramFilesDir & "\DiCaT\CableCaT V2.4\CableCaT.exe")
    _FileWriteLog(@TempDir & "\CClog_" & @ComputerName & ".log", "Found Version: " & $CCver)
    If $CCver = "2.4.2010.179" Then
    _FileWriteLog(@TempDir & "\CClog_" & @ComputerName & ".log", "Newest Version of CableCaT is installed.")
    Exit
    Else
    Switch $CCver
    Case "2.4.2009.324"
    RunWait("MsiExec.exe /X{5EFE3353-D69C-450C-917E-3EB1D412B3CC} /qn")
    DirRemove(@ProgramFilesDir & "\DiCaT\CableCaT V2.4")
    _instCC()
    Case "2.4.2010.85"
    RunWait("MsiExec.exe /X{E4460BDB-BC12-4548-9811-790A678E8BB1} /qn")
    DirRemove(@ProgramFilesDir & "\DiCaT\CableCaT V2.4")
    _instCC()
    Case "2.4.2010.89"
    RunWait("MsiExec.exe /X{8D1B398B-970F-4C04-BD6D-B02F1AEDD3C7} /qn")
    DirRemove(@ProgramFilesDir & "\DiCaT\CableCaT V2.4")
    _instCC()
    Case "2.4.2009.43"
    RunWait("MsiExec.exe /X{432184D6-8DB9-4214-BE5B-4B0E67FE5787} /qn")
    DirRemove(@ProgramFilesDir & "\DiCaT\CableCaT V2.4")
    _instCC()
    EndSwitch
    EndIf
    Else
    _FileWriteLog(@TempDir & "\CClog_" & @ComputerName & ".log", "CableCaT was not installed on this computer")
    If FileExists(@ProgramFilesDir & "\DiCaT\CableCaT V2.4") Then
    DirRemove(@ProgramFilesDir & "\DiCaT\CableCaT V2.4")
    EndIf
    _instCC()
    EndIf
    EndFunc ;==>_testinstall

    [/autoit]

    Gruß
    M.

  • Hallo AutoBert,


    diese falsche Aussage:

    kann ich so nicht stehen lassen, es müssen keine Klammern gesetzt werden (sind aber nicht schädlich), starte einfach folgendes Beispiel-Skript:

    Da genau liegt ja Tücke. Wenn der Inhalt der Variablen "$sText", wie in Deinem Beispiel angeführt, gleich dem Vergleichsstring ist, ist das Ergebnis immer "False" es wird also zum "Else"-Zweig gesprungen. Interresant wird's erst, bei Ungleichheit der Variable mit dem Vergleichsstring, dann verhält es sich so, wie in meinem letzten Post beschrieben.
    Teste mal diese Zeilen:

    [autoit]


    $sText = "2.4.2010.179a"
    If Not $sText = "2.4.2010.179" Then
    MsgBox(0, $sText, "ungleich 2.4.2010.179")
    Else
    MsgBox(0, $sText, "gleich 2.4.2010.179")
    EndIf

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

    $sText = "2.4.2010.179a"
    If Not ($sText = "2.4.2010.179") Then
    MsgBox(0, $sText, "ungleich 2.4.2010.179")
    Else
    MsgBox(0, $sText, "gleich 2.4.2010.179")
    EndIf

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

    If $CCver <> "2.4.2010.179" Then


    was meines Erachtens die idealere Schreibweise ist,

    mfg (Auto)Bert

    Gruß
    M.

  • Ups, da hast du leider recht, ungleich wird jeweil richtig angezeigt. Dass der Text in der MsgBox im ersten Fall falsch angezeigt wird liegt wohl in deiner Absicht,

    Da du es jetzt ja richtiggestellt hast lösche ich meinen vorhergehenden Post,

    mfg (Auto)Bert

  • Ups, da hast du leider recht, ungleich wird jeweil richtig angezeigt. Dass der Text in der MsgBox im ersten Fall falsch angezeigt wird liegt wohl in deiner Absicht,

    Ja.

    Schönes Wochenende
    M.