2

基本的にローカルホストの IP アドレスを取得し、IP 範囲に基づいてアクションを選択する、WinPE で実行されるスクリプトを作成しようとしています。

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 がスクリプトを気に入らない可能性も十分にあります (その場合、誰かがポインターを持っている場合は、それを歓迎します)。

現在、WMI とスクリプト パッケージが ADK からインストールされていることを確認するために、wim をマウントしてインストール パッケージを取得しています。

4

2 に答える 2

1

Win32_NetworkAdapterConfigurationが返されるかについて仮定が行われていることを除いて、コードに問題はありません。

MSDN より - Win32_NetworkAdapterConfiguration クラス現在
のネットワーク アダプタに関連付けられているすべての IP アドレスの配列。このプロパティーには、IPv6 アドレスまたは IPv4 アドレスのいずれかを含めることができます。詳細については、「WMI での IPv6 および IPv4 のサポート」を参照してください。

sIPIPv6 アドレスが含まれている可能性があるためSplit()、期待どおりに動作しません。.IPv6 アドレスには区切り文字が含まれないためSplit()、最初のインデックスのみとして元の文字列を含む配列が返されます。したがって、それ以外のものを読み取ろうとaIP(0)すると、

Microsoft VBScript ランタイム エラー:下付き
文字が範囲外です

エラー。

最初に変数内のInStr()の存在をチェックするためにこの使用を避けるには、配列を反復処理して正しいアドレスを取得するために各アドレスをチェックする必要があります。常に正しいアドレスであるとは限りません。.sIPoAdapter.IPAddressIPAddress(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 で未テスト

于 2016-04-28T09:23:01.970 に答える
0

sIP変数には区切り文字で分割できない文字列が含まれていると思います"."(例:「somestringwithNoDOT」)

したがって、最初のケースでは

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

ステートメントは、整数に変換できない 1 つの文字列のみを返しました。だから私は以下の行で型の不一致エラーを返しました

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

2番目のケースでは

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

上記のステートメントは 1 つの要素を返しますが、aIP には要素がありませんarray。したがって、このステートメントは "Subscript out of range"エラーを返しました

この問題の解決策は、正しい値が に渡されているかどうかを確認することです。sIP

于 2016-04-27T23:47:18.760 に答える