无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: chenall
打印 上一主题 下一主题

grub4dos 外部命令 wenv [2010-10-17 ]

  [复制链接]
331#
发表于 2010-10-5 18:28:47 | 只看该作者
回复

使用道具 举报

332#
 楼主| 发表于 2010-10-5 18:53:06 | 只看该作者
原帖由 sratlf 于 2010-10-5 18:28 发表
不知2010-10-05版在哪下载  

http://code.google.com/p/grubutils/downloads/list  上是1004


嘻嘻,这个就是10-05

如果有足够时间话晚上会再更新一下,就是加入tuxw 的增强功能,另外可能会增加一个简易字符串比较的功能
比如
wenv ${a:-3}==abc //如果变量a的最后3个字符是abc就返回真
如果相等就返回1,否则返回0.

顺便修复一下前面zhaohj 提到的负数除法问题.
回复

使用道具 举报

333#
发表于 2010-10-5 19:14:00 | 只看该作者

回复 #332 chenall 的帖子

请问C大能否添加字符串分割功能?
谢谢
回复

使用道具 举报

334#
发表于 2010-10-5 19:39:07 | 只看该作者
原帖由 chenall 于 2010-10-5 18:21 发表
...
这个没关系的.
这里的var是wenv_func函数里面的一个变量char var[8];
当在了envi_cmd里面的就可以直接printf了.

有区别的,char var[8],是不能通过 %s 来打印长度为8的字符串的。而且回显不一定在envi_cmd中处理,大多时候可能是在 wen_func 里面处理的。


根据内存的使用情况不同,出错的表现是随机的


目前这个只用在显示上,不会有大的问题。
实际上是个很严重的BUG,我注意到你的新版里只初始化了变量名字所在的1个扇区,变量值的存储区没有明确初始化,而在使用过程中去是默认将它当0来对待的,字符写入后没有达到最大长度时,默认0的话它是有结束符的。但我们不能假定用户内存初始化总是0的。

一个办法是专用的变量打印函数,另一个办法是将读写变量时使用的临时数组var的长度设为 MAX_VAR_LEN+1,也就是9。


看下面这个测试,首次运行 WENV,变量 __wenv 就已经有值了


[ 本帖最后由 tuxw 于 2010-10-5 20:03 编辑 ]
回复

使用道具 举报

335#
发表于 2010-10-5 20:32:55 | 只看该作者
有点问题  C大

title img&iso
WENV set path=$U,$input,Input the path,begin with "/" :
WENV run find --set-root ${path}
WENV set de=${path:-3:2}
WENV get de=IM && WENV run map --mem ${path} (fd0) && map --hook && rootnoverify (fd0) && chainloader ()+1 && boot
WENV run map --mem ${path} (0xff) && map --hook && chainloader (0xff) && boot
kernel

测试加载img正常  加载iso执行到map --mem完成 下面应该执行map --hook 却提示 No such command : WENV

用这个菜单却完全正常  加载iso和img都没问题
title mg&iso  use ISO as default
WENV set path=$U,$input,Input the path, begin with "/" :
WENV run find --set-root ${path}
WENV set de=$U,$input,Input please:    //需手动输入IMG来加载IMG  默认加载ISO
WENV get de=IMG && WENV run map --mem ${path} (fd0) && map --hook && rootnoverify (fd0) && chainloader ()+1 && boot
WENV run map --mem ${path} (0xff) && map --hook && chainloader (0xff) && boot
kernel

测试用的文件路径是 /BOOT/IMGS/DTS.IMA  和 /BOOT/IMGS/ADD.ISO
回复

使用道具 举报

336#
 楼主| 发表于 2010-10-5 20:50:39 | 只看该作者
原帖由 tuxw 于 2010-10-5 19:39 发表

有区别的,char var[8],是不能通过 %s 来打印长度为8的字符串的。而且回显不一定在envi_cmd中处理,大多时候可能是在 wen_func 里面处理的。
100993

根据内存的使用情况不同,出错的表现是随机的
10099 ...



汗,,我居然把这个给搞乱了,谢谢提醒,定义变量确实是需要+1的,否则会溢出.
回复

使用道具 举报

