VBS脚本返回预期结果,如何比较浮点值?

时间:2014-06-25 11:21:05

标签: vb.net windows vbscript

执行以下VB脚本时,我得到了一个有趣的结果。

Set StdOut = WScript.StdOut
Set wbemSvc = GetObject("winmgmts://" & "." & "/root/cimv2")
Set biosSet = wbemSvc.ExecQuery("Select * from Win32_BIOS")

For Each biosObj In biosSet
  StdOut.WriteLine "SMBIOSMajorVersion=" & biosObj.SMBIOSMajorVersion
  StdOut.WriteLine "SMBIOSMinorVersion=" & biosObj.SMBIOSMinorVersion
Next

  StdOut.WriteLine "Return value is: " & IsNewBiosVersion

Function IsNewBiosVersion()

  On Error Resume Next
  Set biosSet = wbemSvc.ExecQuery("Select * from Win32_BIOS")

  newBios = 0
  For Each bios In biosSet
    minorFloat = "." & bios.SMBIOSMinorVersion
    If bios.SMBIOSMajorVersion > 2 OR (bios.SMBIOSMajorVersion = 2 AND minorFloat >= .6) Then
      newBios = 1
    End If
  Next
  IsNewBiosVersion = newBios

End Function

结果如下。这看起来很矛盾,因为SMBIOSMinorVersion = 4,根据脚本中的代码逻辑,返回值应为0 !!!

SMBIOSMajorVersion=2
SMBIOSMinorVersion=4
Return value is: 1

我在另一个系统上运行了相同的脚本并获得了预期的正确结果。

SMBIOSMajorVersion=2
SMBIOSMinorVersion=4
Return value is: 0

那么这里有什么问题?

新更新:

我们在系统上再次执行以下脚本,发现CDbl()函数没有转换字符串" 2.4"正确地加倍值,而不是将其转换为24!看起来像点"。"在转换时丢失了,这有什么问题? CDbl中的错误或使用时的违规行为?

这是脚本

Set StdOut = WScript.StdOut
StdOut.WriteLine ""
StdOut.WriteLine "Simple Function to Test BIOS Version"
StdOut.WriteLine ""
Set wbemSvc = GetObject("winmgmts://" & "." & "/root/cimv2")
Set biosSet = wbemSvc.ExecQuery("Select * from Win32_BIOS")

For Each bios In biosSet
  newBios = 0
  StdOut.WriteLine "SMBIOSMajorVersion=" & bios.SMBIOSMajorVersion
  StdOut.WriteLine "SMBIOSMinorVersion=" & bios.SMBIOSMinorVersion
  temp = bios.SMBIOSMajorVersion & "." & bios.SMBIOSMinorVersion
  StdOut.WriteLine "major dot minor=" & temp

  currentBios = CDbl(bios.SMBIOSMajorVersion & "." & bios.SMBIOSMinorVersion)
  StdOut.WriteLine ""
  StdOut.WriteLine "currentBios=" & currentBios
  If currentBios >= 2.6 Then newBios = 1
  StdOut.WriteLine "return value is: " & newBios
Next

这是输出

Simple Function to Test BIOS Version

SMBIOSMajorVersion=2
SMBIOSMinorVersion=4
major dot minor=2.4

currentBios=24
return value is: 1

2 个答案:

答案 0 :(得分:2)

删除您的错误处理 - 它可能会抑制问题。

On Error Resume Next ' Not a good idea

首先,您要在这些行中将字符串与double进行比较:

minorFloat = "." & bios.SMBIOSMinorVersion
If bios.SMBIOSMajorVersion > 2 OR (bios.SMBIOSMajorVersion = 2 AND minorFloat >= .6) Then

答案 1 :(得分:1)

为什么不直接将major.minor值转换为浮点数进行测试?您目前正在进行两项单独的测试,其中一项是字符串与浮点数比较,这是不寻常的。

也许试试这个?

currentBios = CDbl(bios.SMBIOSMajorVersion & "." & bios.SMBIOSMinorVersion)

If currentBios >= 2.6 Then newBios = 1

在涉及数学运算时,您必须小心比较浮点值,但对于字面值,您可以没事。

并且,正如已经提到的,删除On Error Resume Next或者您可能永远不知道为什么它在一台PC上运行而在另一台PC上运行。