web-dev-qa-db-ja.com

バッチ-WMICとnetshを使用したインデックスに基づいてネットワークインターフェイスの名前を変更する

インデックス番号に基づいて名前を変更する必要がある2つのIntelNICがあります。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に変更されます。

2
Sam Martin

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

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

これは、netshコマンドの後にIF/ELSE比較を追加することにより、3つ以上の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を使用したネットワークアダプタの名前変更に関するドキュメントでは、名前と新しい名前の値を二重引用符で囲むことを明示的に指定しています。ただし、Windows用の昇格されたCMDプロンプトXPから実行/呼び出されないバッチファイルでこれを行うと、コマンドが中断され、「この名前のインターフェイスはルーターに登録されていません」と返されます。どういうわけか、二重引用符のないこのまったく同じコマンドは、問題なくアダプタ名を変更します。 NetConnectionIdがスペースを付けて返されると、スクリプトが失敗するという問題が発生します。スペースを含む名前ではなく、NICの名前をLAN1/LAN2に変更して、マスターイメージをフリートにデプロイできるため、この動作は実際には許容できます。次に、実際の金属に対して、展開後にインデックスベースの再構成を実行します。

0
Sam Martin