无忧启动论坛

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

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

  [复制链接]
841#
 楼主| 发表于 2010-11-18 15:43:42 | 只看该作者
我觉得应该可以取消]]]的功能,这个是之前的临时方案,但明显没有现在的“;” 实用。
一个 ; 就是一个语句。

我的处理方法你可以参考一下GRUB4DOS里面相应的代码。

在cmdline.c里面。
//执行一条命令(在WENV里就是一个分号前面的内容)
int run_line (char *heap,int flags)
//下一个命令.
static char *skip_to_next_cmd (char *cmd,int *status)

[ 本帖最后由 chenall 于 2010-11-18 15:48 编辑 ]
回复

使用道具 举报

842#
发表于 2010-11-18 15:46:37 | 只看该作者
主要是FOR
如果FOR命令用加分号连接呢?
wenv for .... do sub1 ;  sub2  ;  sub3

这样看起来是平级的,每个sub中命令用连接符连接。
回复

使用道具 举报

843#
 楼主| 发表于 2010-11-18 15:46:57 | 只看该作者
我觉得在之前的WENV版本上应该很容易改造的.加两个函数就可以了.

直接把WENV主函数的执行单句的命令
ret = p_cmd_list.func(arg,flags);
修改成run_line来调用.
回复

使用道具 举报

844#
发表于 2010-11-18 16:00:29 | 只看该作者
for语句目前空行不会跳过,这个希望改进一下。
回复

使用道具 举报

845#
发表于 2010-11-18 16:42:51 | 只看该作者
FOR存在严重问题:
echo PCI$ > (fd1)/PCI
WENV for /f "eol=; tokens=1-2 delims==;" %i in ( (fd1)/TXT ) do set a=%i ]]] check "$${a:0:4}"<>"PCI\" loop ]]] set b=%j ]]] echo -n $ ]]] echo $${a}=$${b} >> (fd1)/PCI

[ 本帖最后由 zhaohj 于 2010-11-18 16:47 编辑 ]

Snap1.jpg (21.46 KB, 下载次数: 80)

Snap1.jpg
回复

使用道具 举报

846#
发表于 2010-11-19 00:15:06 | 只看该作者
@chenall
不行的,一是在以前的基础上改,新增加的功能都受影响

二是以前的集合命令判断考虑的情况太单一了,而且影响带括号的串
wenv (set a=${b) ; get) ,如果b中含有括号是不能工作的

三是按原来的写法,集合命令后面不能扩展连接符的


@zhaohj
目前 for 用 ]]] 取代原来的集合命令是有问题,应用中请暂时使用扩展连接符之前的版本
已经实现了 (sub1 ]]] sub2 ]]]),但跟以前一样,只能作为最后一个语句,后面不能再跟wenv的连接符(&&,||是可以的)
我想实现的是集合命令在任何地方跟单一的wenv命令一样,如
wenv (...) ]]* (...)
wenv for ... do (...) ]]* ()
wenv check ... ]]* () ]]! (...) ]]* (...)

===============================

想来想去还是要放弃分号方案,因为多一个特殊符号,处理字符串的子命令就多一份限制,判断起来就更复杂,用 ]]] 代替分号,也就是多打两个字
回复

使用道具 举报

847#
发表于 2010-11-19 09:41:56 | 只看该作者
]]] 还是很有用的,有时在一个条件的并列语句,在不确定前一命令返回值时只能用它

添加了集合命令(sub1 ]]] sub2 ]]] sub3),重用了 ]]] 作分隔符(重用连接符号添加集合命令实现较简洁,只用了10条语句,因为它本质上还是连接写命令)
下面的用法是支持的
wenv (set a=1 ]]] set b=2) ]]] get
wenv check ${a}==1 ]]& (echo yes ]]] get) ]]] echo link 1 ]]! (echo not ]]] get) ]]] echo link 2

但for后的集合命令不能再跟wenv的连接符,好在for命令都比较长,一般for后不会再连写其它命令,这个问题不算严重
wenv for ... do (...) ]]* ... ,红色的部分写法不支持

]]! 部分情况支持多级嵌套,但这个是意外的用法,实现时并未刻意如此,可能不完善,尽可能在简单的两种是或否时使用 ]]!
原因是 ]]! 规则引起的,当前面的连写命令不能继续执行时,首先查找最近的一个 ]]! 执行。但目前没有括号对决定优先级的情况,嵌套可能会出错

[ 本帖最后由 tuxw 于 2010-11-19 09:57 编辑 ]

wenv-tuxw-2010-11-19-test.zip

