Batch - Renomeando interfaces de rede baseadas em índice com WMIC e netsh

2

Eu tenho duas placas de rede Intel que preciso renomear com base em seus números de índice, o WMIC é agradável porque sempre retorna números de índice em ordem numérica para que possamos tirar a saída diretamente sem precisar classificar ou executar nenhuma operação de comparação nos resultados.

Infelizmente estou correndo em um obstáculo onde se dentro de um loop for eu uso netsh para mostrar informações de interface usando uma variável na tag de índice que retorna "Índice inválido". Eu acredito que o problema é com a necessidade de usar aspas para trás em um FOR / F para alternar para processamento de comando em vez de processamento de arquivo. Espero que alguém possa apontar um simples erro ou dar uma solução mais limpa para o que estou tentando fazer. Código 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 o índice Invalid. O resto do código na sub-rotina ainda não foi testado, então não tenho certeza se a variável INTERFACENAME está sendo atualizada corretamente. O ideal seria que todo esse processo fosse executado duas vezes renomeando o primeiro resultado do comando WMIC para LAN1 e o segundo resultado do comando WMIC para LAN2.

    
por Sam Martin 16.04.2015 / 05:03

1 resposta

0

Eu consegui reescrever o script usando apenas o WMIC para consultar as informações das interfaces de rede apropriadas.

O script funciona consultando o WMI para os adaptadores de rede cujo status ipenabled está definido como true. 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 passamos para uma segunda consulta WMI. Que por sua vez utiliza o número do índice para obter o netconnectionid que é o nome configurado real 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. Então passamos o controle de volta para o primeiro loop FOR via exit / b para puxar para cima o 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 menor índice. A linha SET NEWNICNAME após a comparação IF / ELSE será aplicada ao próximo menor índice reportado. Código super amador 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

Existe, no entanto, 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 em torno dos valores name e newname. No entanto, fazer isso em um arquivo em lotes que não é executado / chamado de um prompt CMD elevado para o Windows XP quebra o comando e retorna "Uma interface com esse nome não está registrada no roteador". De alguma forma, exatamente o mesmo comando sem as aspas duplas mudará o nome do adaptador sem problemas. O problema então se torna se o NetConnectionId retornar com espaços, seu script falhará. Esse comportamento é realmente aceitável na minha instância, já que posso implantar uma imagem mestra na minha frota com a LAN1 / LAN2 renomeada da NIC, em vez de um nome com espaços. Em seguida, realizo a pós-implantação de reconfiguração baseada em índice no próprio metal.

    
por 21.04.2015 / 00:34