337#
 楼主| 发表于 2010-10-5 20:51:23 | 只看该作者
原帖由 zhhsh 于 2010-10-5 19:14 发表
请问C大能否添加字符串分割功能?
谢谢


不知要如何分割?分割后要如何处理?

难道是传说中的for命令?

[ 本帖最后由 chenall 于 2010-10-5 20:58 编辑 ]
回复

使用道具 举报

338#
 楼主| 发表于 2010-10-5 20:58:22 | 只看该作者
原帖由 sratlf 于 2010-10-5 20:32 发表
有点问题  C大

title img&iso
WENV set path=$U,$input,Input the path,begin with "/" :
WENV run find --set-root ${path}
WENV set de=${path:-3:2}
WENV get de=IM && WENV run map --me ...


注意:目前没有wenv get de=im这样的用法,会出错的...

出现找不到wenv,wenv放在哪里的(fd0)?
回复

使用道具 举报

339#
发表于 2010-10-5 21:20:51 | 只看该作者

回复 #337 chenall 的帖子

对,类似于lmod
比如这个命令:
CHKPCI | lmod /l* [$2]>dectet
以=分割,提取第二个元素

我想,用指针应该能够实现。
回复

使用道具 举报

340#
 楼主| 发表于 2010-10-5 21:38:15 | 只看该作者
原帖由 zhhsh 于 2010-10-5 21:20 发表
对,类似于lmod
比如这个命令:
CHKPCI | lmod /l* [$2]>dectet
以=分割,提取第二个元素

我想,用指针应该能够实现。


其实目前的版本就已经可以实现了的.^_^
目前可以直接提取第一个或最后一个元素.要提第二个就要多执行一次
给你一个例子