53.37 KB, 下载次数: 20, 下载积分: 无忧币 -2

回复

使用道具 举报

848#
发表于 2010-11-19 12:33:32 | 只看该作者
嗯,不错,这样改动比较少,语法也比较合理。
下面那句比较合理?

WENV get _ini_l ]]& for /f "eol=# delims=" %i in ( ${OEMFILE} ) do echo %i > (rd)+1 && WENV (call exec FAT copy /o (rd)+1 ${OEMFILE} ]]] reset =${_ini_buf})

WENV get _ini_l ]]& (for /f "eol=# delims=" %i in ( ${OEMFILE} ) do echo %i) > (rd)+1 && WENV (call exec FAT copy /o (rd)+1 ${OEMFILE} ]]] reset =${_ini_buf})

WENV (get _ini_l ]]& for /f "eol=# delims=" %i in ( ${OEMFILE} ) do echo %i) > (rd)+1 && WENV (call exec FAT copy /o (rd)+1 ${OEMFILE} ]]] reset =${_ini_buf})

WENV get _ini_l ]]& for /f "eol=# delims=" %i in ( ${OEMFILE} ) do echo %i > (rd)+1 ]]]  (call exec FAT copy /o (rd)+1 ${OEMFILE} ]]] reset =${_ini_buf})

WENV get _ini_l ]]& for /f "eol=# tokens=1-2 delims=" %i in ( ${OEMFILE} ) do (echo %i  %j)> (rd)+1 && WENV  (call exec FAT copy /o (rd)+1 ${OEMFILE} ]]] reset =${_ini_buf})




第三句可能不支持吧,因为有(...(.....)....)

最希望实现的:
WENV get _ini_l ]]& (for /f "eol=# tokens=1-2 delims=" %i in ( ${OEMFILE} ) do (echo %i ) ]]]  (echo %j) > (rd)+1 ]]]  call exec FAT copy /o (rd)+1 ${OEMFILE} ]]] reset =${_ini_buf})
                             |                                                                                                                                                                                                                                    |               
               

[ 本帖最后由 zhaohj 于 2010-11-19 13:41 编辑 ]
回复

使用道具 举报

849#
发表于 2010-11-19 13:45:44 | 只看该作者
是的,现在没有括号本对检查,不支持嵌套,要这样用的话也可以加上配对检查,但比较麻烦,要做完全配对检查的话,要能识别出作为字符串的括号才行,容易误判

最后一种情况目前不可能实现,因为 > 是 grub4dos 的符号,不能夹在两个wenv的连接符中间,这种情况前后只能用 &&,||(在wenv里实现一个 ]]> ?那功能重复了)

@zhaohj
现在如果动作大一点,找问题比较麻烦,我准备写一个包括wenv常见用法的批处理,用来作为新版wenv的测试工作以发现常见问题,避免一条条敲命令。大致结构是这样的:
wenv sub-command ....
wenv check .... echo 结果是否正确

但我对for了解比较肤浅,目前只弄了个 /L 的,麻烦你帮我完善一下 /F 两种情况的测试情况吧

下面是一个样本,运行 test.bat 来检测常见错误

[ 本帖最后由 tuxw 于 2010-11-19 13:52 编辑 ]

test.rar

1.74 KB, 下载次数: 20, 下载积分: 无忧币 -2

回复

使用道具 举报

850#
发表于 2010-11-19 13:55:32 | 只看该作者
ok,语法检查确实很重要,常常因为多敲了个字符或写错个字符给测试带来很大麻烦。

WENV calc s=0
WENV for /L %i in (1,1,100) do (set a=%i ]]] calc s=s+a)
WENV check ${s}==5050 echo ok: for 1

用for /F 处理就没有意义了,/F是对文本及字符串的处理,除非这样检查:
map --rd-base=0xf00000 && map --rd-size=1024
WENV reset =0xf00000 1k
#检测试for /L
WENV calc s=0
WENV for /L %i in (1,1,100) do (set a=%i ]]] calc s=s+a ]]] echo $${a}) > (rd)+1
WENV check ${s}==5050 echo ok: for /L 1

#检测试for /F
WENV calc s=0
WENV for /F  %i in ( (rd)+1 ) do (set a=%i ]]] calc s=s+a)
WENV check ${s}==5050 echo ok: for /F 2

[ 本帖最后由 zhaohj 于 2010-11-19 15:15 编辑 ]
回复

使用道具 举报

851#
发表于 2010-11-19 15:32:20 | 只看该作者
可以准备一个样本文件,对它进行特定的处理,然后检测结果是否正确

