临江网

标题: 巧用批处理 自己打造nLite超强版 [打印本页]

作者: 四保临江    时间: 2007-6-12 03:17
标题: 巧用批处理 自己打造nLite超强版
  
  ■山东  高峰


  nLite目前仍处在Beta测试阶段,存在很多未解决的BUG和不足之处。特别是对于中文版Windows,问题更是严重。为弥补nLite的不足,我决定自己动手打造nLite增强版。

nLite的三宗罪

1.过度精简可能导致“营养不良”

使用nLite的初学者往往喜欢追求极端的精简效果,而导致过度精简。安装完系统后,使用一段时间才发现很多软件无法正常使用。由于nLite将安装源文件精简了,安装后如果发现少了什么东西再添加回去非常困难,迫不得已只好重装。其实严格来说这不能算nLite的缺点,而是使用者自身的问题。

2.nLite自身不完善

由于nLite发展时间还较短,还存在一些BUG和问题,比较明显的有3个:

①损坏硬盘安装(即“手动安装”)的相关文件,所以在DOS下或从硬盘中安装精简版可能会提示缺少文件,不过此问题可以通过将安装目录指向I386目录加以解决。

②经nLite精简过的系统,在发现新硬件时,即使是系统本身支持的硬件(即自带驱动)安装驱动也会很慢,而且会弹出对话框提示确认。这是由于nLite破坏了驱动程序的数字签名。要解决此问题只有期待新版本nLite了,由于并不影响实际使用,所以作者说等1.0版本后才会考虑解决。

③对中文支持不够好,不是说nLite程序本身不能支持中文,而是说nLite对中文版Windows的支持还不够好,对我们影响最大的一个问题就是中文输入法问题。如果精简了语言文件,会造成“微软拼音输入法”缺少文件,导致这个输入法不能用,而且会关闭正要输入文字的程序(在切换输入法时也会出现此问题),比如“记事本”、Office等。

3.无法满足更细化的要求

比如nLite可以删除“语言”组件,但不能仅仅删除输入法;nLite可以删除“显示适配器”驱动,但无法删除某个特定类型的显卡驱动(比如仅仅删除Matrox公司的G200显卡驱动);还有上文中删除“手动升级和安装”时遇到的麻烦。这些都需要手工来解决,当然你也可以期待nLite在以后的版本中解决,但谁知道会在哪个版本呢?

救赎nLite的三宗罪

1.为什么要进行后期处理

虽然新版nLite已经能很好地工作了,但仍需进一步改造才能满足我们的需求。这里我用批处理脚本来自动化地完成这一切,有人可能会问为什么选择脚本呢?其实最初我也是纯粹手工进行的,但几次后就发现这样太浪费时间了,并且极易在某些环节犯错误,最后我决定将这种重复性工作交给电脑来完成。

2.nLite的原理

要对nLite精简后的Windows安装文件进行后期加工,就不得不先学习一下nLite的运作方式了。Windows安装程序使用配置文件来控制安装过程,主要的配置文件有layout.inf,dosnet.inf,txtsetup.sif。layout.inf用于记录每一个文件在Windows光盘上的位置;dosnet.inf用于控制哪些文件需要从Windows安装光盘被复制到硬盘的临时文件目录来完成安装;txtsetup.sif负责Windows安装程序最初处于文本界面时的文件复制。当然还有其他几个文件,比如Drvindex.inf用于记录驱动程序,如果要删除Windows XP自带的某个驱动,需要删除该驱动在Drvindex.inf中引用的记录,如果需要添加某个驱动,则可按照Drvindex.inf中其他驱动的格式来添加。intl.inf负责安装多国语言支持。这些文件在Windows安装盘中都是未压缩的,前4个是普通的ASCII文本文件,而intl.inf则是Unicode编码的文本文件。还有很多压缩的INF文件,负责组件和驱动程序的安装,除了txtsetup.sif外都是INF文件。在英文版的Windows上只有intl.inf是Unicode编码的,而在中文版的Windows上大多数INF文件都是Unicode编码的。

nLite精简原理简单来说就是在指定要精简的文件(比如写字板wordpad.exe)后,在所有的Windows配置文件中查找出现“wordpad.exe”的地方并进行删除和修改,这样Windows安装程序在读取配置文件进行安装过程时就不会安装这个文件了。如果需要删除组件则不能修改layout.inf,因为此文件仅仅指定文件的位置,而不能决定该文件是否安装。



    
3.三拳两脚搞定nLite

