|
是我太笨???还是EZBOOT在搞笑
昨天太晚没回你,今天上班做了测试,解决方案与紫狐兄弟差不多不过偶分析了原因。偶可不知道紫狐兄弟说的那段历史,所以笨了一把,做了几个测试来证明这的确是一个BUG。
同时,也说明了此BUG产生的条件及解决方案。
以下是我上班时抽空写的,就不修改直接附上供大家参考吧:
恭喜,你发现了Wengier写的findcd的BUG,你可以去买彩票啦!:)
建议将贴子的标题改为:Easyboot的setup98.img及wengier之Findcd的BUG!
如何确认这是一个BUG?请在windows的dos窗口下手动执行下面语句
第一步:先观察正常时的情况
findce //可以看到findcd设定了环境变量cdrom=H: (我的光驱盘符)
echo %cdrom% //查看一下变量cdrom的值是否是H:
可以看到输出结果是H:,这是正常是的情况。
第二步:展示findcd的BUG
set cdrom=f0023 //先不用findcd而就设置环境变量cdrom的值为f0023
findcd //按理findcd执行后应该是cdrom=h:才对,是不是呢?
set //来看一下环境变量cdrom到底是多少呢?
//你会发现cdrom=f0023
// cdrom=h:
//环境变量中有两个cdrom!奇怪吧!
//dos可以设两个同名的环境变量吗?这个问题我最后解释,继续实验
set cdrom= //删掉环境变量cdrom,看一下是怎样的
set
//删掉了第一个set cdrom=f0023 ,还有一个cdrom=h:
set cdrom= //再删一次
set
//这次删掉了findcd写入的环境变量cdrom=h:
第三步:更深入的研究
findcd //现在cdrom=h:
set cdrom=f0023 //重设一下cdrom
set
//现在没有了两个cdrom环境变量,与dos统一了。
现在我来解释一下:
1:dos可以设两个相同的环境变量吗?
set cdrom=0001
set cdrom=0002
结果 cdrom=0002,所以答案是:不能。
2:既然dos不可设两个相同的环境变量,那么第二步中我们有两个相同的环境变量呢?
这是findcd的BUG,也就是说,程序写得不完善。这个findcd直接在dos环境块中增加环境变量cdrom时,没有检测环境块中是否已存在cdrom这个环境变量是否存在就增加了cdrom环境变量,导致了两个cdrom环境变量的出现。因为不是通过dos内建set命令来执行,所以dos并不能修正它。
理解了上面这段话的意思,则不难理解第三步我们的实验,因为dos内建命令是检测环境变量的,所以当findcd建了一个cdrom=h:后,set cdrom=f0023只能是改变findcd所建的cdrom的值,而不会出现findcd那样带来两个cdrom环境变量的问题。
至于步骤2中set cdrom= 两次才能删掉环境变量cdrom就很好理解了。dos执行内建命令set xxx= (空)作删除时不是遍列环境变量地删除,而是遇到第一个符合条件的环增变量就删除并退出了。
3:回到正题,你的关于easyboot自带的setup98.img的修改有问题吗?
:AUTOSETUP
set CDROM=FOO23
FINDCD.EXE
//如2中描述,现在有了两个环境变量CDROM=F0023 及CDROM=h:
set cdrom=
//这个是你的修改,事实上它将删除第一个CDROM=F0023
//但我们仍有第二个CDROM=h:可用。
if "%CDROM%"=="FOO23" goto NOCDROM
//这句话变成了 if H:=F0023 goto NOCDROM,所以你能成功运行安装程序
path=a:\;%CDROM%\
%CDROM%
cd \WIN98
echo.
OEMSETUP.EXE /K "/IE /NF"
goto QUIT
:NOCDROM
echo.
echo The Windows 98 Setup files were not found.
echo.
:QUIT
从上面我加的分析可看出,在CDROM被findcd检测到时这段程序是正确的。但是,如果findcd没检测到光驱呢?
请不要加载光驱,直接在真实dos的命令行(不是windows的cmd)下做一个测试:
set cdrom=f0023 //环境变量cdrom=f0023
findcd.exe //没有发现光驱,findcd不作操作,所以环境变量cdrom=f0023不会改变
好了,现在我们来分析没光驱情况下加set cdrom= 有无危害
set CDROM=FOO23
FINDCD.EXE //假设findcd没检测到光驱,则findcd不操作环境变量,当前环境变量cdrom=f0023
set cdrom=
//这个是你的修改,它将删除第一个CDROM=F0023,这样已经不存在了环境变量CDROM了。
if "%CDROM%"=="FOO23" goto NOCDROM
//这句话变成了 if (空)=F0023 goto NOCDROM ,出错了了吧,它永远不会跳转NOCDROM
path=a:\;%CDROM%\ //以下将会执行并出错。
%CDROM%
结论:从第3描述可看出,你这样的修改在光驱被findcd.exe检测到时是正确的,但如果光驱没被检测到将会出错。
4:如何避免Wengier的findcd的BUG而又使批处理更健壮呢?
从结论可看出:findcd前不能有set cdrom=xxxx!,后不能有set cdrom= 删除语句,如下修改即可:
:AUTOSETUP
FINDCD.EXE
IF %CDROM%#==# goto NOCDROM
path=a:\;%CDROM%\
%CDROM%
cd \WIN98
echo.
OEMSETUP.EXE /K "/IE /NF"
goto QUIT
:NOCDROM
echo.
echo The Windows 98 Setup files were not found.
echo.
:QUIT
说明:
IF %CDROM%#==# goto NOCDROM //仅判断cdrom变量存在与否就可以了判断光驱是否存在!
|
|