자작 프로그램/배치 스크립트

윈도우 IP 자동 설정 배치 스크립트 - Auto_IPSetting_v2025

Geheimnis 2025. 6. 20. 19:00
반응형

📋 스크립트 주요 기능

이 배치 스크립트는 윈도우에서 IP 주소 구성 자동화를 지원합니다.

제공 기능

  1. 현재 IP 구성 백업 (→ IPAddress.txt 저장)
  2. 백업된 IP 구성 자동 복원
  3. 자동 IP(DHCP) 적용
  4. 고정 IP 수동 입력 (전체 IP 직접 입력)
  5. 사무실 지정 IP 입력(편의 기능 제공)
  6. 프로그램 종료

 

🏗️ 스크립트 구조 및 상세 설명

1️⃣ 관리자 권한 확인 및 자동 상승

batch
복사편집
:Admin_Check fsutil dirty query %systemdrive%
  • UAC(사용자 계정 컨트롤)를 우회하여 관리자 권한으로 재실행
  • 배치파일을 실행할 때 관리자 권한이 아니면 자동으로 관리자 권한으로 다시 실행

2️⃣ 기본 UI 설정

batch
복사편집
chcp 65001 color 1f title Auto_IP_Setting mode con cols=100 lines=50 powershell -Command "&{$host.UI.RawUI.BufferSize = New-Object System.Management.Automation.Host.Size(100, 5000)}"
  • 콘솔 인코딩: UTF-8 적용
  • 콘솔 창 색상 및 크기 지정
  • 콘솔 버퍼 크기 증가 (스크롤 영역 확대)

3️⃣ 날짜별 백업 폴더 구성

batch
복사편집
for /f %%a in ('powershell -NoProfile -Command "Get-Date -Format \"yyyyMMdd\""') do set datetime=%%a set driverRoot=%~dp0Backup%datetime%
  • 현재 날짜(YYYYMMDD)를 가져와서 백업 폴더명에 반영

4️⃣ 메뉴 출력 및 선택 기능

batch
복사편집
:menu netsh interface ipv4 show interface
  • 현재 네트워크 인터페이스 목록 출력
  • 사용자로부터 IP 설정할 인터페이스 색인(Idx) 값 입력받기

메뉴 항목:

markdown
복사편집
1. IP 구성 백업 2. IP 구성 복원 3. DHCP 자동 IP 받기 4. 고정 IP 직접 입력 5. 사무실 지정 IP 입력1 6. 사무실 지정 IP 입력2 7. 종료

5️⃣ IP 구성 백업

batch
복사편집
:ipbackup powershell -NoProfile -ExecutionPolicy Bypass -Command ...
  • 현재 네트워크 설정 정보를 Powershell로 읽어 IPAddress.txt로 저장
  • 저장 항목:
    • 어댑터 이름
    • 설명
    • IPv4 주소
    • 서브넷 마스크
    • 기본 게이트웨이
    • DNS 서버

※ VMware 가상 어댑터 제외


6️⃣ DHCP 자동 IP 설정

batch
복사편집
:dhcp netsh interface ipv4 set address "%RAN_NAME%" source=dhcp netsh interface ipv4 set dnsservers "%RAN_NAME%" source=dhcp
  • 자동 IP 받기(DHCP) 설정 적용
  • 네트워크 설정 후 ncpa.cpl (네트워크 어댑터 설정창) 실행

7️⃣ 고정 IP 수동 입력

batch
복사편집
:static1
  • 사용자가 직접 IP, 서브넷 마스크, 게이트웨이 입력
  • DNS 서버는 기본값 사용
batch
복사편집
DNS1=168.126.63.1 DNS2=168.126.63.2

8️⃣ 사무실 지정 IP 입력 1 / 2

batch
복사편집
:static2 :static3
  • 사무실에서 고정 IP 사용 시, 패턴화된 입력 방식 제공
    • 예) 192.168.0.xxx, 192.168.xxx.xxx
  • 반복적인 입력 편의성 제공

