将字符串拆分为数组错误
Splitting String into Array Errors
尝试编写将在 WinPE 中 运行 的脚本,它基本上获取本地主机的 IP 地址并根据 IP 范围选择操作。
在 Windows 中,脚本 运行 完美无缺。但是,在 WinPE 中,我收到以下错误:
script.vbs(1,1) Microsoft VBScript runtime error: Subscript out of range
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 runtime error: Type mismatch
将数组分配/分割线更改为
aIP() = Split(sIP,".")
结果
script.vbs(26, 1) Microsoft VBScript runtime error: Subscript out of range
所以我显然做错了什么。
也完全有可能我的原始错误消息与我的数组范围完全无关,WinPE 只是不喜欢我的脚本(在这种情况下,如果有人有任何指示,将不胜感激)
目前,我正在安装我的 wim 以获取安装包,以确保从 ADK 安装了 WMI 和脚本包。
我猜 sIP
变量包含一些不能用定界符拆分的字符串 "."
(例如:"somestringwithNoDOT")
所以第一种情况
aIP = Split(sIP,".") ' Split("somestringwithNoDOT",".")
语句return仅编辑了 1 个字符串,无法转换为整数。所以我 return 在下面的行
中编辑了类型不匹配错误
iOct1 = CInt(aIP(0)) ' returns Type mismatch error
第二种情况
aIP() = Split(sIP,".") ' Split("somestringwithNoDOT",".")
上面的语句将 return 1 个元素,但是 aIP 是 array
没有元素。所以这个语句 rturned "Subscript out of range"
error
此问题的解决方案是检查传递给 sIP
的值是否正确
除了对 Win32_NetworkAdapterConfiguration
returns.
所做的假设外,代码没有任何问题
From MSDN - Win32_NetworkAdapterConfiguration class
Array of all of the IP addresses associated with the current network adapter. This property can contain either IPv6 addresses or IPv4 addresses. For more information, see IPv6 and IPv4 Support in WMI.
因为 sIP
可能包含 IPv6 地址,所以 Split()
将无法按预期工作。 IPv6 地址不包含 .
作为分隔符,因此 Split()
将 return 包含原始字符串的数组仅作为第一个索引。因此,尝试读取 aIP(0)
以外的任何内容将导致
Microsoft VBScript runtime error:
Subscript out of range
错误。
为了避免这种情况,首先使用 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 上未测试抱歉
尝试编写将在 WinPE 中 运行 的脚本,它基本上获取本地主机的 IP 地址并根据 IP 范围选择操作。
在 Windows 中,脚本 运行 完美无缺。但是,在 WinPE 中,我收到以下错误:
script.vbs(1,1) Microsoft VBScript runtime error: Subscript out of range
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 runtime error: Type mismatch
将数组分配/分割线更改为
aIP() = Split(sIP,".")
结果
script.vbs(26, 1) Microsoft VBScript runtime error: Subscript out of range
所以我显然做错了什么。
也完全有可能我的原始错误消息与我的数组范围完全无关,WinPE 只是不喜欢我的脚本(在这种情况下,如果有人有任何指示,将不胜感激)
目前,我正在安装我的 wim 以获取安装包,以确保从 ADK 安装了 WMI 和脚本包。
我猜 sIP
变量包含一些不能用定界符拆分的字符串 "."
(例如:"somestringwithNoDOT")
所以第一种情况
aIP = Split(sIP,".") ' Split("somestringwithNoDOT",".")
语句return仅编辑了 1 个字符串,无法转换为整数。所以我 return 在下面的行
中编辑了类型不匹配错误iOct1 = CInt(aIP(0)) ' returns Type mismatch error
第二种情况
aIP() = Split(sIP,".") ' Split("somestringwithNoDOT",".")
上面的语句将 return 1 个元素,但是 aIP 是 array
没有元素。所以这个语句 rturned "Subscript out of range"
error
此问题的解决方案是检查传递给 sIP
除了对 Win32_NetworkAdapterConfiguration
returns.
From MSDN - Win32_NetworkAdapterConfiguration class
Array of all of the IP addresses associated with the current network adapter. This property can contain either IPv6 addresses or IPv4 addresses. For more information, see IPv6 and IPv4 Support in WMI.
因为 sIP
可能包含 IPv6 地址,所以 Split()
将无法按预期工作。 IPv6 地址不包含 .
作为分隔符,因此 Split()
将 return 包含原始字符串的数组仅作为第一个索引。因此,尝试读取 aIP(0)
以外的任何内容将导致
Microsoft VBScript runtime error:
Subscript out of range
错误。
为了避免这种情况,首先使用 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 上未测试抱歉