将字符串拆分为数组错误

Posted

技术标签:

【中文标题】将字符串拆分为数组错误【英文标题】:Splitting String into Array Errors 【发布时间】:2016-04-27 20:28:13 【问题描述】:

尝试编写将在 WinPE 中运行的脚本,该脚本实质上获取本地主机的 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 和脚本包。

【问题讨论】:

我不明白您的第一条错误消息。这是说 Line 1 Column 1 的 Array out of subscript 没有意义。 我的猜测是它返回的 IP6 地址看起来不像 IP4 地址,因此预期的拆分失败,因为没有四个预期的八位字节。来自文档 - 与当前网络适配器关联的所有 IP 地址的数组。此属性可以包含 IPv6 地址或 IPv4 地址 索引 0 处的 IPAddress 将是一个不包含 . 的 IP6,因此 Split() 将只返回一个包含完整字符串的数组。简单的调试是写出sIP 并检查值。一种方法是首先使用InStr() 检查. 的值。 【参考方案1】:

除了假设Win32_NetworkAdapterConfiguration 返回的内容之外,代码没有任何问题。

来自MSDN - Win32_NetworkAdapterConfiguration class与当前网络适配器关联的所有 IP 地址的数组。此属性可以包含 IPv6 地址或 IPv4 地址。如需更多信息,请参阅IPv6 and IPv4 Support in WMI。

由于sIP 可能包含 IPv6 地址,Split() 将无法按预期工作。 IPv6 地址不包含. 作为分隔符,因此Split() 将返回一个仅包含原始字符串作为第一个索引的数组。因此,尝试阅读除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 测试

【讨论】:

【参考方案2】:

我猜sIP 变量包含一些不能用分隔符"." 分割的字符串(例如:“somestringwithNoDOT”)

所以在第一种情况下

aIP = Split(sIP,".")   ' Split("somestringwithNoDOT",".")

语句只返回 1 个字符串,不能转换为 Integer。所以我在下面的行中返回了类型不匹配错误

iOct1 = CInt(aIP(0))  ' returns Type mismatch error

第二种情况

aIP() = Split(sIP,".")  ' Split("somestringwithNoDOT",".")

上面的语句将返回 1 个元素,但 aIP 是 array,没有元素。所以这个语句rturn了"Subscript out of range"错误

此问题的解决方法是检查是否将正确的值传递给sIP

【讨论】:

以上是关于将字符串拆分为数组错误的主要内容,如果未能解决你的问题,请参考以下文章

将字符串拆分为字符串数组[重复]

将数组拆分为字符串[关闭]

将字符串拆分为字符串数组

将字符串拆分为对象数组

将数组拆分为字符串

将逗号分隔的字符串拆分为数组?