|
菜鸟,抄的,有很多不足,看客请留情,请多提意见
- @echo off
- title ★ 系统安装脚本 By: H J J★
- :: Ver: 2.00
- :: Date: 2025-01-01
- REM 本脚本用于在 [ 微PE 2.3 ] 中自动部署系统及常用软件,脚本需要在U盘根目录中保存,并配合_OS及_Desktop目录及其文件运行
- REM 部署过程还必须的另外批处理为:MAS_AIO,PreInst.bat,RES.bat等,及批处理涉及的文件
- REM [ 批处理基础设置 ] 是一些基本设置,请自行修改
- REM 重装部分待完成
- REM =======================运行环境设置=======================
- SetLocal EnableDelayedExpansion
- REM 跳转到批处理所在目录
- set DirCurrent=%~dp0
- cd %DirCurrent%
- color 0F
- REM 只在微PE2.3中测试,其他的pe系统,请自行测试
- set CheckFile="%desktop%\微PE小助手.LNK"
- if not exist %CheckFile% (call :hightlight 4E "- 此批处理只在 · 微PE工具箱 2.3 · 中运行测试通过 任意键退出 -" & pause>nul & exit)
- choice /T 5 /C ync /CS /D y /n>nul
- REM 尝试修正运行环境
- if not exist "%windir%\system32\choice.exe" (copy %DirCurrent%_DESKTOP\choice.exe %windir%\system32\ /y)
- if not exist "%windir%\system32\find.exe" (copy %DirCurrent%_DESKTOP\find.exe %windir%\system32\ /y)
- if not exist "%windir%\system32\findstr.exe" (copy %DirCurrent%_DESKTOP\findstr.exe %windir%\system32\ /y)
- if not exist "%windir%\system32\mountvol.exe" (copy %DirCurrent%_DESKTOP\mountvol.exe %windir%\system32\ /y)
- REM 修正盘符占用 预备
- if exist C:\ (copy %DirCurrent%_DESKTOP\RES.bat "%USERPROFILE%\Desktop" /y)
- choice /T 5 /C ync /CS /D y /n>nul
- REM 下面的修正盘符的逻辑计划修改为:如果x盘被U盘占用,则启动RES.bat,并直接修改U盘盘符为U,然后卸载分区
- if exist C:\ (
- if %~d0==C: (
- start %USERPROFILE%\Desktop\RES.bat
- for /f %%i in ('mountvol c: /l') do (
- set "vol=%%i" & mountvol C: /D & mountvol U: %vol%
- )
- ) else (
- mountvol C: /D
- )
- )
- if exist D:\ (
- if %~d0==D: (
- start %USERPROFILE%\Desktop\RES.bat
- for /f %%i in ('mountvol d: /l') do (
- set "vol=%%i" & mountvol d: /D & mountvol U: %vol%
- )
- ) else (
- mountvol D: /D
- )
- )
- if exist E:\ (
- if %~d0==E: (
- start %USERPROFILE%\Desktop\RES.bat
- for /f %%i in ('mountvol e: /l') do (
- set "vol=%%i" & mountvol E: /D & mountvol U: %vol%
- )
- ) else (
- mountvol E: /D
- )
- )
- if exist F:\ (
- if %~d0==F: (
- start %USERPROFILE%\Desktop\RES.bat
- for /f %%i in ('mountvol F: /l') do (
- set "vol=%%i" & mountvol F: /D & mountvol U: %vol%
- )
- ) else (
- mountvol F: /D
- )
- )
- REM 确保盘符不被占用
- if exist C:\ (echo. & echo 盘符 C 占用修正失败 请手动安装系统 任意键退出 & pause>nul & exit)
- if exist D:\ (echo. & echo 盘符 D 占用修正失败 请手动安装系统 任意键退出 & pause>nul & exit)
- if exist E:\ (echo. & echo 盘符 E 占用修正失败 请手动安装系统 任意键退出 & pause>nul & exit)
- if exist F:\ (echo. & echo 盘符 E 占用修正失败 请手动安装系统 任意键退出 & pause>nul & exit)
- if exist T:\ (echo. & echo 盘符 T 占用修正失败 请手动安装系统 任意键退出 & pause>nul & exit)
- REM =======================批处理基本设置=======================
- REM 系统镜像文件及应答文件
- set WIN7IMG =%DirCurrent%_OS\
- set WIN10IMG =%DirCurrent%_OS\zh-cn_windows_10_consumer_editions_version_22h2_updated_oct_2024_x64_dvd_d0cfb2e9.iso
- set WIN11IMG =%DirCurrent%_OS\zh-cn_windows_11_consumer_editions_version_24h2_x64_dvd_bfc0d79b.iso
- set W10LTSCIMG=%DirCurrent%_OS\WIN10_LTSC.iso
- REM 初始化应答文件
- set UNATT10PRO=%DirCurrent%_OS\UnattendFiles\WIN10.xml
- set UNATT11PRO=%DirCurrent%_OS\UnattendFiles\WIN11.xml
- set UNATT10LTSC=%DirCurrent%_OS\UnattendFiles\WIN10.xml
- REM oobe文件
- set OobeFile=%DirCurrent%_DESKTOP\oobe.cmd
- :: 默认等待时间
- set ETR=8
- :StartDeploy
- REM =======================开始部署系统=======================
- call :DisplayHDD
- call :BestHDD
- call :SelDisk
- call :SelCreatePartition
- call :SelOS
- call :BeforeDepOSCheck
- call :Confirm
- call :StartCreatePartition
- call :CheckCreatePartition
- call :DisplayHDD
- call :StartMountImg
- call :StartDepOS
- call :PreCopy
- call :rb
- call :eof
- :DisplayHDD
- REM =======================显示硬盘详情=======================
- REM 用于标记磁盘和硬盘分区
- REM TODO 这里 最后要互换一下
- set diskTag=ABCDEFGHIJKLMNOPQRSTUVWXYZ
- set AllNo=0123456789
- REM 标记硬盘
- set DiskTotal=0
- set partitionNum=0
- rem 设置分区ID,用于文件系统辅助识别
- set "$01=FAT12"
- set "$02=Xenix /"
- set "$03=Xenix /usr"
- set "$04=FAT16 <32M"
- set "$05=Extended"
- set "$06=FAT16 >=32M"
- set "$07=HPFS/NTFS/exFAT"
- set "$08=AIX"
- set "$09=AIX Boot"
- set "$0A=OS/2 Boot"
- set "$0B=FAT32"
- set "$0C=FAT32 LBA"
- set "$0E=FAT16 LBA"
- set "$0F=Extended LBA"
- set "$10=OPUS"
- set "$11=Hidden FAT12"
- set "$12=Compaq Diagnostics"
- set "$14=Hidden FAT16 <32M"
- set "$16=Hidden FAT16 >=32M"
- set "$17=Hidden HPFS/NTFS"
- set "$18=AST Swap"
- set "$1B=Hidden FAT32"
- set "$1C=Hidden FAT32 LBA"
- set "$1E=Hidden FAT16 LBA"
- set "$24=NEC DOS"
- set "$27=Microsoft Recovery Partition"
- set "$35=OS/2 JFS"
- set "$38=THE OS V3 2gb"
- set "$39=THE OS V4 spanned"
- set "$3A=THE OS V4 4gb"
- set "$3B=THE OS V4 extended"
- set "$3C=PartitionMagic recovery"
- set "$3D=Novell Netware(Hidden)"
- set "$40=VENIX 286"
- set "$41=Linux/MINIX (sharing with DRDOS)"
- set "$42=RAID"
- set "$43=Linux native (sharing with DRDOS)"
- set "$45=Boot-US"
- set "$4C=Oberon"
- set "$4D=QNX 4.2 Primay"
- set "$4E=QNX 4.2 Secondary"
- set "$4F=QNX 4.2 Tertiary"
- set "$50=DM (DIsk Danager)"
- set "$51=Novell(or DM6 Aux1)"
- set "$52=CP/M or Microport SysV/AT"
- set "$53=DM6 Aux3"
- set "$54=DM6"
- set "$55=ES-Drive (Disk Manager)"
- set "$56=Golded Bow (Disk Manager)"
- set "$57=DrivePro"
- set "$5C=Priam Edisk (Disk Manager)"
- set "$61=SpeedStor"
- set "$63=UNIX, System V/386, GNU HURD or Mach"
- set "$64=Novell Netware/286 2.xx"
- set "$65=Novell Netware/386 3.xx"
- set "$66=Novell"
- set "$67=Novell"
- set "$68=Novell"
- set "$69=Novell"
- set "$70=DiskSecure Multi-Boot"
- set "$74=Scramdisk"
- set "$75=PC/IX"
- set "$77=QNX4.x"
- set "$78=QNX4.x 2nd part"
- set "$79=QNX4.x 3rd part"
- set "$80=Minix util 1.4a"
- set "$81=Early Linux, or Minix since 1.4b"
- set "$82=Linux Swap"
- set "$83=Linux Native, or Ext2/3/4 (Linux Data)"
- set "$85=Linux extended"
- set "$86=FAT16 volume"
- set "$87=NTFS volume"
- set "$8B=FAT32 volume"
- set "$8C=FAT32 LBA volume"
- set "$93=Amoeba"
- set "$94=Amoeba bad block table"
- set "$9F=BSD/OS"
- set "$A0=Hibernation"
- set "$A1=Hibernation"
- set "$A5=FreeBSD/NetBSD"
- set "$A6=OpenBSD"
- set "$A7=NextStep"
- set "$A9=NetBSD"
- set "$AA=Olivetti FAT12"
- set "$AC=IBM JFS"
- set "$B7=BSDI BSD/386"
- set "$B8=BSDI BSD/386 Swap"
- set "$BE=Solaris boot"
- set "$C0=DR-DOS"
- set "$C1=DRDOS/sec FAT12"
- set "$C4=DRDOS/sec FAT16"
- set "$C6=Corrupted FAT16"
- set "$C7=Corrupted NTFS"
- set "$D8=CP/M-86"
- set "$DB=CP/M, Concurrent DOS or CTOS"
- set "$DF=BootIt"
- set "$E1=DOS access FAT12"
- set "$E3=DOS R/O or SpeedStor"
- set "$E4=SpeedStor FAT16"
- set "$EB=BeOS"
- set "$EE=Protected MBR"
- set "$EF=EFI System Partition"
- set "$F1=SpeedStor"
- set "$F2=DOS 3.3+ Secondary"
- set "$F4=SpeedStor Large"
- set "$FB=VMware VMFS"
- set "$FC=VMware Swap"
- set "$FD=Linux RAID"
- set "$FE=SpeedStor"
- set "$FF=XENIX bad blocks table"
- rem 设置GPT标识符,数据来自英文维基百科,不保证正确,仅供参考
- set "$00000000-0000-0000-0000-000000000000=未使用"
- set "$024DEE41-33E7-11D3-9D69-0008C781F39F=MBR分区表"
- set "$C12A7328-F81F-11D2-BA4B-00A0C93EC93B=ESP"
- set "$21686148-6449-6E6F-744E-656564454649=BIOS引导分区"
- set "$D3BFE2DE-3DAF-11DF-BA40-E3A556D89593=iFFS分区(Intel快速启动)"
- set "$F4019732-066E-4E12-8273-346C5641494F=Sony引导分区"
- set "$BFBFAFE7-A34F-448A-9A5B-6213EB736C22=Lenovo引导分区"
- set "$E3C9E316-0B5C-4DB8-817D-F92DF00215AE=MSR"
- set "$EBD0A0A2-B9E5-4433-87C0-68B6B72699C7=基本数据分区"
- set "$5808C8AA-7E8F-42E0-85D2-E1E90434CFB3=LDM元数据分区"
- set "$AF9B60A0-1431-4F62-BC68-3311714A69AD=LDM数据分区"
- set "$DE94BBA4-06D1-4D40-A16A-BFD50179D6AC=WinRE"
- set "$37AFFC90-EF7D-4E96-91C3-2D7AE055B174=IBM GPFS分区"
- set "$E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D=存储空间分区"
- set "$75894C1E-3AEB-11D3-B7C1-7B03A0000000=HP-UX 数据分区"
- set "$E2A1E728-32E3-11D6-A682-7B03A0000000=HP-UX 服务分区"
- set "$0FC63DAF-8483-4772-8E79-3D69D8477DE4=Linux 文件系统数据"
- set "$A19D880F-05FC-4D3B-A006-743F0F84911E=Linux RAID 分区"
- set "$44479540-F297-41B2-9AF7-D131D5F0458A=Linux / (x86)"
- set "$4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709=Linux / (x86-64)"
- set "$69DAD710-2CE4-4E3C-B16C-21A1D49ABED3=Linux / (32-bit ARM)"
- set "$B921B045-1DF0-41C3-AF44-4C6F280D3FAE=Linux / (64-bit ARM/AArch64)"
- set "$0657FD6D-A4AB-43C4-84E5-0933C84B4F4F=Linux 交换分区"
- set "$E6D6D379-F507-44C2-A23C-238F2A3DF928=Linux 逻辑卷管理器(LVM)分区"
- set "$933AC7E1-2EB4-4F13-B844-0E14E2AEF915=Linux /home"
- set "$3B8F8425-20E0-4F3B-907F-1A25A76F98E8=Linux /srv"
- set "$7FFEC5C9-2D00-49B7-8941-3EA10A5586B7=Linux 普通dm-crypt分区"
- set "$CA7D7CCB-63ED-4C53-861C-1742536059CC=Linux LUKS分区"
- set "$8DA63339-0007-60C0-C436-083AC8230908=Linux 保留"
- set "$83BD6B9D-7F41-11DC-BE0B-001560B84F0F=FreeBSD 启动分区"
- set "$516E7CB4-6ECF-11D6-8FF8-00022D09712B=FreeBSD 数据分区"
- set "$516E7CB5-6ECF-11D6-8FF8-00022D09712B=FreeBSD 交换分区"
- set "$516E7CB6-6ECF-11D6-8FF8-00022D09712B=FreeBSD UFS分区"
- set "$516E7CB8-6ECF-11D6-8FF8-00022D09712B=FreeBSD Vinum 卷管理器分区"
- set "$516E7CBA-6ECF-11D6-8FF8-00022D09712B=FreeBSD ZFS分区"
- set "$48465300-0000-11AA-AA11-00306543ECAC=Mac OS X HFS+分区"
- set "$7C3457EF-0000-11AA-AA11-00306543ECAC=Mac OS X Apple APFS"
- set "$55465300-0000-11AA-AA11-00306543ECAC=Mac OS X Apple UFS container"
- set "$6A898CC3-1DD2-11B2-99A6-080020736631=Mac OS X ZFS"
- set "$52414944-0000-11AA-AA11-00306543ECAC=Mac OS X Apple RAID分区"
- set "$52414944-5F4F-11AA-AA11-00306543ECAC=Mac OS X Apple RAID分区,离线"
- set "$426F6F74-0000-11AA-AA11-00306543ECAC=Mac OS X Apple引导分区(恢复HD)"
- set "$4C616265-6C00-11AA-AA11-00306543ECAC=Mac OS X Apple Label"
- set "$5265636F-7665-11AA-AA11-00306543ECAC=Mac OS X Apple TV恢复分区"
- set "$53746F72-6167-11AA-AA11-00306543ECAC=Mac OS X Apple 核心存储分区 "
- set "$B6FA30DA-92D2-4A9A-96F1-871EC6486200=Mac OS X SoftRAID_Status"
- set "$2E313465-19B9-463F-8126-8A7993773801=Mac OS X SoftRAID_Scratch"
- set "$FA709C7E-65B1-4593-BFD5-E71D61DE9B02=Mac OS X SoftRAID_Volume"
- set "$BBBA6DF5-F46F-4A89-8F59-8765B2727503=Mac OS X SoftRAID_Cache"
- set "$6A82CB45-1DD2-11B2-99A6-080020736631=Solaris illumos启动分区"
- set "$6A85CF4D-1DD2-11B2-99A6-080020736631=Solaris /"
- set "$6A87C46F-1DD2-11B2-99A6-080020736631=Solaris 交换分区"
- set "$6A8B642B-1DD2-11B2-99A6-080020736631=Solaris 备份分区"
- set "$6A898CC3-1DD2-11B2-99A6-080020736631=Solaris /usr"
- set "$6A8EF2E9-1DD2-11B2-99A6-080020736631=Solaris /var"
- set "$6A90BA39-1DD2-11B2-99A6-080020736631=Solaris /home"
- set "$6A9283A5-1DD2-11B2-99A6-080020736631=Solaris 备用扇区"
- set "$6A945A3B-1DD2-11B2-99A6-080020736631=Solaris 保留分区"
- set "$6A9630D1-1DD2-11B2-99A6-080020736631=Solaris 保留分区"
- set "$6A980767-1DD2-11B2-99A6-080020736631=Solaris 保留分区"
- set "$6A96237F-1DD2-11B2-99A6-080020736631=Solaris 保留分区"
- set "$6A8D2AC7-1DD2-11B2-99A6-080020736631=Solaris 保留分区"
- set "$49F48D32-B10E-11DC-B99B-0019D1879648=NetBSD 交换分区"
- set "$49F48D5A-B10E-11DC-B99B-0019D1879648=NetBSD FFS分区"
- set "$49F48D82-B10E-11DC-B99B-0019D1879648=NetBSD LFS分区"
- set "$49F48DAA-B10E-11DC-B99B-0019D1879648=NetBSD RAID分区"
- set "$2DB519C4-B10F-11DC-B99B-0019D1879648=NetBSD 串联分区"
- set "$2DB519EC-B10F-11DC-B99B-0019D1879648=NetBSD 加密分区"
- set "$FE3A2A5D-4F32-41A7-B725-ACCC3285A309=Chrome OS 内核"
- set "$3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC=Chrome OS 根文件系统"
- set "$2E0A753D-9E48-43B0-8337-B15192CB1B5E=Chrome OS 未来用途"
- set "$42465331-3BA3-10F1-802A-4861696B7521=Haiku BFS"
- set "$85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7=MidnightBSD 启动分区"
- set "$85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7=MidnightBSD 数据分区"
- set "$85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7=MidnightBSD 交换分区"
- set "$0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7=MidnightBSD UFS分区"
- set "$85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7=MidnightBSD Vinum 卷管理器分区"
- set "$85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7=MidnightBSD ZFS分区"
- set "$45B0969E-9B03-4F30-B4C6-B4B80CEFF106=Ceph Journal"
- set "$45B0969E-9B03-4F30-B4C6-5EC00CEFF106=Ceph dm-crypt journal"
- set "$4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D=Ceph OSD"
- set "$4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D=Ceph dm-crypt OSD"
- set "$89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE=Ceph 创建中的磁盘"
- set "$89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE=Ceph 创建中的dm-crypt磁盘"
- set "$CAFECAFE-9B03-4F30-B4C6-B4B80CEFF106=Ceph 块"
- set "$30CD0809-C2B2-499C-8879-2D6B78529876=Ceph 块数据库"
- set "$5CE17FCE-4087-4169-B7FF-056CC58473F9=Ceph 块写前日志"
- set "$FB3AABF9-D25F-47CC-BF5E-721D1816496B=Ceph dm-crypt密钥保险箱"
- set "$4FBD7E29-8AE0-4982-BF9D-5A8D867AF560=Ceph Multipath OSD"
- set "$45B0969E-8AE0-4982-BF9D-5A8D867AF560=Ceph Multipath journal"
- set "$CAFECAFE-8AE0-4982-BF9D-5A8D867AF560=Ceph Multipath 块"
- set "$7F4A666A-16F3-47A2-8445-152EF4D03F6C=Ceph Multipath 块"
- set "$EC6D6385-E346-45DC-BE91-DA2A7C8B3261=Ceph Multipath 块数据库"
- set "$01B41E1B-002A-453C-9F17-88793989FF8F=Ceph Multipath 块写前日志"
- set "$CAFECAFE-9B03-4F30-B4C6-5EC00CEFF106=Ceph dm-crypt 块"
- set "$93B0052D-02D9-4D8A-A43B-33A3EE4DFBC3=Ceph dm-crypt 块数据库"
- set "$306E8683-4FE2-4330-B7C0-00A917C16966=Ceph dm-crypt 块写前日志"
- set "$45B0969E-9B03-4F30-B4C6-35865CEFF106=Ceph dm-crypt LUKS journal"
- set "$CAFECAFE-9B03-4F30-B4C6-35865CEFF106=Ceph dm-crypt LUKS 块"
- set "$166418DA-C469-4022-ADF4-B30AFD37F176=Ceph dm-crypt LUKS 块数据库"
- set "$86A32090-3647-40B9-BBBD-38D8C573AA86=Ceph dm-crypt LUKS 块写前日志"
- set "$4FBD7E29-9D25-41B8-AFD0-35865CEFF05D=Ceph dm-crypt LUKS OSD"
- set "$824CC7A0-36A8-11E3-890A-952519AD3F61=OpenBSD 数据分区"
- set "$CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1=QNX Power-safe (QNX6) 文件系统"
- set "$C91818F9-8025-47AF-89D2-F030D7000C2C=Plan 9 分区"
- set "$9D275380-40AD-11DB-BF97-000C2911D1B8=VMware ESX vmkcore (核心转储分区)"
- set "$AA31E02A-400F-11DB-9590-000C2911D1B8=VMware ESX VMFS文件系统分区"
- set "$9198EFFC-31C0-11DB-8F78-000C2911D1B8=VMware ESX VMware 保留"
- set "$2568845D-2332-4675-BC39-8FA5A4748D15=Android-IA Bootloader"
- set "$114EAFFE-1552-4022-B26E-9B053604CF84=Android-IA Bootloader2"
- set "$49A4D17F-93A3-45C1-A0DE-F50B2EBE2599=Android-IA Boot"
- set "$4177C722-9E92-4AAB-8644-43502BFD5506=Android-IA Recovery"
- set "$EF32A33B-A409-486C-9141-9FFB711F6266=Android-IA Misc"
- set "$20AC26BE-20B7-11E3-84C5-6CFDB94711E9=Android-IA Metadata"
- set "$38F428E6-D326-425D-9140-6E0EA133647C=Android-IA System"
- set "$A893EF21-E428-470A-9E55-0668FD91A2D9=Android-IA Cache"
- set "$DC76DDA9-5AC1-491C-AF42-A82591580C0D=Android-IA Data"
- set "$EBC597D0-2053-4B15-8B64-E0AAC75F4DB1=Android-IA Persistent"
- set "$C5A0AEEC-13EA-11E5-A1B1-001E67CA0C3C=Android-IA Vendor"
- set "$BD59408B-4514-490D-BF12-9878D963F378=Android-IA Config"
- set "$8F68CC74-C5E5-48DA-BE91-A0C8C15E9C80=Android-IA Factory"
- set "$9FDAA6EF-4B3F-40D2-BA8D-BFF16BFB887B=Android-IA Factory (alt)"
- set "$767941D0-2085-11E3-AD3B-6CFDB94711E9=Android-IA Fastboot/Tertiary"
- set "$AC6D7924-EB71-4DF8-B48D-E267B27148FF=Android-IA OEM"
- set "$19A710A2-B3CA-11E4-B026-10604B889DCF=Android 6.0+ ARM Android Meta"
- set "$193D1EA4-B3CA-11E4-B075-10604B889DCF=Android 6.0+ ARM Android EXT"
- set "$7412F7D5-A156-4B13-81DC-867174929325=ONIE Boot"
- set "$D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149=ONIE Config"
- set "$9E1A2D38-C612-4316-AA26-8B49521E5A8B=PowerPC 准备启动"
- set "$BC13C2FF-59E6-4262-A352-B275FD6F7172=freedesktop.org OSes 共享启动加载程序配置"
- set "$734E5AFE-F61A-11E6-BC64-92361F002671=Atari TOS 基本数据分区 (GEM, BGM, F32)"
- echo.
- echo _________________________________________________________________
- echo.
- echo 当前电脑挂载的硬盘:
- rem 组织并显示磁盘详情,并详细标记磁盘,方便后面使用
- for /f "skip=9 tokens=2 delims= " %%a in ('echo list disk^|diskpart') do (
- rem 下面提取硬盘信息 %%a就是磁盘的编号
- for /f "delims=" %%b in ('(echo sel disk %%a ^& echo detail disk^)^|diskpart') do (
- rem 取: 硬盘型号,id->硬盘分区格式,磁盘类型,整理合并信息成为一行便于显示
- set "CurrentLine=%%b"
- set /a LineCount+=1
- if "!CurrentLine:~0,5!"=="在计算机上" (set /a modelpartInfoLineNo=!LineCount!+4 & set /a idPartInfoLineNo=!LineCount!+5 & set /a typepartInfoLineNo=!LineCount!+6)
- if !LineCount!==!modelpartInfoLineNo! (set diskModelTemp=!CurrentLine! & set "diskModelTemp=!diskModelTemp: USB =!" & set "diskModel=!diskModelTemp! ")
- if !LineCount!==!idPartInfoLineNo! (set diskID=!CurrentLine:~7! & (if "!diskID:-=!"=="!diskID!" (set "partFormat=MBR") else (set "partFormat=GPT")))
- set "Disk_%%a_partFormat=!partFormat!"
- if !LineCount!==!typepartInfoLineNo! (
- set "diskProtocol= !CurrentLine:~7!" & set "diskProtocol=!diskProtocol:~-4!"
- echo.
- set "Disk_%%a_Title= -!diskTag:~%%a,1!- %%a !diskProtocol! !partFormat! !diskModel:~0,26! -"
- call :hightlight 4e " !Disk_%%a_Title!"
- echo.
- set "Disk_%%a_No=%%a"
- set "Disk_%%a_partFormat=!partFormat!"
- set "Disk_%%a_Protocol=!diskProtocol!"
- set "Disk_%%a_Model=!diskModel:~0,26!"
- set "Disk_%%a_Info=%%a !diskProtocol! !partFormat! !diskModel!"
- set /a DiskTotal+=1
- )
- )
- rem 下面遍历每个分区,并提取合并处理每个分区的信息
- for /f "tokens=2 delims= " %%c in ('(echo sel disk %%a ^& echo list part ^& exit^)^|diskpart^|findstr /i "系统 主要 未知 保留 逻辑"') do (
- set /a partitionNum+=1
- for /f "delims=" %%d in ('(echo sel disk %%a ^& echo list part ^& echo sel part %%c ^& echo det part^)^|diskpart') do (
- set "partInfoLineContent=%%d"
- set /a partInfoLineNo+=1
- if "!partInfoLineContent:~0,7!"==" 分区 " (
- for /f "tokens=2-5 delims= " %%e in ("!partInfoLineContent!") do (
- if %%c==%%e (
- set "sss= %%g%%h"&set "sss=!sss:~-6!"
- set tinfo= %%a:%%c !sss!
- set "Part_!partitionNum!_DiskNo=%%a"
- set "Part_!partitionNum!_PartNo=%%c"
- set "Part_!partitionNum!_Size=!sss!"
- )
- )
- )
- if "!partInfoLineContent:~0,2!"=="类型" (for /f "tokens=3 delims= " %%l in ("!partInfoLineContent!") do (set "emo=!$%%l!"))
- if "!partInfoLineContent:~0,4!"=="字节偏移" (set /a lll=!partInfoLineNo!+3 & set /a kkk=!partInfoLineNo!+2)
- if !partInfoLineNo!==!lll! (
- if "!partInfoLineContent:~0,1!"=="*" (
- set pf=!partInfoLineContent:~14,1!
- if exist "!pf!:\windows\system32\version.dll" (set "hos=OS" & (if exist "!pf!:\boot\memtest.ext" (set "yd=BIOS") else (set "yd=UEFI"))) else (set "hos= " & set "yd= ")
- set bq=!partInfoLineContent:~17,6!
- set fss=!partInfoLineContent:~31,5!
- (if "!emo:ESP=!"=="!emo!" (echo "">nul) else (set "fss=ESP" & set "Disk_%%a_ESP_QH=%%c" & set "Disk_%%a_ESP_QH=1"))
- (if "!emo:MSR=!"=="!emo!" (echo "">nul) else (set "fss=MSR"))
- set "Part_!partitionNum!_DriveLetter=!pf!"
- set "Part_!partitionNum!_OSTag=!hos!"
- set "Part_!partitionNum!_bootType=!yd!"
- set "Part_!partitionNum!_FileSystem=!fss!"
- set "Part_!partitionNum!_Title= !partitionNum! !tinfo! !pf! !hos! !yd! !fss!"
- set "Part_!partitionNum!_Info=%%a %%c !pf! !fss!"
- set "Disk_%%a_partTotal=%%c"
- echo !partitionNum! !tinfo! !pf! !hos! !yd! !fss!
- set "Disk_%%a_partInfo_%%c=%%a %%c !pf! !fss!"
- )
- )
- if !partInfoLineNo!==!kkk! (
- if "!partInfoLineContent:~0,1!"=="D" (
- set "Part_!partitionNum!_DriveLetter= "
- set "Part_!partitionNum!_OSTag= "
- set "Part_!partitionNum!_bootType= "
- set "Part_!partitionNum!_FileSystem=!emo!"
- set "Part_!partitionNum!_Title= !partitionNum! !tinfo! !emo!"
- set "Part_!partitionNum!_Info=%%a %%c - !emo!"
- set "Disk_%%a_partTotal=%%c"
- echo !partitionNum! !tinfo! !emo!
- set "Disk_%%a_partInfo_%%c=%%a %%c !emo!"
- )
- )
- )
- )
- )
- echo _________________________________________________________________
- echo.
- goto :eof
- :BestHDD
- REM ============================系统硬盘推荐============================
- set /a "Disk_No=!DiskTotal!-1"
- for /l %%n in (0,1,!Disk_No!) do (
- if /i "!Disk_%%n_Protocol!"=="nvme" (echo 推荐将系统安装到下面硬盘: & call :hightlight A0 " !Disk_%%n_Title!" & echo.)
- )
- goto :eof
- :SelDisk
- REM =======================选择系统硬盘=======================
- echo.
- set targetDiskNo=
- echo 全新安装,请根据编号选择硬盘 [ !diskTag:~0,%DiskTotal%! ]
- if !partitionNum! gtr 2 (echo 重装系统,请根据编号选择分区 [ 123 ... !partitionNum! ])
- choice /c ABCDE123456789 /n>nul
- if %errorlevel%==14 (set "targetDiskNo=!Part_9_DiskNo!" & set "targetPartNo=9" & set "targetPartLetter=!Part_9_DriveLetter!" & set "targetESPLetter=!!")
- if %errorlevel%==13 (set "targetDiskNo=!Part_8_DiskNo!" & set "targetPartNo=8" & set "targetPartLetter=!Part_8_DriveLetter!" & set "targetESPLetter=!!")
- if %errorlevel%==12 (set "targetDiskNo=!Part_7_DiskNo!" & set "targetPartNo=7" & set "targetPartLetter=!Part_7_DriveLetter!" & set "targetESPLetter=!!")
- if %errorlevel%==11 (set "targetDiskNo=!Part_6_DiskNo!" & set "targetPartNo=6" & set "targetPartLetter=!Part_6_DriveLetter!" & set "targetESPLetter=!!")
- if %errorlevel%==10 (set "targetDiskNo=!Part_5_DiskNo!" & set "targetPartNo=5" & set "targetPartLetter=!Part_5_DriveLetter!" & set "targetESPLetter=!!")
- if %errorlevel%==9 (set "targetDiskNo=!Part_4_DiskNo!" & set "targetPartNo=4" & set "targetPartLetter=!Part_4_DriveLetter!" & set "targetESPLetter=!!")
- if %errorlevel%==8 (set "targetDiskNo=!Part_3_DiskNo!" & set "targetPartNo=3" & set "targetPartLetter=!Part_3_DriveLetter!" & set "targetESPLetter=!!")
- if %errorlevel%==7 (set "targetDiskNo=!Part_2_DiskNo!" & set "targetPartNo=2" & set "targetPartLetter=!Part_2_DriveLetter!" & set "targetESPLetter=!!")
- if %errorlevel%==6 (set "targetDiskNo=!Part_1_DiskNo!" & set "targetPartNo=1" & set "targetPartLetter=!Part_1_DriveLetter!" & set "targetESPLetter=!!")
- if %errorlevel%==5 (set "targetDiskNo=4" & set "targetPartNo=3" & set "targetPartLetter=C" & set "targetESPLetter=Z")
- if %errorlevel%==4 (set "targetDiskNo=3" & set "targetPartNo=3" & set "targetPartLetter=C" & set "targetESPLetter=Z")
- if %errorlevel%==3 (set "targetDiskNo=2" & set "targetPartNo=3" & set "targetPartLetter=C" & set "targetESPLetter=Z")
- if %errorlevel%==2 (set "targetDiskNo=1" & set "targetPartNo=3" & set "targetPartLetter=C" & set "targetESPLetter=Z")
- if %errorlevel%==1 (set "targetDiskNo=0" & set "targetPartNo=3" & set "targetPartLetter=C" & set "targetESPLetter=Z")
- :: 硬盘选择的逻辑待修改
- :: 硬盘选择有效检查待加入
- echo.
- echo 磁盘选择结束
- goto :eof
- :SelDisk_old
- REM =======================选择系统硬盘=======================
- echo 这个是老版本的
- echo.
- set targetDiskNo=
- set /a "partitionNum=!DiskTotal!-1"
- SET /p SelDisk=请选择目标系统盘磁盘编号 [ !diskTag:~0,%DiskTotal%! ]:
- if not defined SelDisk echo 未输入内容 请重新输入&echo.&goto :SelDisk
- for /l %%i in (0,1,!partitionNum!) do (if !SelDisk! equ %%i (echo. & set targetDiskNo=%%i))
- if not defined targetDiskNo echo. & echo · 磁盘编号输入错误 请重新输入 & goto :SelDisk
- goto :eof
- :SelCreatePartition
- echo.
- echo _____________________选择分区方案_____________________
- echo ^| ^|
- echo ^| [ 1 ] 1分区,全部分配给C盘【默认选项】 ^|
- echo ^| [ 2 ] 2分区,C盘200G,其他给D盘 ^|
- echo ^| [ 3 ] 3分区,C盘200G,D盘500G,其他给E盘 ^|
- echo ^| [ 0 ] 返回 重新选择 ^|
- echo ^|______________________________________________________^|
- echo.
- echo 请选择硬盘分区方案 [1230],%ETR%秒后选择默认分区方案:
- choice /c 1230 /n>nul /t %ETR% /d 1
- if %errorlevel%==4 (goto :SelCreatePartition)
- if %errorlevel%==3 (set "CPName=3分区,C盘200G D盘500G 其他给E盘" & set "CreatePart=CreatePartition3")
- if %errorlevel%==2 (set "CPName=2分区,C盘200G,其他给D盘 " & set "CreatePart=CreatePartition2")
- if %errorlevel%==1 (set "CPName=1分区,全部分配给C盘 " & set "CreatePart=CreatePartition1")
- goto :eof
- :SelOS
- echo.
- echo _____________________选择操作系统_____________________
- echo ^| ^|
- echo ^| [ 1 ] WIN10 专业版 【默认选项】 ^|
- echo ^| [ 2 ] WIN11 专业版 ^|
- echo ^| [ 3 ] WIN10 LTSC ^|
- echo ^| [ 0 ] 返回 重新选择 ^|
- echo ^|______________________________________________________^|
- echo.
- echo 请选择操作系统 [1230],%ETR%秒后默认系统:
- choice /c 1230 /n>nul /t %ETR% /d 1
- if %errorlevel%==4 (goto :SelOS)
- if %errorlevel%==3 (set "OSImageFile=%W10LTSCIMG%" & set "OSIndex=1" & set "OSName=Windows 10 LTSC" & set "UnattFile=%UNATT10LTSC%")
- if %errorlevel%==2 (set "OSImageFile=%WIN11IMG%" & set "OSIndex=4" & set "OSName=Windows 11 Pro " & set "UnattFile=%UNATT11PRO%" )
- if %errorlevel%==1 (set "OSImageFile=%WIN10IMG%" & set "OSIndex=4" & set "OSName=Windows 10 Pro " & set "UnattFile=%UNATT10PRO%" )
- goto :eof
- :BeforeDepOSCheck
- echo ======================= 部署前确认 =======================
- echo.
- REM 检测 启动模式,引导模式,目标硬盘,目标系统盘,系统版本,镜像文件,自动应答文件等等
- if not exist %UnattFile% (echo. & echo 自动应答文件不存在 请检查 %UnattFile% 任意键退出 & pause>nul & exit)
- if not exist %OSImageFile% (echo. & echo 系统镜像不存在 请检查 %OSImageFile% 任意键退出 & pause>nul & exit)
- REM 检查系统盘是否非空 [TODO]
- for /f "delims=" %%a in ('dir /a /b %targetPartLetter%') do (set /a b+=1 & echo %b% & if %b% gtr 1 goto :SelDisk)
- goto :eof
- :Confirm
- REM 显示装机方案待确认
- echo.
- echo _____________________确认安装方案_____________________
- echo ^| ^|
- echo ^| 目标系统 %OSName% ^|
- echo ^| 目标硬盘 %targetDiskNo% - !DISK_%targetDiskNo%_Model! ^|
- echo ^| 分区方案 %CPName% ^|
- echo ^| ^|
- echo ^| [ Y ] 确认上述方案 [ X ] 返回 重新选择 ^|
- echo ^|______________________________________________________^|
- echo.
- ::call :hightlight 4E "- 所选硬盘数据将会彻底丢失 务必确认 -"
- choice /c xy /n>nul
- if %errorlevel%==2 (echo 已经确认继续安装 & goto :eof)
- if %errorlevel%==1 (cls & echo 返回 重新 选择 & goto :StartDeploy)
- goto :eof
- :StartCreatePartition
- :: 跳转到相应分区方案 开始分区
- if %CreatePart%==CreatePartition1 (goto :CreatePartition1)
- if %CreatePart%==CreatePartition2 (goto :CreatePartition2)
- if %CreatePart%==CreatePartition3 (goto :CreatePartition3)
- goto :eof
- :CreatePartition1
- echo =======================开始硬盘分区 1个分区: 都给系统盘=======================
- (
- echo select disk %targetDiskNo%
- echo clean
- echo clean
- echo convert gpt
- :: 创建EFI分区,大小为500M
- echo create partition efi size=500
- echo format fs=fat32 label="EFI" quick
- echo assign letter=z
- :: 创建MSR分区,大小为128M
- echo create partition msr size=128
- echo format fs=fat32 quick
- :: 创建主分区
- echo create partition primary
- echo format fs=ntfs quick
- echo assign letter=c
- echo list volume
- echo exit
- )|diskpart
- goto :eof
- :CreatePartition2
- echo ======================= 开始硬盘分区 2个分区: 200G+REST =======================
- (
- echo select disk %targetDiskNo%
- echo clean
- echo clean
- echo convert gpt
- :: 创建EFI分区,大小为500M
- echo create partition efi size=500
- echo format fs=fat32 label="EFI" quick
- echo assign letter=z
- :: 创建MSR分区,大小为128M
- echo create partition msr size=128
- echo format fs=fat32 quick
- :: 创建主分区, 大小为100G,如需修改大小,请直接替换下面size=[ 100G -> 102407 200G -> 204806 ]
- echo create partition primary size=204806
- echo format fs=ntfs quick
- echo assign letter=c
- :: 创建第二个主分区, 大小为剩余容量
- echo create partition primary
- echo format fs=ntfs quick
- echo assign letter=d
- echo list volume
- echo exit
- )|diskpart
- goto :eof
- :CreatePartition3
- echo =======================开始硬盘分区 3个分区:200G+500G+REST =======================
- (
- echo select disk %targetDiskNo%
- echo clean
- echo clean
- echo convert gpt
- :: 创建EFI分区,大小为500M
- echo create partition efi size=500
- echo format fs=fat32 label="EFI" quick
- echo assign letter=z
- :: 创建MSR分区,大小为128M
- echo create partition msr size=128
- echo format fs=fat32 quick
- :: 创建主分区, 大小为200G,如需修改大小,请直接替换下面size=[ 204806 ]
- echo create partition primary size=204806
- echo format fs=ntfs quick
- echo assign letter=c
- :: 创建第二个主分区, 大小为500G
- echo create partition primary size=512002
- echo format fs=ntfs quick
- echo assign letter=d
- :: 创建第三个主分区, 大小为剩余容量
- echo create partition primary
- echo format fs=ntfs quick
- echo assign letter=e
- echo list volume
- echo exit
- )|diskpart
- goto :eof
- :CheckCreatePartition
- echo =======================检查分区情况 防止分区失败=======================
- echo.
- if not exist c: (echo 目标系统分区创建失败 请检查 任意键返回 & pause>nul & goto :StartDeploy)
- if not exist z: (echo 目标EFI分区创建失败 请检查 任意键返回 & pause>nul & goto :StartDeploy)
- :StartMountImg
- echo =======================挂载系统镜像=======================
- echo.
- imdisk -a -f %OSImageFile% -m T:
- if not exist T:\sources\install.wim (echo. & echo 系统镜像挂载失败 任意键退出 & pause>nul & exit) else (echo 系统镜像挂载成功)
- goto :eof
- :StartDepOS
- REM =======================开始灌装系统=======================
- REM 待根据前面设置优化
- Dism /Apply-Image /ImageFile:T:\sources\install.wim /Index:%OSIndex% /ApplyDir:C:\
- bcdboot C:\Windows /s Z: /f uefi /l zh-cn
- REM 无人值守自动安装系统
- md C:\Windows\Panther
- copy %UnattFile% C:\Windows\Panther\Unattend.xml /y
- REM WIN11 待增加 关闭 BitLocker功能 在oobe阶段 通过注册表 关闭
- if "%OSName:11=%"=="%OSName%" (echo * "不需要关闭BitLocker...") else (copy %OobeFile% C:\Windows\Panther\ /y)
- goto :eof
- :bierende
- REM 判断卷标OS分区的盘符,防止有的情况下磁盘盘符为非C盘
- for /f "tokens=2 delims==" %%a in ('wmic logicaldisk where "VolumeName='OS'" get Name /Value') do set SysDrv=%%a
- dism /Apply-Image /ImageFile:%ISOPath%\install.wim /Index:%NUM% /ApplyDir:%SysDrv%\
- bcdboot %SysDrv%\Windows /l zh-cn /s %BootDrv% /f %OSMode%
- echo --------------------------------------------------------
- Dism /Apply-Image /ImageFile:T:\sources\install.wim /Index:%OSIndex% /ApplyDir:%targetPartLetter%:\
- bcdboot %targetPartLetter%:\Windows /s %targetESPLetter%: /f uefi /l zh-cn
- echo --------------------------------------------------------
- goto :eof
- :PreCopy
- REM =======================后续安装准备=======================
- echo.
- echo 软件目录: %DirCurrent%_DESKTOP
- xcopy %DirCurrent%_DESKTOP\* C:\Users\Public\desktop\必装软件\ /s/e/y
- echo "">>C:\Users\Public\desktop\请远离X卫士X管家
- copy %DirCurrent%_DESKTOP\PreInst.bat "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp" /y
- goto :eof
- :rb
- REM =======================重启后继续装=======================
- echo 任意键重启电脑后继续安装
- shutdown -r -t 0
- exit
- goto :eof
- :hightlight
- REM -----------------------高亮显示文本-----------------------
- pushd "%temp%"
- >"%~2",set/p= <nul
- findstr /a:%~1 .* "%~2*"
- del "%~2"
- popd
- goto :eof
- echo -----------------------
- pause
- REM =======================高亮显示例子=======================
- call :hightlight 4a "这里是要显示的文本"
- echo.
复制代码 |
|