执行以下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
答案 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上运行。