2014-12-16 6 views
0

Запуск этой проблемы. Попытка удалить всю предыдущую версию программы с использованием инструкции меньше и установить новую версию. Он не распознает меньше и будет продолжать удалять и переустанавливать новейшую версию каждый раз.Операции «Менее» не оцениваются

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 
+2

Какова ценность 'NAMVersion' перед сравнением? –

ответ

2

Если у вас нет особых знаний о том, как Cisco называет его версиями, вы не можете сравнивать их так.

Метод, который вы используете, представляет собой сравнение строк, которое следует некоторым нормам лексикографического стандарта. Из-за этого версия umber как 3.2 будет считаться более 3.10.

Чтобы исправить это, вам придется разделить строку на «.». в качестве разделителя и независимо сравнивать числа подрывной деятельности.

Однако это более общее наблюдение, а не прямая причина неправильной оценки. Я думаю, что причина этого заключается в вызове GetStringValue. According to the API этот метод не может сразу вернуть 2 значения, поэтому я немного озадачен тем, как это выполняется даже без ошибок. Однако объясняется, почему номер версии не возвращается правильно. Для этого вам понадобится второй вызов GetStringValue.

Смежные вопросы