9️⃣ IP 구성 복원

batch
복사편집
:iprestore
  • 백업된 IPAddress.txt 를 파싱해서
    • IP 주소
    • 서브넷 마스크
    • 게이트웨이
    • DNS 서버1, 서버2
      설정값을 자동으로 읽어 적용
  • 입력 오류 방지: 각 필드 누락 시 오류 메시지 출력 후 메뉴로 복귀

🔍 기술 포인트

Powershell 연동

  • 고급 IP 정보 파싱 및 텍스트 저장에 PowerShell 사용

네트워크 설정 자동화

  • netsh interface ipv4 set ... 명령 활용

UI 구성

  • 컬러/크기/스크롤 최적화로 콘솔 가독성 향상

에러 처리

  • 백업 파일 유무 확인
  • 필수 값 누락 시 오류 메시지 출력

가상 네트워크 제외

  • VMware 가상 어댑터 제외 기능 포함

💡 활용 예시

  • 사무실에서 PC 포맷 후 고정 IP 적용 자동화
  • 임대용 노트북/PC 회수 시 IP 초기화 자동화
  • 다중 지점에서 공통 IP 구성을 빠르게 적용
  • IP 변경이 빈번한 개발/테스트 환경에서 활용
:main
cls
echo %LINE%
echo. ▶ 이더넷 어댑터 목록 출력
echo %LINE%
netsh interface ipv4 show interface
echo %LINE%
set /p startupqueryinterval=IP를 변경 할 '색인' 값(Idx)을 입력해주세요 :
set "RAN_NAME=%startupqueryinterval%"

 

:menu
cls
echo %LINE%
echo. ▶ 도구 사용 안내
echo %LINE%
echo. ① 현재 IP 구성을 실행 경로의 IPAddress.txt 파일로 저장합니다.
echo. ② 저장된 IPAddress.txt 파일을 이용해 IP 자동 재구성이 가능합니다.
echo. ③ 사무실 지정 IP(static2, static3)는 필요 시 해당 항목을 직접 수정하여 사용하세요.
echo. ④ IP 변경 시 사용할 고정 DNS 값은 static1, static2, static3 항목을 수정하여 사용하세요.
echo %LINE%
echo. ▶ 백업된 IPAddress.txt의 내용을 출력 합니다.
echo %LINE%

:: 다시 IPAddress.txt 출력
if exist "%~dp0IPAddress.txt" (
    for /f "usebackq delims=" %%A in ("%~dp0IPAddress.txt") do (
        echo %%A
    )
) else (
    echo [경고] IPAddress.txt 파일이 없습니다.
)
echo %LINE%
echo.
echo  1. IP 구성 백업 - IPAddress.txt
echo.
echo  2. IP 구성 복원 - IPAddress.txt
echo.
echo  3. 자동으로 IP 주소 받기(DHCP)
echo.
echo  4. 고정 IP Full 입력(ex 192.168.0.1)
echo.
echo  5. 사무실 지정 IP 입력1(ex 192.168.0.xxx)
echo.
echo  6. 사무실 지정 IP 입력2(ex 192.168.xxx.xxx)
echo.
echo  7. 색인 값 변경 (Idx 재입력)
echo.
echo  8. 종료(exit)
echo.
echo %LINE%
set /p num=번호를 입력해주세요 :

if "%num%"=="1" goto ipbackup
if "%num%"=="2" goto iprestore
if "%num%"=="3" goto dhcp
if "%num%"=="4" goto static1
if "%num%"=="5" goto static2
if "%num%"=="6" goto static3
if "%num%"=="7" goto main  :: 색인 값 재입력
if "%num%"=="8" goto exitif not %ERRORLEVEL% == 0 goto exit

 

