windows - VBScript 中的字符串比较

标签 windows vbscript string-comparison nagios

我写了一张支票Nagios检测当前安装的 Java 版本是否是最新的或者是否有要应用的更新。

首先,我获取当前安装的 Java 版本(使用我发现的一些代码来检索当前安装的版本)和最新的可用版本(使用文档 http://java.com/applet/JreCurrentVersion2.txt )。 然后我使用正则表达式(结果:$1.$2.$3)将它们转换为相同的样式,例如:

7.0.25

当通过Wscript.Echo打印转换后的版本时,我可以看到,两者是相同的,但字符串比较运算符StrComp()总是返回false,如果字符串相同或不同。 安装旧版本后,我得到

Critical: Java Version 7.0.24 - available: 7.0.25

这是有意的,但有了正确的版本我也得到了

Critical: Java Version 7.0.25 - available: 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

最佳答案

o.responseText 有一个尾随换行符,因此您实际上是将 7.0.257.0.25\r\n 进行比较,这显然不相等。您可以使用以下内容显示尾随换行符:

>>> <b>WScript.Echo "_" & o.responseText & "_"</b>
_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")

关于windows - VBScript 中的字符串比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17215660/

相关文章:

javascript - VBScript 在加载时设置值

MIPS - 将输入字符串与存储在内存中的字符串进行比较

php - 如何在 PHP 中查找 Windows 和 Linux 上的用户主目录

windows - 如何解决 Windows 计划任务未运行的问题?

powershell - 使用 Task Scheduler 运行脚本,用户上下文完全静默,没有弹出窗口或 cmd 闪烁

vbscript - 批量关闭大写锁定 - 替代方案

.net - 在这种情况下,StringComparer.CurrentCulture 是正确的选择吗?

matlab - 如何判断一个字符串是否代表一个整数?

windows - 是什么导致 GetCursorPos 返回不正确的 {0,0} 坐标?

c - 安装 minGW 后,无法识别 gcc 命令