MWMIC를 사용하여 인덱스를 기반으로 네트워크 인터페이스 이름 바꾸기 및 Batch를 사용하여 netsh

MWMIC를 사용하여 인덱스를 기반으로 네트워크 인터페이스 이름 바꾸기 및 Batch를 사용하여 netsh

인덱스 번호를 기준으로 이름을 바꿔야 하는 두 개의 Intel NIC가 있습니다. WMIC는 항상 인덱스 번호를 숫자 순서로 반환하므로 결과에 대한 비교 작업을 정렬하거나 실행할 필요 없이 출력을 직접 가져올 수 있다는 점에서 좋습니다. .

불행히도 FOR 루프 내에서 netsh를 사용하여 인덱스 태그의 변수를 사용하여 인터페이스 정보를 표시하면 "잘못된 인덱스"가 반환되는 문제가 발생합니다. 문제는 파일 처리가 아닌 명령 처리로 전환하기 위해 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

적절한 네트워크 인터페이스에 대한 정보를 쿼리하기 위해 WMIC만 사용하여 스크립트를 다시 작성할 수 있었습니다.

이 스크립트는 ipenabled 상태가 true로 설정된 네트워크 어댑터에 대해 WMI를 쿼리하여 작동합니다. 이렇게 하면 실제 이더넷 어댑터가 아닌 모든 인터페이스가 제거됩니다. 그런 다음 출력의 첫 번째 줄(실제 이더넷 어댑터의 가장 낮은 인덱스 번호)을 저장하고 이를 두 번째 WMI 쿼리에 전달합니다. 그러면 인덱스 번호를 활용하여 어댑터 "IE 로컬 영역 연결 1"의 실제 구성된 이름인 netconnectionid를 얻습니다. 그런 다음 netconnectionid를 netsh 명령에 전달하여 해당 특정 어댑터의 구성을 변경할 수 있습니다. 그런 다음 exit /b를 통해 첫 번째 FOR 루프에 제어권을 다시 전달하여 다음 인덱스 번호를 가져오고 프로세스를 다시 반복합니다.

netsh 명령 뒤에 IF/ELSE 비교를 더 추가하여 2개 이상의 NIC에 대해 확장할 수 있습니다. 시작 시 NEWNICNAME 값은 가장 낮은 인덱스에 적용되는 이름이 됩니다. IF/ELSE 비교 후 설정된 NEWNICNAME 행은 보고된 다음으로 낮은 지수에 적용됩니다. 슈퍼 아마추어 코드는 다음과 같습니다.

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를 사용하여 네트워크 어댑터 이름 바꾸기에 대한 설명서에서는 이름 및 newname 값 앞뒤에 큰따옴표를 사용하도록 명시적으로 지정합니다. 그러나 Windows XP용 관리자 권한 CMD 프롬프트에서 실행/호출되지 않는 배치 파일에서 그렇게 하면 명령이 중단되고 "이 이름을 가진 인터페이스는 라우터에 등록되지 않았습니다."를 반환합니다. 어떻게든 큰따옴표가 없는 동일한 명령은 문제 없이 어댑터 이름을 변경합니다. 문제는 NetConnectionId가 공백과 함께 반환되면 스크립트가 실패하게 된다는 것입니다. 공백이 있는 이름 대신 LAN1/LAN2로 이름이 변경된 NIC를 사용하여 플릿에 마스터 이미지를 배포할 수 있으므로 이 동작은 실제로 내 인스턴스에서 허용됩니다. 그런 다음 실제 금속에 대한 배포 후 인덱스 기반 재구성을 수행합니다.

답변2

지연된 변수 확장 없이는 Sam Martin의 배치 스크립트가 작동하도록 할 수 없었습니다.

다음은 다음을 사용하여 DNS 서버를 특정 주소로 설정하는 데 사용한 것과 유사한 스크립트입니다. 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!"
        )
    )
)

관련 정보