ADK를 사용한 Windows PE ISO 제작 스크립트

MAKEWINPE_CONFIG.BAT

@ECHO OFF
REM ------------------------------------------------------------------
REM -
REM - 윈도우PE ISO 파일 생성 스크립트 설정 파일
REM -
REM - 스크립트 실행 전에
REM - https://learn.microsoft.com/ko-kr/windows-hardware/get-started/adk-install
REM - 에서 Windows ADK와 Windows PE 추가 기능을 같이 다운로드 받아
REM - 1. adksetup.exe /installpath C:\ADK /features OptionId.DeploymentTools
REM - 2. adkwinpesetup.exe
REM - 순서로 설치한다.
REM -
REM ------------------------------------------------------------------

REM ------------------------------------------------------------------
REM - 기본 설정 변수
REM ------------------------------------------------------------------
SET "CURRENT_DIR=%CD%"
SET "DST_ARCH=amd64"
SET "WORK_DIR=D:\WinPE_%DST_ARCH%"
SET "ISO_FILE=%WORK_DIR%\winpe_test.iso"
SET "WIM_FILE=E:\sources\install.wim"

IF EXIST %WORK_DIR% RMDIR /S /Q %WORK_DIR%

IF NOT EXIST %WIM_FILE% (
  ECHO ERROR: %WIM_FILE% not found.
  EXIT /B
)

REM
REM Sets the PROCESSOR_ARCHITECTURE according to native platform.
REM
IF /I %PROCESSOR_ARCHITECTURE%==x86 (
    REM Set the "right" processor architecture
    IF NOT "%PROCESSOR_ARCHITEW6432%"=="" (
        SET PROCESSOR_ARCHITECTURE=%PROCESSOR_ARCHITEW6432%
    )
) ELSE IF /I %PROCESSOR_ARCHITECTURE%==arm (
    REM Set the "right" processor architecture
    IF NOT "%PROCESSOR_ARCHITEW6432%"=="" (
        SET PROCESSOR_ARCHITECTURE=%PROCESSOR_ARCHITEW6432%
    )
) ELSE IF /I %PROCESSOR_ARCHITECTURE%==amd64 (
    REM Nothing to do
) ELSE IF /I %PROCESSOR_ARCHITECTURE%==arm64 (
    REM Nothing to do
) ELSE (
    @echo Not implemented for PROCESSOR_ARCHITECTURE of %PROCESSOR_ARCHITECTURE%.
    got :EOF
)

REM
REM Query the 32-bit and 64-bit Registry hive for KitsRoot
REM

SET regKeyPathFound=1
SET wowRegKeyPathFound=1
SET KitsRootRegValueName=KitsRoot10

REG QUERY "HKLM\Software\Wow6432Node\Microsoft\Windows Kits\Installed Roots" /v %KitsRootRegValueName% 1>NUL 2>NUL || SET wowRegKeyPathFound=0
REG QUERY "HKLM\Software\Microsoft\Windows Kits\Installed Roots" /v %KitsRootRegValueName% 1>NUL 2>NUL || SET regKeyPathFound=0

if %wowRegKeyPathFound% EQU 0 (
  if %regKeyPathFound% EQU 0 (
    @echo KitsRoot not found, can't set common path for Deployment Tools
    EXIT /B
  ) else (
    SET regKeyPath=HKLM\Software\Microsoft\Windows Kits\Installed Roots
  )
) else (
    SET regKeyPath=HKLM\Software\Wow6432Node\Microsoft\Windows Kits\Installed Roots
)


FOR /F "skip=2 tokens=2*" %%i IN ('REG QUERY "%regKeyPath%" /v %KitsRootRegValueName%') DO (SET KitsRoot=%%j)

REM
REM Build the D&I Root from the queried KitsRoot
REM
SET DandIRoot=%KitsRoot%Assessment and Deployment Kit\Deployment Tools

REM
REM Construct the path to WinPE directory, architecture-independent
REM
SET WinPERoot=%KitsRoot%Assessment and Deployment Kit\Windows Preinstallation Environment
SET WinPERootNoArch=%KitsRoot%Assessment and Deployment Kit\Windows Preinstallation Environment

