2

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

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

1 ответ1

0

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

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

Это можно расширить для более чем двух сетевых карт, добавив больше сравнений IF / ELSE после команды netsh. Значение NEWNICNAME в начале будет именем, примененным к самому низкому индексу. Заданная строка 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, а не с пробелами. Затем я выполняю реконфигурацию на основе индекса после развертывания на реальном металле.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .