星期六, 三月 10, 2007

[转贴]补丁包的集成方法

1、本人的出发点是从安装Windows XP之后的安全性考虑决定制作集成安装光盘的,而不是为了All In One或者其它什么;
2、本方法仅根据微软官方的知识库相关知识,加上本人对dos命令的研究所得,集成工作本身未使用其它第三方的工具(刻盘??废话当然需要刻录软件的支持啦)。

接下来进入正题,首先是准备工作
1、准备好XP的光盘和SP2,当然,已经集成好SP2的光盘也可以(什么,不知道如何集成??这个看后面我慢慢道来)
假设XP零售版的集成了SP2的光盘文件在D:\xp\Retail.SP2\
2、准备好需要集成的小补丁
...省略了...

文件下载完后,假设文件保存的情况如下:
XPSP2之后的需要特别处理的小补丁在E:\WXPSP2_HotFix\SP2_Hotfix1
XPSP2之后的可以批量集成的小补丁在E:\WXPSP2_HotFix\SP2_Hotfix2
当然,你把东西放在其它的目录也没关系。但注意,下载时请把需要手动集成的2个与后面的40个分开保存。

接下来先讲集成操作的分解动作
1、先讲集成安装
集成安装是指,可以使用/s或者/integrate命令开关,通过一条命令将补丁集成到XP安装光盘路径下的方法,具体的命令是


KBArticleNumber /integrate:path


按我们的路径,命令类似


E:\WXPSP2_HotFix\SP2_Hotfix2\WindowsXP-KB924496-x86-CHS.exe /integrate:D:\XP\Retail.SP2\


这个/s或者/integrate有个前提条件,要求补丁为使用 Update.exe 5.4.15.0 版或更高版本作为安装程序的软件更新
目前大部分的补丁都满足条件
如果有谁不会把SP2集成到原版光盘,也可以用类似这个命令的办法实现
我们来试着运行一下会发现,补丁先自动解开,然后过了一阵提示已经集成完毕,并且需要按确定。
补丁还有一个开关命令/passive,加上这个开关命令后,命令将以无人参与方式运行,无须确认。

2、对需要特别处理集成的小补丁进行集成
为什么要特别处理,根据微软的知识库描述,其实这个是这几个小补丁的一个bug
在集成完SP2的XP光盘文件夹\i386路径下有个HIVESYS.inf,这个文件中有一行为


INSTALL_LANGUAGE="0804"


而这2个小补丁不认"0804",将其改为"804"则能认
因此,我们需要进行修改
修改完毕后,可用这几条命令将它们进行集成


E:\WXPSP2_HotFix\SP2_Hotfix1\WindowsXP-KB873339-x86-CHS.exe /integrate:D:\XP\Retail.SP2_HotFix\
E:\WXPSP2_HotFix\SP2_Hotfix1\WindowsXP-KB885626-v2-x86-chs.exe /integrate:D:\XP\Retail.SP2_HotFix\
E:\WXPSP2_HotFix\SP2_Hotfix1\WindowsXP-KB885835-x86-CHS.exe /integrate:D:\XP\Retail.SP2_HotFix\
E:\WXPSP2_HotFix\SP2_Hotfix1\WindowsXP-KB885836-x86-CHS.exe /integrate:D:\XP\Retail.SP2_HotFix\
E:\WXPSP2_HotFix\SP2_Hotfix1\WindowsXP-KB886185-x86-CHS.exe /integrate:D:\XP\Retail.SP2_HotFix\
E:\WXPSP2_HotFix\SP2_Hotfix1\WindowsXP-KB873339-x86-CHS.exe /integrate:D:\XP\Retail.SP2_HotFix\
E:\WXPSP2_HotFix\SP2_Hotfix1\WindowsXP-KB888302-x86-CHS.exe /integrate:D:\XP\Retail.SP2_HotFix\
E:\WXPSP2_HotFix\SP2_Hotfix1\WindowsXP-KB891781-x86-CHS.exe /integrate:D:\XP\Retail.SP2_HotFix\

然后为了防止今后出什么意外的错,再把改过的内容改回来

3、现在我们来看如何将40个(将来可能更多)补丁用一条命令完成集成
先来看这条命令

