【发布时间】:2014-06-30 19:46:53
【问题描述】:
执行以下 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”转换为double值,而是将其转换为24!看起来像点“。”转换时丢失了,这是怎么回事? CDbl有BUG还是使用时违规?
这是脚本
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
【问题讨论】:
-
您是否检查过有多少 Win32_BIOS 对象被返回到
biosSet? -
哎呀,我应该放这个 --> StdOut.WriteLine "Return value is: " & IsNewBiosVersion, 在循环中,但是没有坏处,因为在两个系统中,只有一个 Win32_BIOS 对象是返回biosSet