为什么我的 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
语句将遍历对象列表,直到到达列表末尾,在本例中为九个对象实例。该命令的结构使得 For
和 Next
块中的任何命令都将针对由 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"
我有一台 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
语句将遍历对象列表,直到到达列表末尾,在本例中为九个对象实例。该命令的结构使得 For
和 Next
块中的任何命令都将针对由 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"