
Eu tenho duas placas de rede Intel que preciso renomear com base em seus números de índice, o WMIC é bom porque parece sempre retornar números de índice em ordem numérica para que possamos obter a saída diretamente, sem precisar classificar ou executar qualquer operação de comparação nos resultados .
Infelizmente, estou me deparando com um problema onde, se dentro de um loop FOR, eu uso netsh para mostrar informações da interface usando uma variável na tag de índice, ele retorna "Índice inválido". Acredito que o problema seja a necessidade de usar aspas crases em FOR /F para alternar para o processamento de comandos em vez do processamento de arquivos. Esperando que alguém consiga apontar um erro simples ou fornecer uma solução mais limpa para o que estou tentando fazer. Codifique da seguinte forma:
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
)
)
O primeiro loop FOR é resolvido corretamente e passa um número de índice para a sub-rotina, mas o comando netsh na segunda sub-rotina retorna índice inválido. O restante do código da sub-rotina ainda não foi testado, então não tenho certeza se a variável INTERFACENAME está sendo atualizada corretamente. Idealmente, todo esse processo seria executado renomeando duas vezes o primeiro resultado do comando WMIC para LAN1 e o segundo resultado do comando WMIC para LAN2.
Responder1
Consegui reescrever o script usando apenas WMIC para consultar as informações das interfaces de rede apropriadas.
O script funciona consultando o WMI em busca de adaptadores de rede cujo status ipenabled esteja definido como verdadeiro. Isso elimina todas as interfaces que não são adaptadores Ethernet reais. Em seguida, armazenamos a primeira linha da saída (número de índice mais baixo para um adaptador Ethernet real) e a passamos para uma segunda consulta WMI. Que por sua vez utiliza o número de índice para obter o netconnectionid que é o nome real configurado do adaptador "IE Local Area Connection 1". Podemos então passar o netconnectionid para um comando netsh para alterar a configuração desse adaptador específico. Em seguida, passamos o controle de volta para o primeiro loop FOR via exit /b para obter nosso próximo número de índice e repetir o processo novamente.
Isso pode ser expandido para mais de duas NICs adicionando mais comparações IF/ELSE após o comando netsh. O valor NEWNICNAME no início será o nome aplicado ao índice mais baixo. A linha NEWNICNAME definida após a comparação IF / ELSE será aplicada ao próximo índice mais baixo relatado. Código superamador da seguinte forma:
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
No entanto, há um grande problema com isso no XP. A documentação sobre como renomear adaptadores de rede com netsh especifica explicitamente o uso de aspas duplas nos valores name e newname. No entanto, fazer isso em um arquivo em lote que não é executado/chamado a partir de um prompt CMD elevado para Windows XP interrompe o comando e retorna "Uma interface com este nome não está registrada no roteador". De alguma forma, esse mesmo comando sem aspas duplas alterará o nome do adaptador sem problemas. O problema então é que se o NetConnectionId retornar com espaços, seu script falhará. Na verdade, esse comportamento é aceitável em minha instância, pois posso implantar uma imagem mestre em minha frota com ambas as NICs renomeadas como LAN1/LAN2, em vez de um nome com espaços. Em seguida, executo a reconfiguração baseada em índice pós-implantação no metal real.
Responder2
Não consegui fazer o script em lote de Sam Martin funcionar sem atrasar a expansão de variáveis.
Aqui está um script semelhante a este que usei para configurar servidores DNS para um endereço específico usando 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!"
)
)
)