这是我对该启动盘的分析,个人水平有限,如有不妥之处请大家指点。
************
CONFIG.SYS
************
4个菜单由CONFIG.SYS指定。指定默认为图形模式GP,20秒选择时间,颜色代码7。背景颜色代码0
COMMON项
加载了HIMEM.SYS /testmem

ff (高版本HIMEM.SYS的TESTMEM默认也是OFF) XMS驱动,不测试内存
//*UMBPCI.SYS我不知道是什么(根据文件名估计是加载UMB的驱动,我用的是EMM386.EXE),斑竹的盘里也有*//
指定DOS,加载到HMA或UMB
指定,FILES=30,BUFFES=30
STACKS=9,256 我以前碰到过设定堆栈段为这个值,可能使部分DOS软件无法使用。
LASTDRIVE=N,设定最后一个盘符为N
剩下的SUB都是空
*************
AUTOEXEC.BAT
*************
@ECHO OFF 关闭显示
set EXPAND=YES //*不知道设置这个变量干吗用,后面的程序好象没有用到过*//
SET DIRCMD=/O:N //*不知道这个环境变量(请斑竹解释一下)*//
XMSDSK 8192 N: /y 指定8M XMS为RAMDRIVER,盘符为N
set temp=c:\ 设定临时文件夹 为C:\
set tmp=c:\ 同上
set ramd=n RAM DRIVER的标志变量,为后面的程序确定RAMD的盘符服务
path=N:\;A:\;C:\ 设置查找路径
cls 清屏
unzip /d /o CAB1.zip n:\ > nul 解压缩CAB1.ZIP至内存虚拟盘
EXTRACT /Y /e /L n: CAB2.CAB > nul ......CAB2.CAB............
copy command.com n:\ /y > nul 复制command.com...........
copy vide-cdd.sys n:\ /y > nul ....vide-cdd.sys..........
set comspec=N:\command.com 指定COMMAND.COM路径.......
LH CTMOUSE.EXE > NUL 鼠标驱动
LH N:\SMARTDRV.EXE 高速缓存
LH N:\DOSKEY.COM > NUL DOSKEY
GOTO %CONFIG% 根据CONFIG.SYS的SUB执行