:ipbackup
echo.
echo %LINE%
echo. ▶ IP 주소 정보 저장(IPAddress.txt)
echo %LINE%
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
  "$output = ''; " ^
  "$adapters = Get-NetIPConfiguration | Where-Object { $_.NetAdapter.InterfaceDescription -notmatch 'VMware Virtual Ethernet Adapter' }; " ^
  "foreach ($adapter in $adapters) { " ^
    "$nic = $adapter.NetAdapter; " ^
    "$prefix = $adapter.IPv4Address.PrefixLength; " ^
    "$maskValue = ([math]::Pow(2,32) - [math]::Pow(2,32-$prefix)); " ^
    "$bytes = @(); " ^
    "for ($i = 3; $i -ge 0; $i--) { $bytes += (($maskValue -shr ($i * 8)) -band 0xFF) } " ^
    "$subnet = ($bytes -join '.'); " ^
    "$dns = (Get-DnsClientServerAddress -InterfaceIndex $nic.ifIndex -AddressFamily IPv4).ServerAddresses -join ', '; " ^
    "$ipconfigInfo = '어댑터 이름: ' + $nic.Name + \"`n\" + " ^
                   "'설명: ' + $nic.InterfaceDescription + \"`n\" + " ^
                   "'IPv4 주소: ' + $adapter.IPv4Address.IPAddress + \"`n\" + " ^
                   "'서브넷 마스크: ' + $subnet + \"`n\" + " ^
                   "'기본 게이트웨이: ' + $adapter.IPv4DefaultGateway.NextHop + \"`n\" + " ^
                   "'DNS 서버: ' + $dns + \"`n\"; " ^
    "$output += $ipconfigInfo + \"`n\"; " ^
  "} " ^
  "[System.IO.File]::WriteAllText('%~dp0IPAddress.txt', $output, [System.Text.UTF8Encoding]::new($false))"

REM "'물리적 주소: ' + $nic.MacAddress + \"`n\" + " ^

pause
goto menu

 

:: IPAddress.txt 출력
if exist "%~dp0IPAddress.txt" (
    for /f "usebackq delims=" %%A in ("%~dp0IPAddress.txt") do (
        echo %%A
    )
) else (
    echo [경고] IPAddress.txt 파일이 없습니다.
)

 

:iprestore
cls
setlocal enabledelayedexpansion
echo %LINE%
echo. ▶ 백업된 IPAddress.txt를 읽어 자동으로 IP 구성 중입니다.
echo %LINE%

:: IPAddress.txt 파일 확인
if not exist "%~dp0IPAddress.txt" (
    echo [경고] IPAddress.txt 파일이 없습니다.
    pause
    endlocal
    goto menu
)

:: 변수 초기화
set "IPAddr="
set "Subnet="
set "Gateway="
set "DNS1="
set "DNS2="

:: IPAddress.txt에서 값 파싱
for /f "usebackq tokens=1* delims=:" %%A in ("%~dp0IPAddress.txt") do (
    set "line=%%A"
    set "value=%%B"
    set "line=!line: =!"
    set "value=!value!"

    :: 앞뒤 공백 제거
    for /f "tokens=* delims= " %%X in ("!value!") do set "value=%%X"

    if /i "!line!"=="IPv4주소" set "IPAddr=!value!"
    if /i "!line!"=="서브넷마스크" set "Subnet=!value!"
    if /i "!line!"=="서브넷마스크:" set "Subnet=!value!"
    if /i "!line!"=="서브넷마스크" set "Subnet=!value!"
    if /i "!line!"=="기본게이트웨이" set "Gateway=!value!"
    if /i "!line!"=="DNS서버" (
        for /f "tokens=1,2 delims=, " %%D in ("!value!") do (
            set "DNS1=%%D"
            set "DNS2=%%E"
        )
    )
)

:: 읽어온 값 출력
echo.
echo IP 주소         : %IPAddr%
echo 서브넷 마스크   : %Subnet%
echo 기본 게이트웨이 : %Gateway%
echo DNS 서버1      : %DNS1%
echo DNS 서버2      : %DNS2%
echo.