工具准备:为了弥补Windows命令的不足,本文采用了几个体积小巧却功能强大的GNU工具(关于GNU的概念请参考本刊今年第10期的《稀饭魔语大辞典》),可以从http://www.newhua.com/cfan/200511/gnu.zip下载。压缩包中包含了3个小工具,分别为sed(通过命令行编辑文件)、fgrep(类似于findstr命令)、recode(用于转换Unicode编码的文本文件),下载解压后请放在与I386目录平级的位置。

*本文的所有脚本已打包提供下载,下载地址:http://www.newhua.com/cfan/200511/nlitebat.rar。

(1)准备工作:INF集中整理

Windows安装文件大多压缩过(见图1),要修改那些压缩过的INF文件怎么办?把下面的批处理命令保存为ripinf.cmd文件(其中rem语句后的为脚本的注释),放在Windows XP安装文件目录中(ripinf.cmd应与i386目录同级):
if exist inf rd /s /Q inf
rem 把所有的in?为后缀的文件复制到inf目录
xcopy i386\*.in? inf\
cd inf
rem 解压缩所有的in_文件
expand -r *.in_
md inftmp
rem 分离inf文件和非inf文件
move *.inf inftmp\
del /Q *
move inftmp\*
rd /s /q inftmp
rem 把所有的sif为后缀的文件复制到inf目录,一般仅仅是txtsetup.sif
xcopy ..\i386\*.sif



  巧用批处理 自己打造nlite超强版


  
双击执行ripinf.cmd后,就可以在INF目录中找到所有已经解压缩的Windows配置文件了。

(2)开始发招:批处理解决大问题

首先备份nLite处理之后的目录,把该目录复制一份,这样手工删除组件时一旦出错,还可以回到刚才nLite结束时的状态,避免了重新进行耗时的nLite过程。

①精简nLite不能删除的某些组件

删除“手动升级”。打开“资源管理器”,进入nLite之后的安装文件目录中的I386目录,I386目录下的WIN9XMIG、WIN9XUPG、WINNTUPG目录,分别用于支持从Windows 9x/NT升级安装Windows XP,这3个目录大约占用38MB空间(见图2),这就是上文中“手动升级”的组件部分。将这3个目录删除就精简了“手动升级”而保留了“手动安装”。把下面的命令保存为ripupgrate.cmd,放在Windows XP安装文件目录中,此脚本同时支持Windows XP/2003:



  巧用批处理 自己打造nlite超强版


  
if exist i386\Winntupg rd /s /Q  i386\Winntupg
if exist i386\Winntmig rd /s /Q i386\Winntmig
if exist  i386\win9xupg rd /s /Q  i386\win9xupg
if exist  i386\Win9xmig rd /s /Q  i386\Win9xmig



    
②精简内存盘驱动ramdisk

你可能会问ramdisk是什么,为什么要精简它?正常运行XP的时候,并不需要这个ramdisk(内存盘)驱动(这个内存盘不同于以前介绍过的的内存盘,它主要用于从光盘上运行的Windows XP PE或者嵌入式的Windows XP),所以这个ramdisk几乎无用,精简掉后还能进一步减少系统启动时加载驱动的时间。从而加快启动速度,减少内存占用。

选择一款对Unicode文件支持较好的文本编辑器(本文选用EmEditor),在刚才的“准备工作”步骤中所获得的INF目录中搜索“ramdisk”关键字(不含引号)。在EmEditor中即为:选择菜单“Search→Find in Files”(搜索→在文件中寻找),在弹出的搜索框中将文件类型设置为*.*,下方的“encoding”(文字编码)使用缺省的“configed encoding”(自动切换Unicode编码进行搜索)。最后在搜索结果中我们可以发现在defltwk.inf、dosnet.inf、dwup.inf、layout.inf、ramdisk.inf、txtsetup.sif中包含“ramdisk.sys”和“ramdisk.inf”。经测试,只需删除dosnet.inf、txtsetup.sif这2个文件中出现ramdisk的行即可,将以下脚本保存为ripramdisk.cmd,和刚才建立的几个CMD文件放在一起。

