尝试编写将在WinPE中运行的脚本,该脚本基本上获取localhost的IP地址,并根据IP范围选择操作。
在Windows中,脚本运行完美。但是,在WinPE中,我收到以下错误:
script.vbs(1,1)Microsoft VBScript运行时错误:下标超出范围
Google-fu告诉我,这与我的阵列超出范围有关。在这里,我认为我有一个很好的理解,但显然不是。
在Windows上按原样运行的代码:
Option Explicit
Dim sIP, sHostname,sPingBat
Dim aIP
Dim iOct1, iOct2, iOct3, iOct4, iReturn
Dim oWMIService, oCmd, oAdapter
Dim cAdapters
iReturn = 999
sHostname = "."
Set oWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sHostname & "\root\cimv2")
Set cAdapters = oWMIService.ExecQuery("Select IPAddress from Win32_NetworkAdapterConfiguration Where IPEnabled = True")
Set oCmd = CreateObject("Wscript.Shell")
For Each oAdapter in cAdapters
If Not IsNull(oAdapter.IPAddress) Then
sIP = Trim(oAdapter.IPAddress(0))
Else
iReturn = 404
WScript.Quit iReturn
End If
Next
sIP = CStr(sIP)
aIP = Split(sIP, ".")
iOct1 = CInt(aIP(0))
iOct2 = CInt(aIP(1))
iOct3 = CInt(aIP(2))
iOct4 = CInt(aIP(3))
现在,如果我将aIP数组的声明更改为以下任一项:
aIP()
aIP(4)
并运行
aIP = Split(sIP, ".")
我得到了
script.vbs(26,1)Microsoft VBScript运行时错误:类型不匹配
将数组赋值/分割线更改为
aIP() = Split(sIP,".")
结果
script.vbs(26,1)Microsoft VBScript运行时错误:下标超出范围
所以我显然做错了什么。
我的原始错误消息完全可能与我的数组范围完全无关,而WinPE只是不喜欢我的脚本(在这种情况下,如果有人有任何指针,我们将不胜感激)
目前,我正在安装我的wim以获取安装包,以确保从ADK安装WMI和Scripting包。
答案 0 :(得分:1)
除了假设Win32_NetworkAdapterConfiguration
返回的内容之外,代码没有任何问题。
来自MSDN - Win32_NetworkAdapterConfiguration class
与当前网络适配器关联的所有IP地址的数组。此属性可以包含IPv6地址或IPv4地址。有关详细信息,请参阅IPv6 and IPv4 Support in WMI。
由于sIP
可能包含IPv6地址,Split()
将无法正常工作。 IPv6地址不包含.
作为分隔符,因此Split()
将返回一个包含原始字符串的Array作为第一个索引。因此,尝试阅读aIP(0)
以外的任何内容都会导致
Microsoft VBScript运行时错误:
下标超出范围
错误。
为避免这种情况,首先使用InStr()
检查.
变量中是否存在sIP
,您还需要遍历oAdapter.IPAddress
数组以检查每个要获得正确的地址,您不能认为IPAddress(0)
始终是正确的。
试试这个
Dim ips, ip
For Each oAdapter in cAdapters
ips = oAdapter.IPAddress
If IsArray(ips) Then
For Each ip In ips
If InStr(1, ip, ".") > 0 Then
sIP = Trim(ip)
Exit For
End If
Next
If Len(sIP) > 0 Then Exit For
Else
iReturn = 404
WScript.Quit iReturn
End If
Next
在iPad上未经测试抱歉
答案 1 :(得分:0)
我猜$(this).css('color', 'red');
变量包含一些不能拆分的字符串wity delimiter sIP
(例如:" somestringwithNoDOT")
所以在第一种情况下
"."
语句只返回1个字符串,不能转换为Integer。所以我在下面的行中返回了类型不匹配错误
aIP = Split(sIP,".") ' Split("somestringwithNoDOT",".")
在第二种情况下
iOct1 = CInt(aIP(0)) ' returns Type mismatch error
上面的语句将返回1个元素,但aIP是aIP() = Split(sIP,".") ' Split("somestringwithNoDOT",".")
,带有NO元素。所以此声明rtur array
错误
此问题的解决方法是检查正确的值是否传递到"Subscript out of range"