比如去掉注释,然后在处理后的文件中查找注释符,如果不存在,就返回OK
对特定的样本计算好处理后的文件大小,处理后同时检查文件大小

字符串可以给定一个比较特殊的串,然后用容易出错的分隔字符处理,再检测结果

[ 本帖最后由 tuxw 于 2010-11-19 15:41 编辑 ]
回复

使用道具 举报

852#
发表于 2010-11-19 18:37:37 | 只看该作者
11-19版本看来还有问题,主要是FOR /F
回复

使用道具 举报

853#
 楼主| 发表于 2010-11-20 00:22:04 | 只看该作者
原帖由 tuxw 于 2010-11-19 00:15 发表
@chenall
不行的,一是在以前的基础上改,新增加的功能都受影响

二是以前的集合命令判断考虑的情况太单一了,而且影响带括号的串
wenv (set a=${b) ; get) ,如果b中含有括号是不能工作的

三是按原来的 ...


有利就有弊,老实说这些新功能我都没有用过,呵呵,感觉有点复杂了.

我当时是按照标准的批处理写法来编写的,很容易看明白,不用再去学习新的语法.

我现在语法这些有点怕了,我一直没有去使用grub2或burg.就是因为我不愿意去学习新的语法.

以后实在必须使用了我才会去学习新的.感觉现在要学习的东西太多了,所以我尽量使用通用的东西.
回复

使用道具 举报

854#
发表于 2010-11-20 09:29:50 | 只看该作者
嗯,以你的版本为标准,我在你基础上修改的就不用遵守那么多,不然也没必要修改了

事实上现在增加的功能和参数大部分都没有在help里正式说明,不理会这些增加的功能的话,跟你的版本是完全兼容的,当然,从现在开始,“集合”命令使用不兼容了

原帖由 zhaohj 于 2010-11-19 18:37 发表
11-19版本看来还有问题,主要是FOR /F

麻烦弄个详细点的测试,事实上因为我对for不熟,除了增加了loop/break没做过其它改动,可能是其它地方的修改引起的

[ 本帖最后由 tuxw 于 2010-11-20 09:31 编辑 ]
回复

使用道具 举报

855#
发表于 2010-11-20 09:52:05 | 只看该作者
下面是for/f 生成id的信息文件:
cat --length=0 (fd1)/OEM && FAT mkfile size=* (fd1)/PCI
WENV echo PCI$ > (fd1)/PCI
pause make PCI ...
WENV for /f "eol=: tokens=1-3 delims==," %i in ( (fd1)/OEM ) do (set a=%i ]]] check $${a}==ID ]]& set b=%j ]]] set c=%k ]]] echo -n $ ]]] echo $${b}=$${c}) >> (fd1)/PCI

[ 本帖最后由 zhaohj 于 2010-11-20 09:59 编辑 ]

Snap1.jpg (102.01 KB, 下载次数: 80)

Snap1.jpg
回复

使用道具 举报

856#
发表于 2010-11-20 10:11:26 | 只看该作者
刚开始怀疑loop命令,我取消loop还是这样。
这些命令应该很简单了,现在最大的可能是check

或者怀疑g4d,换老一点的我再测试一下

[ 本帖最后由 zhaohj 于 2010-11-20 10:26 编辑 ]
回复

使用道具 举报

857#
发表于 2010-11-20 10:40:39 | 只看该作者
这样试试
check "$${a}"==ID

当不知道比较对象是否含有空格时,最好加上引号

单独执行这样一句(去掉check)
WENV for /f "eol=: tokens=1-3 delims==," %i in ( (fd1)/OEM ) do (set a=%i ]]] check $${a}==ID ]]& set b=%j ]]] set c=%k ]]] echo -n $ ]]] echo $${b}=$${c})
这样都是简单命令,如果成功,则跟for无关,是 check 或者集合命令中的 ]]& 引起的

集合命令中目前只能使用 ]]] (这样才等效于以前的 ; )
所以集合命令中的check 后面不要跟 ]]& 直接跟命令,这样在集合命令中 check "$${a}"==ID set b=%j 是一条独立的语句,就符合集合命令的要求了

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

使用道具 举报

858#
发表于 2010-11-20 10:59:13 | 只看该作者
WENV for /f "eol=: tokens=1-3 delims==," %i in ( (fd1)/OEM ) do (set a=%i ]]] check "$${a}"==ID set b=%j ]]] set c=%k ]]] echo -n $ ]]] echo $${b}=$${c}) >> (fd1)/PCI
还是死机