REM
REM Construct the path to DISM, Setup and USMT, architecture-independent
REM
SET WindowsSetupRootNoArch=%KitsRoot%Assessment and Deployment Kit\Windows Setup
SET USMTRootNoArch=%KitsRoot%Assessment and Deployment Kit\User State Migration Tool

REM
REM Constructing tools paths relevant to the current Processor Architecture
REM
SET DISMRoot=%DandIRoot%\%PROCESSOR_ARCHITECTURE%\DISM
SET BCDBootRoot=%DandIRoot%\%PROCESSOR_ARCHITECTURE%\BCDBoot
SET ImagingRoot=%DandIRoot%\%PROCESSOR_ARCHITECTURE%\Imaging
SET OSCDImgRoot=%DandIRoot%\%PROCESSOR_ARCHITECTURE%\Oscdimg
SET WdsmcastRoot=%DandIRoot%\%PROCESSOR_ARCHITECTURE%\Wdsmcast

REM
REM Now do the paths that apply to all architectures...
REM
REM Note that the last one in this list should not have a
REM trailing semi-colon to avoid duplicate semi-colons
REM on the last entry when the final path is assembled.
REM
SET HelpIndexerRoot=%DandIRoot%\HelpIndexer

REM
REM Set WSIMRoot. WSIM is x86 only
REM
SET WSIMRoot=%DandIRoot%\WSIM\x86

REM
REM Set ICDRoot. ICD is x86 only
REM
SET ICDRoot=%KitsRoot%Assessment and Deployment Kit\Imaging and Configuration Designer\x86

REM
REM Now buld the master path from the various tool root folders...
REM
REM Note that each fragment above should have any required trailing
REM semi-colon as a delimiter so we do not put any here.
REM
REM Note the last one appended to NewPath should be the last one
REM set above in the arch. neutral section which also should not
REM have a trailing semi-colon.
REM
SET NewPath=%DISMRoot%;%ImagingRoot%;%BCDBootRoot%;%OSCDImgRoot%;%WdsmcastRoot%;%HelpIndexerRoot%;%WSIMRoot%;%WinPERoot%;%ICDRoot%

SET PATH=%NewPath:"=%;%PATH%

REM
REM Set current directory to DandIRoot
REM
cd /d "%DandIRoot%"
cd /d "%CURRENT_DIR%"

MAKEWINPE.BAT

@ECHO OFF
REM ------------------------------------------------------------------
REM -
REM - 윈도우PE ISO 파일 생성 스크립트
REM -
REM - 이 스크립트는 윈도우 10 PE의 ISO를 생성한다.
REM -
REM ------------------------------------------------------------------

REM =======================================
REM ■ CODEPAGE를 UTF-8로 변경
REM =======================================
CHCP 65001 1> NUL 2> NUL

REM ------------------------------------------------------------------
REM - 설정파일 읽어오기
REM ------------------------------------------------------------------
SET "CONFIG_BATCH_FILE=MAKEWINPE_CONFIG.BAT"
IF NOT EXIST %CONFIG_BATCH_FILE% (
  ECHO %CONFIG_BATCH_FILE% 파일이 없습니다.
  EXIT /B 1
)
CALL %CONFIG_BATCH_FILE%

ECHO.
ECHO ###########################################################
ECHO #
ECHO # COPYPE %DST_ARCH% %WORK_DIR%
ECHO #
ECHO ###########################################################
CALL COPYPE %DST_ARCH% %WORK_DIR%
IF %ERRORLEVEL% NEQ 0 (
  ECHO ERROR: COPYPE
  EXIT /B
)

ECHO.
ECHO ###########################################################
ECHO #
ECHO # 불필요한 파일 삭제
ECHO #
ECHO ###########################################################
FOR /F "TOKENS=*" %%A IN ('DIR /B /ON %WORK_DIR%\media\??-??') DO (
  RMDIR /S /Q %WORK_DIR%\media\%%A
)
FOR /F "TOKENS=*" %%A IN ('DIR /B /ON %WORK_DIR%\media\??-*-??') DO (
  RMDIR /S /Q %WORK_DIR%\media\%%A
)