:: 값 확인 후 적용
if "%IPAddr%"=="" (
    echo [오류] IP 주소를 읽어올 수 없습니다.
    pause
    endlocal
    goto menu
)

if "%Subnet%"=="" (
    echo [오류] 서브넷 마스크를 읽어올 수 없습니다.
    pause
    endlocal
    goto menu
)

if "%Gateway%"=="" (
    echo [오류] 기본 게이트웨이를 읽어올 수 없습니다.
    pause
    endlocal
    goto menu
)

if "%DNS1%"=="" (
    echo [오류] DNS 서버1 주소를 읽어올 수 없습니다.
    pause
    endlocal
    goto menu
)

echo. 네트워크 설정을 적용 중입니다...

:: 기존 DNS 삭제 후 새로 설정
netsh interface ipv4 set dnsservers "%RAN_NAME%" static %DNS1% primary >nul
if not "%DNS2%"=="" (
    netsh interface ipv4 add dnsservers "%RAN_NAME%" %DNS2% >nul
)

:: IP 설정 적용
netsh interface ipv4 set address "%RAN_NAME%" static %IPAddr% %Subnet% %Gateway%

echo.
echo. [완료] 네트워크 설정이 적용되었습니다.
start ncpa.cpl
:: explorer shell:::{7007ACC7-3202-11D1-AAD2-00805FC1270E}
pause
endlocal
goto menu

 

:dhcp
netsh interface ipv4 set address "%RAN_NAME%" source=dhcp
netsh interface ipv4 set dnsservers "%RAN_NAME%" source=dhcp
echo.. 네트워크 설정이 완료 되었습니다.
start ncpa.cpl
:: explorer shell:::{7007ACC7-3202-11D1-AAD2-00805FC1270E}
pause
goto menu

 

:static1
cls
echo %LINE%
echo. ▶ 백업된 IPAddress.txt의 내용을 출력 합니다.
echo %LINE%

:: 다시 IPAddress.txt 출력
if exist "%~dp0IPAddress.txt" (
    for /f "usebackq delims=" %%A in ("%~dp0IPAddress.txt") do (
        echo %%A
    )
) else (
    echo [경고] IPAddress.txt 파일이 없습니다.
)
echo %LINE%

set DNS1=168.126.63.1
set DNS2=168.126.63.2
set SNNum=255.255.255.0
set GWNUM=
set SN=
echo.
set /p IPNum=. 아이피번호를 입력(ex 192.168.0.1) : 
@echo off
for /f "tokens=1-4 delims=. " %%a in ("%IPNum%") do (
set octetA=%%a
set octetB=%%b
set octetC=%%c
set octetD=%%d
)
echo.
set /p sn=. 서브넷 마스크를 입력(255.255.255.0 아닐 경우에 입력) : 
if "%SN%"=="" goto gw
if not "%SN%"=="" goto sn

:sn
set SNNum=%SN%

:gw
set GWNum=%octetA%.%octetB%.%octetC%.1
echo.
set /p GWNum=. 게이트 웨이를 입력(%GWNum% 아닐 경우에 입력) :  
echo.
echo. 
echo.. 네트워크 설정중 입니다. 잠시만 기다리세요.....
netsh interface ipv4 set dnsservers "%RAN_NAME%" static %DNS1% primary > nul
netsh interface ipv4 add dnsservers "%RAN_NAME%" %DNS2% > nul
netsh interface ipv4 set address "%RAN_NAME%" static %IPNum% %SNNum% %GWNum%
echo.. 네트워크 설정이 완료 되었습니다.
echo.
start ncpa.cpl
:: explorer shell:::{7007ACC7-3202-11D1-AAD2-00805FC1270E}
pause
goto menu

 

:static2
cls
set octetD=
echo %LINE%
echo. ▶ 백업된 IPAddress.txt의 내용을 출력 합니다.
echo %LINE%

