2013-06-20 3 views
1

Я написал чек для Nagios, чтобы определить, установлена ​​ли в настоящее время версия Java, или если есть Обновления, которые необходимо применить.Сравнение строк в VBScript

Сначала я получаю как установленную в настоящее время версию Java (используя некоторый код, который я нашел для получения установленной версии), так и новейшую доступную версию (используя документ http://java.com/applet/JreCurrentVersion2.txt). Тогда я трансформировать их с помощью регулярных выражений (результат: $ 1. $ 2. $ 3) в том же стиле, например:

7.0.25

При печати преобразованные версии через Wscript. Echo Я вижу, оба они идентичны, но оператор сравнения строк StrComp() всегда возвращает false, если строки равны или различны. С старой версии установлен я получаю

Critical: Java Version 7.0.24 - доступен: 7.0.25

, который предназначен, но с правильной версией я также получаю

Critical: Java Version 7.0.25 - доступен: 7.0.25

вместо

OK: Java Version 7.0.25

Я прикрепил полный сценарий вниз ниже:

check_java.vbs

On Error Resume Next 

CONST rOK = 0 
CONST rWarning = 1 
CONST rCritical = 2 
CONST rUnknown = 3 

blnJavaInstalled = False 
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
Set colProducts = objWMIService.ExecQuery("SELECT Version FROM Win32_Product") 
For Each objProduct in colProducts 
    If Err.Number = 0 Then 
    If (InStr(UCase(objProduct.Name),"JAVA") And Not InStr(UCase(objProduct.Name),"UPDATER")) Then 
     blnJavaInstalled = True 
     version = objProduct.Version 
    End If 
    End If 
Next 
If blnJavaInstalled <> True Then 
    Wscript.Echo "No Java found." 
    Wscript.Quit(rUnknown) 
End If 

Set objRegEx = CreateObject("VBScript.RegExp") 
objRegEx.Global = True 
objRegEx.IgnoreCase = True 
objRegEx.Pattern = "([0-9]+)\.([0-9]+).([0-9]*[1-9])0*" 

curVersion = objRegEx.Replace(version, "$1.$2.$3") 

Dim o 
Set o = CreateObject("MSXML2.XMLHTTP") 
o.open "GET", "http://java.com/applet/JreCurrentVersion2.txt", False 
o.send 

Set objRegEx = CreateObject("VBScript.RegExp") 
objRegEx.Global = True 
objRegEx.IgnoreCase = True 
objRegEx.Pattern = "1\.([0-9]+)\.([0-9]+)_([0-9]+)" 

newVersion = objRegEx.Replace(o.responseText, "$1.$2.$3") 

If StrComp(curVersion, newVersion) Then 
    Wscript.Echo "OK: Java Version " & curVersion 
    Wscript.Quit(rOK) 
Else 
    Wscript.Echo "Critical: Java Version " & curVersion & " - available: " & newVersion 
    Wscript.Quit(rCritical) 
End If 

ответ

1

o.responseText имеет завершающую новую линию, поэтому вы фактически сравниваете 7.0.25 с 7.0.25\r\n, что, очевидно, не равно. Вы можете раскрыть заднюю строку с чем-то вроде этого:

>>> WScript.Echo "_" & o.responseText & "_" 
_7.0.25 
_

Либо изменить второе регулярное выражение

objRegEx.Pattern = "1\.([0-9]+)\.([0-9]+)_([0-9]+)[\s\S]*" 

или удалить строку из o.responseText перед выполнением замены регулярных выражений:

newVersion = objRegEx.Replace(Replace(o.responseText, vbNewLine, ""), "$1.$2.$3") 
+0

Спасибо, это была та часть, которую я искал. – Salandas

1

StrComp возвращает 0 (False), если сравниваемые строки равны. Поэтому переключите ветви вашего оператора If. Поскольку вам не интересно, какая из строк больше или меньше, подумайте об использовании оператора = (меньше риска ошибки).

+0

Я тоже экспериментировал с этим, но поскольку строки всегда были разными (см. Отмеченные ответы), я не мог решить проблему с вставкой «= 0» в StrComp, поэтому я верю d изменений, которые я сделал.С решением в другом ответе и вашей информации я получил его работу. Спасибо – Salandas