2016-04-27 5 views
2

Der Versuch, ein Skript zu schreiben, das in WinPE ausgeführt wird, erhält im Wesentlichen die IP-Adresse des lokalen Hosts und wählt eine Aktion basierend auf dem IP-Bereich aus.Zerlegung einer Zeichenfolge in Array-Fehler

In Windows läuft das Skript fehlerfrei. Doch in WinPE, erhalte ich folgende Fehlermeldung:

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

Google-fu sagt mir, dass etwas mit meinem Array außerhalb des Bereichs zu tun hat, zu sein. Hier dachte ich, ich hätte ein gutes Verständnis, aber anscheinend nicht.

Code, wie funktioniert, ist unter 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)) 

Nun, wenn ich die Erklärung des AIP-Array eine der folgenden ändern:

aIP() 
aIP(4) 

und laufen

aIP = Split(sIP, ".") 

Ich bekomme

script.vbs(26, 1) Microsoft VBScript runtime error: Type mismatch

Ändern der Array-Zuordnung/Trennlinie zu

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

Ergebnisse in

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

So bin ich offensichtlich etwas falsch zu machen.

Es ist auch durchaus möglich, dass meine ursprüngliche Fehlermeldung zu meinem Array-Bereich völlig unabhängig ist, und WinPE wird meinen Skript gerade nicht wie

(in diesem Fall, wenn jemand irgendwelche Zeiger hat, würde es geschätzt werden)

Im Moment mounte ich meine Wim, um die Installationspakete zu erhalten, um sicherzustellen, dass die WMI- und Scripting-Pakete vom ADK installiert werden.

+0

Ich verstehe nicht, Ihre erste Fehlermeldung. Es sagt Array aus Index für * Zeile 1 Spalte 1 *, die keinen Sinn macht. –

+1

Meine Vermutung ist, dass es die IP6-Adresse zurückgibt, die nichts wie eine IP4-Adresse aussieht, so dass die erwartete Aufteilung fehlschlägt, weil es nicht die vier erwarteten Oktetts gibt. Aus der Dokumentation - * Array aller IP-Adressen, die dem aktuellen Netzwerkadapter zugeordnet sind. Diese Eigenschaft kann entweder IPv6-Adressen oder IPv4-Adressen * enthalten. – Lankymart

+1

Die IPAddress bei Index 0 ist eine IP6-Adresse, die kein '.' enthält. Daher gibt' Split() 'nur ein Array zurück, das die vollständige Zeichenfolge enthält. Einfaches debuggen ist es, 'sIP' auszugeben und den Wert zu überprüfen. Ein Ansatz wäre, den Wert für "." Zuerst mit "InStr()" zu überprüfen. – Lankymart

Antwort

1

Es ist nichts falsch mit dem Code mit Ausnahme der Annahme darüber getroffen werden, was Win32_NetworkAdapterConfiguration zurückkehrt.

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 .

Da sIP eine IPv6-Adresse enthalten könnte die Split() nicht wie erwartet funktionieren. IPv6-Adressen enthalten kein . als Trennzeichen, sodass Split() ein Array zurückgibt, das nur die ursprüngliche Zeichenfolge als ersten Index enthält. Daher versucht etwas anderes zu lesen, dann wird aIP(0) ein

Microsoft VBScript runtime error:
Subscript out of range

Fehler verursachen.

Um dies zu vermeiden Verwendung InStr() zunächst für die Existenz von . in dem sIP Variable zu überprüfen, werden Sie auch durch den oAdapter.IPAddress Array iterieren müssen jede Adresse zu überprüfen, die richtigen zu bekommen, Sie IPAddress(0) nicht davon ausgehen können, wird immer sei der Richtige.

Versuchen Sie, diese

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 

Ungeprüfte auf dem iPad leider

0

Ich denke, sIP Variable eine Zeichenfolge enthält, die sich nicht gespaltet wity Begrenzer "." (ex: "somestringwithNoDOT") im ersten Fall nur 1 string

So

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

Anweisung zurückgegeben, welches nicht in Integer umgewandelt werden kann. Also kehrte i Typenkonflikt Fehler in Zeile unterhalb

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

Im zweiten Fall

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

oben Anweisung 1 Element zurück, aber AIP ist array ohne Elemente.Also diese Aussage rturned "Subscript out of range" Fehler

Lösung für dieses Problem ist zu prüfen, ob der richtige Wert vorbei zu sIP

Verwandte Themen