将字符串拆分为数组错误

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 上未测试抱歉