无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 2651|回复: 7
打印 上一主题 下一主题

最近发现了几个bug,请大家测试最新的补丁,并检查自己的脚本是否受影响

[复制链接]
跳转到指定楼层
1#
发表于 2011-7-7 07:49:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
昨晚我和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 编辑 ]
2#
发表于 2011-7-7 08:19:42 | 只看该作者

回复 #1 2011_dihuo0 的帖子

这个exist的判断结果确实有时不准确,这是很长时间都存在的问题。
回复

使用道具 举报

3#
发表于 2011-7-7 15:58:53 | 只看该作者
@幸运的草
有时不准确,我印像中从来就没有接到过类似报告?

@2011_dihuo0
if exist 判断变量,目前除了内部变量之外,其它的如果出现问题那是属于BUG,请详细报告。
至于内部变量,虽然可以让它也判断返回真,但是我感觉没有这个必要,因为这些内部变量是永久存在的,还有必要去判断吗?
回复

使用道具 举报

4#
 楼主| 发表于 2011-7-7 17:44:43 | 只看该作者

回复 #2 幸运的草 的帖子

新版的试图修正这一问题,但是在我这儿表现不太稳定,时好时坏,我还不能重现,所以没有继续报告。
回复

使用道具 举报

5#
 楼主| 发表于 2011-7-7 18:14:13 | 只看该作者

回复 #3 chenall 的帖子

如果一个变量var直接或者间接引用了内部变量或非标准的变量,那么exist就认定它是不存在的。
当我们使用别人的脚本提供的变量时,他是否引用过内部变量或非标准的变量,我们是不知道的。这时if exist就可能出错。使用if "%var%"==""更保险些。
这个问题也可以不算作bug,但是应当再文档中注明。
在脚本中我提倡使用if "%var%"==""来判断变量,我认为正确性是第一位的,如果可能就应该避开那些不确定的因素。在保证正确性的基础上,在考虑精简代码等问题。
回复

使用道具 举报

6#
发表于 2011-7-7 19:02:56 | 只看该作者

回复 #5 2011_dihuo0 的帖子

"如果一个变量var直接或者间接引用了内部变量或非标准的变量,那么exist就认定它是不存在的。"
有没有实例?
回复

使用道具 举报

7#
 楼主| 发表于 2011-7-7 20:36:09 | 只看该作者

回复 #6 chenall 的帖子

在我的系统上几次出现这种问题,抽时间我再测试一下。

[ 本帖最后由 2011_dihuo0 于 2011-7-7 20:37 编辑 ]
回复

使用道具 举报

8#
发表于 2011-7-8 08:50:13 | 只看该作者
没有直接证据证明楼主的说法。
我们把变量划分一下:
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%
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-29 09:47

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表