WMIC と netsh によるインデックスに基づくネットワーク インターフェイスの MName バッチ

WMIC と netsh によるインデックスに基づくネットワーク インターフェイスの MName バッチ

インデックス番号に基づいて名前を変更する必要がある Intel NIC が 2 つあります。WMIC は、常にインデックス番号を数値順に返すため、結果を並べ替えたり比較操作を実行したりすることなく、出力を直接取得できるという点で便利です。

残念ながら、FOR ループ内で netsh を使用してインデックス タグの変数を使用してインターフェイス情報を表示すると、「無効なインデックス」が返されるという問題に遭遇しています。問題は、ファイル処理ではなくコマンド処理に切り替えるために FOR /F でバック クォートを使用する必要があることにあると思います。誰かが単純な間違いを指摘したり、私がしようとしていることに対してより明確な解決策を提示したりできることを願っています。コードは次のとおりです。

SET INTERFACENAME=LAN1
FOR /F "skip=1 tokens=1 delims=" %%a in (
    'WMIC path Win32_NetworkAdapter where "Manufacturer='Intel'" get index'
) do (
    call :sub1 %%a
)

:sub1
:: %1 = index
FOR /F "skip=2 tokens=1,2 delims=:" %%b in (
    'netsh interface ip show interface index=%index%'
) do (
    if "%%b"=="User-friendly Name" (
        netsh interface set interface name = "%%c" newname = "%INTERFACENAME%" && set INTERFACENAME=LAN2 && exit /b
    )
)

最初の FOR ループは正しく解決され、サブルーチンにインデックス番号を渡しますが、2 番目のサブルーチンの netsh コマンドは無効なインデックスを返します。サブルーチンの残りのコードはまだテストされていないため、INTERFACENAME 変数が正しく更新されているかどうかはわかりません。理想的には、このプロセス全体が 2 回実行され、WMIC コマンドの最初の結果が LAN1 に、WMIC コマンドの 2 番目の結果が LAN2 に名前変更されます。

答え1

適切なネットワーク インターフェイスの情報を照会するために、WMIC のみを使用してスクリプトを書き直すことができました。

このスクリプトは、ipenabled ステータスが true に設定されているネットワーク アダプターを WMI に照会することで機能します。これにより、実際のイーサネット アダプターではないすべてのインターフェイスが除去されます。次に、出力の最初の行 (実際のイーサネット アダプターの最小のインデックス番号) を保存し、それを 2 番目の WMI クエリに渡します。次に、インデックス番号を使用して、アダプターの実際の構成名である netconnectionid を取得します (「IE Local Area Connection 1」)。次に、netconnectionid を netsh コマンドに渡して、その特定のアダプターの構成を変更できます。次に、exit /b を介して最初の FOR ループに制御を戻し、次のインデックス番号を取得して、このプロセスを繰り返します。

これは、netsh コマンドの後に IF / ELSE 比較を追加することで、2 つ以上の NIC に拡張できます。開始時の NEWNICNAME 値は、最も低いインデックスに適用される名前になります。IF / ELSE 比較後の NEWNICNAME 設定行は、報告された次の最も低いインデックスに適用されます。スーパー アマチュア コードは次のとおりです。

set NEWNICNAME=Internet
FOR /F "skip=1 tokens=1 delims=" %%a in (
    'wmic path Win32_NetworkAdapterConfiguration where 'ipenabled^="true"' get index'
    ) do (
    set index=%%a && Call :sub1
)

:sub1
FOR /F "skip=1 tokens=1 delims=" %%b in (
    'wmic path Win32_NetworkAdapter where index^=%index% get NetConnectionId'
) do (
    set OGNICNAME=%%b
)
netsh interface set interface name=%OGNICNAME% newname=%NEWNICNAME%
if %NEWNICNAME%==InternalLAN (
    GOTO EOL
) else (
    set NEWNICNAME=InternalLAN
)
exit /b

ただし、XP ではこれに関して大きな問題があります。netsh を使用したネットワーク アダプターの名前変更に関するドキュメントでは、name 値と newname 値を二重引用符で囲むことが明示的に指定されています。ただし、Windows XP の管理者特権の CMD プロンプトから実行/呼び出されていないバッチ ファイルでこれを行うと、コマンドが壊れて、「この名前のインターフェイスはルーターに登録されていません」というメッセージが表示されます。どういうわけか、この同じコマンドを二重引用符なしで実行すると、問題なくアダプター名が変更されます。問題は、NetConnectionId がスペース付きで返された場合、スクリプトが失敗するという点です。この動作は、私のインスタンスでは実際に許容できます。両方の NIC をスペース付きの名前ではなく LAN1 / LAN2 に名前変更してマスター イメージをフリートに展開できるためです。次に、実際のメタルで展開後にインデックス ベースの再構成を実行します。

答え2

遅延変数拡張なしでは、Sam Martin のバッチ スクリプトを動作させることができませんでした。

これは、DNSサーバーを特定のアドレスに設定するために使用したスクリプトに似ています。 クイックセットDNS

@echo off
setlocal EnableDelayedExpansion
Pushd "%~dp0"

goto start

:Trim
set Params=%*
for /f "tokens=1*" %%a in ("!Params!") do EndLocal & set %1=%%b
exit /b

:exitProg
echo.
echo Operations were completed successfully for any connected network adapters.
echo.
pause
exit

:start 
echo Looking up connected network adapters...
set NICNAME=""

FOR /F "skip=1 tokens=1 delims=" %%a in (
    'wmic path Win32_NetworkAdapterConfiguration where 'ipenabled^="true"' get index'
    ) do (
    set indexMain=%%a
    set indexMainS=!indexMain!
    set index=!indexMainS: =!
    
    set indexTrim=""
    call :Trim indexTrim !index!
    
    if not "!indexTrim!"=="" (
        REM echo Index is !index!
        Call :sub1
    )
)

goto exitProg

:sub1
FOR /F "skip=1 tokens=1 delims=" %%b in (
    'wmic path Win32_NetworkAdapter where index^=%index% get NetConnectionId'
) do (
    set OGNICNAME=%%b
    set NICNAME=!OGNICNAME!
    set NICNAMETRIM=""
    set containerStr=
    call :Trim NICNAMETRIM !NICNAME!
    if not "!NICNAMETRIM!"=="" (
        REM echo calling findstring
        echo !NICNAMETRIM! | findstr /b /l "VirtualBox">temp.txt
        set /p containerStr=<temp.txt
        del temp.txt
        REM echo containerStr is !containerStr!
        if "!containerStr!" == "" (
            echo. 
            echo Network adapter connected to the internet is named "!NICNAMETRIM!"
            echo Calling QuickSetDNS on "!NICNAMETRIM!"
            QuickSetDNS.exe /SetDNS "{IPv4_ONE_ADDR_HERE},{IPv4_TWO_ADDR_HERE}" "!NICNAMETRIM!"
            QuickSetDNS.exe /SetDNS6 "{IPv6_ONE_ADDR_HERE},{IPv6_TWO_ADDR_HERE}" "!NICNAMETRIM!"
        )
    )
)

関連情報