WENV for /f "eol=: tokens=1-3 delims==," %i in ( (fd1)/OEM ) do (set a=%i ]]]  set b=%j ]]] set c=%k ]]] echo -n $ ]]] echo $${b}=$${c}) >> (fd1)/PCI
还是死机

[ 本帖最后由 zhaohj 于 2010-11-20 11:04 编辑 ]
回复

使用道具 举报

859#
发表于 2010-11-20 11:01:27 | 只看该作者
去掉check命令是否也死机
回复

使用道具 举报

860#
发表于 2010-11-20 11:07:15 | 只看该作者
象下面简单一点的正常:
wenv for /f "eol=# delims=" %i in ( ${OEMFILE} ) do echo %i > (rd)+1

说明是连接符引起的问题

[ 本帖最后由 zhaohj 于 2010-11-20 11:13 编辑 ]
回复

使用道具 举报

861#
发表于 2010-11-20 11:46:37 | 只看该作者
你测试用的OEM文件传上来我测试下,有必要的话将集合命令的运行方式调整下
回复

使用道具 举报

862#
发表于 2010-11-20 11:53:59 | 只看该作者
这个就是N版的OEM集合,对了解OEM驱动很有帮助。

[ 本帖最后由 zhaohj 于 2010-11-20 11:57 编辑 ]

OEM.rar

2.48 KB, 下载次数: 18, 下载积分: 无忧币 -2

回复

使用道具 举报

863#
发表于 2010-11-20 12:47:42 | 只看该作者
很奇怪的问题,死机竟然是 echo $${a} 引起的,可能集合命令里处理 $$ 有问题
回复

使用道具 举报

864#
发表于 2010-11-20 13:22:17 | 只看该作者
一个$$测试没问题,两个$$就出问题了
回复

使用道具 举报

865#
发表于 2010-11-20 15:04:58 | 只看该作者
一个 $ 因为第一次就替换成了常量,不会出错,两个 $$ 每次循环显示的a都不同
怀疑是a里含了某个特殊字符比如括号导致语法错误,而这条语法还能执行但要死机

最好能有办法通过缩减OEM文件大小,定位出处理哪个字符串的时候出错了

或者怀疑是什么符号引起的,直接先设定好一个变量 d=含特殊字符的串,然后
WENV for ... do (...  ]]] echo -n ${d}),d前只有一个 $ ,看会否死机。如果第二个测试死机的话,就是集合命令引起的

[ 本帖最后由 tuxw 于 2010-11-20 15:07 编辑 ]
回复

使用道具 举报

866#
发表于 2010-11-20 16:35:11 | 只看该作者
已知这个问题是由字符串中未配对的括号引起的,OEM 文件中有两行各含一对括号,经过字符串分割处理后括号是不配对的,影响了集合命令的的括号处理。

我的版本中是完全没有检查括号配对,而重用 ]]] 符号集合命令分隔符跟命令连写处理上有冲突,导致死机。
C大的版本有个简单的检查,不过检不出这种情况,但C大的版本不会导致死机。(用C大的版本执行你的for命令,然后用find在rd中查找bracket,cat索引附近的一段,会发现输出的括号未匹配的提示)

已将集合命令的处理恢复了 ; 方式,括号的严格匹配问题我再想一想

wenv-tuxw-2010-11-20-test.zip

20.77 KB, 下载次数: 19, 下载积分: 无忧币 -2

回复

使用道具 举报

867#
发表于 2010-11-20 17:06:46 | 只看该作者
你是说恢复成这样?
WENV (command1 ; command1 ; command3 ; ...)
回复

使用道具 举报

868#
发表于 2010-11-20 18:29:09 | 只看该作者
是的,跟以前的集合命令一样

括号的配对比较麻烦,没有一个好的办法区分,因为语法上没有强制要求字符串使用引号括起来

wenv (set a=() ; set b=2),a后面2个作为字符串的括正好配对,这句可以工作,如果作为字符的括号不配对,确定集合命令的结束处就会出错,如
wenv (set a=( ; set b=2)
wenv (set a=()) ; set b=2)
回复

使用道具 举报

869#
发表于 2010-11-20 18:35:09 | 只看该作者
11-15号的版本最稳定,用今天的版本替换15号的版本,在原本良好运行的SRSF6都出现异常。
我的FTP中有这个稳定的版本,你可以测试一下
回复

使用道具 举报

870#
发表于 2010-11-20 18:37:02 | 只看该作者
换个角度,改变集合命令的标识符[[( sub1 ; sub2 )]]跟连接符一样,用复杂点的标识符尽可能降低与普通字符混淆的概率
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-29 23:59

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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