dir E:\WXPSP2_HotFix\SP2_Hotfix2\*.exe /b


这条命令将返回在E:\WXPSP2_HotFix\SP2_Hotfix2\下面所有的.exe文件的文件名,注意,仅仅是文件名,没有修改日期、时间和大小等等。
接着,再来看这条命令


FOR /F usebackq %i IN (`dir E:\WXPSP2_HotFix\SP2_Hotfix\*.exe /b`) DO start /wait E:\WXPSP2_HotFix\SP2_Hotfix2\%i /integrate:D:\XP\Retail.SP2\ /passive


依次来解释具体的含义
FOR.......DO——对一组文件中的每一个文件执行某个特定命令。
/F—— 表示处理对象是一组以回车作为分隔符的文件
usebackq——处理一对``里面的命令
%i——就是参数了
IN——包含在...之中的
dir *.exe /b——得到目录下全部exe的文件名,每行一个
连起来就是,对(FOR)目录下全部的exe文件(/F usebackq %i IN (`dir *.exe /b`)),执行无人参与方式集成(E:\WXPSP2_HotFix\SP2_Hotfix\%i /integrate:D:\XP\Retail.SP2\ /passive)
其中,start /wait是用于启动一条命令,并且等待其结束再执行后续的命令,如果不加,则会出现n个补丁试图同时集成的情况,会造成集成失败的。
可以把这么复杂的命令,放到一个.bat文件中,但要注意,需要把%i修改为%%i,原因是.bat中的%i是另有含义的。


FOR /F usebackq %%i IN (`dir E:\WXPSP2_HotFix\SP2_HotFix2\*.exe /b`) DO start /wait E:\WXPSP2_HotFix\SP2_HotFix2\%%i /integrate:D:\XP\Retail.SP2\ /passive


这样,运行这个.bat,就能把n个补丁一口气集成到目标路径。

讲完了分解动作,来讲一下我的想法,我认为准备好的XP集成了SP2的目录不要直接把补丁打进去,而是复制一份后再打
原因是,如果直接打了,那么一旦以后出现某补丁A把某补丁B替换了、而补丁B已经被集成了的情况,则需要手工把集成了的补丁B的相关垃圾文件和垃圾信息删去,比较麻烦。
而不直接打,则只需要每次删除前次的集成目录后重新集成一次即可
基于这个想法,我给出一份全自动的补丁集成批处理文件,内容如下:


SETLOCAL
SET SP2CD=D:\XP\Retail.SP2
SET SP2_HotFixCD=D:\XP\Retail.SP2_HotFix
SET SP2Dir=E:\WXPSP2_HotFix\SP2
SET SP2HotFix1=E:\WXPSP2_HotFix\SP2_HotFix1
SET SP2HotFix2=E:\WXPSP2_HotFix\SP2_HotFix2
IF EXIST %SP2_HotFixCD% RD /S /Q %SP2_HotFixCD%
XCOPY /E /I %SP2CD% %SP2_HotFixCD%
REN %SP2_HotFixCD%\i386\HIVESYS.INF HIVESYS.bak
COPY %SP2HotFix1%\HIVESYS.INF %SP2_HotFixCD%\i386\HIVESYS.INF
FOR /F usebackq %%i IN (`dir %SP2HotFix1%\*.exe /b`) DO START /wait %SP2HotFix1%\%%i /s:%SP2_HotFixCD%\ /passive
DEL %SP2_HotFixCD%\i386\HIVESYS.INF
REN %SP2_HotFixCD%\i386\HIVESYS.bak HIVESYS.INF
FOR /F usebackq %%i IN (`dir %SP2HotFix2%\*.exe /b`) DO START /wait %SP2HotFix2%\%%i /s:%SP2_HotFixCD%\ /passive
ENDLOCAL



如果你连集成了SP2的XP的光盘这点空间也想省掉,那么
假设放XP光盘的光驱为G:
SP2的补丁下载在E:\WXPSP2_HotFix\SP2\WindowsXP-KB835935-SP2-CHS.exe
那么.bat文件相应改为


