echo on
REM SET UP DEFAULTS ----------------------------------------------
REM SET DEFAULT PATHS AND DRIVES FOR NON INTERACTIVE ITEMS (ONLY CHANGE AS REQUIRED)
REM MOUNTED ISO DRIVE LETTER
SET ISODRIVE=F
Set /p ISODRIVE= ^> Enter Drive Letter of iso (Default=%ISODRIVE%) and press "Enter":
REM CHECK IF INSTALL.WIM IN ISO
IF EXIST %ISODRIVE%:\SOURCES\INSTALL.WIM goto :WIM1
IF EXIST %ISODRIVE%:\SOURCES\INSTALL.ESD goto :ESD1
ECHO NO INSTALL.WIM (or INSTALL.ESD) IN ISO
GOTO :CONT3
:ESD1
ECHO ISO HAS INSTALL.ESD - NEED ISO WITH INSTALL.WIM
GOTO :CONT3
:WIM1
REM DRIVE LETTER FOR VHD WHEN MOUNTED TO CREATE DUAL BOOT - USE UNCOMMON LETTER
SET VHDdrive=T
REM SET DRIVE AND PATH OF WORKING FILES (no quotes even if spaces, no trailing \)
SET DRV=D
SET Updateiso=\isos\Updateiso
REM SET DRIVE AND PATH OF WHERE TO STORE ISO IF CREATED (no quotes even if spaces, no trailing \)
SET IDRV=D
SET Newiso=%Updateiso%\newisos
REM SET DEFAULT DRIVE AND PATH OF ANY DRIVER FILES TO BE COPIED (no quotes even if spaces, no trailing \)
REM FILES ARE COPIED TO %Updateiso%\Drivers-Boot / Wim FOR SUBSEQUENT USE WITHOUT HAVING TO COPY EVERY TIME
SET DRIVERFILES-Wim=%DRV%:\%Updateiso%\PutNeWDriversHere\DriverFiles-Wim
SET DRIVERFILES-Boot=%DRV%:\%Updateiso%\PutNeWDriversHere\DriverFiles-Boot
REM SET DEFAULT DRIVE AND PATH WHERE TO STORE VHDS IF CREATED (no quotes even if spaces, no trailing \)
SET VDRV=D
SET HYPERFILES=\Hyper-V\Virtual Hard Disks
REM SET MAXIMUM VHD SIZE IN MB
SET Maxvhdsize=100000
REM SET DEFAULT NAMES FOR NEW ISOS - vhdname defaults to same name as iso
SET isoname=IsoNew
REM SET INTERACTIVE DEFAULTS
REM SET DEFAULT TO CREATE DUAL BOOT OPTION (set to Y or y to create, N or n to not create)
SET dualboot=N
REM SET DEFAULT TO CREATE AS UEFI OPTION (set to U or u for UEFI, B or b for Bios to create)
SET uefimbr=U
REM SET DEFAULT TO INSTALL AS S-MODE (set to N or n for normal, S or s for S-Mode)
SET smode=N
REM set to Y or y to copy new ones, P or p for previous ones, N or n to not copy (i.e. use ones previously copied)
SET COPYDRIVERS=P
REM SET DEFAULT BOOT.WIM INDEX - USUALLY 2 in most cases unless using a custom boot wim where may vary
SET BIND=2
REM SET DEFAULT EDITION TO INSTALL - NOTE: SKUID IS NOT THE SKU INDEX
REM SKUID 1=HOME, 2=HOME N, 3=HOME SL, 4=EDU, 5=EDU N, 6=PRO, 7=PRO N, 8=PRO EDU,
REM SKUID 9=PRO EDU N, 10=PRO Workstations, 11=PRO N Workstations, 12=WINPE
SET SKUID=6
REM SET DEFAULT WINDOWS VERSION
SET WINVER=11
REM ------------------- END OF DEFAULT SETUPS ------------------------------------
REM DELETE NEXT TWO LINES IF YOU WANT TO INJECT DRIVERS
REM SET COPYDRIVERS=N
REM GOTO :CONT5
DISM /cleanup-mountpoints
SET /p WINVER= ^> Enter Windows version 10 or 11. Default = %WINVER% and press "Enter":
IF %WINVER%==10 goto :CONTX
IF %WINVER%==11 goto :CONTX
:LOOPBACK0
GOTO :LOOPBACK0
:CONTX
ECHO VERSION IS %WINVER%
:LOOPBACK1
SET /p COPYDRIVERS= ^> Enter Y or y to copy new drivers, P or p to use previously copied drivers, N or n for none and press "Enter":
IF %COPYDRIVERS%==N goto :CONT5
IF %COPYDRIVERS%==n goto :CONT5
IF %COPYDRIVERS%==Y goto :CONT6
IF %COPYDRIVERS%==y goto :CONT6
IF %COPYDRIVERS%==P goto :CONT5
IF %COPYDRIVERS%==p goto :CONT5
GOTO :LOOPBACK1
:LOOPBACK1A
SET /p COPYDRIVERS= ^> Enter Y or y to copy new drivers, P or p to use previously copied drivers, N or n for none and press "Enter":
IF %COPYDRIVERS%==N goto :CONT5
IF %COPYDRIVERS%==n goto :CONT5
IF %COPYDRIVERS%==Y goto :CONT6
IF %COPYDRIVERS%==y goto :CONT6
IF %COPYDRIVERS%==P goto :CONT5
IF %COPYDRIVERS%==p goto :CONT5
GOTO :LOOPBACK1A
:CONT6
xcopy /e /q /y "%DRIVERFILES-Wim%\*.*" "%DRV%:%Updateiso%\Drivers-Wim\"
xcopy /e /q /y "%DRIVERFILES-Boot%\*.*" "%DRV%:%Updateiso%\Drivers-Boot\"
:CONT5
SET /p BIND= ^> Enter Boot.wim Index Number (Default=%BIND%) and press "Enter":
Set /p SKUID= ^> Enter Edition to install- SKU ID (not index) 1=HOME,2=HOME N, 3=HOME SL, 4=EDU, 5=EDU N, 6=PRO, 7=PRO N, 8=PRO EDU, 9=PRO EDU N, 10=PRO Workstations, 11=PRO N Workstations, 12=WinPE (Default=%SKUID%) and press "Enter":
IF %WINVER%==11 goto :WIN11
if %SKUID%==1 SET SKUNAME="Windows 10 Home"
if %SKUID%==2 SET SKUNAME="Windows 10 Home N"
if %SKUID%==3 SET SKUNAME="Windows 10 Home Single Language"
if %SKUID%==4 SET SKUNAME="Windows 10 Education"
if %SKUID%==5 SET SKUNAME="Windows 10 Education N"
if %SKUID%==6 SET SKUNAME="Windows 10 Pro"
if %SKUID%==7 SET SKUNAME="Windows 10 Pro N"
if %SKUID%==8 SET SKUNAME="Windows 10 Pro Education"
if %SKUID%==9 SET SKUNAME="Windows 10 Pro Education N"
if %SKUID%==10 SET SKUNAME="Windows 10 Pro for Workstations"
if %SKUID%==11 SET SKUNAME="Windows 10 Pro for Workstations N"
echo %SKUID%, %SKUNAME%
goto :CONTQ
:WIN11
if %SKUID%==1 SET SKUNAME="Windows 11 Home"
if %SKUID%==2 SET SKUNAME="Windows 11 Home N"
if %SKUID%==3 SET SKUNAME="Windows 11 Home Single Language"
if %SKUID%==4 SET SKUNAME="Windows 11 Education"
if %SKUID%==5 SET SKUNAME="Windows 11 Education N"
if %SKUID%==6 SET SKUNAME="Windows 11 Pro"
if %SKUID%==7 SET SKUNAME="Windows 11 Pro N"
if %SKUID%==8 SET SKUNAME="Windows 11 Pro Education"
if %SKUID%==9 SET SKUNAME="Windows 11 Pro Education N"
if %SKUID%==10 SET SKUNAME="Windows 11 Pro for Workstations"
if %SKUID%==11 SET SKUNAME="Windows 11 Pro for Workstations N"
echo %SKUID%, %SKUNAME%
:CONTQ
set /p isoname= ^> Enter iso name (no extension) - Default is %isoname% and press "Enter" - enter n or N if you do not want an iso:
CLS
:LOOPBACK4
set /p smode= ^> Enter N or n to install OS as normal, or enter S or s to install as S-Mode - Default is %smode% "Enter":
echo %smode%
if %smode%==N goto :LOOPBACK5
if %smode%==n goto :LOOPBACK5
if %smode%==S goto :LOOPBACK5
if %smode%==s goto :LOOPBACK5
REM reenter if not N,n,S or s
goto :LOOPBACK4
:LOOPBACK5
set /p uefimbr= ^> Enter U or u to install OS as UEFI, or enter B or b to boot as BIOS - Default is %uefimbr% "Enter":
echo %uefimbr%
if %uefimbr%==U goto :LOOPBACK3
if %uefimbr%==u goto :LOOPBACK3
if %uefimbr%==B goto :LOOPBACK3
if %uefimbr%==b goto :LOOPBACK3
REM reenter if not U,u,B or b
goto :LOOPBACK5
:LOOPBACK3
set /p dualboot= ^> Select install OS a vhd ONLY, iso or dual boot (I , i for iso only, Y , y to dual Boot, V , v for VHD only) - Default is %dualboot% "Enter":
echo %dualboot%
if %dualboot%==y goto :CONT1
if %dualboot%==Y goto :CONT1
if %dualboot%==V goto :CONT1
if %dualboot%==v goto :CONT1
if %dualboot%==i goto :CONT2
if %dualboot%==I goto :CONT2
REM reenter if not Y,y,N or n
goto :LOOPBACK3
:CONT1
set vhdname=%isoname%
if %isoname%==n set vhdname=NewVHD
if %isoname%==N set vhdname=NewVHD
set /p vhdname= ^> Enter vhd name (no extension) - Default is %vhdname% and press "Enter":
:CONT2
REM ---------------------------------------------------------------------------------------------
REM CREATE FILE STRUCTURE IF NOT EXISTING
%DRV%:
md %Updateiso%
cd %Updateiso%
md offline
md diskpart
md drivers
md newisos
md newvhds
md smode
rd %Updateiso%\isofiles /s /q
md isofiles
REM ---------------------------------------------------------------------------------------------
REM COPY FILES FROM MOUNTED ISO DRIVE
cd isofiles
xcopy /e /y /q %ISODRIVE%:\*.* *.*
REM --------------------------------------------------------------------------------------------
REM CREATE EI.CFG IN SOURCES FOLDER - COMMENT OUT HYPERV
rem echo [CHANNEL] > "%DRV%:\isos\%Updateiso%\isofiles\sources\ei.cfg"
rem echo Retail >> "%DRV%:%Updateiso%\isofiles\sources\ei.cfg"
REM ---------------------------------------------------------------------------------------------
IF %COPYDRIVERS%==N goto :SMODEMAKE
IF %COPYDRIVERS%==n goto :SMODEMAKE
REM ADD DRIVERS TO BOOT.WIM
DISM /Mount-Wim /WimFile:"%DRV%:%Updateiso%\isofiles\sources\boot.wim" /Index:%BIND% /MountDir:"%DRV%:%Updateiso%\offline"
DISM /Image:"%DRV%:%Updateiso%\offline" /Add-Driver /Driver:"%DRV%:%Updateiso%\Drivers-Boot" /recurse
DISM /Unmount-Wim /MountDir:"%DRV%:%Updateiso%\offline" /Commit
if %SKUID%==12 goto :ISOMAKE
pause
REM ---------------------------------------------------------------------------------------------
REM ADD DRIVERS TO INSTALL.WIM
DISM /Mount-Wim /WimFile:"%DRV%:%Updateiso%\isofiles\sources\install.wim" /name:%SKUNAME% /MountDir:"%DRV%:%Updateiso%\offline"
DISM /Image:"%DRV%:%Updateiso%\offline" /Add-Driver /Driver:"%DRV%:%Updateiso%\Drivers-Wim" /recurse
DISM /Unmount-Wim /MountDir:"%DRV%:%Updateiso%\offline" /Commit
pause
REM----------------------------------------------------------------------------------------------
:SMODEMAKE
if %isoname%==N goto :DUAL
if %isoname%==n goto :DUAL
if %smode%==n goto :ISOMAKE
if %smode%==N goto :ISOMAKE
REM CREATE MYUNATTEND.XML
echo ^<?xml version="1.0" encoding="utf-8"?^> > "%DRV%:%Updateiso%\smode\myunattend.xml"
echo ^<unattend xmlns="urn:schemas-microsoft-com:unattend"^> >> "%DRV%:%Updateiso%\smode\myunattend.xml"
echo ^<settings pass="offlineServicing"^> >> "%DRV%:%Updateiso%\smode\myunattend.xml"
echo ^<component name="Microsoft-Windows-CodeIntegrity" >> "%DRV%:%Updateiso%\smode\myunattend.xml"
echo processorArchitecture="amd64" >> "%DRV%:%Updateiso%\smode\myunattend.xml"
echo publicKeyToken="31bf3856ad364e35" language="neutral" >> "%DRV%:%Updateiso%\smode\myunattend.xml"
echo versionScope="nonSxS" >> "%DRV%:%Updateiso%\smode\myunattend.xml"
echo xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" >> "%DRV%:%Updateiso%\smode\myunattend.xml"
echo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"^> >> "%DRV%:%Updateiso%\smode\myunattend.xml"
echo ^<SkuPolicyRequired^>1^</SkuPolicyRequired^> >> "%DRV%:%Updateiso%\smode\myunattend.xml"
echo ^</component^> >> "%DRV%:%Updateiso%\smode\myunattend.xml"
echo ^</settings^> >> "%DRV%:%Updateiso%\smode\myunattend.xml"
echo xmlns:cpi="urn:schemas-microsoft-com:cpi" /^> >> "%DRV%:%Updateiso%\smode\myunattend.xml"
echo ^</unattend^> >> "%DRV%:%Updateiso%\smode\myunattend.xml"
DISM /Mount-Wim /WimFile:"%DRV%:%Updateiso%\isofiles\sources\install.wim" /name:%SKUNAME% /MountDir:"%DRV%:%Updateiso%\offline"
DISM /Image:"%DRV%:%Updateiso%\offline" /Apply-Unattend:%DRV%:%Updateiso%\smode\myunattend.xml
DISM /Unmount-Wim /MountDir:"%DRV%:%Updateiso%\offline" /Commit
DISM /cleanup-mountpoints
REM----------------------------------------------------------------------------------------------
REM CREATE ISO
:ISOMAKE
C:
CD "\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg"
oscdimg.exe -m -o -u2 -udfver102 -bootdata:2#p0,e,b"%DRV%:%Updateiso%\isofiles\boot\etfsboot.com"#pEF,e,b"%DRV%:%Updateiso%\isofiles\efi\microsoft\boot\efisys.bin" "%DRV%:%Updateiso%\isofiles" "%IDRV%:%Newiso%\%isoname%.iso"
if %SKUID%==12 goto :CONT3
REM ---------------------------------------------------------------------------------------------
:DUAL
REM CREATE DUAL BOOT VHD AND INSTALL IT IF REQUIRED
C:
CD\
if %dualboot%==I goto :CONT3
if %dualboot%==i goto :CONT3
REM CREATE DISKPART.TXT
if %uefimbr%==B goto :MBRBOOT
if %uefimbr%==b goto :MBRBOOT
@echo create vdisk file="%VDRV%:%Hyperfiles%\%vhdname%.vhdx" maximum=%Maxvhdsize% type=expandable > %DRV%:%Updateiso%\diskpart\diskpart.txt
@echo select vdisk file="%VDRV%:%Hyperfiles%\%vhdname%.vhdx" >> "%DRV%:%Updateiso%\diskpart\diskpart.txt"
@echo attach vdisk >> "%DRV%:%Updateiso%\diskpart\diskpart.txt"
@echo convert gpt >> "%DRV%:%Updateiso%\diskpart\diskpart.txt"
@echo create partition primary >> "%DRV%:%Updateiso%\diskpart\diskpart.txt"
@echo format fs=ntfs quick label="Windows" >> "%DRV%:%Updateiso%\diskpart\diskpart.txt"
@echo assign letter=%VHDdrive% >> "%DRV%:%Updateiso%\diskpart\diskpart.txt"
goto :VHDCREATE
:MBRBOOT
@echo create vdisk file="%VDRV%:%Hyperfiles%\%vhdname%.vhdx" maximum=%Maxvhdsize% type=expandable > %DRV%:%Updateiso%\diskpart\diskpart.txt
@echo select vdisk file="%VDRV%:%Hyperfiles%\%vhdname%.vhdx" >> "%DRV%:%Updateiso%\diskpart\diskpart.txt"
@echo attach vdisk >> "%DRV%:%Updateiso%\diskpart\diskpart.txt"
@echo convert mbr >> "%DRV%:%Updateiso%\diskpart\diskpart.txt"
@echo create partition primary >> "%DRV%:%Updateiso%\diskpart\diskpart.txt"
@echo select partition 1 >> "%DRV%:%Updateiso%\diskpart\diskpart.txt"
@echo assign letter=%VHDdrive% >> "%DRV%:%Updateiso%\diskpart\diskpart.txt"
@echo format fs=ntfs quick label="Windows" >> "%DRV%:%Updateiso%\diskpart\diskpart.txt"
@echo active >> "%DRV%:%Updateiso%\diskpart\diskpart.txt"
:VHDCREATE
REM CREATE VHD
diskpart /s "%DRV%:%Updateiso%\diskpart\diskpart.txt"
REM INSTALL OS IN VHD DRIVE
DISM /apply-image /imagefile:"%DRV%:%Updateiso%\isofiles\sources\install.wim" /name:%SKUNAME% /applydir:%VHDdrive%:\
if %dualboot%==V goto :CONT3
if %dualboot%==v goto :CONT3
REM ADD BOOT ENTRY TO BCD
bcdboot %VHDdrive%:\windows /p /d
:CONT3
@ECHO PROCESS IS COMPLETE
pause