
Ich habe zwei Intel-Netzwerkkarten, die ich basierend auf ihren Indexnummern umbenennen muss. WMIC ist insofern praktisch, als dass es die Indexnummern scheinbar immer in numerischer Reihenfolge zurückgibt, sodass wir die Ausgabe direkt übernehmen können, ohne die Ergebnisse sortieren oder vergleichen zu müssen.
Leider stoße ich auf ein Problem: Wenn ich in einer FOR-Schleife Netsh verwende, um Schnittstelleninformationen mithilfe einer Variable im Index-Tag anzuzeigen, wird „Ungültiger Index“ zurückgegeben. Ich glaube, das Problem liegt in der Notwendigkeit, in einem FOR /F Backquotes zu verwenden, um zur Befehlsverarbeitung statt zur Dateiverarbeitung zu wechseln. Ich hoffe, dass jemand einen einfachen Fehler aufzeigen oder eine sauberere Lösung für das bieten kann, was ich versuche. Der Code lautet wie folgt:
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
)
)
Die erste FOR-Schleife wird korrekt aufgelöst und übergibt eine Indexnummer an die Subroutine, aber der Netsh-Befehl in der zweiten Subroutine gibt „Ungültiger Index“ zurück. Der restliche Code in der Subroutine wurde noch nicht getestet, daher bin ich mir nicht sicher, ob die Variable INTERFACENAME korrekt aktualisiert wird. Idealerweise würde dieser gesamte Prozess zweimal durchlaufen, wobei das erste Ergebnis des WMIC-Befehls in LAN1 und das zweite Ergebnis des WMIC-Befehls in LAN2 umbenannt würde.
Antwort1
Ich konnte das Skript nur mithilfe von WMIC neu schreiben, um die Informationen für die entsprechenden Netzwerkschnittstellen abzufragen.
Das Skript funktioniert, indem es WMI nach Netzwerkadaptern abfragt, deren ipenabled-Status auf true gesetzt ist. Dadurch werden alle Schnittstellen ausgesondert, die keine tatsächlichen Ethernet-Adapter sind. Anschließend speichern wir die erste Zeile der Ausgabe (niedrigste Indexnummer für einen tatsächlichen Ethernet-Adapter) und übergeben sie an eine zweite WMI-Abfrage. Diese wiederum nutzt die Indexnummer, um die Netconnectionid abzurufen, die der tatsächlich konfigurierte Name des Adapters „IE Local Area Connection 1“ ist. Anschließend können wir die Netconnectionid an einen Netsh-Befehl übergeben, um die Konfiguration dieses bestimmten Adapters zu ändern. Anschließend geben wir die Kontrolle über exit /b an die erste FOR-Schleife zurück, um unsere nächste Indexnummer abzurufen und den Vorgang erneut zu wiederholen.
Dies kann für mehr als zwei Netzwerkkarten erweitert werden, indem nach dem Netsh-Befehl weitere IF/ELSE-Vergleiche hinzugefügt werden. Der NEWNICNAME-Wert am Anfang ist der Name, der auf den niedrigsten Index angewendet wird. Die festgelegte NEWNICNAME-Zeile nach dem IF/ELSE-Vergleich wird auf den nächsten gemeldeten niedrigsten Index angewendet. Super-Amateur-Code wie folgt:
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
Unter XP gibt es damit jedoch ein großes Problem. Die Dokumentation zum Umbenennen von Netzwerkadaptern mit netsh gibt ausdrücklich die Verwendung von Anführungszeichen um die Werte „Name“ und „Newname“ an. Wenn dies jedoch in einer Batchdatei geschieht, die nicht von einer CMD-Eingabeaufforderung mit erhöhten Rechten für Windows XP ausgeführt/aufgerufen wird, wird der Befehl abgebrochen und es wird „Eine Schnittstelle mit diesem Namen ist nicht beim Router registriert“ zurückgegeben. Irgendwie ändert genau dieser Befehl ohne die Anführungszeichen den Adapternamen ohne Probleme. Das Problem besteht dann darin, dass Ihr Skript fehlschlägt, wenn die NetConnectionId mit Leerzeichen zurückgegeben wird. Dieses Verhalten ist in meinem Fall tatsächlich akzeptabel, da ich ein Master-Image auf meiner Flotte bereitstellen kann, wobei beide NICs in LAN1/LAN2 umbenannt werden, anstatt einen Namen mit Leerzeichen zu verwenden. Dann führe ich nach der Bereitstellung eine indexbasierte Neukonfiguration auf dem eigentlichen Metall durch.
Antwort2
Ich konnte das Batch-Skript von Sam Martin nicht ohne verzögerte Variablenerweiterung zum Laufen bringen.
Hier ist ein ähnliches Skript, das ich verwendet habe, um DNS-Server auf eine bestimmte Adresse einzustellen, mit 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!"
)
)
)