ECHO.
ECHO ###########################################################
ECHO #
ECHO # 마운트 %WORK_DIR%\media\sources\boot.wim → %WORK_DIR%\mount
ECHO # DISM /mount-image /imagefile:%WORK_DIR%\media\sources\boot.wim /index:1 /mountdir:%WORK_DIR%\mount
ECHO #
ECHO ###########################################################
DISM /mount-image /imagefile:%WORK_DIR%\media\sources\boot.wim /index:1 /mountdir:%WORK_DIR%\mount
IF %ERRORLEVEL% NEQ 0 (
  ECHO ERROR: mount
  EXIT /B
)

ECHO.
ECHO ###########################################################
ECHO #
ECHO # 기본언어를 한국어로 변경
ECHO #
ECHO ###########################################################
BCDEDIT /store %WORK_DIR%\media\Boot\BCD /set {bootmgr} locale ko-KR
DISM /image:"%WORK_DIR%\mount" /add-package /packagepath:"%WinPERoot%\%DST_ARCH%\WinPE_OCs\WinPE-FontSupport-KO-KR.cab"
DISM /image:"%WORK_DIR%\mount" /add-package /packagepath:"%WinPERoot%\%DST_ARCH%\WinPE_OCs\ko-kr\lp.cab"
DISM /image:"%WORK_DIR%\mount" /set-allintl:ko-kr
DISM /image:"%WORK_DIR%\mount" /Set-TimeZone:"Korea Standard Time"
DEL /F /Q %WORK_DIR%\WinPE-FontSupport-KO-KR.cab
DEL /F /Q %WORK_DIR%\lp.cab

ECHO.
ECHO ###########################################################
ECHO #
ECHO # Default 하이브 수정 (명령프롬프트 옵션 편집)
ECHO #
ECHO ###########################################################
IF NOT EXIST %WORK_DIR%\mount\Windows\system32\config\default (
  ECHO %WORK_DIR%\mount\Windows\system32\config\default NOT FOUND.
  DISM /unmount-image /mountdir:%WORK_DIR%\mount
  EXIT /B
)
REG LOAD HKU\tmp %WORK_DIR%\mount\Windows\system32\config\default
REG ADD HKU\tmp\Console /v screenbuffersize /t REG_DWORD /d 13107290 /f
REG ADD HKU\tmp\Console /v WindowSize /t REG_DWORD /d 2621530 /f
REG ADD HKU\tmp\Console /v historybuffersize /t REG_DWORD /d 90 /f
REG ADD HKU\tmp\Console /v NumberOfHistoryBuffers /t REG_DWORD /d 10 /f
REG ADD HKU\tmp\Console /v HistoryNoDup /t REG_DWORD /d 1 /f
REG ADD HKU\tmp\Console /v FontFamily /t REG_DWORD /d 54 /f
REG ADD HKU\tmp\Console /v FontSize /t REG_DWORD /d 917504 /f
REG ADD HKU\tmp\Console /v FontWeight /t REG_DWORD /d 400 /f
REG ADD HKU\tmp\Console /v FaceName /t REG_SZ /d "굴림체" /f
REG UNLOAD HKU\tmp

