无忧启动论坛
标题:
最近发现了几个bug,请大家测试最新的补丁,并检查自己的脚本是否受影响
[打印本页]
作者:
dihuo0
时间:
2011-7-7 07:49
标题:
最近发现了几个bug,请大家测试最新的补丁,并检查自己的脚本是否受影响
昨晚我和zxw有过一番争论,我发现大家可能没有仔细看最近的
更新和建议帖,特发此帖提醒大家。
1. 在批处理中
%~0,%~d0,%~p0,%~f0
替换的结果都可能不正确。因此,如果批处理中使用了这些参数时,最好使用
完整的路径
来调用这个批处理,否则可能出错。
2. if命令的子命令exist无法识别非标准的变量名,甚至是连内部变量也无法识别,即if exist @root echo @root exist ! echo @root not exist的执行结果始终是@root not exist。如果一个变量var直接或者间接引用了内部变量或非标准的变量,那么
exist就认定它是不存在的。
因此,判断一个变量是否存在或为空时,最好是使用
if "%var%"==""
,
而不要使用if exist var
。
grub4dos-0.4.5b-2011-07-05试图修复这些问题,正在测试,请大家下载测试:
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=180142&page=107#pid2270038
在dos的批处理中经常会用%~p0和if exist,这是dos批处理下的习惯用法,并不是非用不可,然而dos正确的做法在grub4dos下未必正确。熟悉dos批处理既是一种财富,更是一种
负担
。
grub4dos毕竟不是dos
!既然我们使用的是grub4dos,请让我们适应他习惯他,容忍他的bug,帮助他改进他。请认真审查我们在dos下养成的习惯,因为它可能是错的。我们在使用批处理时一定要小心,否则一旦出错查找原因将是一件很困难的工作。
[
本帖最后由 2011_dihuo0 于 2011-7-7 17:45 编辑
]
作者:
幸运的草
时间:
2011-7-7 08:19
标题:
回复 #1 2011_dihuo0 的帖子
这个exist的判断结果确实有时不准确,这是很长时间都存在的问题。
作者:
chenall
时间:
2011-7-7 15:58
@幸运的草
有时不准确,我印像中从来就没有接到过类似报告?
@2011_dihuo0
if exist 判断变量,目前除了内部变量之外,其它的如果出现问题那是属于BUG,请详细报告。
至于内部变量,虽然可以让它也判断返回真,但是我感觉没有这个必要,因为这些内部变量是永久存在的,还有必要去判断吗?
作者:
dihuo0
时间:
2011-7-7 17:44
标题:
回复 #2 幸运的草 的帖子
新版的试图修正这一问题,但是在我这儿表现不太稳定,时好时坏,我还不能重现,所以没有继续报告。
作者:
dihuo0
时间:
2011-7-7 18:14
标题:
回复 #3 chenall 的帖子
如果一个变量var直接或者间接引用了内部变量或非标准的变量,那么exist就认定它是不存在的。
当我们使用别人的脚本提供的变量时,他是否引用过内部变量或非标准的变量,我们是不知道的。这时if exist就可能出错。使用if "%var%"==""更保险些。
这个问题也可以不算作bug,但是应当再文档中注明。
在脚本中我提倡使用if "%var%"==""来判断变量,我认为正确性是第一位的,如果可能就应该避开那些不确定的因素。在保证正确性的基础上,在考虑精简代码等问题。
作者:
chenall
时间:
2011-7-7 19:02
标题:
回复 #5 2011_dihuo0 的帖子
"如果一个变量var直接或者间接引用了内部变量或非标准的变量,那么exist就认定它是不存在的。"
有没有实例?
作者:
dihuo0
时间:
2011-7-7 20:36
标题:
回复 #6 chenall 的帖子
在我的系统上几次出现这种问题,抽时间我再测试一下。
[
本帖最后由 2011_dihuo0 于 2011-7-7 20:37 编辑
]
作者:
zhaohj
时间:
2011-7-8 08:50
没有直接证据证明楼主的说法。
我们把变量划分一下:
1:GRUB4DOS的内部变量,如:@path、@root、@date、@time、@random
2:用户自定义变量,1-60个
3:返回值变量,第61-64个,以?_开头
---------------------------------
2、3一共可以存放64个变量,占用一扇区(512字节)(每个变量名不超过8个,512/8=64),变量名存放在(md)0x228+1中
一个变量值占用一个扇区,故变量空间总共占用65个扇区(md)0x228+65)。
-------------------------------
返回值变量是变化的,变量名及值随着环境而变化。如果间接引用了返回值变量,需要特别小心。
例1:
WENV set a=abcdefg
WENV set len=${?_GET} //返回变量a的长度
目前这个与set命令有差异,只能使用wenv外部命令
也可以这样
set a=abcdefg && set /a len=*0x4cb00
例2:
set *
uuid (hd0,0)
set hdid=%?_UUID%
欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/)
Powered by Discuz! X3.3