WINPE镜像制作-main.cmd详解

导读

 WINPE镜像制作-startnet.cmd详解

Windows 评估和部署套件 (ADK)系统部署流程

出货系统镜像批量安装方案


一、main.cmd详解

这是一个简单的WINPE脚本,功能由系统实现自动识别,判定legacy模式安装win7 64 CN,判定uefi安装win8.1 64 CN


@ECHO off
@REM  This script is called by x:\Windows\System32\Startnet.cmd - WinPE
@ECHO.
@ECHO.
@ECHO.
@ECHO Running Intel Optimization powercfg for improved imaging times
@ECHO.
@ECHO.
@REM  *****************************************************************
@REM  List all the disks, then search the volumes of each one to see 
@REM  which disks may have "Winpe" in the label. We will ignore that 
@REM  disk and use the first disk without the Winpe label that we find. 
@REM  *****************************************************************
@REM  create diskpart script for list disk
@ECHO.>x:\listdisk.txt
@ECHO list disk>>x:\listdisk.txt
@ECHO exit>>x:\listdisk.txt
@ECHO x:\listdisk.txt
@ECHO call diskpart /s x:\listdisk.txt
CALL diskpart /s x:\listdisk.txt>x:\Disks.txt
@ECHO.
@REM Set Disk equal to blank to start
SET disk=
@ECHO.
@REM 
@REM  This line will write a diskpart script to select the disk and detail it's contents.
@REM  We use this output to find a disk that does NOT have Winpe as the volume label.
@REM  That disk will have the OS installed to it. This way you can exclude USB from diskpart.
@REM  
@REM  This works around the issue where the USB key is sometimes enumerated as disk 0 and the 
@REM  SSD is disk 1. 
@REM  依次取磁盘0,1,2,。。。,1.如果盘符不是WINPE设置disk的值;2.如果不是WINPE又没有磁盘,设置disk=0,后面又要讨论disk 0是否为U盘,为U盘error 
FOR /f "skip=8 tokens=2" %%A IN (x:\Disks.txt) DO (
@ECHO sel disk %%A>x:\Par.txt
@ECHO det disk>>x:\Par.txt
@ECHO exit>>x:\Par.txt
IF NOT "%%A"=="DiskPart..." CALL :LISTPAR %%A
)
IF "%Disk%"=="" ECHO "No disk found without a volume label of WINPE" && SET disk=0
@rem IF "%Disk%"=="" ECHO "No disk found without a volume label of WINPE" && GOTO :ERROR
@ECHO Using Disk "%Disk%"
@ECHO.

@rem if disk  is removable, case 1 no disk,case 2 the removable device name is not winPE
@ECHO sel disk %Disk% >x:\Par_1.txt
@ECHO det disk>>x:\Par_1.txt
@ECHO exit>>x:\Par_1.txt
CALL DISKPART /S X:\Par_1.txt>X:\ParOutput_1.txt
FOR /f "skip=26 tokens=6" %%A IN (x:\ParOutput_1.txt) DO (
IF /i  "%%A"=="removable"  ECHO Disk "%Disk%" is removable device GOTO :ERROR && GOTO :ERROR
)




@ECHO.
@ECHO.
@REM  *****************************************************************
@REM    Detect if System is booted into UEFI mode or Bios mode 
@REM  *****************************************************************
FOR /f "tokens=2* delims= " %%A IN ('reg query HKLM\System\CurrentControlSet\Control /v PEFirmwareType') DO SET Firmware=%%B
@ECHO.
IF %Firmware%==0x1 GOTO :BIOSMODE
IF %Firmware%==0x2 GOTO :UEFIMODE
GOTO :END


:UEFIMODE
@ECHO.
@REM ************************
@REM UEFI SECTION
@REM ************************
@ECHO The PC is booted in UEFI mode
@ECHO.>x:\winpart.txt
@ECHO select disk "%Disk%">>x:\winpart.txt
@ECHO clean>>x:\winpart.txt
@ECHO convert gpt>>x:\winpart.txt
@ECHO create partition primary size=300>>x:\winpart.txt
@ECHO format quick fs=ntfs label="Windows RE tools">>x:\winpart.txt
@ECHO assign letter="T">>x:\winpart.txt
@ECHO set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac">>x:\winpart.txt
@ECHO gpt attributes=0x8000000000000001>>x:\winpart.txt
@ECHO create partition efi size=100>>x:\winpart.txt
@ECHO format quick fs=fat32 label="System">>x:\winpart.txt
@ECHO assign letter="S">>x:\winpart.txt
rem @ECHO create partition msr size=128>>x:\winpart.txt
@ECHO create partition primary>>x:\winpart.txt
rem @ECHO shrink minimum=15000>>x:\winpart.txt
@ECHO format quick fs=ntfs label="Windows">>x:\winpart.txt
@ECHO assign letter="C">>x:\winpart.txt

