|
2#
楼主 |
发表于 2014-5-9 15:57:26
|
只看该作者
2、系统补丁集成
说到这里,再向各位老实交代一件事:尽管Win7系统和Win8系统功能组件名字可能不同,系统补丁名字不同,要封装的驱动不同,但本文中处理三者方法对两类系统确实一样的,到Win9系统时估计也差不多。
微软就是这么霸气,系统漏洞、驱动补丁、软件补丁这么多,什么时候是头啊,这让我想起了小时候父母安排的农活,不干不行啊,不干要挨揍啊。系统补丁还是尽量打上吧,要不电脑奔在网上大多都是肉鸡,或被人遥控的僵尸,国家安全战略不是儿戏,个人网银私照不能外泄啊。
Win7 SP1从发布之日2011年5月起到现在,光安全补丁有100多个,一段时间以后必须安装预备补丁(KB947821,现在可能是v36吧),才能安装后续补丁;Intel、AMD和Nvdia等公司的产品驱动,有时也以类似KBXXXXXXX.msu的形式出现(一般是微软验证过的,CAB压缩格式的。其实它以这样的形式出现,我倒开心了,容易集成吗),如果再加上其它性能补丁,更是不计其数,如果制作的系统不包含补丁,要联网安装,等得人撞墙的撞墙,跳楼的跳楼了。Win8发布时间稍短,补丁可能不是太多,我们倒还可以忍受,但是我们总是可以积极一点,多做一点准备工作,少给电脑和网络带来一些本可以避免的负担。有时候很多内网不能与互联网连接,系统补丁不能自动更新,如果安装时没有集成补丁,那这台机子很可能终生不知道打补丁是干什么的,抗病毒能力肯定很差。打补丁说着容易,做着难,但是你只要认认真真做过一次,下一次绝对简单。
那我们到底需要哪些系统补丁呢,我的理解是重要安全补丁,关键、较新又稳定的性能补丁,如.Net4等的系统重要组件补丁,如有需要的话最新IE、微软办公套件补丁、微软杀软安全软件补丁,还有如果你够负责任,Flash补丁,大家很可能比我想到的还要多。但是系统映像文件就是我们做好要发布的那个*.wim文件体积总是有限的。Win7时代,微软系统源盘位是2.X GB,Win8时代,微软系统源盘位是3.X GB,微软Win9应该不会超过4GB,但我们还要在里面封装系统补丁、驱动,这个体积肯定是要长势喜人的,我在内网上做的系统,又封装了一部分打印机驱动,又加了Photoshop等,Win7 x64体积接近6G,Win8.1 x64体积超过5G,所以自主权在各位手里,各取所需。
那么怎么封装补丁呢?请看官放慢节奏。我们在开头和第一部分不是看到查看当前系统的系统组件的开关状态了吗,用的是什么命令,大概是”Dism /online xxxxxxxxx”对吧,实际上就是它。这个命令是针对当前系统的,当然给没有补丁的当前系统用这样的命令打补丁,并编写批处理也肯定比一个一个双击运行要快,但这明显不是我们所要的东西。
这里我再插下嘴,关于wim与gho的不同点,gho是针对磁盘物理扇区的机械复制(你可以压缩一下),但wim远不是这么简单,wim是基于文件的备份,这个怎么理解呢。进行wim备份压缩时它扫描某个磁盘或者目录,找到所有的文件,还可以根据计划过滤一部分不用的文件,然后基于对操作系统文件的深刻理解,一个一个文件复制(当然也可以压缩)。所以使用微软命令Dism操作wim格式的文件时,微软非常清楚哪个是垃圾,哪个是用户文档,哪个是系统核心文件,当然哪个是系统补丁文件、哪个是硬件驱动文件也不在话下,到这里我说wim文件是具有活性的系统备份大家没有意见了吧。再回过头来看gho,它纯粹是磁盘扇区集合,对它操作的每个单位是磁盘扇区,你想想你有多么崩溃。微软原版ISO中的系统都是wim格式的,并且一个wim文件可以存储多个系统映像,它内部肯定有索引机制,相同文件绝对不保存第二份,所以微软原版wim中4-5个系统更像是一堆增量备份。这4-5个映像怎么区分呢,最简单的方法就是根据索引来分,1-5,事实证明也是可行的。现在我说在网上所看到的gho格式的Win8系统都是半瓶水准,应该可以吧。最新wim文件直接启动也是微软开放的一点小甜头而已。
闲话掠过,继续正题,”Dism /online xxxxxxxxx”是操作当前系统,是真正真该运行的系统,由于wim文件的先进性,我们可以像操作正在运行的当前系统一样操作系统映像,就是操作wim文件。但wim文件毕竟不是正在运行的系统,我们还是需要为它搭点舞台的,如果你回头看看刚才Dism命令的帮助,你肯定可以看到通用命令和数据两块里有:Mount-image/Unmount-image、Mount-wim/Unmount-wim命令参数,Mount-wim这个参数可以把wim装载到某个文件夹中,接着在Dism看来这个指定文件夹就和正在运行的系统没什么区别了,正在运行的系统不就是C:\吗。这个装载过程,微软称作安装映像,但不同于/Apply这个参数的意义,那是应用,安装与应用的区别我感觉最大区别在于我安装完了,可以使用Unmount命令在适合时候再卸载。安装、卸载wim可以操作系统映像,安装、卸载wimage还可以操作微软vhd映像文件,更NB一点。以我的机子中的映像为例,大家看看如何装载。
D:\backup目录下有个Win81_PR_x64_VL_WithUpdate_Office2013.wim映像文件,并且我知道这个映像文件中只有一个系统映像,映像名刚好跟文件名一致。要装载这个映像,需要一个文件夹,当然磁盘空间必须够,一般30G开外最好,这个应该不难,假设我就在d:\下建一个Mount文件夹用来放置系统映像。那么安装(装载)映像的命令一般是这个样子:
实际上如果不太清楚命令用法,还可以看帮助。
但是这里有一个小问题,如何知道映像文件里有几个映像,请大家再回头看看开始Dism帮助,是不是有一个参数/get-wiminfo,大家就在提示符中输入”Dism /get-wiminfo /?”,结果如下
这下,大家把自己的映像文件代入一下,信息一览无余。当然这种方法比各种图形化工具笨拙一点,没关系,这个是最基本的,功能最全,并且可以编程,图形化工具基本上都固化了,操作空间很小。
映像安装完毕,我就可以像操作/online映像一样操作离线映像,这个时候wim文件就复活了。假如我要给d:\mount\下的Win81映像添加一个KB29XXXXXXX补丁,我又把映像安装以后有关的帮助贴文如下,请原谅我的懒惰,我原来就是这么看过来的,请大家只看自己关心的哪一块,用到什么学习什么:
部署映像服务和管理工具
版本: 6.3.9600.17031
映像版本: 6.3.9600.17031
可以使用以下命令来服务此映像:
WINDOWS 版本服务命令:
/Optimize-Image - 对脱机映像执行指定的
配置。
/Set-ProductKey - 设置脱机映像的产品密钥。
/Get-TargetEditions - 显示可以将映像升级到的
Windows 版本列表。
/Get-CurrentEdition - 显示当前映像的版本。
/Set-Edition - 将映像升级到较高的版本。
默认关联命令:
/Remove-DefaultAppAssociations - 删除 Windows 映像中的默认应用程序关联。
/Import-DefaultAppAssociations - 向 Windows 映像导入一组
默认应用程序关联。
/Get-DefaultAppAssociations - 显示 Windows 映像中默认应用程序关联的列表。
/Export-DefaultAppAssociations - 从运行的操作系统导出
默认的应用程序关联。
APPX 服务命令:
/Set-ProvisionedAppxDataFile - 将自定义数据放入指定的应用包
(.appx 或 .appxbundle)。
指定的应用程序包必须已在映像中。
/Remove-ProvisionedAppxPackage - 从映像中删除应用包(.appx 或 .appxbundle)。
创建新的用户帐户时,将
不安装这些应用包。
/Add-ProvisionedAppxPackage - 将应用包(.appx 或 .appxbundle)添加到映像
并将其设置为对每个新用户进行安装。
/Get-ProvisionedAppxPackages - 显示有关映像中设置为对每个新用户进行
安装的应用包
(.appx 或 .appxbundle)的信息。
无人参与服务命令:
/Apply-Unattend - 将无人参与文件应用于映像。
驱动程序服务命令:
/Remove-Driver - 从脱机映像中删除驱动程序包。
/Add-Driver - 向脱机映像中添加驱动程序包。
/Get-DriverInfo - 显示有关脱机映像中或正在运行的操作系统中的
特定驱动程序的信息。
/Get-Drivers - 显示有关脱机映像中或正在运行的操作系统中
的所有驱动程序的信息。
/Export-Driver - 从脱机映像或正在运行的操作系统
导出所有第三方驱动程序包。
国际服务命令:
/Set-LayeredDriver - 设置键盘分层驱动程序。
/Set-UILang - 设置安装的脱机映像中使用的默认系统用户界面语言。
/Set-UILangFallback - 设置安装的脱机映像中系统用户界面的回滚默认语言。
/Set-UserLocale - 设置安装的脱机映像中的用户区域设置。
/Set-SysLocale - 设置安装的脱机映像中的非 Unicode 程序的语言(也
称为系统区域设置)和字体设置。
/Set-InputLocale - 设置要在安装的脱机映像中使用的输入区域设置和
键盘布局。
/Set-TimeZone - 设置安装的脱机映像中的默认时区。
/Set-AllIntl - 设置安装的脱机映像中的所有国际设置。
/Set-SKUIntlDefaults - 将安装的脱机映像中的指定 SKU 语言的所有国际
设置都设置为默认值。
/Gen-LangIni - 生成新的 lang.ini 文件。
/Set-SetupUILang - 定义安装程序将使用的默认语言。
/Get-Intl - 显示有关国际设置和语言的信息。
应用程序服务命令:
/Check-AppPatch - 显示有关 MSP 修补程序是否适用于安装的映像的信息。
/Get-AppPatchInfo - 显示有关安装的 MSP 修补程序的信息。
/Get-AppPatches - 显示有关应用于所有安装的应用程序的所有
MSP 修补程序的信息。
/Get-AppInfo - 显示有关特定安装的 MSI 应用程序的信息。
/Get-Apps - 显示有关安装的所有 MSI 应用程序的信息。
程序包服务命令:
/Add-Package - 向映像中添加程序包。
/Remove-Package - 从映像中删除程序包。
/Enable-Feature - 启用映像中的特定功能。
/Disable-Feature - 禁用映像中的特定功能。
/Get-Packages - 显示有关映像中所有程序包的信息。
/Get-PackageInfo - 显示有关特定程序包的信息。
/Get-Features - 显示有关程序包中所有功能的信息。
/Get-FeatureInfo - 显示有关特定功能的信息。
/Cleanup-Image - 对映像执行清理和恢复
操作。
若要获得有关这些服务命令及其参数的详细信息,请在紧挨着 /? 之前指定一个命令。
示例:
DISM.exe /Image:C:\test\offline /Apply-Unattend /?
DISM.exe /Image:C:\test\offline /Get-Features /?
DISM.exe /Online /Get-Drivers /?
大家肯定看到程序包服务命令:/Add-Package - 向映像中添加程序包。接着看帮助和示例:
部署映像服务和管理工具
版本: 6.3.9600.17031
映像版本: 6.3.9600.17031
/Add-Package /PackagePath:<path_to_package> [/IgnoreCheck] [/PreventPending]
在映像中添加一个或多个程序包。/PackagePath 可以指向
.cab 文件、.msu 文件或文件夹。
如果适用性检查失败,可使用 /IgnoreCheck 开关跳过
程序包安装。
如果程序包或 Windows 映像具有挂起的联机操作,
可使用 /PreventPending 开关跳过程序包安装。
示例:
DISM.exe /Image:C:\test\offline /Add-Package
/PackagePath:C:\test\packages /IgnoreCheck
DISM.exe /Image:C:\test\offline /Add-Package
/PackagePath:C:\test\packages\package.cab /PreventPending
DISM.exe /Image:C:\test\offline /Add-Package
/PackagePath:C:\Windows-KB000006-v1-x86-en-us.msu
这里面最后面一个示例大家应该看得懂了吧,把映像路径和补丁路径指定好,添加系统补丁就会在你的掌握之中了。关于集成系统补丁最基础的东西我已经汇报完毕,大家应该已经入了这个门了,更丰富的内容需要大家DIY了。
下面我要稍微拔苗助长了。大家是不是看到,帮助中说,可以一条指令添加多个系统补丁,没错,你只要将/PackagePath参数赋值为补丁对应的路径,那么当前系统应该会把那个目录下所有补丁都集成进映像中,至少理论上是这样的。请大家看下我整理的关于Win7_x64的安全补丁和其它一些补丁的列表:
Windows6.1-KB0947821-v32-x64.msu
Windows6.1-KB2476490-x64.msu
Windows6.1-KB2491683-x64.msu
Windows6.1-KB2503658-x64.msu
Windows6.1-KB2503665-x64.msu
Windows6.1-KB2506223-x64.msu
Windows6.1-KB2507618-x64.msu
Windows6.1-KB2507938-x64.msu
Windows6.1-KB2508429-x64.msu
Windows6.1-KB2509553-x64.msu
Windows6.1-KB2510531-x64.msu
Windows6.1-KB2511455-x64.msu
Windows6.1-KB2533623-x64.msu
Windows6.1-KB2535512-x64.msu
Windows6.1-KB2536275-x64.msu
Windows6.1-KB2544893-x64.msu
Windows6.1-KB2555917-x64.msu
Windows6.1-KB2556532-x64.msu
Windows6.1-KB2560656-x64.msu
Windows6.1-KB2563894-x64.msu
Windows6.1-KB2564958-x64.msu
Windows6.1-KB2567053-x64.msu
Windows6.1-KB2567680-x64.msu
Windows6.1-KB2570947-x64.msu
Windows6.1-KB2579686-x64.msu
Windows6.1-KB2584146-x64.msu
Windows6.1-KB2585542-x64.msu
Windows6.1-KB2588516-x64.msu
Windows6.1-KB2601626-x64.msu
Windows6.1-KB2617657-x64.msu
Windows6.1-KB2619339-x64.msu
Windows6.1-KB2620704-x64.msu
Windows6.1-KB2620712-x64.msu
Windows6.1-KB2621146-x64.msu
Windows6.1-KB2621440-x64.msu
Windows6.1-KB2631813-x64.msu
Windows6.1-KB2639308-x64.msu
Windows6.1-KB2639417-x64.msu
Windows6.1-KB2641653-x64.msu
Windows6.1-KB2644615-x64.msu
Windows6.1-KB2645640-x64.msu
Windows6.1-KB2653956-x64.msu
Windows6.1-KB2654428-x64.msu
Windows6.1-KB2655992-x64.msu
Windows6.1-KB2658846-x64.msu
Windows6.1-KB2659262-x64.msu
Windows6.1-KB2660465-x64.msu
Windows6.1-KB2660649-x64.msu
Windows6.1-KB2665364-x64.msu
Windows6.1-KB2667402-v2-x64.msu
Windows6.1-KB2670838-x64.msu
Windows6.1-KB2676562-x64.msu
Windows6.1-KB2685939-x64.msu
Windows6.1-KB2688338-x64.msu
Windows6.1-KB2690533-x64.msu
Windows6.1-KB2691442-x64.msu
Windows6.1-KB2698365-x64.msu
Windows6.1-KB2705219-v2-x64.msu
Windows6.1-KB2706045-x64.msu
Windows6.1-KB2709715-x64.msu
Windows6.1-KB2716513-x64.msu
Windows6.1-KB2718523-x64.msu
Windows6.1-KB2719033-x64.msu
Windows6.1-KB2724197-x64.msu
Windows6.1-KB2727528-x64.msu
Windows6.1-KB2729094-v2-x64.msu
Windows6.1-KB2731771-x64.msu
Windows6.1-KB2731847-v2-x64.msu
Windows6.1-KB2743555-x64.msu
Windows6.1-KB2757638-x64.msu
Windows6.1-KB2761226-x64.msu
Windows6.1-KB2769369-x64.msu
Windows6.1-KB2770660-x64.msu
Windows6.1-KB2772930-x64.msu
Windows6.1-KB2778344-x64.msu
Windows6.1-KB2778930-x64.msu
Windows6.1-KB2779030-x64.msu
Windows6.1-KB2785220-x64.msu
Windows6.1-KB2786081-x64.msu
Windows6.1-KB2790655-x64.msu
Windows6.1-KB2799494-x64.msu
Windows6.1-KB2803821-v2-x64.msu
Windows6.1-KB2807986-x64.msu
Windows6.1-KB2808735-x64.msu
Windows6.1-KB2813170-x64.msu
Windows6.1-KB2813347-x64.msu
Windows6.1-KB2813430-x64.msu
Windows6.1-KB2829361-x64.msu
Windows6.1-KB2830290-x64.msu
Windows6.1-KB2834140-v2-x64.msu
Windows6.1-KB2834886-x64.msu
Windows6.1-KB2835174-x64.msu
Windows6.1-KB2835361-x64.msu
Windows6.1-KB2835364-x64.msu
Windows6.1-KB2839894-x64.msu
Windows6.1-KB2840149-x64.msu
Windows6.1-KB2845187-x64.msu
Windows6.1-KB2845690-x64.msu
Windows6.1-KB2847311-x64.msu
Windows6.1-KB2847927-x64.msu
Windows6.1-KB2849470-x64.msu
Windows6.1-KB2850851-x64.msu
Windows6.1-KB2853587-x64.msu
Windows6.1-KB2855844-x64.msu
Windows6.1-KB2859537-x64.msu
Windows6.1-KB2861855-x64.msu
Windows6.1-KB2862330-x64.msu
Windows6.1-KB2862966-x64.msu
Windows6.1-KB2862973-x64.msu
Windows6.1-KB2864058-x64.msu
Windows6.1-KB2864202-x64.msu
Windows6.1-KB2868038-x64.msu
Windows6.1-KB2868623-x64.msu
Windows6.1-KB2868626-x64.msu
Windows6.1-KB2872339-x64.msu
Windows6.1-KB2875783-x64.msu
Windows6.1-KB2876284-x64.msu
Windows6.1-KB2876315-x64.msu
Windows6.1-KB2876331-x64.msu
Windows6.1-KB2882822-x64.msu
Windows6.1-KB2883150-x64.msu
Windows6.1-KB2883457-x64.msu
Windows6.1-KB2884256-x64.msu
Windows6.1-KB2888049-x64.msu
Windows6.1-KB2892074-x64.msu
Windows6.1-KB2893294-x64.msu
这里共有126个补丁,绝大多数是系统安全补丁。第一个补丁是第32版Win7_x64系统更新预备补丁,本来名字是Windows6.1-KB947821-v32-x64.msu,但我把它重命名为Windows6.1-KB0947821-v32-x64.msu
,怎么回事,就多了个0吗,是的。刚才我说,如果你把所有安全补丁全部下载下来,想使用一条指令集成全部补丁,到后面怎么老是出错,你根本想不到错在什么地方。原来微软维护那么多系统,维护那么多补丁,都是几万、几十万的代码,夜路难走,难免出点车祸啥的,前后不一致是经常的事,所以系统更新预备补丁应时而生。更新补丁时最好先更新预备补丁,再更新其它补丁。另外,想手工集成IE10、IE11,网上都能看到一般都要先集成4-8个预先补丁,然后才能集成IE。还有一个明显的道理,你只有集成了IE11,才能集成IE11后续修补补丁。说到集成IE,就把IE集成方法说下,与普通补丁稍有区别。从微软官方下载IE,放在d:\ie目录,不管IE是9,10还是11,把名字改简单一点,就改成ie.exe吧,大概是执行”d:\ie\ie.exe /x:.”,我机子上没有现成的IE,火车上信号不好,下载太慢,执行方法如有误请多包涵。然后在d:\ie生成几个文件,结果可能如下所示:
HARDWAREBLOCKINGLIST.XML
IE-Hyphenation-en.MSU
IE-Spelling-en.MSU
IE-Win7.CAB
ielangpack-zh-CN.CAB
IE_SUPPORT_amd64_zh-CN.CAB
SETUPDOWNLOADLIST.TXT
SQMAPI.DLL
集成的时候,就是对着这几个文件展开操作,下面大家看段代码:
dism /image:!LPartSource!:\mount /add-package /packagepath:%~dp0ie\%%i\ie-win7.cab /Scratchdir:!LPartSource!:\tmp_Imagex
if exist %~dp0ie\%%i\ielangpack-CHS.CAB dism /image:!LPartSource!:\mount /add-package /packagepath:%~dp0ie\%%i\ielangpack-CHS.CAB /Scratchdir:!LPartSource!:\tmp_Imagex
if exist %~dp0ie\%%i\ielangpack-zh-cn.CAB dism /image:!LPartSource!:\mount /add-package /packagepath:%~dp0ie\%%i\ielangpack-zh-cn.CAB /Scratchdir:!LPartSource!:\tmp_Imagex
if exist %~dp0ie\%%i\IE-Hyphenation-neu.msu dism /image:!LPartSource!:\mount /add-package /packagepath:%~dp0ie\%%i\IE-Hyphenation-neu.msu /Scratchdir:!LPartSource!:\tmp_Imagex
if exist %~dp0ie\%%i\IE-Hyphenation-en.msu dism /image:!LPartSource!:\mount /add-package /packagepath:%~dp0ie\%%i\IE-Hyphenation-en.msu /Scratchdir:!LPartSource!:\tmp_Imagex
if exist %~dp0ie\%%i\IE-Spelling-neu.msu dism /image:!LPartSource!:\mount /add-package /packagepath:%~dp0ie\%%i\IE-Spelling-neu.msu /Scratchdir:!LPartSource!:\tmp_Imagex
if exist %~dp0ie\%%i\IE-Spelling-en.msu dism /image:!LPartSource!:\mount /add-package /packagepath:%~dp0ie\%%i\IE-Spelling-en.msu /Scratchdir:!LPartSource!:\tmp_Imagex
这段代码判断ie目录下是否存在那4个ie补丁文件,因为Win7 ie10/ie11补丁文件名字不一样,所以分别判断。另外,更新IE10/11需要的预备补丁,我都放在那126个补丁里面了,具体是哪一个我现在也记不清了,想细究大家自己Google或者Bing,百度什么都不懂。
我的同事说过,所谓的干部工作就是摸清所有人的底细,掌握每个人为了位子、地方所能承受的底限,是提前说还是日后再说,有些人真TM垃圾,连老婆都可以牺牲。补丁的集成,如果全靠手工命令输入,那的确是烦死了,那么长的名字,非常容易出错,那我在拔苗助长后就再把大家拉一拉,看看还有没有提升的空间。这段批处理流程应该很简单了,大家可以使用,也可以修改优化。
del /f /s /q %temp%\InfoDism.txt>nul 2>nul
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 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
)
echo.
set /p IndexSource=请输入系统映像索引序号,我不检测无效序号,不带冒号----
echo.
set bDrvDism=y
set /p bDrvDism=请问是否封装硬件驱动?默认是y,直接回车/不是输入小写n----
echo.
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=请输入Driver子目录序号,不带冒号----
set bVldDrv=n
for /l %%i in (1,1,!CountDrv!) do (
if !NumDrv!==%%i set bVldDrv=y
)
if !bVldDrv!==n echo 你没有输入有效Driver子目录序号,退出重来吧!&&goto End
)
)
echo.
set bPatDism=y
set /p bPatDism=请问是否封装系统补丁?默认是y,直接回车/不是输入小写n----
echo.
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
)
)
echo.
set bIsWin8=y
set /p bIsWin8=请问映像版本是否Win8?默认是y,直接回车/不是输入小写n----
if not !bIsWin8!==n (
echo.
set bEnabNet3=y
set /p bEnabNet3=请问是否启用 .Net 3.5/2支持?默认是y,直接回车/不是输入小写n----
if not !bEnabNet3!==n (
echo.
set /p LabelISO=请插入光盘或者装载ISO,并准确输入盘符!----
)
)
::要为Win7封装IE11/IE10,必须封装预备补丁,4-9个。
if !bIsWin8!==n (
set bDisabFun=y
set /p bDisabFun=请问是否关闭Win7部分功能?默认是y,直接回车/不是输入小写n----
set bDismIE10=y
set /p bDismIE10=请问是否封装IE10/IE11?默认是y,直接回车/不是输入小写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 !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 >>%temp%\InfoDism.txt
)
)
)
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 || echo %%j>>%temp%\InfoDism.txt
)
)
if not !bIsWin8!==n (
if not !bEnabNet3!==n (
dism /image:!LPartSource!:\mount /enable-Feature /FeatureName:netfx3 /Source:!LabelISO!:\sources\sxs /Scratchdir:!LPartSource!:\tmp_Imagex
)
)
if !bIsWin8!==n (
if not !bDisabFun!==n (
echo 调整功能独立操作,以增强批处理兼容性,连Win7 Starter都可以用。
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:TabletPCOC
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:WindowsGadgetPlatform
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:MediaCenter
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:FaxServicesClientPackage
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:Printing-XPSServices-Features
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:Xps-Foundation-Xps-Viewer
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:Printing-Foundation-InternetPrinting-Client
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:Hearts
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:Solitaire
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:SpiderSolitaire
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:FreeCell
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:Minesweeper
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:PurblePlace
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:Chess
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:Shanghai
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:InboxGames
dism /Image:!LPartSource!:\mount /Disable-Feature /Scratchdir:!LPartSource!:\tmp_Imagex /FeatureName:OpticalMediaDisc
)
if not !bDismIE10!==n (
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\dirIESeek.txt) do (
set /a a+=1
if !NumIE!==!a! (
dism /image:!LPartSource!:\mount /add-package /packagepath:%~dp0ie\%%i\ie-win7.cab /Scratchdir:!LPartSource!:\tmp_Imagex
if exist %~dp0ie\%%i\ielangpack-CHS.CAB dism /image:!LPartSource!:\mount /add-package /packagepath:%~dp0ie\%%i\ielangpack-CHS.CAB /Scratchdir:!LPartSource!:\tmp_Imagex
if exist %~dp0ie\%%i\ielangpack-zh-cn.CAB dism /image:!LPartSource!:\mount /add-package /packagepath:%~dp0ie\%%i\ielangpack-zh-cn.CAB /Scratchdir:!LPartSource!:\tmp_Imagex
if exist %~dp0ie\%%i\IE-Hyphenation-neu.msu dism /image:!LPartSource!:\mount /add-package /packagepath:%~dp0ie\%%i\IE-Hyphenation-neu.msu /Scratchdir:!LPartSource!:
\tmp_Imagex
if exist %~dp0ie\%%i\IE-Hyphenation-en.msu dism /image:!LPartSource!:\mount /add-package /packagepath:%~dp0ie\%%i\IE-Hyphenation-en.msu /Scratchdir:!LPartSource!:
\tmp_Imagex
if exist %~dp0ie\%%i\IE-Spelling-neu.msu dism /image:!LPartSource!:\mount /add-package /packagepath:%~dp0ie\%%i\IE-Spelling-neu.msu /Scratchdir:!LPartSource!:\tmp_Imagex
if exist %~dp0ie\%%i\IE-Spelling-en.msu dism /image:!LPartSource!:\mount /add-package /packagepath:%~dp0ie\%%i\IE-Spelling-en.msu /Scratchdir:!LPartSource!:\tmp_Imagex
)
)
)
)
set bCommit=y
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
我把系统功能组件调整(仅限Win7,大家根据前面第一部分可以自行扩展)、集成系统补丁和集成驱动做成了批处理,大家就不用再手工输入那么多命令了,并且可以根据个人好恶自行修改,实际上这就是一个小软件了,只不过它有一个Ugly Face。该代码段流程图如下:
在这一部分最后我再说点东西,封装系统补丁、硬件驱动,可以在系统安装前完成,可以在制作完系统映像后进行,就是说,你就以审核模式安装了一个没有安装任何杂质的原版系统以后,并重新封装制作了预发布映像,再对预发布映像进行功能调整、补丁驱动集成。请问,你从网上下载下来一个gho系统,你能在这个系统安装前给它封装自己或单位需要的补丁和驱动吗?但是wim的可以。
还有一个问题,这么多补丁,真的需要每个都集成进去吗?有没有权威的方法呢?这个问题需要认真思考一下,我们不妨看看微软是如何自动为我们打补丁的?微软大致是按照重要程度、优先级和当前系统使用的组件、软件来决定打哪些补丁的,我观察过Win7了,它的确不是傻乎乎地把2011年5月以来所有安全补丁都下载下来安装进去的,它是按照重要程度和优先级来办的,并且自动更新补丁数量明显比它所发布的所有补丁数量少,因为有些累积补丁已经包含了以前的补丁,但它还是有点二,如果我的机子上安装了IE9,它会把IE9的安全修补补丁下载安装好,过了没多久,它又告诉我可以升级IE11,既然可以升级新版,干嘛先修补IE9直接给我升级IE11多好!所以一个真正负责任的系统封装集成工程师会严肃看待集成多少补丁和如何集成补丁这个问题的,也请所有发布系统的人正视这个问题。
我建议大家,就实打实安装一遍原版系统,看看微软按照什么顺序给我们更新了多少补丁,我们再根据自己的需求,选择性地跳过某些补丁,这样大家集成补丁总应该有数了吧。当然2012年、2013年和2014年微软更新补丁顺序可能并不相同,所以这也有个时效性了。
这里再说下精简版系统,系统补丁打不上,功能组件打不开,驱动不好装,软件总是出错,很有可能跟精简无章有关系。XP时代,微软对精简已经忍无可忍,Win8/7时代基本上封上了精简这个偏门,如果你觉得你能玩得过微软,那你就用精简版好了。
|
|