:: 다시 IPAddress.txt 출력
if exist "%~dp0IPAddress.txt" (
    for /f "usebackq delims=" %%A in ("%~dp0IPAddress.txt") do (
        echo %%A
    )
) else (
    echo [경고] IPAddress.txt 파일이 없습니다.
)
echo %LINE%

set DNS1=168.126.63.1
set DNS2=168.126.63.2
set SNNum=255.255.255.0
set GWNUM=
set SN=
echo.
set octetA=192
set octetB=168
set octetC=0
set /p octetD=. 아이피 끝자리를 입력 192.168.0.%octetD%xxx :
set IPNum=%octetA%.%octetB%.%octetC%.%octetD%
)
echo.
set /p sn=. 서브넷 마스크를 입력(255.255.255.0 아닐 경우에 입력) : 
if "%SN%"=="" goto gw
if not "%SN%"=="" goto sn

:sn
set SNNum=%SN%

:gw
set GWNum=%octetA%.%octetB%.%octetC%.1
echo.
set /p GWNum=. 게이트 웨이를 입력(%GWNum% 아닐 경우에 입력) :  
echo.
echo. 
echo.. 네트워크 설정중 입니다. 잠시만 기다리세요.....
netsh interface ipv4 set dnsservers "%RAN_NAME%" static %DNS1% primary > nul
netsh interface ipv4 add dnsservers "%RAN_NAME%" %DNS2% > nul
netsh interface ipv4 set address "%RAN_NAME%" static %IPNum% %SNNum% %GWNum%
echo.. 네트워크 설정이 완료 되었습니다.
echo.
start ncpa.cpl
:: explorer shell:::{7007ACC7-3202-11D1-AAD2-00805FC1270E}
pause
goto menu

 

:static3
cls
set octetC=
set octetD=
echo %LINE%
echo. ▶ 백업된 IPAddress.txt의 내용을 출력 합니다.
echo %LINE%

:: 다시 IPAddress.txt 출력
if exist "%~dp0IPAddress.txt" (
    for /f "usebackq delims=" %%A in ("%~dp0IPAddress.txt") do (
        echo %%A
    )
) else (
    echo [경고] IPAddress.txt 파일이 없습니다.
)
echo %LINE%

set DNS1=168.126.63.1
set DNS2=168.126.63.2
set SNNum=255.255.255.0
set GWNUM=
set SN=
echo.
set octetA=192
set octetB=168
set /p octetC=. 아이피 3번째 자리를 입력 192.168.%octetC%xxx :
set IPNum=%octetA%.%octetB%.%octetC%.%octetD%
set /p octetD=. 아이피 4번째 자리를 입력 192.168.%octetC%.%octetD%xxx :
set IPNum=%octetA%.%octetB%.%octetC%.%octetD%
)
echo.
set /p sn=. 서브넷 마스크를 입력(255.255.255.0 아닐 경우에 입력) : 
if "%SN%"=="" goto gw
if not "%SN%"=="" goto sn

:sn
set SNNum=%SN%

:gw
set GWNum=%octetA%.%octetB%.%octetC%.1
echo.
set /p GWNum=. 게이트 웨이를 입력(%GWNum% 아닐 경우에 입력) :  
echo.
echo. 
echo.. 네트워크 설정중 입니다. 잠시만 기다리세요.....
netsh interface ipv4 set dnsservers "%RAN_NAME%" static %DNS1% primary > nul
netsh interface ipv4 add dnsservers "%RAN_NAME%" %DNS2% > nul
netsh interface ipv4 set address "%RAN_NAME%" static %IPNum% %SNNum% %GWNum%
echo.. 네트워크 설정이 완료 되었습니다.
echo.
start ncpa.cpl
:: explorer shell:::{7007ACC7-3202-11D1-AAD2-00805FC1270E}
pause
goto menu

반응형