为什么我的 VBScript 抛出九个弹出窗口而不是一个?

Why is my VBScript throwing nine Pop Ups instead of one?

我有一台 Win7 64 位 Windows 专业笔记本电脑。我有一个从网上获取的 VB 脚本,经过某些改动后,我试图让笔记本电脑上的所有适配器都达到 Link 的速度。 Vb 脚本似乎可以正常工作,只是我必须输入 9 次才能获得所有实例的完整列表。这意味着当我双击脚本时,弹出窗口只显示一个实例。当我再次按 Enter 时,它会显示第一个和第二个,同样直到我按 Enter,九次,我在一个弹出窗口中得到完整列表。我知道这在使用 CScript 的命令提示符下是可能的,但我更喜欢获得单个弹出窗口。我在 VB 脚本方面不是很全能,但我愿意学习。我错过了什么吗?任何帮助将不胜感激。这是我的脚本。

strComputer = "."
strRslt = Wscript.ScriptName _
    & vbTab & "Computer Information " & vbcr _ 
Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\WMI")
Set colItems = objWMIService.ExecQuery("SELECT * FROM MSNdis_LinkSpeed" ,,48)  
For Each objItem in colItems
strRslt = strRslt & vbNewLine  _
& "InstanceName: " & vbTab & objItem.InstanceName & vbcr _
& "NdisLinkSpeed: " & vbTab & objItem.NdisLinkSpeed/10 & " kbps" 
msgbox strRslt,&h51000, "speed"
Next

因为变量 strRslt 将数据信息填充到 for .. 下一个循环中

因此,在这种情况下,您应该在 Next 之后而不是在循环内编写 MsgBox

strComputer = "."
strRslt = Wscript.ScriptName & vbTab & "Computer Information"
Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\WMI")
Set colItems = objWMIService.ExecQuery("SELECT * FROM MSNdis_LinkSpeed" ,,48)  
For Each objItem in colItems
    strRslt = strRslt & vbNewLine & _
    "InstanceName: " & vbTab & objItem.InstanceName & vbcrlf & _
    "NdisLinkSpeed: " & vbTab & objItem.NdisLinkSpeed/10 & " kbps" 
Next
MsgBox strRslt,vbInformation+&h51000, "speed"

这个问题很简单,很多人在刚开始使用 VBScript 或其他类似语言时都会遇到这个问题。

For Each 语句将遍历对象列表,直到到达列表末尾,在本例中为九个对象实例。该命令的结构使得 ForNext 块中的任何命令都将针对由 Each 之后的变量标识的当前实例执行。 由于 MsgBox() 函数在 For 中是 运行,它将针对每个对象实例显示。

如果您没想到这一点,简单的解决方法是将 MsgBox() 移出循环。

For Each objItem in colItems
    strRslt = strRslt & vbNewLine  _
    & "InstanceName: " & vbTab & objItem.InstanceName & vbcr _
    & "NdisLinkSpeed: " & vbTab & objItem.NdisLinkSpeed/10 & " kbps"
Next
msgbox strRslt,&h51000, "speed"