
Tengo dos NIC Intel a las que necesito cambiar el nombre según sus números de índice. WMIC es bueno porque parece que siempre devuelve números de índice en orden numérico para que podamos tomar la salida directamente sin necesidad de ordenar o ejecutar operaciones de comparación en los resultados. .
Desafortunadamente, me encuentro con un problema en el que, si dentro de un bucle FOR uso netsh para mostrar información de la interfaz usando una variable en la etiqueta de índice, devuelve "Índice no válido". Creo que el problema es la necesidad de usar comillas invertidas en FOR /F para cambiar al procesamiento de comandos en lugar del procesamiento de archivos. Espero que alguien pueda señalar un simple error o dar una solución más clara a lo que estoy intentando hacer. Codifique de la siguiente manera:
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
)
)
El primer bucle FOR se resuelve correctamente y pasa un número de índice a la subrutina, pero el comando netsh de la segunda subrutina devuelve un índice no válido. El resto del código de la subrutina aún no se ha probado, por lo que no estoy seguro de si la variable INTERFACENAME se está actualizando correctamente. Idealmente, todo este proceso se ejecutaría dos veces cambiando el nombre del primer resultado del comando WMIC a LAN1 y el segundo resultado del comando WMIC a LAN2.
Respuesta1
Pude reescribir el script solo usando WMIC para consultar la información de las interfaces de red apropiadas.
El script funciona consultando a WMI sobre adaptadores de red cuyo estado ipenabled esté establecido en verdadero. Esto elimina todas las interfaces que no sean adaptadores Ethernet reales. Luego almacenamos la primera línea de la salida (el número de índice más bajo para un adaptador Ethernet real) y la pasamos a una segunda consulta WMI. Que a su vez utiliza el número de índice para obtener el netconnectionid, que es el nombre configurado real del adaptador "IE Local Area Connection 1". Luego podemos pasar el netconnectionid a un comando netsh para modificar la configuración de ese adaptador específico. Luego volvemos a pasar el control al primer bucle FOR mediante exit /b para obtener nuestro siguiente número de índice y repetir el proceso nuevamente.
Esto se puede ampliar para más de dos NIC agregando más comparaciones IF/ELSE después del comando netsh. El valor NEWNICNAME al inicio será el nombre aplicado al índice más bajo. La línea NEWNICNAME establecida después de la comparación IF/ELSE se aplicará al siguiente índice más bajo reportado. Código súper aficionado de la siguiente manera:
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
Sin embargo, existe un gran problema con esto en XP. La documentación sobre cómo cambiar el nombre de los adaptadores de red con netsh especifica explícitamente el uso de comillas dobles alrededor de los valores de nombre y nuevo nombre. Sin embargo, al hacerlo en un archivo por lotes que no se ejecuta ni se llama desde un indicador CMD elevado para Windows XP, se interrumpe el comando y se devuelve "Una interfaz con este nombre no está registrada en el enrutador". De alguna manera, este mismo comando exacto sin comillas dobles cambiará el nombre del adaptador sin problemas. El problema entonces es que si NetConnectionId regresa con espacios, su secuencia de comandos fallará. Este comportamiento es realmente aceptable en mi caso, ya que puedo implementar una imagen maestra en mi flota con ambas NIC renombradas LAN1/LAN2 en lugar de un nombre con espacios. Luego realizo una reconfiguración basada en índices posterior a la implementación en el metal real.
Respuesta2
No pude hacer que el script por lotes de Sam Martin funcionara sin una expansión variable retrasada.
Aquí hay un script similar a este que usé para configurar servidores DNS en una dirección específica usando DNS rápido
@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!"
)
)
)