JayTran
JayTran

Reputation: 1

"Less than" statements not evaluating

Running into this problem. Trying to uninstall all previous version of a program using the less than statement and installing new version. It doesn't recognize the less than and will keep uninstalling and reinstalling the newest version everytime.

Option Explicit

Const HKEY_LOCAL_MACHINE = &H80000002
Dim Msg, MsgBoxStyle, RegKey, NAMProductKey, NAMProductName, NAMVersion

'=== START Check for Cisco AnyConnect Network Access Manager < 3.1.05170
Sub GetNAMKey()
    Dim oReg, sPath, aKeys, sName, sKey, sVersion
    Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

    sPath = "SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
    oReg.EnumKey HKEY_LOCAL_MACHINE, sPath, aKeys

    For Each sKey in aKeys
        oReg.GetStringValue HKEY_LOCAL_MACHINE, sPath & "\" & sKey, "DisplayName", sName, "DisplayVersion", sVersion
        If Not IsNull(sName) Then 
            If (sName = "Cisco AnyConnect Network Access Manager") Then
                NAMProductKey = sKey
                NAMProductName = sName
                NAMVersion = sVersion
            End If
        End If
    Next
End Sub

'=Start Uninstall Reference== 
Sub UninstallUNI(key, name)
    Dim cmd, objShell, iReturn, oshell

    cmd = "%SystemRoot%\System32\msiexec.exe /q/x " & key
    Set objShell = wscript.createObject("wscript.shell")

    objShell.LogEvent 0, "Removing the program [" & name & "] under Product Key [" & key & "]" & vbCrLf & "Executing command: " & vbCrLf & cmd

    iReturn=objShell.Run(cmd,1,TRUE)

    If (iReturn = 0) Then
        objShell.LogEvent 0, "Program [" & name & "] was successfully removed"
    Else
        objShell.LogEvent 0, "Failed to remove the program [" & name & "]."
    End If

    Set objShell = Nothing  
End Sub

'=== START CALLs (This is the script's logic.)
Dim objWSH
Set objWSH = CreateObject("WScript.Shell")

NAMProductKey = ""
NAMProductName = ""
NAMVersion = "" 

Call GetNAMKey()

If Not (NAMProductKey = "") Then
    If (NAMVersion < "3.1.05170") Then
        Call UninstallUNI

        NAMProductKey = ""
        NAMProductName = ""
        NAMVersion = "" 

        Call GetNAMKey()

        If (NAMProductKey = "") Then
            'Now we need to produce "msiexec.exe /a "Msi file.msi" /quiet /norestart" for a silent MSI install
            objWSH.Run "msiexec.exe /i " + Chr(34) + "C:\Users\sek\Music\Cisco ISE\AnyConnect Network Access Manager\anyconnect-nam-win-3.1.05170-k9.msi" + Chr(34) + " /quiet /norestart"
        End If
    End If
Else
    'Now we need to produce "msiexec.exe /a "Msi file.msi" /quiet /norestart" for a silent MSI install
    objWSH.Run "msiexec.exe /i " + Chr(34) + "C:\Users\sek\Music\Cisco ISE\AnyConnect Network Access Manager\anyconnect-nam-win-3.1.05170-k9.msi" + Chr(34) + " /quiet /norestart"
End If

Upvotes: 0

Views: 64

Answers (1)

Syberdoor
Syberdoor

Reputation: 2619

Unless you have very specific knowledge about how Cisco names it's versions you can not compare them like this.

The method you are using is a string compare which follows some lexicographic standard rules. Because of that a version umber like 3.2 will be considered greater than 3.10.

In order to fix this you will have to split the string with '.' as delimiter and compare the subversion numbers independently.

However this is more a general observation and not the direct reason for the wrong evaluation. I think the reason for that lies within your GetStringValue call. According to the API this method can not return 2 values at once, so I am a bit puzzled how this is even executed without error. It explains however why the version number is not returned correctly. You would need a second GetStringValue call for that.

Upvotes: 2

Related Questions