2016-04-27 2 views
2

Попытка написать скрипт, который будет запущен в WinPE, который по существу получает IP-адрес локального хоста и выбирает действие на основе диапазона IP.Разбиение строки на ошибки в массиве

В Windows скрипт работает безупречно. Однако, в WinPE, я получаю следующее сообщение об ошибке:

script.vbs(1,1) Microsoft VBScript runtime error: Subscript out of range

Google-фу говорит мне, что есть что-то делать с моим массив находясь вне диапазона. Здесь я думал, что у меня хорошее понимание, но, видимо, нет.

код, который работает как на 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, чтобы установить пакеты установки, чтобы убедиться, что пакеты WMI и Scripting установлены из ADK.

+0

Я не понимаю ваше первое сообщение об ошибке. Он говорит, что Array из индекса для * Line 1 Column 1 * не имеет смысла. –

+1

Я предполагаю, что он возвращает IP6-адрес, который не похож на IP4-адрес, поэтому ожидаемое разделение не выполняется, потому что нет четырех ожидаемых октетов. Из документации - * Массив всех IP-адресов, связанных с текущим сетевым адаптером. Это свойство может содержать либо адреса IPv6, либо адреса IPv4 *. – Lankymart

+1

IPAddress в индексе 0 будет IP6, который не содержит '.', поэтому' Split() 'просто вернет массив, содержащий полную строку. Простая отладка заключается в том, чтобы выписать 'sIP' и проверить значение. Один из подходов - проверить значение для '.' сначала, используя' InStr() '. – Lankymart

ответ

1

Там нет ничего плохого с кодом, за исключением предположений делаются о том, каком Win32_NetworkAdapterConfiguration возвращается.

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() вернет массив, содержащий исходную строку только в качестве первого индекса. Поэтому при попытке чтения что-нибудь другое, то 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 

UNTESTED на IPad жаль

0

Я думаю sIP переменная содержит строку, которая не может быть расщепленной wity DELIMITER "." (например: "somestringwithNoDOT")

Таким образом, в 1-ом случае

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

заявление вернулся только 1 строка, который не может быть закрыт для Integer. Таким образом, я возвратил ошибку несоответствия типов в строке ниже

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

Во 2-м случае

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

выше заявление будет возвращать 1 элемент, но AIP является array без элементов.Так что это утверждение rturned "Subscript out of range" ошибки

Разрешения этой проблемы, чтобы проверить, является ли правильное значение перехода к sIP

Смежные вопросы