MПереименование сетевых интерфейсов на основе индекса с помощью WMIC и netsh с помощью Batch

MПереименование сетевых интерфейсов на основе индекса с помощью WMIC и netsh с помощью Batch

У меня есть две сетевые карты Intel, которые мне нужно переименовать на основе их индексных номеров. WMIC хорош тем, что он всегда возвращает индексные номера в числовом порядке, поэтому мы можем получить выходные данные напрямую, без необходимости сортировки или выполнения каких-либо операций сравнения результатов.

К сожалению, я столкнулся с проблемой, когда в цикле FOR я использую netsh для отображения информации об интерфейсе с помощью переменной в теге index, он возвращает "Invalid index". Я считаю, что проблема в необходимости использования обратных кавычек в 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 разрешается правильно и передает индексный номер в подпрограмму, но команда netsh во второй подпрограмме возвращает Invalid index. Остальной код в подпрограмме еще не тестировался, поэтому я не уверен, что переменная INTERFACENAME обновляется правильно. В идеале весь этот процесс должен проходить через дваждые переименование первого результата команды WMIC в LAN1 и второго результата команды WMIC в LAN2.

решение1

Мне удалось переписать скрипт только с использованием WMIC для запроса информации о соответствующих сетевых интерфейсах.

Скрипт работает, запрашивая WMI для сетевых адаптеров, чей статус ipenabled установлен на true. Это отсеивает все интерфейсы, которые не являются фактическими адаптерами Ethernet. Затем мы сохраняем первую строку вывода (наименьший индексный номер для фактического адаптера Ethernet) и передаем ее во второй запрос WMI. Который, в свою очередь, использует индексный номер для получения netconnectionid, который является фактическим настроенным именем адаптера "IE Local Area Connection 1". Затем мы можем передать netconnectionid команде netsh для изменения конфигурации этого конкретного адаптера. Затем мы передаем управление обратно в первый цикл FOR через exit /b, чтобы извлечь наш следующий индексный номер и повторить процесс снова.

Это можно расширить для более чем двух сетевых карт, добавив больше сравнений IF / ELSE после команды netsh. Значение NEWNICNAME в начале будет именем, примененным к самому низкому индексу. Строка set NEWNICNAME после сравнения IF / ELSE будет применена к следующему низкому сообщенному индексу. Супер любительский код выглядит следующим образом:

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. Однако выполнение этого в пакетном файле, который не запускается/не вызывается из командной строки CMD с повышенными привилегиями для Windows XP, прерывает команду и возвращает «Интерфейс с этим именем не зарегистрирован на маршрутизаторе». Каким-то образом эта же самая команда без двойных кавычек изменит имя адаптера без проблем. Затем проблема заключается в том, что если NetConnectionId возвращается с пробелами, ваш скрипт не будет работать. Такое поведение на самом деле приемлемо в моем случае, так как я могу развернуть главный образ на своем парке с обоими сетевыми картами, переименованными в LAN1 / LAN2, а не в имя с пробелами. Затем я выполняю реконфигурацию на основе индекса после развертывания на реальном железе.

решение2

Мне не удалось заставить работать пакетный скрипт Сэма Мартина без отложенного расширения переменных.

Вот скрипт, похожий на этот, который я использовал для настройки DNS-серверов на определенный адрес с помощью QuickSetDNS

@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!"
        )
    )
)

Связанный контент