|
本帖最后由 2011htpcfans 于 2013-11-21 22:14 编辑
>>>>>>Dism集成调整应用捕获映像整理小工具<<<<<<<
1、利用西安出差开会两天时间整理编写的小工具,大家看看好用吧,呵呵。
2、期待哪位高手告诉我个支持Dism和Diskpart操作的ISO版的Win8 X64版PE,不需要那种很多工具的,先谢谢了。
3、以下代码不解释,行内一看便知。
@echo off&mode con lines=25 cols=90
title Dism映像集成整理与安装备份小工具_Marc倾力提供
color 0a
setlocal enabledelayedexpansion
echo.
@echo ------------------------------------------------------------------------------
rd %systemdrive%\users\Dir_Test>nul 2>nul
md %systemdrive%\users\Dir_Test>nul 2>nul||(Echo 请使用右键管理员身份运行&&Pause >nul&&Exit)
rd %systemdrive%\users\Dir_Test>nul 2>nul
cls
echo 任务开始时间是%time:~,2%点%time:~3,2%分%time:~6,2%秒
echo.
set /a Tday=0
set "T1=%time%"
echo -------------------------------------------------------------------------------
echo 首先说下本批处理的主要功能
echo.
echo 功能1:将Win7、Win8的系统补丁、稳定硬件驱动封装入系统映像文件wim中。
echo 调整Win7、Win8的部分系统功能,如使用Win8原版ISO开启.Net3.5/2支持。
echo 功能2:Win8/PE系统环境下将系统映像应用安装到某一分区,可以是vhd分区。
echo Apply操作,但本批处理只做了UEFI x64引导创建和修复,无全面引导支持。
echo 功能3:Win8/PE系统环境下将某一分区,可以是vhd分区,备份成系统映像文件wim。
echo Capture操作,可以全新制作,也可追加在其它映像文件wim中。
echo 功能4:Win8/PE系统环境下整理系统映像,Export操作。
echo.
echo -------------------------------------------------------------------------------
echo 批处理使用环境要求
echo.
echo 1:Win8/7/PE系统,或者功能健全版PE,2-4项功能需要Win8/PE以上系统
在Win8 X64/PE下可以安装系统,即Apply+BCDBoot。
echo 2:封装需要映像文件和本批处理工具同目录,驱动和补丁目录有固定要求。
echo 在同目录中有\Driver和\patch固定目录,放置驱动和补丁子目录。
echo 如\Driver\Drv_Win8_x64,\patch\patch_Win8_x64
echo 调整Win7、Win8功能,可能还要准备Win8原版光盘,或者IE10安装包。
echo 3:当前目录下工作子目录,挂载文件夹\Mount,临时文件夹\tmp_Imgex。
echo 临时文件*.txt都在系统临时文件夹%temp%中。
echo.
echo -------------------------------------------------------------------------------
pause>null
:opInput
cls
echo.
echo ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
echo ┋ 任务选择 ┋
echo ┋ ┋
echo ┋ 任务类型 1: 系统封装与功能调整。 ┋
echo ┋ ┋
echo ┋ 任务类型 2: 将Wim文件中的映像应用于某一分区,即装系统。 ┋
echo ┋ ┋
echo ┋ 任务类型 3: 将某一分区系统捕获为系统映像文件,即wim文件。 ┋
echo ┋ ┋
echo ┋ 任务类型 4: Wim文件导入导出整理。 ┋
echo ┋ ┋
echo ╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
echo 注意:
echo.
echo 1:如果牵扯VHD请提前装载,牵扯原版光盘或ISO请提前准备。
echo 2:凡涉及输入名字的,请不要输入带空格、/。\,:~《》%¥#等千奇百怪的字符。
echo 3:输入数字字母较多,请现在改系统输入法为英文,误操作,请按Ctrl+C退出。
echo 4:无论是捕获还是导出映像,新文件名最好不要与现有文件名相同,我不检测。
echo 5:请尽量不要在低版本系统里面操作高版本系统映像,出错概率较高。
echo 5:系统杀软Defender如有影响,请提前暂时关闭。
echo 5:注意系统临时文件夹容量,别两30-40M都没有,映像操作。
echo.
::准备全局变量
set /a a=0
set /a OpChoice=0
set /a NameUnit=0
set /a CountWim=0
set /a CountIndex=0
set /a NumWimSource=0
set NameWimSource=null
set /a IndexSource=0
set /a NumWimDest=0
set NameWimDest=null
::准备全局临时文件夹\tmp_Imagex,预备以后作为ScratchDir使用
if not exist %~dp0tmp_Imagex goto mdTmp
call :rd_Pre %~dp0tmp_Imagex
:mdTmp
md %~dp0tmp_Imagex
call :ChoiceIn 4
set /a OpChoice=!Op!
if !OpChoice!==1 (
echo 任务类型 1: 系统封装与功能调整。
::准备局部变量
set /a CountPatch=0
set /a NumPatch=0
set NameDirPat=null
set /a CountDrv=0
set /a NumDrv=0
set NameDirDrv=null
::准备局部文件夹\mount
if not exist %~dp0mount goto mdmount
call :rd_Pre %~dp0mount
:mdmount
md %~dp0mount
set /p bPatDism=请问是否封装系统补丁?默认是y,直接回车/不是输入n----
set /p bDrvDism=请问是否封装硬件驱动?默认是y,直接回车/不是输入n----
set /p bIsWin8=请问是要操作Win8映像吗?默认是y,直接回车/不是输入n----
if not !bIsWin8!==n (
set /p bEnabNet3=请问是否启用 .Net 3.5/2支持?默认是y,直接回车/不是输入n----
if not !bEnabNet3!==n (
set /p LabelISO=请插入光盘或者装载ISO,并准确输入盘符!----
)
)
if !bIsWin8!==n (
set /p bDisabFun=请问是否关闭Win7部分功能?默认是y,直接回车/不是输入n----
set /p bDismIE10=请问是否封装IE10?默认是y,直接回车/不是输入n----
)
::准备源系统映像文件与索引序号。
call :SeekWim
set /a CountWim=!a!
echo 下面进行系统文件序号选择
call :ChoiceIn !CountWim!
set /a NumWimSource=!Op!
call :GetNameUnit !NumWimSource! %temp%\fSeek.txt
set NameWimSource=!NameUnit!
echo 下面进行映像索引序号选择
call :SeekCIndex !NameWimSource!
call :ChoiceIn !CountIndex!
set /a IndexSource=!Op!
if not !bPatDism!==n (
call :dirChild %~dp0patch
set /a CountPatch=!a!
echo 下面进行补丁文件夹序号选择
call :ChoiceIn !CountPatch!
set /a NumPatch=!Op!
call :GetNameUnit !NumPatch! %temp%\dirSeek.txt
set NameDirPat=!NameUnit!
dir %~dp0patch\!NameDirPat! /b /s >%temp%\fSeek.txt
)
if not !bDrvDism!==n (
call :dirChild %~dp0driver
set /a CountDrv=!a!
echo 下面进行驱动文件夹序号选择
call :ChoiceIn !CountDrv!
set /a NumDrv=!Op!
call :GetNameUnit !NumDrv! %temp%\dirSeek.txt
set NameDirDrv=!NameUnit!
)
dism /mount-image /imagefile:!NameWimSource! /index:!IndexSource! /mountdir:%~dp0mount
if not !bPatDism!==n ( for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do ( dism /image:%~dp0mount /add-package /packagepath:%%i ) )
if not !bDrvDism!==n dism /image:%~dp0mount /add-driver /driver:%~dp0Driver\!NameDirDrv! /recurse /forceunsigned
if not !bIsWin8!==n (
if not !bEnabNet3!==n dism /image:%~dp0mount /enable-Feature /FeatureName:netfx3 /Source:!LabelISO!:\sources\sxs
goto Unmount
)
if !bIsWin8!==n (
if not !bDisabFun!==n (
echo 调整功能独立操作,以增强批处理兼容性,连Win7 Starter都可以用。
dism /Image:%~dp0mount /Disable-Feature /FeatureName:TabletPCOC
dism /Image:%~dp0mount /Disable-Feature /FeatureName:WindowsGadgetPlatform
dism /Image:%~dp0mount /Disable-Feature /FeatureName:MediaCenter
dism /Image:%~dp0mount /Disable-Feature /FeatureName:FaxServicesClientPackage
dism /Image:%~dp0mount /Disable-Feature /FeatureName:Printing-XPSServices-Features
dism /Image:%~dp0mount /Disable-Feature /FeatureName:Xps-Foundation-Xps-Viewer
dism /Image:%~dp0mount /Disable-Feature /FeatureName:Printing-Foundation-InternetPrinting-Client
dism /Image:%~dp0mount /Disable-Feature /FeatureName:Hearts
dism /Image:%~dp0mount /Disable-Feature /FeatureName:Solitaire
dism /Image:%~dp0mount /Disable-Feature /FeatureName:SpiderSolitaire
dism /Image:%~dp0mount /Disable-Feature /FeatureName:FreeCell
dism /Image:%~dp0mount /Disable-Feature /FeatureName:Minesweeper
dism /Image:%~dp0mount /Disable-Feature /FeatureName:PurblePlace
dism /Image:%~dp0mount /Disable-Feature /FeatureName:Chess
dism /Image:%~dp0mount /Disable-Feature /FeatureName:Shanghai
dism /Image:%~dp0mount /Disable-Feature /FeatureName:InboxGames
dism /Image:%~dp0mount /Disable-Feature /FeatureName:OpticalMediaDisc
)
if not !bDismIE10!==n (
dism /image:%~dp0mount /add-package /packagepath:e:\lite\ie10\ie-win7.cab /packagepath:e:\lite\ie10\ielangpack-CHS.CAB
dism /image:%~dp0mount /add-package /packagepath:e:\lite\ie10\IE-Hyphenation-NEU.msu /packagepath:e:\lite\ie10\IE-Spelling-NEU.msu
)
)
:Unmount
set /p bCommit=请问是否保存映像修改,默认是y,直接回车/不是输入n----
if not !bCommit!==n dism /unmount-image /mountdir:%~dp0mount /commit&&goto Proceed
dism /unmount-image /mountdir:%~dp0mount /discard
goto Proceed
)
if !OpChoice!==2 (
echo 任务: 将Wim文件中的映像应用于某一分区,即装系统,未提供完整引导重建。
echo UEFI模式下可以建立Win8.1/8/7 x64引导,就是完整系统安装了。
echo -------------------------------------------------------------------------------
set /p LabelApply=请输入要安装系统的盘符,请现在自行格式化,不带冒号----
set /p bBootNeed=是否同时建立系统引导,必须是UEFI模式Win8.1/8/7 x64,默认不n,直接回车/是输入y----
if !bBootNeed!==y (
echo list vol>%temp%\DiskPart.txt
echo exit>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
set /p bLabelHave=请问ESP分区是否已经有盘符,默认是y,直接回车/不是输入n---
if !bLabelHave!==y (
set /p Label_ESP=请输入ESP分区现在的盘符,不带冒号,我不检测无效盘符噢----
goto validLESP)
set /p choiceVol_6=请输入ESP分区的卷编号,直接回车----
set /p Label_ESP=请输入要指定的盘符,不带冒号,我不检测无效盘符噢----
echo select vol !choiceVol_6!>%temp%\DiskPart.txt
echo assign letter=!Label_ESP!>>%temp%\DiskPart.txt
echo exit>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
)
:validLESP
::准备源系统映像文件与索引序号。
call :SeekWim
set /a CountWim=!a!
echo 下面进行系统文件序号选择
call :ChoiceIn !CountWim!
set /a NumWimSource=!Op!
call :GetNameUnit !NumWimSource! %temp%\fSeek.txt
set NameWimSource=!NameUnit!
echo 下面进行映像索引序号选择
call :SeekCIndex !NameWimSource!
call :ChoiceIn !CountIndex!
set /a IndexSource=!Op!
dism /Apply-Image /ImageFile:!NameWimSource! /Index:!IndexSource! /ApplyDir:!LabelApply!:\
if !bBootNeed!==y (
if exist !LabelApply!:\windows\system32\bcdboot.exe !LabelApply!:\windows\system32\bcdboot !LabelApply!:\windows /s !Label_ESP!: /f ALL
)
goto Proceed
)
if !OpChoice!==3 (
echo 任务类型 3: 将某一分区系统捕获为系统映像文件,即wim文件。
set /p LabelCapture=请输入要捕获系统的盘符,不带冒号----
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
)
set /p bCaptureAppend=是否增量捕获在其它映像文件中,默认是y,直接回车/不是输入n----
if not !bCaptureAppend!==n (
call :SeekWim
set /a CountWim=!a!
echo 下面进行系统文件序号选择
call :ChoiceIn !CountWim!
set /a NumWimDest=!Op!
call :GetNameUnit !NumWimDest! %temp%\fSeek.txt
set NameWimDest=!NameUnit!
echo !NameWimDest!
dism /Append-Image /ImageFile:!NameWimDest! /CaptureDir:!LabelCapture!:\ /Name:!NameImage!
goto Proceed
)
dism /Capture-Image /ImageFile:%~dp0!NameImage!.wim /CaptureDir:!LabelCapture!:\ /Name:!NameImage!
goto Proceed
)
if !OpChoice!==4 (
echo 任务类型 4: Wim文件导入导出整理。
::准备源系统映像文件与索引序号。
call :SeekWim
set /a CountWim=!a!
echo 下面进行系统文件序号选择
call :ChoiceIn !CountWim!
set /a NumWimSource=!Op!
call :GetNameUnit !NumWimSource! %temp%\fSeek.txt
set NameWimSource=!NameUnit!
echo 下面进行映像索引序号选择
call :SeekCIndex !NameWimSource!
call :ChoiceIn !CountIndex!
set /a IndexSource=!Op!
find "名称" %temp%\imageinfo.txt>%temp%\tmp.txt
set /a a=0
for /f "skip=2 tokens=2 delims= " %%i in (%temp%\tmp.txt) do (
set /a a+=1
if !IndexSource!==!a! set NameTmp=%%i
)
:: 格式化映像名字,以下划线代替空格
set /a a=0
for %%i in ( !NameTmp! ) do (
set /a a+=1
if !a!==1 set NameImage=%%i
if not !a!==1 set NameImage=!NameImage!_%%i
)
set /p bCaptureAppend=是否导出在其它映像文件中,默认是y,直接回车/不是输入n----
if not !bCaptureAppend!==n (
call :SeekWim
set /a CountWim=!a!
echo 下面进行系统文件序号选择
call :ChoiceIn !CountWim!
set /a NumWimDest=!Op!
call :GetNameUnit !NumWimDest! %temp%\fSeek.txt
set NameWimDest=!NameUnit!
dism /Export-Image /SourceImageFile:!NameWimSource! /SourceIndex:!IndexSource! /DestinationImageFile:!NameWimDest!
goto Proceed
)
dism /Export-Image /SourceImageFile:!NameWimSource! /SourceIndex:!IndexSource! /DestinationImageFile:%~dp0!NameImage!.wim
goto Proceed
)
:Proceed
set IfProceed=n
set /p IfProceed=请问继续其它任务吗,第二次运行默认应答选项无效,默认不n,直接回车/是输入y----
if !IfProceed!==y goto opInput
call :rd_Pre %~dp0tmp_Imagex
call :rd_Pre %~dp0mount
del /f /s /q %temp%\fSeek.txt
del /f /s /q %temp%\ImageInfo.txt
del /f /s /q %temp%\tmp.txt
del /f /s /q %temp%\del_log.txt
del /f /s /q %temp%\del_rd.txt
del /f /s /q %temp%\dirSeek.txt
del /f /s /q %temp%\DiskPart.txt
echo 任务结束时间是%time:~,2%点%time:~3,2%分%time:~6,2%秒
set "T2=%time%"
if "%T2:~,2%" lss "%T1:~,2%" (set Tday+=8640000)
set /a "T_d=%Tday%+(%T2:~,2%*360000)+(%T2:~3,1%*60000+%T2:~4,1%*6000)+(%T2:~6,1%*1000+%T2:~7,1%*100)+(%T2:~9,1%*10+%T2:~-1%)-(%T1:~,2%*360000)-(%T1:~3,1%*60000+%T1:~4,1%*6000)-(%T1:~6,1%*1000+%T1:~7,1%*100)-(%T1:~9,1%*10+%T1:~-1%)"
set /a "ss=%T_d%/100%%60"
set /a "mm=%T_d%/6000%%60"
set /a "hh=%T_d%/360000%%1"
set /a "ms=%T_d%%%100"
echo 本次任务消耗时间为 %hh%:%mm%:%ss%.%ms%秒
pause
exit
:: 程序段_1:清理某文件夹,需传入参数%1,完整目录名,示例:call :rd_Pre %~dp0mount
:rd_Pre
:rd
takeown /f %1 /r /d y >%temp%\del_log.txt>nul 2>nul
@echo y|icacls %1 /t /q /grant administrator:f>nul 2>nul
rd %1 /s /q
if not exist %1 goto :eof
dir %1 /d /b >%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))
if exist %1 goto :rd
:: 程序段_2:查找当前目录下所有映像文件wim,不需传入参数,示例:call :SeekWim
:: 注意:及时取出统计变量a的值,文件完整路径加名字信息在fSeek.txt中
:SeekWim
cls
set /a a=0
dir %~dp0*.wim /b /s >%temp%\fSeek.txt
echo 查找到%~dp0目录下所有映像文件如下表
echo -----------------------------------------------------
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do ( set /a a+=1&&echo 系统映像:!a! %%i)
if !a!==0 echo 无系统映像文件,直接退出
echo -----------------------------------------------------
goto :eof
:: 程序段_3:传入参数:指定完整目录,查找其下所有子目录,示例:call :dirChild %~dp0patch
:: 注意:及时取出统计变量a的值,目录信息在dirSeek.txt中,也最好通过重命名取走
:dirChild
cls
set /a a=0
dir %1 /d /b >%temp%\dirSeek.txt
echo 查找到%1目录下所有子目录,仅查子目录
for /f "usebackq delims=" %%i in (%temp%\dirSeek.txt) do (
set /a a+=1
echo 所有子目录:!a! %%i)
if !a!==0 echo 无无任何子目录
echo -----------------------------------------------------
goto :eof
:: 程序段_4:序号选择,需传入参数:可选范围,示例:call :ChoiceIn !CountPatch!
:: 注意:用户序号输入的值已经放在变量op了,请及时取值使用。
:ChoiceIn
:op
echo ------------------------------------------------------------------------------
set /p op=请输入选择序号:1-%1----
for /l %%i in (1,1,%1) do (
if !op!==%%i goto VldInput
)
echo 这么简单的选择题都会错,输入数字1-%1有这么难吗,请重新输入
echo ------------------------------------------------------------------------------
goto op
:VldInput
echo -----------------------------------------------------
goto :eof
:: 程序段_5:根据指定序号(参数%1)取出文件(参数%2)中指定行内容
:: 注意:指定行内容在变量NameUnit中,请及时取值使用。
:GetNameUnit
set /a a=0
for /f %%i in ( %2 ) do (
set /a a+=1
if !a!==%1 set NameUnit=%%i
)
goto :eof
:: 程序段_6: 通过Dism操作检索映像文件(需要完整路径,参数%1)中映像总数
:: 注意:修改主程序全局变量CountIndex,请及时取值使用。
:SeekCIndex
dism /get-imageinfo /imagefile:%1
dism /get-imageinfo /imagefile:%1 >%temp%\ImageInfo.txt
:: 好多PE不支持findstr
:: findstr "索引" %temp%\ImageInfo.txt>%temp%\Tmp.txt
find /i "索引" %temp%\ImageInfo.txt>%temp%\Tmp.txt
for /f "skip=2 tokens=2 delims= " %%i in (%temp%\tmp.txt) do (set /a CountIndex=%%i)
goto :eof
|
评分
-
查看全部评分
|