처음으로 쓸 수 있는 배치파일을 만든 후기

오늘은 제가 win10block을 어떤 이유에서 배치 파일(bat)파일로 만들어서 깃허브에 배포했는지 짧게 설명하고, 저만의 코드 복습을 해볼 예정입니다.

왜 만들었는지

당시에 한참 윈도우7과 윈도우8에서 업데이트를 아무 생각없이 진행하다가 윈도우10으로 넘어가는 상황이 빈번하게 발생하였습니다. 그래서 기존에 업그레이드에 영향을 주는 업데이트 목록은 이미 알고 있었기에 바로 배치 스크립트를 작성했습니다.

(사실 그 때는 프로그래밍을 정식으로 공부해보지않아서 스크립트 언어밖에 선택지가 없긴 했습니다.)

만든 후 사용됬는지

만들어 놓고 주변분들께 공유해드렸더니 어느 순간, 컴퓨터 사용에 익숙치 않으신 분들을 대상으로 사용됬다고 건너건너 들었습니다. 그 이후로 2년 넘게 지난 현재까지 이상하게 동작한다고 들려오는 것은 없으니, 첫 배치 스크립트는 잘 짰다고 생각합니다. ^^;

코드 복습

요즘에도 batch 파일로 작성한지 오래되서 잘 기억은 나지 않습니다.

그래서 일부는 구글링의 도움을 받았습니다.

@echo off

이 밑 코드부터는 명령어를 다시 언급하지 않겠다는 선언입니다.

예를 들어 cls을 그냥하면 사용자가 입력한 명령어도 같이 출력되지만, echo off를 하게 되면 결과만 실행됩니다.

ms 레퍼런스 문서를 살펴보니 on,off는 Parameters로 분류되어 있었습니다.

{ on | off } : Specifies whether to turn the command-echoing feature on or off. 

이 곳에서 자세한 내용을 참고하시기 바랍니다.

:_main
cls
:: windows10 block main menu
echo.┌───────────────────────────────┐
echo.│win10 upgrade block (win10 block)				│
echo.│https://github.com/minwook-shin/win10block			│
echo.│made by : minwook-shin / license : GPL3 			│
echo.│								│
echo │         1. windows8						│
echo.│								│
echo │         2. windows7						│
echo.│								│
echo │         3. windowsvista					│
echo.│								│
echo │         4. end						│
echo.│								│
echo │         5. reboot(recommend)					│
echo.└───────────────────────────────┘
echo.
echo.
:: select menu
set /p menu=press number :
if "%menu%"=="1" goto _8
if "%menu%"=="2" goto _7
if "%menu%"=="3" echo none.
if "%menu%"=="4" goto _end
if "%menu%"=="5" goto _shutdown
goto _main

이번에는 길게 소스코드를 잘라봤습니다.

눈에 띄는 것은 역시 goto입니다. 파일의 특정 부분에 바로 이동할 때 쓰입니다. 사실 이때는 잘 몰랐는데, 객체지향 언어에서는 지양해야 될 방법이더군요.

다시 본론으로 들어가서, 우선 처음에 시작하려면 페이지를 지우고 시작해야하니 cls을 수행하고, echo를 이용하여 프로그램 설명을 적었습니다.

그리고 매뉴를 만들어서 select로 선택을 받습니다. if문을 이용하여 %menu%변수와 매칭되는 숫자만 goto로 보냅니다.

그 외 숫자는 main으로 다시 보내버립니다.

:: windows10 updater disable (windows8,8.1)
:_8
echo kill GWX(windows10 upgrade program)...
TASKKILL /IM GWX.exe /T /F
echo uninstall KB3035583(GWX Update installs Get Windows 10 app in Windows 8.1 and Windows 7 SP1)...
wusa.exe /uninstall /kb:3035583 /quiet /norestart
echo uninstall KB2976978(Compatibility update for Windows 8.1 and Windows 8)...
wusa.exe /uninstall /kb:2976978 /quiet /norestart
echo disable the Removed update ...
start "title" /b /wait cscript.exe "%~dp0HideWindowsUpdates.vbs" 2976978 3035583
SET /P P=Press enter to go to the main.
goto _main

1번을 누르면 윈도우8 메뉴를 선택한게 되므로, goto _8을 합니다. 그 후, TASKKILL로 업그레이드 프로그램을 종료시킵니다.

그리고 wusa.exe(윈도우 업데이트 독립 실행형 설치 프로그램)를 이용하여 kb3035583, kb2976978 업데이트를 제거하고 비활성화도 합니다.

:: windows10 updater disable (windows7)
:_7
echo kill GWX(windows10 upgrade program)...
TASKKILL /IM GWX.exe /T /F 
echo uninstall KB3035583(GWX Update installs Get Windows 10 app in Windows 8.1 and Windows 7 SP1)...
wusa.exe /uninstall /kb:3035583 /quiet /norestart
echo uninstall KB2952664(Compatibility update for upgrading Windows 7)...
wusa.exe /uninstall /kb:2952664 /quiet /norestart
echo uninstall KB3021917(Technical Preview update)...
wusa.exe /uninstall /kb:3021917 /quiet /norestart
echo disable the Removed update ...
start "title" /b /wait cscript.exe "%~dp0HideWindowsUpdates.vbs" 3021917 3035583 2952664
SET /P P=Press enter to go to the main.
goto _main

윈도우8과 별반 다를 것이 없지만, 비활성화할 업데이트 번호가 달라서 부득이하게 비슷한 코드를 작성했습니다. 윈도우7은 kb3035583, kb2952664, kb3021917이였군요.

지금 생각해보면, 이렇게 하기보단 함수 선언하면서 중복 코드를 줄였을텐데 그땐 잘 몰랐습니다.

:: end program
:_end
echo The program closes.
SET /P P=Press enter to end.
exit
:: shutdown
:_shutdown
echo Finish the settings and reboot Windows.
SET /P P=Press enter to reboot after the program closed.
shutdown -r

종료하는 것과 재부팅하는 것을 분리시켜서 무조건적으로 재부팅이 안되게 했었는데, 지금보면 이런 방식보다는 사용자 입력받아서 종료와 재부팅을 구별했으면 어땠을까 생각합니다.

마무리

우선 현시점으로 윈도우10 업그레이드 프로그램은 종료되었습니다. 그래서 win10blcok이라는 프로그램도 사실 필요는 없지만, 제가 처음으로 그럴듯한 배치파일을 만들어본 것이기도 했고 실제로 현장에서 쓰였다는 이야기도 들려서 코드 기록 차원에서 깃허브에 남겼습니다.

깃허브에 커밋 기록을 남겨놓은지 벌써 (2018년이 곧 다가오고 있으니) 3년이 되어갑니다. 지금도 코드를 되짚어보니 고치고 싶은게 많았는데, 앞으로는 어떤 느낌으로 지금 작성한 코드들을 볼지 더욱 더 궁금해집니다.

  • 전체 소스코드는 제 저장소에서 보실 수 있습니다.
Written on December 28, 2017