WENV SET A=123:456:789:ABC
以":"分割
提取第一个元素
WENV SET b=${A%%:}
b=123
提取最后一个元素
wenv set b=${A##:}
b=ABC
提取第二个元素
wenv set b=${a#:}//去掉第一个元素
wenv set b=${b%%:}//再提取第一个元素.
最终的b=456
根据以上方法想提取哪一个都行,只是需要执行多次.^_^,会考虑增强一下.
回复

使用道具 举报

341#
发表于 2010-10-5 21:57:35 | 只看该作者
原帖由 sratlf 于 2010-10-5 20:32 发表
有点问题  C大

title img&iso
WENV set path=$U,$input,Input the path,begin with "/" :
WENV run find --set-root ${path}
WENV set de=${path:-3:2}
WENV get de=IM && WENV run map --me ...


这个应该是 get de=IM 返回了真值,后面的 rootnoverify (fd0) 执行导致路径改变

if(value[0])
{
...
return 1;
}
这个是只要读到变量就返回真值

如果你的菜单用  command --set-path 设置了默认路径(原来的路径不是(fd0)),这个错误可以避免。不过那只是将这个问题隐藏了,中间还是要等第一个 chainloader 失败才会去加载ISO

[ 本帖最后由 tuxw 于 2010-10-5 22:12 编辑 ]
回复

使用道具 举报

342#
发表于 2010-10-5 22:02:56 | 只看该作者
原帖由 chenall 于 2010-10-5 20:58 发表


注意:目前没有wenv get de=im这样的用法,会出错的...

出现找不到wenv,wenv放在哪里的(fd0)?



哈哈,我还以为新学到一种用法呢?正在考虑将以前的判断变量值 WENV calc ${VAR}-5 || EChO =5 改为 WENV get VAR=5,看到后面 chenall 的回复才知空欢喜一场。


不过版主sratlf发明的这个写法倒是很直观,可以考虑增加哦
回复

使用道具 举报

343#
 楼主| 发表于 2010-10-5 22:30:52 | 只看该作者
嘿嘿.
WENV get VAR=xxx
这里面一个未公开的功能(只有在我的NTBOOT中使用过),你可以试试后面的XXX为一个内存数值,执行后再看看该内存的变化.

新版已经上传,SVN没有更新.

今天的版本,改动比较大,请大家多多测试.

2010-10-05
   1.修正calc命令除法计算的bug.
   2.整合醉书生的修改版,并修复几个小bug.
   3.添加字符串比较功能. == <>

字符串比较功能例子:
wenv ${a}==abc && echo abc
wenv ${VAR}==5 && echo 5
wenv ${VAR}<>5 && echo not 5

注: 注意比较时,后面的字符串忽略小写对比.
比如
wenv abc=ABC 值为真
wenv aBc=abc 值为假
wenv abc=aBc 值为真.

不知各位明白了没?(嘻嘻,很奇怪的比较).
也就是如果你想忽略大小写进行比较,那么只要把前部份全部转为小写再比较就可以了.
回复

使用道具 举报

344#
发表于 2010-10-5 22:49:22 | 只看该作者
"只要把前部份全部转为小写再比较就可以了",这句话怎么这么难懂?!
还是详细说明一下吧!

大概意思是“后面部分可以把大写转为小写再比较”,但小写不能转大写对比。
只要前面部分某个字符是大写,后面部分对应的一定要大写才能匹配(==)。

[ 本帖最后由 zhaohj 于 2010-10-5 22:59 编辑 ]
回复

使用道具 举报

345#
发表于 2010-10-5 22:59:05 | 只看该作者

回复 #340 chenall 的帖子

谢谢,对于提取每一行是否要自己写函数
回复

使用道具 举报

346#
 楼主| 发表于 2010-10-5 23:16:31 | 只看该作者
原帖由 zhaohj 于 2010-10-5 22:49 发表
"只要把前部份全部转为小写再比较就可以了",这句话怎么这么难懂?!
还是详细说明一下吧!

大概意思是“后面部分可以把大写转为小写再比较”,但小写不能转大写对比。
只要前面部分某个字符是大写,后面部 ...


嗯,就是这样子..
我也说不太清楚,嘿嘿.

[ 本帖最后由 chenall 于 2010-10-5 23:21 编辑 ]
回复

使用道具 举报

347#
 楼主| 发表于 2010-10-5 23:18:54 | 只看该作者
原帖由 zhhsh 于 2010-10-5 22:59 发表
谢谢,对于提取每一行是否要自己写函数


目前wenv里面有读取一行的函数,但是没有提供输出

需要的话要再增加功能,让它可以读取文件作为变量.
回复

使用道具 举报

348#
发表于 2010-10-5 23:35:05 | 只看该作者
对目前这个版本已经很满意了
长假还有2天,我还有时间跟进一下
回复

使用道具 举报

349#
 楼主| 发表于 2010-10-5 23:47:35 | 只看该作者
原帖由 tuxw 于 2010-10-5 23:35 发表
对目前这个版本已经很满意了
长假还有2天,我还有时间跟进一下


真好,我们就可怜了,国庆要加班,还不给加班费....
回复

使用道具 举报

350#
 楼主| 发表于 2010-10-5 23:55:17 | 只看该作者
原帖由 zhhsh 于 2010-10-5 22:59 发表
谢谢,对于提取每一行是否要自己写函数


目前读取可以直接读取第一行的.嘿嘿
dd if=()/test.txt of=(md)0x300+1
wenv set a=*0x60000
得到的变量a就是test.txt的第一行了.

急用的话可以先用着,有空还想再实现一下类拟for简单循环的功能.
回复

使用道具 举报

351#
发表于 2010-10-6 01:50:25 | 只看该作者
原帖由 chenall 于 2010-10-5 22:30 发表
嘿嘿.
WENV get VAR=xxx
这里面一个未公开的功能(只有在我的NTBOOT中使用过),你可以试试后面的XXX为一个内存数值,执行后再看看该内存的变化.
...



还真是隐蔽,ASCII串扩展成16进制形式的UNICODE串,我看你get里的那段代码一直就没明白它是干什么用的。这个只在特殊地方会用到
回复

使用道具 举报

352#
发表于 2010-10-6 04:02:09 | 只看该作者
发现一个BUG:
WENV set TT=
当TT不存在时,它会添加一个变量TT,值是"随机"的(0地址)



同时改了几个小地方,比如数组定义时+1了,但memset时没+1。不过问题不大,因为几乎不重复使用。
WENV abc=ABC 这种少一个=的手误非常容易发生而且不易查出来,这种情况检出时显示帮助信息
另外加上了 get/get prefix*/reset prefix* 的变量计数

wenv_tuxw_1006.zip (13.7 KB, 下载次数: 17)

[ 本帖最后由 tuxw 于 2010-10-6 04:04 编辑 ]
回复

使用道具 举报

353#
发表于 2010-10-6 08:48:09 | 只看该作者
原帖由 chenall 于 2010-10-5 20:58 发表


注意:目前没有wenv get de=im这样的用法,会出错的...

出现找不到wenv,wenv放在哪里的(fd0)?


wenv是在U盘上  USB-HDD启动  /BOOT/GRUB下

另回复 #341tuxw  在菜单里有写 command --set-path /BOOT/GRUB

很奇怪的是#335两个菜单  

第一个是WENV提取指定字符再赋给新的变量  运行有问题  第二个是手动输入再执行WENV get就没有问题

想不明白

2010-10-05
   1.修正calc命令除法计算的bug.
   2.整合醉书生的修改版,并修复几个小bug.
   3.添加字符串比较功能. == <>

字符串比较功能例子:
wenv ${a}==abc && echo abc
wenv ${VAR}==5 && echo 5
wenv ${VAR}<>5 && echo not 5


添加了字符串比较功能啊  晚上回去再测试下  现在是不行了
回复

使用道具 举报

354#
发表于 2010-10-6 10:40:41 | 只看该作者
原帖由 sratlf 于 2010-10-6 08:48 发表


wenv是在U盘上  USB-HDD启动  /BOOT/GRUB下

另回复 #341tuxw  在菜单里有写 command --set-path /BOOT/GRUB

很奇怪的是#335两个菜单  

第一个是WENV提取指定字符再赋给新的变量  运行有问题  第二 ...


command --set-path /BOOT/GRUB
要用绝对路径 command --set-path (cd)/BOOT/GRUB,(cd)换成实际路径,不能是()
就是一个不受 root/rootnoverify 影响的路径

提取变量不行,手动输入可以,的情况比较奇怪,可以这样试试
输入path之前先清空
WENV set path=
WENV set path=$input,.....
输入路径时在后面加个\0
这个测试是检查输入path时如用了tab自动完成路径,它会在后面加一个空格,这样会导致后面的截取不是IM。而用手动输入IM是不可能是tab键完成的,就不会有问题

或者干脆在
WENV set de=${path:-3:2}
之后
WENV get path && WENV get de && pause any key ...
看看字符串截取是否正常

[ 本帖最后由 tuxw 于 2010-10-6 10:52 编辑 ]
回复

使用道具 举报

355#
发表于 2010-10-6 10:48:24 | 只看该作者

回复 #354 tuxw 的帖子

usb-cdrom启动的好说  usb-hdd启动就麻烦了该怎么写能保证不会判断失误(有时会交换磁盘顺序)

而且有影响的话  为什么第二个菜单就能正确执行呢
回复

使用道具 举报

356#
发表于 2010-10-6 10:53:47 | 只看该作者
刚编辑了前面的回复,正好说到手动可以截取不行的可能原因
回复

使用道具 举报

357#
发表于 2010-10-6 10:59:59 | 只看该作者

回复 #356 tuxw 的帖子

嘿嘿  手机回复完了才看到  提取的两个变量值都是正确的  昨晚试过了

全手动输入 在map --mem前用get能看到de值是正确的  是输入path的指定两个字符

补充  输入path时是手动输入的  没有用tab自动补全

[ 本帖最后由 sratlf 于 2010-10-6 11:03 编辑 ]
回复

使用道具 举报

358#
发表于 2010-10-6 11:27:58 | 只看该作者
如果de变量正常的话就没其它问题了,ISO失败的原因前面说了,是因为不支持get de=IM 这种写法,它始终返回真值,加载ISO时它仍执行上面一行导致当前根目录改变
所以只要将 get de=IM 换成chenall新版 WENV im==${de} 应该就正常了
回复

使用道具 举报

359#
发表于 2010-10-6 11:31:33 | 只看该作者

回复 #358 tuxw 的帖子

谢谢  晚上回去测试下
回复

使用道具 举报

360#
发表于 2010-10-6 11:53:12 | 只看该作者
学习了,thanks.
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-27 15:02

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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