SETLOCAL
SET XPCD=G:
SET SP2CD=D:\XP\Retail.SP2
SET SP2_HotFixCD=D:\XP\Retail.SP2_HotFix
SET SP2Dir=E:\WXPSP2_HotFix\SP2
SET SP2HotFix1=E:\WXPSP2_HotFix\SP2_HotFix1
SET SP2HotFix2=E:\WXPSP2_HotFix\SP2_HotFix2
IF EXIST %SP2_HotFixCD% RD /S /Q %SP2_HotFixCD%
XCOPY /E /I /V %XPCD% %SP2_HotFixCD%
START /wait %SP2Dir%\WindowsXP-KB835935-SP2-CHS.exe -s:D:\XP\Retail.SP2_HotFix /passive
REN %SP2_HotFixCD%\i386\HIVESYS.INF HIVESYS.bak
COPY %SP2HotFix1%\HIVESYS.INF %SP2_HotFixCD%\i386\HIVESYS.INF
FOR /F usebackq %%i IN (`dir %SP2HotFix1%\*.exe /b`) DO START /wait %SP2HotFix1%\%%i /s:%SP2_HotFixCD%\ /passive
DEL %SP2_HotFixCD%\i386\HIVESYS.INF
REN %SP2_HotFixCD%\i386\HIVESYS.bak HIVESYS.INF
FOR /F usebackq %%i IN (`dir %SP2HotFix2%\*.exe /b`) DO start /wait %SP2HotFix2%\%%i /s:%SP2_HotFixCD%\ /passive
ENDLOCAL



这样做节省了空间,但每次操作的时间会多很多

当然,不管你用了上面2个里面的哪个,前面分解动作里面提到的批处理文件都不需要了,而且需要把修改过的HIVESYS.INF复制一份到E:\WXPSP2_HotFix\SP2_HotFix1
而批处理里面的环境参数,你可以修改为自己需要的(就是前面的那些SET XXX=YYYYY啦),光盘也可以换成VOL/OEM,不见得非用零售版(本人偏好零售版啦)
注意,不要使用+/&等在DOS下有特殊用途的字符

最后讲一下刻盘和补丁维护
先用UltraISO之类的将原版XP的光盘做一个.ISO光盘镜像文件,这个镜像应该是可以从光盘启动的
然后打开,把里面的东西全砍掉,再把D:\XP\Retail.SP2_HotFix\里面的东西扔进去,保存,刻盘即可
将来有了新补丁,可以在WSUS里面查看到,请先根据WSUS给出的链接,把这些补丁下载下来,单独保存(没有WSUS?那就去看MS的安全公告,比如http://www.microsoft.com/china/technet/security/bulletin/ms06-063.mspx, 与此安全更新相关的常见问题解答 (FAQ) 中提到“此安全更新替代以前的一个安全更新。 下表列出了相应的安全公告 ID 和受影响的操作系统”,具体看那个表)
单独运行集成命令(不要加/passive),测试这些补丁是否能集成到D:\XP\Retail.SP2_HotFix
如果提示集成完毕,就把它移动到E:\WXPSP2_HotFix\SP2_HotFix2\,如不能集成,则把这个补丁删除掉或者通过别的办法集成
然后看剩下这些补丁是否有替代了我们先前下载的补丁,如果有那么删除掉原先的那些

补充:===============================================
其实,用命令行方式带(/help)执行补丁,会弹出参数的介绍,如下:
/help Displays this message

setup modes
:

/quiet quiet mode (no user interaction or display)
/passive unattended mode (progress bar only)


restart options

/norestart Do not restart when installation is complete
/forcerestart Restart after installation
/warnrestart[:] Warn and restart automatically if required (default timeout 30 seconds)
/promptrestart Prompt if restart is required

Special Options

/overwriteoem Overwrite OEM files without prompting
/nobackup Do not backup files needed for uninstall
/forceappsclose Force other programs to close when the computer shuts down
/integrate: Integrate this software update into
/log: Create log file at


有了上面做的 .bat 文件的方法就也可以自己执行安装:
1,放所有补丁文件到一个目录里:比如 f:\hotfix\
2,新建一个 .bat 文件,内容如下:
FOR /F usebackq %%i IN (`dir f:\HotFix\*.exe /b`) DO start /wait f:\HotFix\%%i /norestart /nobackup /passive

就会执行不重启,不备份,不用人干预的补丁安装。

没有评论: