echo list vol>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
echo.
set OpChoice=0
set /p OpChoice=请选则任务类型,输入有效序号----
echo.
if !OpChoice!==1 (
set /a a=0
set /a CountWim=0
set /a NumWimSource=0
set /a CountIndex=0
set /a IndexSource=0
echo.
set bBootNeed=y
set /p bBootNeed=是否同时建立引导项,默认是y,直接回车/不要输入小写n----
if not !bBootNeed!==n (
echo.
set bIsUEFI=y
set /p bIsUEFI=请问是否UEFI引导,默认是,直接回车/不是请输入小写n----
if !bIsUEFI!==y (
::为ESP分区分配盘符,为减少标号减少goto,要扫描所有可用盘符,效率稍低!
set bHvSetESP=n
for %%i in (z y x w v u t s r q p o n m) do (
if !bHvSetESP!==n ( if not exist %%i: set Label_ESP=%%i&&set bHvSetESP=y )
)
echo list vol>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
set /p NumVolESP=请输入GPT中ESP分区的卷编号,直接回车----
echo select vol !NumVolESP!>%temp%\DiskPart.txt
echo remove>>%temp%\DiskPart.txt
echo assign letter=!Label_ESP!>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
)
if !bIsUEFI!==n (
echo.
set bHvMSR=y
set /p bHvMSR=请问是否有独立引导分区,默认有,直接回车/没有输入小写n----
if !bHvMSR!==y (
echo.
set bHvLab=n
set /p bHvLab=请确认独立引导分区是否已有盘符,有输入y,默认没有n,直接回车----
echo.
if !bHvLab!==y (
set /p Label_ESP=请输入独立引导分区盘符,我不检测无效盘符噢----
)
if not !bHvLab!==y (
::为MBR中独立引导分区分配盘符,为减少标号减少goto,要扫描所有可用盘符,效率稍低!
set bHvSetESP=n
for %%i in (z y x w v u t s r q p o n m) do (
if !bHvSetESP!==n ( if not exist %%i: set Label_ESP=%%i&&set bHvSetESP=y )
)
echo list vol>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
set /p NumVolESP=请输入MBR中独立引导分区的卷编号,直接回车----
echo select vol !NumVolESP!>%temp%\DiskPart.txt
echo assign letter=!Label_ESP!>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
)
)
)
)
echo list vol>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
echo.
set bHvSetSYS=n
for /l %%i in (1,1,5) do (
if !bHvSetSYS!==n (
set /p Label_SYS=请问系统要安装在哪个盘,我不检测无效盘符噢----
if not exist !Label_SYS!: echo 你输入的盘符是什么东西,根本不存在吗!
if exist !Label_SYS!: set bHvSetSYS=y
)
)
if not !bBootNeed!==n ( if !bIsUEFI!==n ( if !bHvMSR!==n ( set Label_ESP=!Label_SYS!)))
echo.
::准备源系统映像文件与索引序号。
set bHvLSr=n
for /l %%i in (1,1,5) do (
if !bHvLSr!==n (
set /p LPartSource=请输入系统映像源文件所在盘,不带冒号----
if not exist !LPartSource!: echo 这个盘符根本就没有使用了,你不要搞笑好吧
if exist !LPartSource!: set bHvLSr=y
)
)
dir !LPartSource!:\*.wim /b /s >%temp%\fSeek.txt
echo 查找到!LPartSource!分区下所有映像文件如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do ( set /a a+=1&&echo 系统映像:!a! %%i)
set /a CountWim=!a!
if !a!==0 echo 该分区无系统映像文件,退出重来吧!&&goto End
::准备全局临时文件夹\tmp_Imagex,预备以后作为ScratchDir使用
if not exist !LPartSource!:\tmp_Imagex md !LPartSource!:\tmp_Imagex
if exist !LPartSource!:\tmp_Imagex rd /s /q !LPartSource!:\tmp_Imagex&&md !LPartSource!:\tmp_Imagex
echo.
set /p NumWimSource=请输入系统映像文件序号,我不检测无效序号,不带冒号----
set bVldNSr=n
for /l %%i in (1,1,!CountWim!) do ( if !NumWimSource!==%%i set bVldNSr=y )
if !bVldNSr!==n echo 你没有输入有效系统映像文件序号,退出重来吧!&&goto End
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do (
set /a a+=1
if !NumWimSource!==!a! Dism /get-imageinfo /imagefile:%%i
)
echo.
set /p IndexSource=请输入系统映像索引序号,我不检测无效序号,不带冒号----
vol !Label_SYS!:
echo.
echo 格式化!Label_SYS!盘,请核对分区对否,慎重,别破坏数据。
echo.
pause
format !Label_SYS!: /q /x /u /y /fs:ntfs /a:4096 /v:WSYS
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do (
set /a a+=1
if !a!==!NumWimSource! Dism /Apply-Image /ImageFile:"%%i" /Index:!IndexSource! /ApplyDir:!Label_SYS!:\ /Scratchdir:!LPartSource!:\tmp_Imagex
)
if not !bBootNeed!==n (
if not !bIsUEFI!==n %windir%\system32\bcdboot !Label_SYS!:\windows /s !Label_ESP!: /f uefi /l zh-cn
if !bIsUEFI!==n (
if not exist !Label_SYS!:\bootmgr %windir%\system32\bootsect.exe /nt52 all /force /mbr
if exist !Label_SYS!:\bootmgr (
%windir%\system32\bootsect.exe /nt60 all /force /mbr
%windir%\system32\bcdboot !Label_SYS!:\windows /s !Label_ESP!: /f bios /l zh-cn
)
)
)
rd /s /q !LPartSource!:\tmp_Imagex
goto End
)
if !OpChoice!==2 (
set /a a=0
set /a CountWim=0
set /a NumWimDest=0
set NameImage=null
set bHvLSYS=n
for /l %%i in (1,1,5) do (
if !bHvLSYS!==n (
set /p LabelCapture=请输入要捕获系统的分区盘符,不带冒号----
if not exist !LabelCapture!: echo 你输入的盘符是什么东西,根本不存在吗!请重新输入!
if exist !LabelCapture!: set bHvLSYS=y
)
)
echo.
set b7Sysprep=n
set /p b7Sysprep=请问是不是制作Win7预封装部署系统(删除Administrator账号),默认不是,是请输入小写y----
if !b7Sysprep!==y rd /s /q !LabelCapture!:\users\Administrator
echo.
set /p NameInput=请输入要捕获制作映像的名字,不要带空格等奇怪的字符----
:: 格式化映像名字,以下划线代替空格
set /a a=0
for %%i in ( !NameInput! ) do (
set /a a+=1
if !a!==1 set NameImage=%%i
if not !a!==1 set NameImage=!NameImage!_%%i
)
echo.
set bCaptureAppend=y
set /p bCaptureAppend=是否增量捕获在其它映像文件中,默认是y,直接回车,不是输入小写n----
echo.
if not !bCaptureAppend!==n (
set bHvLDst=n
for /l %%i in (1,1,5) do (
if !bHvLDst!==n (
set /p LPartDest=请输入系统映像文件所在盘,不带冒号----
if not exist !LPartDest!: echo 这个盘符根本就没有使用了,你不要搞笑好吧!
if exist !LPartDest!: set bHvLDst=y
)
)
dir !LPartDest!:\*.wim /b /s >%temp%\fSeek.txt
echo 查找到!LPartDest!分区下所有映像文件如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do ( set /a a+=1&&echo 系统映像:!a! %%i)
set /a CountWim=!a!
if !a!==0 echo 该分区无系统映像文件,退出重来吧!&&goto End
if not exist !LPartDest!:\tmp_Imagex md !LPartDest!:\tmp_Imagex
if exist !LPartDest!:\tmp_Imagex rd /s /q !LPartDest!:\tmp_Imagex&&md !LPartDest!:\tmp_Imagex
echo.
set /p NumWimDest=请输入系统映像文件序号,不带冒号----
set bVldDst=n
for /l %%i in (1,1,!CountWim!) do (
if !NumWimDest!==%%i set bVldDst=y
)
if !bVldDst!==n echo 你没有输入有效系统映像文件序号,退出重来吧!&&goto End
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do (
set /a a+=1
if !NumWimDest!==!a! Dism /Append-Image /ImageFile:"%%i" /CaptureDir:!LabelCapture!:\ /Name:!NameImage! /Scratchdir:!LPartDest!:\tmp_Imagex
)
rd /s /q !LPartDest!:\tmp_Imagex
goto End
)
echo.
if !bCaptureAppend!==n (
set bHvLDst=n
for /l %%i in (1,1,5) do (
if !bHvLDst!==n (
set /p LDstPart=请输入新作映像文件要放置分区的盘符,不带冒号----
if not exist !LDstPart!: echo 你输入的盘符是什么东西,根本不存在吗!请重新输入!
if exist !LDstPart!: set bHvLDst=y
)
)
if not exist !LDstPart!:\tmp_Imagex md !LDstPart!:\tmp_Imagex
if exist !LDstPart!:\tmp_Imagex rd /s /q !LDstPart!:\tmp_Imagex&&md !LDstPart!:\tmp_Imagex
Dism /Capture-Image /ImageFile:!LDstPart!:\!NameImage!.wim /CaptureDir:!LabelCapture!:\ /Name:!NameImage! /compress:max /Scratchdir:!LDstPart!:\tmp_Imagex
rd /s /q !LDstPart!:\tmp_Imagex
goto End
)
)
if !OpChoice!==3 (
::准备全局变量
set /a a=0
set /a CountWim=0
set /a CountIndex=0
set /a NumWimSource=0
set /a IndexSource=0
set /a NumWimDest=0
set NameImage=null
::准备源系统映像文件与索引序号。
set bHvLSr=n
for /l %%i in (1,1,5) do (
if !bHvLSr!==n (
set /p LPartSource=请输入系统映像源文件所在盘,不带冒号----
if not exist !LPartSource!: echo 这个盘符根本就没有使用了,你不要搞笑好吧
if exist !LPartSource!: set bHvLSr=y
)
)
dir !LPartSource!:\*.wim /b /s >%temp%\fSrSeek.txt
echo 查找到!LPartSource!分区下所有映像文件如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSrSeek.txt) do ( set /a a+=1&&echo 系统映像:!a! %%i)
set /a CountWim=!a!
if !a!==0 echo 该分区无系统映像文件,退出重来吧!&&goto End
::准备全局临时文件夹\tmp_Imagex,预备以后作为ScratchDir使用
if not exist !LPartSource!:\tmp_Imagex md !LPartSource!:\tmp_Imagex
if exist !LPartSource!:\tmp_Imagex rd /s /q !LPartSource!:\tmp_Imagex&&md !LPartSource!:\tmp_Imagex
echo.
set /p NumWimSource=请输入系统映像源文件序号,不带冒号----
set bVldNSr=n
for /l %%i in (1,1,!CountWim!) do ( if !NumWimSource!==%%i set bVldNSr=y )
if !bVldNSr!==n echo 你没有输入有效系统映像文件序号,退出重来吧!&&goto End
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSrSeek.txt) do (
set /a a+=1
if !NumWimSource!==!a! Dism /get-imageinfo /imagefile:%%i
)
echo.
set /p IndexSource=请输入系统映像索引序号,不带冒号----
echo.
set bExportAppend=y
set /p bExportAppend=是否导出在其它映像文件中,默认是y,直接回车,不是输入小写n----
echo.
if not !bExportAppend!==n (
set bHvLDst=n
for /l %%i in (1,1,5) do (
if !bHvLDst!==n (
set /p LPartDest=请输入系统映像导出目标文件所在盘,不带冒号----
if not exist !LPartDest!: echo 这个盘符根本就没有使用了,你不要搞笑好吧!
if exist !LPartDest!: set bHvLDst=y
)
)
dir !LPartDest!:\*.wim /b /s >%temp%\fDsSeek.txt
echo 查找到!LPartDest!分区下所有映像文件如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fDsSeek.txt) do ( set /a a+=1&&echo 系统映像:!a! %%i)
set /a CountWim=!a!
if !a!==0 echo 该分区无系统映像文件,退出重来吧!&&goto End
echo.
set /p NumWimDest=请输入系统映像目标文件序号,不带冒号----
set bVldDst=n
for /l %%i in (1,1,!CountWim!) do (
if !NumWimDest!==%%i set bVldDst=y
)
if !bVldDst!==n echo 你没有输入有效系统映像文件序号,退出重来吧!&&goto End
set /a a=0
set /a b=0
for /f "usebackq delims=" %%i in (%temp%\fDsSeek.txt) do (
set /a a+=1
if !NumWimDest!==!a! (
set /a b=0
for /f "usebackq delims=" %%j in (%temp%\fSrSeek.txt) do (
set /a b+=1
if !NumWimSource!==!b! (
if %%i==%%j echo 导出到原文件中,算了吧!&&goto End
dism /Export-Image /SourceImageFile:"%%j" /SourceIndex:!IndexSource! /DestinationImageFile:"%%i" /Scratchdir:!LPartSource!:\tmp_Imagex
)
)
)
)
rd /s /q !LPartSource!:\tmp_Imagex
goto End
)
echo.
if !bExportAppend!==n (
set bHvLDst=n
for /l %%i in (1,1,5) do (
if !bHvLDst!==n (
set /p LPartNewDest=请问全新映像文件放哪个盘,不带冒号----
if not exist !LPartNewDest!: echo 这个盘符根本就没有使用了,你不要搞笑好吧!
if exist !LPartNewDest!: set bHvLDst=y
)
)
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSrSeek.txt) do (
set /a a+=1
if !NumWimSource!==!a! (
Dism /get-imageinfo /imagefile:%%i /Index:!IndexSource! >%temp%\ImageInfo.txt
find "名称" %temp%\imageinfo.txt>%temp%\tmp.txt
for /f "skip=2 tokens=1,* delims= " %%j in (%temp%\tmp.txt) do ( set NameTmp=%%k)
:: 格式化映像名字,以下划线代替空格,微软原始映像中老多空格,真没办法!
set /a b=0
for %%j in ( !NameTmp! ) do (
set /a b+=1
if !b!==1 set NameImage=%%j
if not !b!==1 set NameImage=!NameImage!_%%j
)
dism /Export-Image /SourceImageFile:"%%i" /SourceIndex:!IndexSource! /DestinationImageFile:"!LPartNewDest!:\!NameImage!.wim" /compress:max /Scratchdir:!LPartSource!:\tmp_Imagex
)
)
rd /s /q !LPartSource!:\tmp_Imagex
goto End
)
)
if !OpChoice!==4 (
set bIsUEFI=y
set /p bIsUEFI=请问是否UEFI引导,默认是,直接回车/不是请输入小写n----
if not !bIsUEFI!==n (
::为ESP分区分配盘符,为减少标号减少goto,要扫描所有可用盘符,效率稍低!
set bHvSetESP=n
for %%i in (z y x w v u t s r q p o n m) do (
if !bHvSetESP!==n ( if not exist %%i: set Label_ESP=%%i&&set bHvSetESP=y )
)
echo list vol>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
echo.
set /p NumVolESP=请输入GPT中ESP分区的卷编号,直接回车----
echo select vol !NumVolESP!>%temp%\DiskPart.txt
echo remove>>%temp%\DiskPart.txt
echo assign letter=!Label_ESP!>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
)
if !bIsUEFI!==n (
echo.
set bHvMSR=y
set /p bHvMSR=请问是否有独立引导分区,默认有,直接回车/没有输入小写n----
if !bHvMSR!==y (
echo.
set bHvLab=n
set /p bHvLab=请问MBR中独立引导分区是否已有盘符,有输入y,默认没有n,直接回车----
if !bHvLab!==y (
echo.
set /p Label_ESP=请输入MBR中独立引导分区盘符,我不检测无效盘符噢----
)
if not !bHvLab!==y (
::为MBR中独立引导分区分配盘符,为减少标号减少goto,要扫描所有可用盘符,效率稍低!
echo.
set bHvSetESP=n
for %%i in (z y x w v u t s r q p o n m) do (
if !bHvSetESP!==n ( if not exist %%i: set Label_ESP=%%i&&set bHvSetESP=y )
)
echo list vol>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
echo.
set bHvLSYS=n
for /l %%i in (1,1,5) do (
if !bHvLSYS!==n (
set /p Label_SYS=请输入系统盘符,我不检测无效盘符噢----
if not exist !Label_SYS!: echo 你输入的盘符是什么东西,根本不存在吗!
if exist !Label_SYS!: (
if not exist !Label_SYS!:\windows\ echo 你输入了盘符,但里面没系统!
if exist !Label_SYS!:\windows\ set bHvLSYS=y
)
)
)
if !bIsUEFI!==n ( if !bHvMSR!==n ( set Label_ESP=!Label_SYS!))
if not !bIsUEFI!==n %windir%\system32\bcdboot !Label_SYS!:\windows /s !Label_ESP!: /f UEFI /l zh-cn /addlast
if !bIsUEFI!==n (
if not exist !Label_SYS!:\bootmgr %windir%\system32\bootsect.exe /nt52 all /force /mbr
if exist !Label_SYS!:\bootmgr (
%windir%\system32\bootsect.exe /nt60 all /force /mbr
%windir%\system32\bcdboot !Label_SYS!:\windows /s !Label_ESP!: /f BIOS /l zh-cn /addlast
)
)
goto End
)
if !OpChoice!==5 (
echo.
echo GPT中EFI分区、MBR中独立引导分区容量1000M,GPT中msr分区容量400M!
echo MBR中先分第一、二基本分区,再从二区末尾缩减1000M,用于最后的独立引导分区!
echo 第一分区容量80G,可自行输入;控制分区容量,防止最后引导分区容量不够,出错!
echo list disk>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
echo.
set choiceDisk=0
set /p choiceDisk=请输入要操作的磁盘编号,从0起编,默认第0磁盘,直接回车----
echo.
set bPart_GPT=y
set /p bPart_GPT=请问是否进行GPT分区,默认是,直接回车/不是请输入小写n----
echo select disk !choiceDisk!>%temp%\DiskPart.txt
echo detail disk>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
echo.
set SizeEFI=1000
set /p SizeEFI=输入EFI或者MBR中独立引导分区容量,单位M,默认1000,直接回车----
echo.
set SizePartition=80000
set /p SizePartition=输入第一基本分区容量,剩余为第二分区,默认80G,直接回车,单位M----
echo select disk !choiceDisk!>%temp%\DiskPart.txt
echo clean>>%temp%\DiskPart.txt
if not !bPart_GPT!==n (
echo convert gpt>>%temp%\DiskPart.txt
echo create partition efi size=!SizeEFI! offset=1024>>%temp%\DiskPart.txt
echo format fs=fat32 quick>>%temp%\DiskPart.txt
echo.
::可在此加暂停,在本批处理目录查看DiskPart.txt内容,还可手动改盘符,保存后生效
set /p bProceed=你选择对磁盘^<!choiceDisk!^>进行分区操作,请确认是否继续,是y,非n---
if not !bProceed!==y exit
diskpart /s %temp%\DiskPart.txt
goto End
)
if !OpChoice!==6 (
echo.
set bHvSetESP=n
for %%i in (z y x w v u t s r q p o n m) do (
if !bHvSetESP!==n ( if not exist %%i: set Label_ESP=%%i&&set bHvSetESP=y )
)
echo list vol>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
echo 要为某卷分配随机盘符,那我认为此卷没有盘符,如果已有,执行报错!
echo.
set /p NumVolESP=请输入要分配盘符或卸载盘符分区的卷编号,直接回车----
echo.
set bAssign=y
set /p bAssign=请问是要分配装载盘符y还是删除盘符n,默认分配装载----
echo select vol !NumVolESP!>%temp%\DiskPart.txt
if not !bAssign!==n (
echo assign letter=!Label_ESP!>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
)
if !bAssign!==n (
echo remove>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
)
goto End
)
if !OpChoice!==7 (
echo.
set /p fileVhd=请输入要创建的固定容量vhd文件名(加完整路径,示例:e:\backup\x.vhd)---
echo.
set /p SizePartition_Op4_P1=输入要创建的vhd文件容量,单位M----
echo create vdisk file="!fileVhd!" maximum=!SizePartition_Op4_P1! type=fixed>%temp%\DiskPart.txt
echo select vdisk file="!fileVhd!">>%temp%\DiskPart.txt
echo attach vdisk>>%temp%\DiskPart.txt
::默认偏移量1024K。
echo create part pri offset=1024>>%temp%\DiskPart.txt
echo format fs=ntfs quick>>%temp%\DiskPart.txt
::可在此预先指定盘符,为建立引导项打基础,建立引导项应该比较Easy了。
echo assign>>%temp%\DiskPart.txt
echo list partition>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
goto End
)
if !OpChoice!==8 (
echo.
::准备VHD系统映像文件与序号。
set bHvLSr=n
for /l %%i in (1,1,5) do (
if !bHvLSr!==n (
set /p LPartSource=请输入VHD系统映像文件所在盘,不带冒号----
if not exist !LPartSource!: echo 这个盘符根本就没有使用了,你不要搞笑好吧
if exist !LPartSource!: set bHvLSr=y
)
)
dir !LPartSource!:\*.vhd /b /s >%temp%\fSeek.txt
echo 查找到!LPartSource!分区下所有映像文件如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do ( set /a a+=1&&echo 系统映像:!a! %%i)
set /a CountWim=!a!
if !a!==0 echo 该分区无系统映像文件,退出重来吧!&&goto End
echo.
set NumWimSource=1
set /p NumWimSource=请输入系统映像文件序号,我不检测无效序号,不带冒号,默认1----
set bVldNSr=n
for /l %%i in (1,1,!CountWim!) do ( if !NumWimSource!==%%i set bVldNSr=y )
if !bVldNSr!==n echo 你没有输入有效系统映像文件序号,退出重来吧!&&goto End
echo.
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do (
set /a a+=1
if !a!==!NumWimSource! (
echo 你选择的VHD系统映像文件是:%%i
echo.
set bAttach_Detach=y
set /p bAttach_Detach=请问是装载还是卸载,默认装载y,卸载n----
echo select vdisk file="%%i">%temp%\DiskPart.txt
if !bAttach_Detach!==y (
echo attach vdisk>>%temp%\DiskPart.txt
echo exit>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
goto End
)
if !bAttach_Detach!==n (
echo detach vdisk>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
goto End
)
)
)
)
if !OpChoice!==9 (
echo list disk>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
set /a CountDisk=0
set /a CountPart=0
set NumDisk=0
set NumPart=0
set bVldNum=n
set NumVol=0
set /a a=0
set /a CountWim=0
set /a NumWimSource=0
set /a CountIndex=0
set /a IndexSource=0
echo list disk>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt>%temp%\Out_DiskPart.txt
find /i "磁盘" %temp%\Out_DiskPart.txt>%temp%\Out_tmp.txt
for /f "skip=2 tokens=2 delims= " %%i in (%temp%\Out_tmp.txt) do (set /a CountDisk=%%i)
echo -----------------------------------------------------
for /l %%i in (1,1,5) do (
if !bVldNum!==n (set /p NumDisk=请输入要安装系统的目标磁盘编号,从0起编,默认第0块磁盘----)
for /l %%j in (0,1,!CountDisk!) do (
if !NumDisk!==%%j set bVldNum=y
)
)
if !bVldNum!==n (echo 磁盘编号5次都输错,算了退出吧!&&exit)
echo.
echo GPT中EFI分区、MBR中独立引导分区容量1000M,GPT中msr分区容量400M!
echo MBR中先分第一、二基本分区,再从二区末尾缩减1000M,用于最后的独立引导分区!
echo 第一分区容量80G,可自行输入;控制分区容量,防止最后引导分区容量不够,出错!
echo -----------------------------------------------------
set bPart_GPT=y
set /p bPart_GPT=请问是否进行GPT分区,不是请输入小写n,默认是,直接回车----
echo.
set SizeEFI=1000
set /p SizeEFI=输入EFI或者MBR中独立引导分区容量,单位M,默认1000,直接回车----
echo.
set SizePartition=80000
set /p SizePartition=输入第一基本分区容量,单位M,默认80G,直接回车----
set bHvSetESP=n
for %%i in (z y x w v u t s r q p o n m) do (
if !bHvSetESP!==n ( if not exist %%i: set Label_ESP=%%i&&set bHvSetESP=y )
)
echo select disk !NumDisk!>%temp%\DiskPart.txt
echo clean>>%temp%\DiskPart.txt
if not !bPart_GPT!==n (
echo convert gpt>>%temp%\DiskPart.txt
echo create partition efi size=!SizeEFI! offset=1024>>%temp%\DiskPart.txt
echo format fs=fat32 quick>>%temp%\DiskPart.txt
echo assign letter=!Label_ESP!>>%temp%\DiskPart.txt
echo create partition msr size=400>>%temp%\DiskPart.txt
echo create partition primary size=!SizePartition!>>%temp%\DiskPart.txt
echo format fs=ntfs quick>>%temp%\DiskPart.txt
echo assign>>%temp%\DiskPart.txt
)
if !bPart_GPT!==n (
echo create partition primary size=!SizePartition! offset=1024>>%temp%\DiskPart.txt
echo format fs=ntfs quick>>%temp%\DiskPart.txt
echo assign>>%temp%\DiskPart.txt
)
echo create partition primary>>%temp%\DiskPart.txt
echo format fs=ntfs quick>>%temp%\DiskPart.txt
echo assign>>%temp%\DiskPart.txt
if !bPart_GPT!==n (
::echo select part 2 >>%temp%\DiskPart.txt
echo shrink desired=!SizeEFI! minimum=300>>%temp%\DiskPart.txt
echo list partition>>%temp%\DiskPart.txt
::暂停等待输入,在此查看DiskPart.txt内容,保存后生效
echo.
set bProceed=y
set /p bProceed=你选择对磁盘^<!NumDisk!^>进行分区操作,不分区n,默认分y,直接回车---
if not !bProceed!==y exit
diskpart /s %temp%\DiskPart.txt
echo list vol>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
echo.
set /p NumVolESP=请输入GPT中ESP分区或MBR中独立引导分区的卷编号,然后回车----
echo.
::现在准备指定要安装系统分区,请看盘符信息。
set bHvSYS=n
for /l %%i in (1,1,5) do (
if !bHvSYS!==n (
set /p LabSYS=请输入要安装系统分区盘符,不带冒号,然后回车----
if not exist !LabSYS!: echo 你输入的盘符是什么东西,根本不存在吗?
if exist !LabSYS!: set bHvSYS=y
)
)
echo.
echo 现在准备把映像wim文件复制到本地磁盘另外一个分区中,请看盘符信息。
echo.
::指定系统映像源文件本地磁盘放置分区。
set bHvLabSr=n
for /l %%i in (1,1,5) do (
if !bHvLabSr!==n (
set /p LabelSr=请输入要放置映像wim文件的盘符,直接回车----
if not exist !LabelSr!: echo 你输入的盘符是什么东西,根本不存在吗?
if exist !LabelSr!: set bHvLabSr=y
)
)
echo.
::准备全局临时文件夹\tmp_Imagex,预备以后作为ScratchDir使用
if not exist !LabelSr!:\tmp_Imagex md !LabelSr!:\tmp_Imagex
if exist !LabelSr!:\tmp_Imagex rd /s /q !LabelSr!:\tmp_Imagex&&md !LabelSr!:\tmp_Imagex
if not exist !LabelSr!:\backup md !LabelSr!:\backup
::准备源系统映像文件与索引序号。
set bHvLSr=n
for /l %%i in (1,1,5) do (
if !bHvLSr!==n (
set /p LPartU=请输入系统映像源文件所在U盘盘符,不带冒号----
if not exist !LPartU!: echo 这个盘符根本就没有使用了,你不要搞笑好吧
if exist !LPartU!: set bHvLSr=y
)
)
dir !LPartU!:\*.wim /b /s >%temp%\fSeek.txt
echo 查找到!LPartU!分区下所有映像文件如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do ( set /a a+=1&&echo 系统映像:!a! %%i)
set /a CountWim=!a!
if !a!==0 echo 该分区无系统映像文件,退出重来吧!&&goto End
echo.
set /p NumWimSource=请输入系统映像源文件序号,我不检测无效序号,不带冒号----
set bVldNSr=n
for /l %%i in (1,1,!CountWim!) do ( if !NumWimSource!==%%i set bVldNSr=y )
if !bVldNSr!==n echo 你没有输入有效系统映像文件序号,退出重来吧!&&goto End
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do (
set /a a+=1
if !NumWimSource!==!a! copy %%i !LabelSr!:\backup\
)
echo list vol>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
::准备复制U盘PE进EFI/MSR分区。
echo.
set bCpyPE=n
for /l %%i in (1,1,5) do (
if !bCpyPE!==n (
set /p LabU=请输入PE源盘即DVD盘盘符,不带冒号,然后回车----
if not exist !LabU!:\sources\boot.wim echo 这个盘不对,你不要搞笑好吧
if exist !LabU!:\sources\boot.wim (
set bCpyPE=y
if not exist !Label_ESP!:\boot\ md !Label_ESP!:\boot\
if not exist !Label_ESP!:\winpe\ md !Label_ESP!:\winpe\
if exist !Label_ESP!:\bootmgr del /f /q !Label_ESP!:\bootmgr
if exist !Label_ESP!:\bootmgr.efi del /f /q !Label_ESP!:\bootmgr.efi
xcopy /h !LabU!:\bootmgr !Label_ESP!:\
xcopy /h !LabU!:\bootmgr.efi !Label_ESP!:\
robocopy !LabU!:\boot\ !Label_ESP!:\boot\ /e /xf bcd
copy /y !LabU!:\sources\boot.wim !Label_ESP!:\winpe\
copy /y !LabU!:\boot\boot.sdi !Label_ESP!:\winpe\
)
)
)
echo 映像文件已拷贝到本地磁盘,程序暂停,U盘可以拔出它用,然后继续。
pause
echo.
dir !LabelSr!:\*.wim /b /s >%temp%\fSeek.txt
echo 查找到!LabelSr!分区下所有映像文件如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do ( set /a a+=1&&echo 系统映像:!a! %%i)
set /a CountWim=!a!
echo -----------------------------------------------------
set /p NumWimSource=请输入系统映像源文件序号,我不检测无效序号,不带冒号----
set bVldNSr=n
for /l %%i in (1,1,!CountWim!) do ( if !NumWimSource!==%%i set bVldNSr=y )
if !bVldNSr!==n echo 你没有输入有效系统映像文件序号,退出重来吧!&&goto End
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do (
set /a a+=1
if !NumWimSource!==!a! Dism /get-imageinfo /imagefile:%%i
)
echo.
set /p IndexSource=请输入系统映像索引序号,我不检测无效序号,不带冒号----
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do (
set /a a+=1
if !a!==!NumWimSource! Dism /Apply-Image /ImageFile:"%%i" /Index:!IndexSource! /ApplyDir:!LabSYS!:\ /Scratchdir:!LabelSr!:\tmp_Imagex
)
if !bPart_GPT!==y %windir%\system32\bcdboot !LabSYS!:\windows /s !Label_ESP!: /f uefi /l zh-cn
if not !bPart_GPT!==y (
if not exist !LabSYS!:\bootmgr %windir%\system32\bootsect.exe /nt52 !Label_ESP!: /force /mbr
if exist !LabSYS!:\bootmgr (
%windir%\system32\bootsect.exe /nt60 !Label_ESP!: /force /mbr
%windir%\system32\bcdboot !Label_SYS!:\windows /s !Label_ESP!: /f bios /l zh-cn
)
)
echo list disk>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
set /a CountDisk=0
set /a CountPart=0
set NumDisk=0
set bVldNum=n
set NumVol=0
set /a a=0
set /a CountWim=0
set /a NumWimSource=0
set /a NumDskG=0
set /a NumPart=0
set bBK=y
echo list disk>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt>%temp%\Out_DiskPart.txt
find /i "磁盘" %temp%\Out_DiskPart.txt>%temp%\Out_tmp.txt
for /f "skip=2 tokens=2 delims= " %%i in (%temp%\Out_tmp.txt) do (set /a CountDisk=%%i)
for /l %%i in (1,1,5) do (
if !bVldNum!==n (set /p NumDisk=请输入要安装或备份系统的目标磁盘编号,从0起编,默认第0块磁盘----)
for /l %%j in (0,1,!CountDisk!) do (
if !NumDisk!==%%j set bVldNum=y
)
)
if !bVldNum!==n (echo 磁盘编号5次都输错,算了退出吧!&&exit)
::Ghost认为磁盘从1开始起编!
set /a NumDskG=!NumDisk!+1
set /p bBK=请问是进行备份吗,如恢复输入n,默认是备份y,直接回车----
echo select disk !NumDisk!>%temp%\DiskPart.txt
echo list part>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
::准备指定安装或备份分区
set /p NumPart=你选择在磁盘^<!NumDisk!^>上安装或备份系统,请输入分区序号----
if !bBK!==y (
echo list vol>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
set bHvLabSr=n
for /l %%i in (1,1,5) do (
if !bHvLabSr!==n (
set /p LabelSr=请输入系统备份gho文件的放置盘符,直接回车----
if not exist !LabelSr!: echo 你输入的盘符是什么东西,根本不存在吗?
if exist !LabelSr!: set bHvLabSr=y
)
)
if not exist !LabelSr!:\backup md !LabelSr!:\backup
set NameBack=bk_Mby
set /p NameBack=请输入要备份文件名字,默认名字bk_Mby,直接回车----
%~dp0ghost -clone,mode=pdump,src=!NumDskG!:!NumPart!,dst=!LabelSr!:\backup\!NameBack!.gho /z9 /sure
goto End
)
if not !bBK!==y (
echo list vol>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
::指定要安装分区,请看卷标信息。
set bHvSYS=n
for /l %%i in (1,1,5) do (
if !bHvSYS!==n (
set /p LabSYS=请输入要安装系统分区盘符,就是那个序号对应的盘符,然后回车----
if not exist !LabSYS!: echo 你输入的盘符是什么东西,根本不存在吗?
if exist !LabSYS!: set bHvSYS=y
)
)
::指定EFI/MSR分区盘符,请看卷标信息。
set bHvSYS=n
for /l %%i in (1,1,5) do (
if !bHvSYS!==n (
set /p Label_ESP=请输入EFI/MSR分区盘符,不带冒号,然后回车----
if not exist !Label_ESP!: echo 你输入的盘符是什么东西,根本不存在吗?
if exist !Label_ESP!: set bHvSYS=y
)
)
set bNdCpyFil=n
set /p bNdCpyFil=请问需要从U盘复制gho文件吗,如需要输入y,默认不要n,直接回车----
if !bNdCpyFil!==y (
::现在准备把系统备份gho文件复制到本地卷中,请看卷标信息。
::指定系统备份gho文件文件本地磁盘放置分区。
set bHvLabSr=n
for /l %%i in (1,1,5) do (
if !bHvLabSr!==n (
set /p LabelSr=请输入要放置系统备份gho文件的盘符,直接回车----
if not exist !LabelSr!: echo 你输入的盘符是什么东西,根本不存在吗?
if exist !LabelSr!: set bHvLabSr=y
)
)
if not exist !LabelSr!:\backup md !LabelSr!:\backup
::准备源系统备份gho文件与索引序号。
set bHvLSr=n
for /l %%i in (1,1,5) do (
if !bHvLSr!==n (
set /p LPartU=请输入系统备份gho文件所在U盘盘符,不带冒号----
if not exist !LPartU!: echo 这个盘符根本就没有使用了,你不要搞笑好吧
if exist !LPartU!: set bHvLSr=y
)
)
dir !LPartU!:\*.gho /b /s >%temp%\fSeek.txt
echo 查找到!LPartU!分区下所有gho文件如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do ( set /a a+=1&&echo 系统备份:!a! %%i)
set /a CountWim=!a!
if !a!==0 echo 该分区无系统备份文件,退出重来吧!&&goto End
set /p NumWimSource=请输入gho文件序号,我不检测无效序号,不带冒号----
set bVldNSr=n
for /l %%i in (1,1,!CountWim!) do ( if !NumWimSource!==%%i set bVldNSr=y )
if !bVldNSr!==n echo 你没有输入有效gho文件序号,退出重来吧!&&goto End
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do (
set /a a+=1
if !NumWimSource!==!a! copy %%i !LabelSr!:\backup\
)
echo gho文件已拷贝到本地磁盘,程序暂停,U盘可以拔出它用,然后继续。
pause
dir !LabelSr!:\*.gho /b /s >%temp%\fSeek.txt
echo 查找到!LabelSr!分区下所有gho文件如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do ( set /a a+=1&&echo 系统gho:!a! %%i)
set /a CountWim=!a!
set /p NumWimSource=请输入系统gho文件序号,我不检测无效序号,不带冒号----
set bVldNSr=n
for /l %%i in (1,1,!CountWim!) do ( if !NumWimSource!==%%i set bVldNSr=y )
if !bVldNSr!==n echo 你没有输入有效系统gho文件序号,退出重来吧!&&goto End
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do (
set /a a+=1
if !NumWimSource!==!a! ( %~dp0ghost -clone,mode=pload,src=%%i:1,dst=!NumDskG!:!NumPart! /sure )
)
)
if not !bNdCpyFil!==y (
set bHvLabSr=n
for /l %%i in (1,1,5) do (
if !bHvLabSr!==n (
set /p LabelSr=请输入有系统备份gho文件的盘符,直接回车----
if not exist !LabelSr!: echo 你输入的盘符是什么东西,根本不存在吗?
if exist !LabelSr!: set bHvLabSr=y
)
)
dir !LabelSr!:\*.gho /b /s >%temp%\fSeek.txt
echo 查找到!LabelSr!分区下所有gho文件如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do ( set /a a+=1&&echo 系统gho:!a! %%i)
set /a CountWim=!a!
set /p NumWimSource=请输入系统gho文件序号,我不检测无效序号,不带冒号----
set bVldNSr=n
for /l %%i in (1,1,!CountWim!) do ( if !NumWimSource!==%%i set bVldNSr=y )
if !bVldNSr!==n echo 你没有输入有效系统gho文件序号,退出重来吧!&&goto End
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do (
set /a a+=1
if !NumWimSource!==!a! ( %~dp0ghost -clone,mode=pload,src=%%i:1,dst=!NumDskG!:!NumPart! /sure )
)
)
if !bPart_GPT!==y %windir%\system32\bcdboot !LabSYS!:\windows /s !Label_ESP!: /f uefi /l zh-cn
if not !bPart_GPT!==y (
if exist !LabSYS!:\ntldr %windir%\system32\bootsect.exe /nt52 !Label_ESP!: /force /mbr
if not exist !LabSYS!:\ntldr %windir%\system32\bootsect.exe /nt60 !Label_ESP!: /force /mbr&&%windir%\system32\bcdboot !Label_SYS!:\windows /s !Label_ESP!: /f bios /l zh-cn
)
)
goto End
)
if !OpChoice!==12 (
set bVldNum=n
set NumVol=0
set /a a=0
set NumSdi=1
set /a CountWim=0
set NumWimSource=1
set bIsUEFI=y
set /p bIsUEFI=请问BIOS是否UEFI,默认是,不是请输入小写n----
set bHvLab=n
set /p bHvLab=采用MBR但无MSR,或者MBR中MSR分区/ESP分区如已有盘符,输入y,其余直接回车----
if !bHvLab!==y (
set /p LabelEFI=请输入ESP分区或MBR中MSR分区盘符或者MBR无MSR分区时的系统盘符----
)
if not !bHvLab!==y (
::给EFI或者MSR分区分配盘符
set bHvSetESP=n
for %%i in (z y x w v u t s r q p o n m) do (
if !bHvSetESP!==n ( if not exist %%i: set LabelEFI=%%i&&set bHvSetESP=y )
)
echo list vol>%temp%\DiskPart.txt
echo exit>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
set /p NumVolESP=请输入GPT中ESP分区或MBR中MSR分区的卷编号,直接回车----
echo select vol !NumVolESP!>%temp%\DiskPart.txt
echo assign letter=!LabelEFI!>>%temp%\DiskPart.txt
echo exit>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
)
::UEFI引导需要PE源盘安装硬盘PE,默认需要本PE源盘,MBR引导,默认也要
set bCopyPE=y
set /p bCopyPE=请问是否需要复制PE文件,默认需要,不需要输入小写n----
if not !bCopyPE!==n (
set name_PE=PE_MBY
set /p name_PE=默认安装PE于!LabelEFI!:\PE_MBY目录,也可输入目录名字,如PE_WYS----
if not exist !LabelEFI!:\!name_PE!\ md !LabelEFI!:\!name_PE!\
set name_PathSdi=!name_PE!
set name_PathWim=!name_PE!
set bHvLSr=n
for /l %%i in (1,1,5) do (
if !bHvLSr!==n (
set /p LPartU=请输入PE源文件所在盘盘符,可以是本地硬盘,不带冒号----
if not exist !LPartU!: echo 这个盘符根本就没有使用了,你不要搞笑好吧
if exist !LPartU!: set bHvLSr=y
)
)
echo.
dir !LPartU!:\*.sdi /b /s >%temp%\fdSeek.txt
echo 查找到!LPartU!分区下所有映像引导文件*.sdi如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fdSeek.txt) do ( set /a a+=1&&echo 系统引导文件:!a! %%i)
set /a CountWim=!a!
if !a!==0 echo 该分区无PE系统映像引导文件,退出重来吧!&&goto End
echo -----------------------------------------------------
set /p NumSdi=请输入系统映像引导文件序号,我不检测无效序号,默认1----
set bVldNSr=n
for /l %%i in (1,1,!CountWim!) do ( if !NumSdi!==%%i set bVldNSr=y )
if !bVldNSr!==n echo 你没有输入有效PE系统映像文件序号,退出重来吧!&&goto End
echo.
dir !LPartU!:\*.wim /b /s >%temp%\fwSeek.txt
echo 查找到!LPartU!分区下所有映像文件如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fwSeek.txt) do ( set /a a+=1&&echo PE系统映像:!a! %%i)
set /a CountWim=!a!
if !a!==0 echo 该分区无PE系统映像文件,退出重来吧!&&goto End
echo -----------------------------------------------------
set /p NumWimSource=请输入PE系统映像文件序号,我不检测无效序号,默认1----
set bVldNSr=n
for /l %%i in (1,1,!CountWim!) do ( if !NumWimSource!==%%i set bVldNSr=y )
if !bVldNSr!==n echo 你没有输入有效PE系统映像文件序号,退出重来吧!&&goto End
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fdSeek.txt) do (
set /a a+=1
if !a!==!NumSdi! copy /y %%i !LabelEFI!:\!name_PE!\boot.sdi
)
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fwSeek.txt) do (
set /a a+=1
if !a!==!NumWimSource! copy /y %%i !LabelEFI!:\!name_PE!\boot.wim
)
)
if !bIsUEFI!==n (
set bCopyBoot=n
set /p bCopyBoot=是否需要从PE源盘复制MBR启动环境文件,默认不,需要输入小写y----
if not !bCopyBoot!==n (
set bHvLSr=n
for /l %%i in (1,1,5) do (
if !bHvLSr!==n (
set /p LPartPE=请输入PE源盘盘符,然后回车----
if not exist !LPartPE!: echo 这个盘符根本就没有使用了,你不要搞笑好吧
if exist !LPartPE!: set bHvLSr=y
)
)
if not exist !LPartPE!:\boot\ ( echo 这个盘里没有启动环境文件,你不要搞笑好吧!&& goto End )
xcopy /h /y !LPartPE!:\bootmgr !LabelEFI!:\
if exist !LabelEFI!:\boot\ rd /s /q !LabelEFI!:\boot\
if not exist !LabelEFI!:\boot\ md !LabelEFI!:\boot\
robocopy !LPartPE!:\boot\ !LabelEFI!:\boot\ /e /xf bcd
)
)
set bbPE=y
set /p bbPE=请问是否建PE菜单项,默认建,如果不建输入小写n----
if not !bbPE!==n (
if !bCopyPE!==n (
::没有复制源文件,说明ESP/MSR分区中已经存在PE源文件,查找相应路径
echo.
dir !LabelEFI!:\*.sdi /b /s >%temp%\fdSeek.txt
echo 查找到!LabelEFI!分区下所有映像引导文件*.sdi如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fdSeek.txt) do ( set /a a+=1&&echo 系统引导文件:!a! %%i )
set /a CountWim=!a!
if !a!==0 echo 该分区无PE系统映像引导文件,退出重来吧!&&goto End
echo -----------------------------------------------------
set /p NumSdi=请输入系统映像引导文件序号,我不检测无效序号,默认1----
set bVldNSr=n
for /l %%i in (1,1,!CountWim!) do ( if !NumSdi!==%%i set bVldNSr=y )
if !bVldNSr!==n echo 你没有输入有效PE系统映像文件序号,退出重来吧!&&goto End
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fdSeek.txt) do (
set /a a+=1
if !a!==!NumSdi! (
set namePathSdi=%%i
set name_PathSdi=!namePathSdi:~3,-9!
)
)
echo 引导文件路径是:!name_PathSdi!
set /p name_PathSdi=如果路径有误,请手工输入,默认不需要,直接回车----
echo.
dir !LabelEFI!:\*.wim /b /s >%temp%\fwSeek.txt
echo 查找到!LabelEFI!分区下所有PE映像文件如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fwSeek.txt) do ( set /a a+=1&&echo PE系统映像:!a! %%i)
set /a CountWim=!a!
if !a!==0 echo 该分区无PE系统映像文件,退出重来吧!&&goto End
echo -----------------------------------------------------
set /p NumWimSource=请输入PE系统映像文件序号,我不检测无效序号,默认1----
set bVldNSr=n
for /l %%i in (1,1,!CountWim!) do ( if !NumWimSource!==%%i set bVldNSr=y )
if !bVldNSr!==n echo 你没有输入有效PE系统映像文件序号,退出重来吧!&&goto End
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fwSeek.txt) do (
set /a a+=1
if !a!==!NumWimSource! (
set namePathWim=%%i
set name_PathWim=!namePathWim:~3,-9!
)
)
echo PE系统文件路径是:!name_PathWim!
set /p name_PathWim=如果路径有误,请手工输入,默认不需要,直接回车----
)
set name_MenuPE=PE_MBY
set /p name_MenuPE=输入菜单项名字,默认PE_MBY,可自行输入,如MAXDOS_WYS----
del /f /s /q %~dp0fdid.txt>nul 2>nul
del /f /s /q %~dp0fmid.txt>nul 2>nul
goto End
)
if !OpChoice!==13 (
echo.
echo 1:本批处理、驱动和补丁子目录、IE升级包必需都在当前目录。
echo 在同目录中有\Driver、\patch和\IE固定目录,放置驱动和补丁子目录。
echo 如\Driver\Drv_Win8_x64,\patch\patch_Win8_x64
echo 调整Win7、Win8功能,可能还要准备Win8原版光盘,或者IE10安装包。
echo.
echo 2:当前目录下工作子目录,挂载文件夹\Mount,临时文件夹\tmp_Imgex。
echo 临时文件*.txt都在系统临时文件夹%temp%中。
echo.
pause
::准备全局变量
set /a a=0
set /a CountWim=0
set /a CountIndex=0
set /a NumWimSource=0
set /a IndexSource=0
::准备局部变量
set /a CountPatch=0
set /a NumPatch=0
set /a CountDrv=0
set /a NumDrv=0
set /a CountIE=0
set /a NumIE=0
cls
echo.
set bPatDism=y
set /p bPatDism=请问是否封装系统补丁?默认是y,直接回车/不是输入小写n----
set bDrvDism=y
set /p bDrvDism=请问是否封装硬件驱动?默认是y,直接回车/不是输入小写n----
set bIsWin8=y
set /p bIsWin8=请问是要操作Win8映像吗?默认是y,直接回车/不是输入小写n----
if not !bIsWin8!==n (
set bEnabNet3=y
set /p bEnabNet3=请问是否启用 .Net 3.5/2支持?默认是y,直接回车/不是输入小写n----
if not !bEnabNet3!==n (
set /p LabelISO=请插入光盘或者装载ISO,并准确输入盘符!----
)
)
if !bIsWin8!==n (
set bDisabFun=y
set /p bDisabFun=请问是否关闭Win7部分功能?默认是y,直接回车/不是输入小写n----
set bDismIE10=y
set /p bDismIE10=请问是否封装IE10?默认是y,直接回车/不是输入小写n----
)
::准备源系统映像文件与索引序号。
set bHvLSr=n
for /l %%i in (1,1,5) do (
if !bHvLSr!==n (
set /p LPartSource=请输入系统映像文件所在盘,不带冒号----
if not exist !LPartSource!: echo 这个盘符根本就没有使用了,你不要搞笑好吧
if exist !LPartSource!: set bHvLSr=y
)
)
dir !LPartSource!:\*.wim /b /s >%temp%\fSeek.txt
echo 查找到!LPartSource!分区下所有映像文件如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do ( set /a a+=1&&echo 系统映像:!a! %%i)
set /a CountWim=!a!
if !a!==0 echo 该分区无系统映像文件,退出重来吧!&&goto End
::准备临时文件夹\tmp_Imagex,预备以后作为ScratchDir使用,这段代码不能随意移动位置!
::目的是1:在PE中临时文件空间不足,源文件盘空间一般没问题;2:如果源文件在固态盘,要充分固态盘速度优势。
if not exist !LPartSource!:\tmp_Imagex md !LPartSource!:\tmp_Imagex
if exist !LPartSource!:\tmp_Imagex rd /s /q !LPartSource!:\tmp_Imagex&&md !LPartSource!:\tmp_Imagex
::准备局部文件夹\mount
if not exist !LPartSource!:\mount md !LPartSource!:\mount
if exist !LPartSource!:\mount (
:rd
dir !LPartSource!:\mount /ad /b /s >%temp%\del_rd.txt
for /f "usebackq delims=" %%i in (%temp%\del_rd.txt) do ((takeown /f "%%i" /r /d y >%temp%\del_log.txt>nul 2>nul)&(@echo y|icacls "%%i" /t /q /grant administrator:f>nul 2>nul )&(rd "%%i" /s /q>nul 2>nul))
takeown /f !LPartSource!:\mount /r /d y >%temp%\del_log.txt>nul 2>nul
@echo y|icacls !LPartSource!:\mount /t /q /grant administrator:f>nul 2>nul
rd !LPartSource!:\mount /s /q
if exist !LPartSource!:\mount goto :rd
del /f /s /q %temp%\del_log.txt>nul 2>nul
del /f /s /q %temp%\del_rd.txt>nul 2>nul
md !LPartSource!:\mount
)
set /p NumWimSource=请输入系统映像文件序号,我不检测无效序号,不带冒号----
set bVldNSr=n
for /l %%i in (1,1,!CountWim!) do ( if !NumWimSource!==%%i set bVldNSr=y )
if !bVldNSr!==n echo 你没有输入有效系统映像文件序号,退出重来吧!&&goto End
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do (
set /a a+=1
if !NumWimSource!==!a! Dism /get-imageinfo /imagefile:%%i
)
set /p IndexSource=请输入系统映像索引序号,我不检测无效序号,不带冒号----
if not !bPatDism!==n (
cls
set /a a=0
dir %~dp0patch /d /b >%temp%\dirPatSeek.txt
echo 查找到%~dp0patch目录下所有子目录,仅查子目录
for /f "usebackq delims=" %%i in (%temp%\dirPatSeek.txt) do (
set /a a+=1
echo 所有子目录:!a! %%i)
set /a CountPatch=!a!
if !CountPatch!==0 echo 无任何patch子目录&&set bPatDism=n
echo -----------------------------------------------------
if not !CountPatch!==0 (
set /p NumPatch=请输入patch子目录序号,不带冒号----
set bVldPat=n
for /l %%i in (1,1,!CountPatch!) do (
if !NumPatch!==%%i set bVldPat=y
)
if !bVldPat!==n echo 你没有输入有效patch子目录序号,退出重来吧!&&goto End
)
)
if not !bDrvDism!==n (
cls
set /a a=0
dir %~dp0Driver /d /b >%temp%\dirDrvSeek.txt
echo 查找到%~dp0Driver目录下所有子目录,仅查子目录
for /f "usebackq delims=" %%i in (%temp%\dirDrvSeek.txt) do (
set /a a+=1
echo 所有子目录:!a! %%i)
set /a CountDrv=!a!
if !CountDrv!==0 echo 无任何Driver子目录&&set bDrvDism=n
echo -----------------------------------------------------
if not !CountDrv!==0 (
set /p NumDrv=请输入patch子目录序号,不带冒号----
set bVldDrv=n
for /l %%i in (1,1,!CountDrv!) do (
if !NumDrv!==%%i set bVldDrv=y
)
if !bVldDrv!==n echo 你没有输入有效Driver子目录序号,退出重来吧!&&goto End
)
)
if !bIsWin8!==n (
if not !bDismIE10!==n (
echo IE10升级包在当前目录子目录IE下!
set /a a=0
dir %~dp0IE /d /b >%temp%\dirIESeek.txt
echo 查找到%~dp0IE目录下所有子目录,仅查子目录
for /f "usebackq delims=" %%i in (%temp%\dirIESeek.txt) do (
set /a a+=1
echo 所有子目录:!a! %%i)
set /a CountIE=!a!
if !CountIE!==0 echo 无任何IE子目录&&set bDismIE10=n
echo -----------------------------------------------------
if not !CountIE!==0 (
set /p NumIE=请输入IE子目录序号,不带冒号----
set bVldIE=n
for /l %%i in (1,1,!CountIE!) do (
if !NumIE!==%%i set bVldIE=y
)
if !bVldIE!==n echo 你没有输入有效IE子目录序号,退出重来吧!&&goto End
)
)
)
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do (
set /a a+=1
if !NumWimSource!==!a! dism /mount-image /imagefile:"%%i" /index:!IndexSource! /mountdir:!LPartSource!:\mount /Scratchdir:!LPartSource!:\tmp_Imagex
)
if not !bPatDism!==n (
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\dirPatSeek.txt) do (
set /a a+=1
if !NumPatch!==!a! dir "%~dp0patch\%%i" /b /s >%temp%\fPatSeek.txt
)
for /f "usebackq delims=" %%j in (%temp%\fPatSeek.txt) do ( dism /image:!LPartSource!:\mount /add-package /packagepath:%%j /Scratchdir:!LPartSource!:\tmp_Imagex )
)
if not !bDrvDism!==n (
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\dirDrvSeek.txt) do (
set /a a+=1
if !NumDrv!==!a! dism /image:!LPartSource!:\mount /add-driver /driver:"%~dp0Driver\%%i" /recurse /forceunsigned /Scratchdir:!LPartSource!:\tmp_Imagex
)
)
if not !bIsWin8!==n (
if not !bEnabNet3!==n (
dism /image:!LPartSource!:\mount /enable-Feature /FeatureName:netfx3 /Source:!LabelISO!:\sources\sxs /Scratchdir:!LPartSource!:\tmp_Imagex
)
)
set /p bCommit=请问是否保存映像修改,默认是y,直接回车/不保存输入小写n----
if not !bCommit!==n ( dism /unmount-image /mountdir:!LPartSource!:\mount /commit /Scratchdir:!LPartSource!:\tmp_Imagex )
if !bCommit!==n ( dism /unmount-image /mountdir:!LPartSource!:\mount /discard /Scratchdir:!LPartSource!:\tmp_Imagex )
rd /s /q !LPartSource!:\tmp_Imagex
rd /s /q !LPartSource!:\mount
goto End
)
if !OpChoice!==14 (
echo 查找同目录(及子目录)下自动应答文件,如果一个都没有,那就不要试了。
echo 本工具包提供的自动应答文件分64位和32位两种,通用版仅仅实现跳过oobe过程。
set /a NumUntitled=0
set /a a=0
set NameUntitled=null
dir %~dp0*.xml /b /s >%~dp0fAppUntitled.txt
echo 查找到%~dp0目录下所有自动应答文件如下表
echo -----------------------------------------------------
for /f "usebackq delims=" %%i in (%~dp0fAppUntitled.txt) do ( set /a a+=1&&echo 应答文件:!a! %%i)
if !a!==0 echo 根本就没有一个自动应答文件,那封装也没什么意思了,准备退出!&&goto End
echo.
set /p NumUntitled=请认真选择应答文件序号,不带冒号----
set /a a=0
for /f "usebackq delims=" %%i in (%~dp0fAppUntitled.txt) do (
set /a a+=1
if !NumUntitled!==!a! echo 你选择的应答文件是:%%i
)
set bGoSysprep=y
set /p bGoSysprep=最后请确认现在可以开始封装了吗?默认是,直接回车,如果算了,请输入小写n----
if not !bGoSysprep!==n (
echo 正在帮您清除系统垃圾文件,请稍等......
::删除补丁备份目录
rd %windir%\$hf_mig$ /Q /S
::删除系统盘Office安装临时文件
rd /s /q %systemdrive%\msocache
dir /ad /b /s %windir%\$NtUninstall* >%~dp0Del_rd.txt
dir /ad /b /s %windir%\SoftwareDistribution\Download>>%~dp0Del_rd.txt
for /f %%i in (%~dp0Del_rd.txt ) do ( rd "%%i" /s /q )
del %~dp0Del_rd.txt /f /q
::删除补丁安装记录内容(下面的del /f /s /q %systemdrive%\*.log已经包含删除此类文件)
del %windir%\KB*.log /f /q
::删除系统盘目录下临时文件
del /f /s /q %windir%\*.tmp
::删除系统盘目录下临时文件
del /f /s /q %windir%\*._mp
::删除系统盘目录下日志文件
del /f /s /q %windir%\*.log
::删除系统盘目录下GID文件
del /f /s /q %windir%\*.gid
::删除系统目录下scandisk(磁盘扫描)留下的无用文件
del /f /s /q %windir%\*.chk
::删除系统目录下old文件
del /f /s /q %windir%\*.old
::删除回收站的无用文件
del /f /s /q %windir%\recycled\*.*
::删除系统目录下备份文件
del /f /s /q %windir%\*.bak
::删除系统维护等操作产生的临时文件
rd /s /q %windir%\temp md %windir%\temp
::删除当前用户的COOKIE(IE)
del /f /q %userprofile%\cookies\*.*
::删除internet临时文件
del /f /s /q "%userprofile%\local settings\temporary internet files\*.*"
::删除当前用户日常操作临时文件
del /f /s /q "%userprofile%\local settings\temp\*.*"
copy %systemdrive%\Users\%username%\Favorites\*.* %systemdrive%\Users\Default\Favorites
dir %~dp0Desk*.bat /b /s >%~dp0fTmp.txt
dir %~dp0Driver*.bat /b /s >>%~dp0fTmp.txt
for /f %%i in (%~dp0fTmp.txt) do ( copy %%i %windir%\system32 )
set /a a=0
for /f "usebackq delims=" %%i in (%~dp0fAppUntitled.txt) do (
set /a a+=1
if !a!==!NumUntitled! %windir%\system32\sysprep\sysprep.exe /oobe /generalize /shutdown /unattend:%%i
)
)
goto End
)
if !OpChoice!==15 (
set bIsUEFI=y
set /p bIsUEFI=请问BIOS是否UEFI,默认是,不是请输入小写n----
set bHvLab=n
set /p bHvLab=采用MBR但无MSR,或者MBR中MSR分区/ESP分区如已有盘符,输入y,其余直接回车----
if !bHvLab!==y (
set /p LabelEFI=请输入ESP分区或MBR中MSR分区盘符或者MBR无MSR分区时的系统盘符----
)
if not !bHvLab!==y (
::给EFI或者MSR分区分配盘符
set bHvSetESP=n
for %%i in (z y x w v u t s r q p o n m) do (
if !bHvSetESP!==n ( if not exist %%i: set LabelEFI=%%i&&set bHvSetESP=y )
)
echo list vol>%temp%\DiskPart.txt
echo exit>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
set /p NumVolESP=请输入GPT中ESP分区或MBR中MSR分区的卷编号,直接回车----
echo select vol !NumVolESP!>%temp%\DiskPart.txt
echo assign letter=!LabelEFI!>>%temp%\DiskPart.txt
echo exit>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
)
bcdedit /create {bootmgr} /d "Marc Boot Manager" >nul 2>nul
bcdedit /set {bootmgr} device partition=\device\harddiskvolume!NumVolESP! >nul 2>nul
set b8Boot=n
set /p b8Boot=请问是否建8.1/8/7引导,默认不,如果要建输入小写y----
if !b8Boot!==y (
::创建8.1/8/7引导项
set l_Sys8=null
set /p l_Sys8=请问要为哪个盘的Windows 8.1/8/7建立引导,输入盘符----
set name_MenuWindows=Windows_8.1/8/7
set /p name_MenuWindows=默认菜单项名字Windows_8.1/8/7,可自行输入不带空格名字,如Windows_7----
bcdedit /create /d "!name_MenuWindows!" /application osloader>%temp%\fmid.txt
for /f "tokens=2 delims= " %%i in (%temp%\fmid.txt) do (set fmid=%%i)
bcdedit /set !fmid! device partition=!l_Sys8!:
if not !bIsUEFI!==n bcdedit /set !fmid! path \windows\system32\winload.efi
if !bIsUEFI!==n bcdedit /set !fmid! path \windows\system32\winload.exe
bcdedit /set !fmid! osdevice partition=!l_Sys8!:
bcdedit /set !fmid! systemroot \windows
bcdedit /displayorder !fmid! /addlast
)
set b8VhdBoot=n
set /p b8VhdBoot=请问是否建8.1/8/7 VHD引导,默认不,如果要建输入小写y----
if !b8VhdBoot!==y (
::创建8.1/8/7 VHD引导项
set namePathVhd=null
::准备VHD系统文件与序号。
set bHvLSr=n
for /l %%i in (1,1,5) do (
if !bHvLSr!==n (
set /p LPartSource=请输入VHD系统文件所在盘,不带冒号----
if not exist !LPartSource!: echo 这个盘符根本就没有使用了,你不要搞笑好吧
if exist !LPartSource!: set bHvLSr=y
)
)
dir !LPartSource!:\*.vhd /b /s >%temp%\fSeek.txt
echo 查找到!LPartSource!分区下所有VHD文件如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do ( set /a a+=1&&echo 系统映像:!a! %%i)
set /a CountWim=!a!
if !a!==0 echo 该分区无系统VHD文件,退出重来吧!&&goto End
set NumWimSource=1
set /p NumWimSource=请输入VHD系统文件序号,我不检测无效序号,默认1----
set bVldNSr=n
for /l %%i in (1,1,!CountWim!) do ( if !NumWimSource!==%%i set bVldNSr=y )
if !bVldNSr!==n echo 你没有输入有效VHD系统文件序号,退出重来吧!&&goto End
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do (
set /a a+=1
if !a!==!NumWimSource! (
set nameTmp=%%i
echo 你选择的VHD系统文件是:%%i
)
)
set namePathVhd=!nameTmp:~3!
set name_MenuVHD=VHD_MBY
set /p name_MenuVHD=输入菜单项名字,默认VHD_MBY,可自行输入,如MAXDOS_WYS----
bcdedit /create /d "!name_MenuVHD!" /application osloader>%temp%\fmid.txt
for /f "tokens=2 delims= " %%i in (%temp%\fmid.txt) do (set fmid=%%i)
bcdedit /set !fmid! device vhd=[!LPartSource!:]\!namePathVhd!
if not !bIsUEFI!==n bcdedit /set !fmid! path \windows\system32\winload.efi
if !bIsUEFI!==n bcdedit /set !fmid! path \windows\system32\winload.exe
bcdedit /set !fmid! osdevice vhd=[!LPartSource!:]\!namePathVhd!
bcdedit /set !fmid! systemroot \windows
bcdedit /set !fmid! detecthal yes
bcdedit /displayorder !fmid! /addlast
)
if !bIsUEFI!==n (
set bXP=n
set /p bXP=请问是否建XP引导,默认不,如果要建输入小写y----
if !bXP!==y (
::创建XP引导项
set l_SysXP=null
set /p l_SysXP=请问要为哪个盘的XP建立引导,输入盘符----
set name_MenuXP=XP_MBY
set /p name_MenuXP=输入菜单项名字,默认XP_MBY,可自行输入,如MAXDOS_WYS----
::取得GUID所在行。
set numOrder=null
set /a a=0
for /f "delims= " %%i in ( %temp%\x.txt ) do (
set /a a+=1
if %%i==displayorder set numOrder=!a!
)
find "description" %temp%\x.txt >%temp%\m.txt
set /a a=0
for /f "skip=3 tokens=1,* delims= " %%i in ( %temp%\m.txt ) do (
set bDel=n
set /a Tmp=!a!+1
set /p bDel=系统启动菜单第!Tmp!项是:%%j,请问是否删除,默认不删,删除输入y----
set /a numItem=!a!+!numOrder!
if not !bDel!==n (
set /a c=0
for /f "tokens=1,* delims= " %%k in ( %temp%\x.txt ) do (
set /a c+=1
if !c!==!numItem! (
if !numItem!==!numOrder! (
set item=%%l
bcdedit /delete %%l >nul 2>nul
bcdedit /delete %%l /f >nul 2>nul
)
if not !numItem!==!numOrder! (
set item=%%k
bcdedit /delete %%k >nul 2>nul
bcdedit /delete %%k /f >nul 2>nul
)
)
)
)
set /a a+=1
)
del /f /s /q %temp%\x.txt>nul 2>nul
del /f /s /q %temp%\m.txt>nul 2>nul
bcdedit /enum
echo.
goto End
)
:End
set bProceed=n
set /p bProceed=请问继续其它任务吗,重复运行默认应答选项有效,默认不n,直接回车/是输入小写y----
if !bProceed!==y goto op
del /f /s /q %temp%\fSeek.txt>nul 2>nul
del /f /s /q %temp%\fSrSeek.txt>nul 2>nul
del /f /s /q %temp%\fDsSeek.txt>nul 2>nul
del /f /s /q %temp%\dirPatSeek.txt>nul 2>nul
del /f /s /q %temp%\dirDrvSeek.txt>nul 2>nul
del /f /s /q %temp%\dirIESeek.txt>nul 2>nul
del /f /s /q %temp%\fPatSeek.txt>nul 2>nul
del /f /s /q %temp%\ImageInfo.txt>nul 2>nul
del /f /s /q %temp%\DiskPart.txt>nul 2>nul
del /f /s /q %temp%\tmp.txt>nul 2>nul
del /f /s /q %~dp0fAppUntitled.txt>nul 2>nul
del /f /s /q %~dp0fTmp.txt>nul 2>nul
del /f /s /q %~dp0null>nul 2>nul
del /f /s /q %temp%\Out_DiskPart.txt>nul 2>nul
del /f /s /q %temp%\Out_tmp.txt>nul 2>nul
del /f /s /q %temp%\tmp.txt>nul 2>nul
del /f /s /q %~dp0fdid.txt>nul 2>nul
del /f /s /q %~dp0fmid.txt>nul 2>nul