rem @ECHO create partition primary>>x:\winpart.txt
rem @ECHO format quick fs=ntfs label="Recovery image">>x:\winpart.txt
rem @ECHO assign letter="R">>x:\winpart.txt
rem @ECHO set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac">>x:\winpart.txt
rem @ECHO gpt attributes=0x8000000000000001>>x:\winpart.txt
@ECHO list partition>>x:\winpart.txt
@ECHO list volume>>x:\winpart.txt
@ECHO exit>>x:\winpart.txt
@ECHO.
@REM *****************************************************************
@REM  Map drive letter for Install.wim
@REM *****************************************************************
@ECHO.>x:\ListVol.txt
@ECHO List volume>>x:\ListVol.txt
@ECHO exit>>x:\ListVol.txt
@ECHO call diskpart /s x:\ListVol.txt
CALL DISKPART /s x:\ListVol.txt>x:\Output.txt
@ECHO.
@ECHO.
@REM Go through each drive letter, looking for the \Scripts\Main.cmd file
FOR /f "skip=8 tokens=3" %%A IN (x:\Output.txt) DO (
IF EXIST %%A:\Scripts\Main.cmd SET InstallPath=%%A&& ECHO "Found device with images folder and Main.cmd file"
)

@ECHO call diskpart /s x:\winpart.txt
DISKPART /s x:\winpart.txt

rem == Apply the image to the Windows partition ==
dism /Apply-Image /ImageFile:"%InstallPath%:\Scripts\install_win8_1_x64_UEFI_CN.wim" /Index:1 /ApplyDir:C:\
rem == Copy boot files to the System partition ==
C:\Windows\System32\bcdboot C:\Windows


rem @ECHO copy %InstallPath%:\Scripts\ApplyImage-UEFI.bat %cd%
rem copy %InstallPath%:\Scripts\ApplyImage-UEFI.bat %cd%

rem @ECHO ApplyImage-UEFI.bat %InstallPath%:\Scripts\install.wim
rem ApplyImage-UEFI.bat %InstallPath%:\Scripts\install.wim



GOTO :WINPARTSECTION


:BIOSMODE
@REM ************************
@REM BIOS SECTION
@REM ************************
@ECHO The PC is booted in BIOS mode
@ECHO The PC is booted in BIOS mode>x:\Bios.txt
@ECHO.>x:\winpart.txt
@ECHO select disk "%Disk%">>x:\winpart.txt
@ECHO clean>>x:\winpart.txt
@ECHO create partition primary size=100>>x:\winpart.txt
@ECHO active>>x:\winpart.txt
@ECHO format quick fs=fat32 label="System">>x:\winpart.txt
@ECHO assign letter="S">>x:\winpart.txt
@ECHO create partition primary>>x:\winpart.txt
@ECHO format quick fs=ntfs label="Windows">>x:\winpart.txt
@ECHO assign letter="C">>x:\winpart.txt
rem @ECHO shrink desired=15000>>x:\winpart.txt
rem @ECHO create partition primary>>x:\winpart.txt
rem @ECHO format quick fs=ntfs label="Recovery image">>x:\winpart.txt
rem @ECHO assign letter="R">>x:\winpart.txt
rem @ECHO set id=27>>x:\winpart.txt
@ECHO list partition>>x:\winpart.txt
@ECHO list volume>>x:\winpart.txt
@ECHO exit>>x:\winpart.txt
@ECHO.
@REM *****************************************************************
@REM  Map drive letter for Install.wim
@REM *****************************************************************
@ECHO.>x:\ListVol.txt
@ECHO List volume>>x:\ListVol.txt
@ECHO exit>>x:\ListVol.txt
@ECHO call diskpart /s x:\ListVol.txt
CALL DISKPART /s x:\ListVol.txt>x:\Output.txt
@ECHO.
@ECHO.
@REM Go through each drive letter, looking for the \Scripts\Main.cmd file
FOR /f "skip=8 tokens=3" %%A IN (x:\Output.txt) DO (
IF EXIST %%A:\Scripts\Main.cmd SET InstallPath=%%A&& ECHO "Found device with images folder and Main.cmd file"
)

@ECHO call diskpart /s x:\winpart.txt
DISKPART /s x:\winpart.txt