OS
tw /np > nul 运行汉字系统
n:
cd \
GOTO END
:CDROM
CALL FINDCD.BAT CALL FINDCD.BAT 加载光驱且查找光盘盘符
tw /np > nul 运行汉字系统
N:
cd \
GOTO END
:GP
CALL FINDCD.BAT CALL FINDCD.BAT 加载光驱且查找光盘盘符
menua.bat 启动图形界面的批处理文件
:NOGP
menua.bat 启动图形界面的批处理文件
:END
***********
FINDCD.BAT
***********
@echo off 关闭显示
set cdrom= 标志变量,用于存放CDROM盘符
:LOOP
findcd -e 查找CDROM盘符,返回ERROR代码
if errorlevel 255 goto NOCD 根据返回不同的ERROR代码确定CDROM盘符
if errorlevel 0 set cdrom=A
if errorlevel 1 set cdrom=B
if errorlevel 2 set cdrom=C
if errorlevel 3 set cdrom=D
if errorlevel 4 set cdrom=E
if errorlevel 5 set cdrom=F
if errorlevel 6 set cdrom=G
if errorlevel 7 set cdrom=H
if errorlevel 8 set cdrom=I
if errorlevel 9 set cdrom=J
if errorlevel 10 set cdrom=K
if errorlevel 11 set cdrom=L
if errorlevel 12 set cdrom=M
if errorlevel 13 set cdrom=N
if errorlevel 14 set cdrom=O
if errorlevel 15 set cdrom=P
if errorlevel 16 set cdrom=Q
if errorlevel 17 set cdrom=R
if errorlevel 18 set cdrom=S
if errorlevel 19 set cdrom=T
if errorlevel 20 set cdrom=U
if errorlevel 21 set cdrom=V
if errorlevel 22 set cdrom=W
if errorlevel 23 set cdrom=X
if errorlevel 24 set cdrom=Y
if errorlevel 25 set cdrom=Z
goto END
:NOCD 为什么不先运行这个SUB,再运行LOOP呢?
ctload VIDE-CDD.SYS /D:mscd001 加载光驱驱动( 我用的是OAKCDROM.SYS)
/D:MSCD001 指定设备名为MSCD001。可以改,但必须和MSCDEX.EXE的设备名相同
CTLOAD可能是,当系统启动后仍能用这个程序加载设备驱动程序,省去在CONFIG.SYS中加载,
LH MSCDEX.EXE /D:mscd001 DOS下文件存取格式转换,使DOS能处理ISO9660文件格式
GOTO LOOP
:END
******
总结:
******
这个启动盘用到的一些技巧的实现方法
1. > NUL 来实现无输出 (对于高手称不上技巧) >nul的作用是将默认的显示输出重定向到NUL这个空设备
还有其他有用的技巧,比如一个文件的HELP太多,你可以把他的HELP重定向至一个文件如mode/? > mode.txt
(有兴趣的朋友可以去找DOS的重定向技术,及管道|技术)
2. 使用了错误返回代码 ERRORLEVEL 这个功能很有用,能增加程序的检测机制,根据不同的错误或状态运行不同的程序
3. GET他利用GET.EXE这个文件来检测键盘输入 如GET N 再在下面检测GET是否等于N的值.
4. 批处理使用参数比如yiyesong.bat后面加参数,在yiyesong.bat检测参数
if "%1"=="/cd" goto cd
if "%1"=="/a" goto a
if "%1"=="/?" goto help
if "%1"=="" goto null
goto end
5. 使用LOCATE.COM来检测文件存在否。如locate.com %cdrom%:\yiyesong.bat /np /nr
如果将%cdrom%:\变为%cdrom%: 就是全盘搜索.(他所说的任意目录查找就是这么实现的)
对应的查找方法
98SE locate %cdrom%: w98setup.bin /S:162939! /np /g:y
2000 locate %cdrom%: winnt.exe /s:81757! /c:"set dirname=&d" /np /G:Y
ME locate %cdrom%: w9xsetup.bin /S:181875! /np /g:y
是否"一叶松软件屋启动光盘" locate.com %cdrom%:\yiyesong.bat /np /nr (这个是绝对路径的)
其实就是检测是否存在这4个文件,只是没指定绝对路径进行全盘搜索而已,如果只保留这4个文件就能轻易的
通过他的检测机制.
LOCATE.COM的用法,/?看吧
6. 98,ME,2000的自动安装,从98光盘附带的工具里附带一个软件,就是制作自动安装脚本的。
具体的我忘了,大家自己找找,在安装过程中所有需要输入的信息,包括序列号,都可以制作成脚本,实现完全
的自动安装.
具体到这张盘上对应的脚本文件分别是. 98SE Msbatch.inf 实现方法 SETUP.EXE n:\MSBATCH.INF /IS
2000 Win2kpro.txt SETUP.EXE n:\MEBATCH.INF /IS
ME Mebatch.inf WINNT.EXE /u:n:\win2kpro.txt /s:%dirname%
98安装时取消磁盘检测是加/IS参数,具体的解释可以SETUP/?来看
*******************************
一些不合理和潜在的BUG(个人看法)
*******************************
**************
程序的检测机制
**************
所有需要用到光盘的批处理程序,都有2个检测机制,一个是检测是否加载光驱驱动了,一个是检测
是否为"一叶松软件屋启动光盘"
检测机制很简单.
例CD-YE.BAT
findcd -e
if not errorlevel 255 goto check
ctload n:\VIDE-CDD.SYS /D:MSCD001
call findcd.bat
用于检测是否加载光驱了。如果没加载就运行加载批处理FINDCD.BAT,不过这段程序效率不高,在最初设置光驱的时候
用CDROM这个变量来存放光驱盘符.只要检测一下CDROM这个变量的值是否为空就可以判断是否加载光驱了。没必要再重新
找CDROM,检测错误返回码,并且这段程序检测完是否加载光驱之后,如果没加载的话,运行了一次加载VIDE-CDD.SYS,
而这个驱动会在之后FINDCD.BAT里再次调用。重复加载驱动,效率不高.
*******************
FINDCD.BAT有个大BUG
*******************
如果这个机器根本就没有光驱,但却选用了启动CDROM的话,在FINCD.BAT这会出现死循环
:LOOP
findcd -e
if errorlevel 255 goto NOCD
...
GOTO END
:NOCD
ctload VIDE-CDD.SYS /D:mscd001
LH MSCDEX.EXE /D:mscd001
GOTO LOOP
因为没有光驱FINDCD的错误返回码永远是255,可如果是返回码是255就再次加载光驱驱动,加载完驱动返回码还是255...
即使更改了上面BUG
这个问题还可能会引起,在后面众多.BAT里多次用%CDROM%这个变量,如果没光驱的话,这个变量就失效了,所有用到这个变量的
.BAT都可能出现以外执行结果。
还有一个习惯问题,FINDCD.BAT和FINDCD.COM文件名相同,MSDOS系统FINDCD.COM优先于FINDCD.EXE优先于FINDCD.BAT
你的系统同时存在FINDCD.BAT和FINGCD.COM如果要运行.BAT的话,必须要键入扩展名.虽然你在用FINDCD.BAT的时候都
加扩展名了,但如果你是一个庞大系统,且多次调用,一个疏忽就能是你的程序出现很多意外结果.建议以后不要重名
******************
CDROM.BAT有潜在BUG
******************
CALL FINDCD.BAT
IF EXIST n:\*.* GOTO END
xmsdsk 4096 N: /y 如果用这个盘启动的计算机没有光驱,程序就会运行这行,而在最初的AUTOEXEC.BAT里就指定加载了8M
RAMDRIVER,这里又重新加载4M并且指定盘符都是N,这样的重复加载不知道会出什么结果.
:END
%CDROM%:
CD \
****************
多次更改TEMP变量
****************
部分应用程序的批处理多次更改TEMP环境变量。一会儿是%RAMD%:\,一会儿是C:\,如果这个机器没分区或者因为什么意外
C盘无法识别。而碰巧这个应用软件需要TMP/TEMP临时存放空间。这时就会访问C盘,但C盘无法识别,必然出错,虽然这个错误
不是大问题,但也对使用者来说也是一个麻烦
在MENUA.BAT里调用了GOMENU.BAT,但这个文件不存在,所以无法看到这个启动盘的图形界面.
打开附件