rem 把i386\dosnet.inf 不包含ramdisk的行存为 tmpinf 文件
findstr /I /V ramdisk   i386\dosnet.inf  >tmpinf
rem 用 tmpinf 文件覆盖原来的i386\dosnet.inf,这样就从i386\dosnet.inf删除了包含ramdisk的行。
move /Y tmpinf i386\dosnet.inf
rem 同理删除txtsetup.sif中的ramdisk
findstr /I /V ramdisk   i386\TXTSETUP.SIF  >tmpinf
move /Y tmpinf i386\TXTSETUP.SIF
rem 实际要删除的文件名字记录到allfilefordel.txt中以后集中删除或者交给nLite去删除
echo ramdisk.sys>>allfilefordel.txt
echo ramdisk.inf>>allfilefordel.txt

③精简“智能ABC”以外的所有输入法

我们这样做的理由是:

★东亚语言输入法非常庞大,输入法目录包含日韩繁简各种输入法文件约100MB左右,而nLite不能单独删除输入法。

★并且nLite对中文版Windows的支持还不够好,对我们影响最大的问题莫过于中文输入法问题。如果你精简了语言文件,会造成微软拼音输入法缺少文件,并导致其他一些程序故障。

★Windows XP自带输入法不够方便。在安装完Windows XP,需要另外安装新的输入法,如紫光、拼音加加、微软拼音2003,极点五笔等,所以删除自带输入法非常必要。

小提示
“微软拼音2003”可从http://www.microsoft.com/downloads/details.aspx?FamilyID=3C381308-E169-41F3-812E-AA8774162795&displaylang=zh-cn下载,或安装Office XP/2003完整版中附带的该输入法。


  还是用刚才精简ramdisk时的方法,在INF目录搜索输入法相关的文件。我知道winzm是Windows的郑码输入法,搜索winzm的结果如图3所示。从图中可以知道输入法文件和defltwk.inf、DOSNET.INF、dwup.inf、HIVESYS.INF、INTL.INF、LAYOUT.INF、sysfiles.inf、TXTSETUP.SIF相关。查看文件内容后(见图4,图5)确定hivesys.inf和intl.inf文件包含了输入法的注册表信息,而从刚才的图3可以确定输入法的名称信息保存在dosnet.inf,layout.inf,intl.inf,txtsetup.sif中。我们要做的就是修改dosnet.inf,hivesys.inf,intl.inf,txtsetup.sif这4个文件,删除其中与输入法相关的信息。


  巧用批处理 自己打造nlite超强版


  图3


  巧用批处理 自己打造nlite超强版


  图4


    


  巧用批处理 自己打造nlite超强版


  图5


  
同样,我们可以用脚本来完成这些工作。由于脚本较长,在此不列出代码,解压后将ripime.cmd放置在上文存放CMD文件的目录中,此脚本适用Windows XP/2003。

运行这个批处理文件,需要删除的文件列表就在allfilefordel.txt这个文件中了,将该列表复制到nLite的“保留或移除额外文件”对话框的“要移除的额外文件”框中(参考本期《我的Windows XP安装盘只有200MB!》),nLite在精简时就会自动去除删除这些文件。同样,如果想要保留某种输入法,可以从刚才获取的输入法文件和注册表项列表中将要保留的输入法过滤掉。

(3)集合所有脚本

将下面的命令保存为postnLite.cmd,放置在刚才保存其他CMD文件的位置:

call ripupgrate.cmd
call ripramdisk.cmd
call ripime.cmd

这个脚本自动调用了刚才建立的3个批处理脚本。在每次使用nLite进行精简之后,在Windows安装目录中执行此脚本就能完成所有修补工作。

4.安装

在nLite完成修改之后,为了保证安装文件没有问题,可以用VMware虚拟机软件进行测试。测试的步骤如下,另外请关注本刊近期将推出的nLite后续测试文章。

1.在虚拟机中使用光盘启动安装,检查是否有什么问题。

2.在虚拟机的Windows下安装,执行I386目录下的Winnt32.exe文件,然后按照提示一步步去做。检查是否有问题,进入I386目录后,可以使用“winnt32 /s:i386 /unattend:winnt.sif /copysource:lang”命令实现全自动安装。

3.在虚拟机中使用Windows 98启动盘启动到DOS命令提示符下,接着执行smartdrv.exe(Windows 98安装光盘中有此文件),再进入Windows XP安装目录中的i386目录,输入“winnt /s i386 /u:winnt.sif”命令,实现全自动安装。                  


   






欢迎光临 临江网 (http://bbs.linjiang.com/) Powered by Discuz! X2.5