rem == Apply the image to the Windows partition ==
dism /Apply-Image /ImageFile:"%InstallPath%:\Scripts\install_win7_x64_legacy_CN.wim" /Index:1 /ApplyDir:C:\
rem == Copy boot files to the System partition ==
C:\Windows\System32\bcdboot C:\Windows

rem @ECHO copy %InstallPath%:\Scripts\ApplyImage-BIOS.bat %cd%
rem copy %InstallPath%:\Scripts\ApplyImage-BIOS.bat %cd%

rem @ECHO ApplyImage-BIOS.bat %InstallPath%:\Scripts\install.wim
rem ApplyImage-BIOS.bat %InstallPath%:\Scripts\install.wim

GOTO :WINPARTSECTION


:WINPARTSECTION






@ECHO *****************************************************************
@ECHO  Image deployment COMPLETE. Type EXIT from Command
@ECHO *****************************************************************
@ECHO.
GOTO :REBOOT


:LISTPAR
@REM This section is to bring a disk number and use it to List Partitions
@ECHO.
SET TempDisk=%1
DISKPART /s x:\Par.txt>x:\ParOutput.txt
FOR /f "skip=26 tokens=4" %%A IN (x:\ParOutput.txt) DO (
IF /i NOT "%%A"=="Winpe" SET Disk=%TempDisk%
)
GOTO :EOF

:REBOOT
@REM 
@REM  Get finish time so we can evaluate total WinPE phase time.
@REM
CALL |time>x:\StopTime.txt
@ECHO.
@ECHO Deployment complete, system restart.
pause
WPEUTIL REBOOT
@ECHO.

:ERROR
@ECHO.
@ECHO An error has been detected.
COLOR 4F
@ECHO. 
GOTO :END

:END
@REM 
@REM  Get finish time so we can evaluate total WinPE phase time.
@REM
CALL |time>x:\StopTime.txt
@ECHO.
FOR /f "tokens=5" %%A IN (x:\starttime.txt) DO ECHO Script Start Time is %%A
FOR /f "tokens=5" %%A IN (x:\stoptime.txt) DO ECHO  Script Stop Time is %%A
@ECHO.




  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ventoy是一个制作可启动U盘的开源工具。 有了Ventoy你就无需反复地格式化U盘,你只需要把 ISO/WIM/IMG/VHD(x)/EFI 等类型的文件拷贝到U盘里面就可以启动了,无需其他操作。 你可以一次性拷贝很多个不同类型的镜像文件,Ventoy 会在启动时显示一个菜单来供你进行选择。 Ventoy 安装之后,同一个U盘可以同时支持 x86 Legacy BIOS、IA32 UEFI、x86_64 UEFI、ARM64 UEFI 和 MIPS64EL UEFI 模式。 Ventoy 支持大部分常见类型的操作系统 (Windows/WinPE/Linux/ChromeOS/Unix/VMware/Xen ...)。 使用说明:https://www.ventoy.net/cn/doc_start.html Ventoy 特点 100% 开源,使用简单,快速 (拷贝文件有多快就有多快),可以安装在 U盘/本地硬盘/SSD/NVMe/SD卡等设备上,直接从 ISO/WIM/IMG/VHD(x)/EFI 文件启动,无需解开ISO/WIM/IMG/VHD(x)/EFI 文件在磁盘上无需连续,支持MBR和GPT分区格式,同时支持 x86 Legacy BIOS 以及 IA32/x86_64/ARM64/MIPS64 UEFI,UEFI 模式支持安全启动 (Secure Boot),支持数据持久化,支持Windows系统的自动安装部署,支持 RHEL7/8/CentOS7/8/SUSE/Ubuntu Server/Debian 等Linux系统的自动安装部署,镜像分区支持 FAT32/exFAT/NTFS/UDF/XFS/Ext2(3)(4) 文件系统,支持超过4GB的ISO文件,保留ISO原始的启动菜单风格(Legacy & UEFI),支持大部分常见操作系统, 已测试730+ 个ISO文件,不仅仅是启动,而是完整的安装过程,菜单可以在列表模式和目录树模式之间实时、动态切换,提出 "Ventoy Compatible" 概念,支持插件扩展,Linux vDisk(vhd/vdi/raw...) 启动解决方案,支持向运行环境中插入文件,动态替换ISO文件中的原始启动配置文件,高度可定制化的主题风格和菜单,启动过程中支持U盘设置写保护,不影响U盘日常普通使用,版本升级时数据不会丢失,无需跟随操作系统升级而升级Ventoy。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值