ECHO.
ECHO ###########################################################
ECHO #
ECHO # Optional components 추가
ECHO #
ECHO ###########################################################
ECHO.
ECHO -----------------------------------------------------------
ECHO - PowerShell
ECHO -----------------------------------------------------------
Dism /Add-Package /Image:"%WORK_DIR%\mount" /PackagePath:"%WinPERoot%\%DST_ARCH%\WinPE_OCs\WinPE-WMI.cab"
Dism /Add-Package /Image:"%WORK_DIR%\mount" /PackagePath:"%WinPERoot%\%DST_ARCH%\WinPE_OCs\ko-kr\WinPE-WMI_ko-kr.cab"
Dism /Add-Package /Image:"%WORK_DIR%\mount" /PackagePath:"%WinPERoot%\%DST_ARCH%\WinPE_OCs\WinPE-NetFX.cab"
Dism /Add-Package /Image:"%WORK_DIR%\mount" /PackagePath:"%WinPERoot%\%DST_ARCH%\WinPE_OCs\ko-kr\WinPE-NetFX_ko-kr.cab"
Dism /Add-Package /Image:"%WORK_DIR%\mount" /PackagePath:"%WinPERoot%\%DST_ARCH%\WinPE_OCs\WinPE-Scripting.cab"
Dism /Add-Package /Image:"%WORK_DIR%\mount" /PackagePath:"%WinPERoot%\%DST_ARCH%\WinPE_OCs\ko-kr\WinPE-Scripting_ko-kr.cab"
Dism /Add-Package /Image:"%WORK_DIR%\mount" /PackagePath:"%WinPERoot%\%DST_ARCH%\WinPE_OCs\WinPE-PowerShell.cab"
Dism /Add-Package /Image:"%WORK_DIR%\mount" /PackagePath:"%WinPERoot%\%DST_ARCH%\WinPE_OCs\ko-kr\WinPE-PowerShell_ko-kr.cab"
Dism /Add-Package /Image:"%WORK_DIR%\mount" /PackagePath:"%WinPERoot%\%DST_ARCH%\WinPE_OCs\WinPE-StorageWMI.cab"
Dism /Add-Package /Image:"%WORK_DIR%\mount" /PackagePath:"%WinPERoot%\%DST_ARCH%\WinPE_OCs\ko-kr\WinPE-StorageWMI_ko-kr.cab"
Dism /Add-Package /Image:"%WORK_DIR%\mount" /PackagePath:"%WinPERoot%\%DST_ARCH%\WinPE_OCs\WinPE-DismCmdlets.cab"
Dism /Add-Package /Image:"%WORK_DIR%\mount" /PackagePath:"%WinPERoot%\%DST_ARCH%\WinPE_OCs\ko-kr\WinPE-DismCmdlets_ko-kr.cab"

ECHO.
ECHO ###########################################################
ECHO #
ECHO # 패지지 목록 확인
ECHO #
ECHO ###########################################################
DISM /image:"%WORK_DIR%\mount" /get-packages

ECHO.
ECHO ###########################################################
ECHO #
ECHO # 언어 확인
ECHO #
ECHO ###########################################################
DISM /image:"%WORK_DIR%\mount" /get-intl

ECHO.
ECHO ###########################################################
ECHO #
ECHO # 언마운트
ECHO # DISM /unmount-image /mountdir:%WORK_DIR%\mount /commit
ECHO #
ECHO ###########################################################
DISM /unmount-image /mountdir:%WORK_DIR%\mount /commit
IF %ERRORLEVEL% NEQ 0 (
  ECHO ERROR: unmount
  EXIT /B
)
sync

ECHO.
ECHO ###########################################################
ECHO #
ECHO # boot.wim 파일을 추출하여 용량 최적화
ECHO # DISM /export-image /sourceimagefile:%WORK_DIR%\media\sources\boot.wim /sourceindex:1 /destinationimagefile:%WORK_DIR%\boot.wim
ECHO #
ECHO ###########################################################
DIR "%WORK_DIR%\media\sources\boot.wim"
DISM /export-image /sourceimagefile:%WORK_DIR%\media\sources\boot.wim /sourceindex:1 /destinationimagefile:%WORK_DIR%\boot.wim
COPY /Y "%WORK_DIR%\boot.wim" "%WORK_DIR%\media\sources\boot.wim"
DIR "%WORK_DIR%\media\sources\boot.wim"

ECHO ###########################################################
ECHO #
ECHO # ISO 파일 생성
ECHO #
ECHO ###########################################################
IF EXIST %ISO_FILE% DEL /F /Q %ISO_FILE%
CALL MAKEWINPEMEDIA /iso %WORK_DIR% %ISO_FILE%
IF %ERRORLEVEL% NEQ 0 (
  ECHO ERROR: MAKEWINPEMEDIA
  EXIT /B
)
DEL /F /Q "%WORK_DIR%\boot.wim"

CD /D %CURRENT_DIR%
PAUSE
위로 스크롤