无忧启动论坛

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

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

  [复制链接]
601#
发表于 2010-10-24 15:39:54 | 只看该作者
是新的替换函数的BUG,没针对for命令处理

wenv-tuxw-2010-10-24.zip (35.06 KB, 下载次数: 20)

Test-2010-10-24-15-33-43.png (10.5 KB, 下载次数: 65)

Test-2010-10-24-15-33-43.png
回复

使用道具 举报

602#
发表于 2010-10-24 16:03:30 | 只看该作者
wenv for /f "eol=# tokens=1-3 delims==," %i in ( (fd0)/TXTSETUP.OEM ) do (set a=%i ; set b=%j ; set c=%k ; check $${a}==id call write --offset=$${p} (fd0)/SRSID.TXT $PCI\\$${b:4}=$${c}\r\n ; check $${a}==id calc p=$${p}+$${b,?}+$${c,?}+4)
--------------
默认去掉"后,变量值后多出一个“!”字符
文件格式:
id = "PCI\VEN_1000&DEV_0622", "symmpi"

[ 本帖最后由 zhaohj 于 2010-10-24 16:05 编辑 ]

Snap1.jpg (38.83 KB, 下载次数: 76)

Snap1.jpg
回复

使用道具 举报

603#
发表于 2010-10-24 16:23:20 | 只看该作者
原帖由 zhaohj 于 2010-10-24 16:03 发表
wenv for /f "eol=# tokens=1-3 delims==," %i in ( (fd0)/TXTSETUP.OEM ) do (set a=%i ; set b=%j ; set c=%k ; check $${a}==id call write --offset=$${p} (fd0)/SRSID.TXT $PCI\\$${b:4}=$${c}\r\n ; chec ...


OK,非常感谢zhaohj,这么快找出几个BUG

wenv-tuxw-2010-10-24.zip (35.08 KB, 下载次数: 22)

switch 后面没有参数时始终显示当前开关状态(不管debug什么状态)

[ 本帖最后由 tuxw 于 2010-10-24 16:34 编辑 ]
回复

使用道具 举报

604#
发表于 2010-10-24 18:09:47 | 只看该作者
正常了。
现在switch写法与get处理对应,这样比较好。
----------------------
在循环中,我一直想实现满足某个条件返回循环体的命令(即跳到下一个do开始,象loop命令),这对优化程式有很大好处。tuxw兄看一下能否实现这个愿望。
跳出循环体如chenall讲的,可以call kernel。
既然使用循环体,loop及exit命令还真有必要。

[ 本帖最后由 zhaohj 于 2010-10-24 18:13 编辑 ]
回复

使用道具 举报

605#
发表于 2010-10-24 20:15:45 | 只看该作者
原帖由 zhaohj 于 2010-10-24 18:09 发表
正常了。
现在switch写法与get处理对应,这样比较好。
----------------------
在循环中,我一直想实现满足某个条件返回循环体的命令(即跳到下一个do开始,象loop命令),这对优化程式有很大好处。tuxw兄看 ...


我不大会用for,你能否写个示例的语法,怎么用exit和loop?
我近期会侧重于排除BUG,现在看起来比较正常,实际上小问题比较多。因为大家测试时都是基于应用的,很少有人专门做极限测试,有些隐藏很深的问题不容易发现。功能加得越多,以后越不好找。

修复 calc 计算结果不能为0的BUG
switch 计算结果数制默认改为10进制,即开关初始化状态为1101,这个跟原版保持一致。
16进制时 calc p=1,变量里存的是0x1,若 calc p=-1 就是一长串的F了。

wenv-tuxw-2010-10-24.zip (34.93 KB, 下载次数: 10)

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

使用道具 举报

606#
发表于 2010-10-24 20:55:34 | 只看该作者
i=0;
j=50;
do while i<100
i=i+1;
if i=10 loop;
j=150-i;
if j=i exit;
print i;
print j;
enddo
上面就是一个循环体,i输出为1,2,..9,11..75,中间10跳过
当i=75时,j=75,退出循环体。所以j输出为149,148,...141,139,138...75

[ 本帖最后由 zhaohj 于 2010-10-24 21:03 编辑 ]
回复

使用道具 举报

607#
 楼主| 发表于 2010-10-24 20:58:31 | 只看该作者
原帖由 zhaohj 于 2010-10-24 18:09 发表
正常了。
现在switch写法与get处理对应,这样比较好。
----------------------
在循环中,我一直想实现满足某个条件返回循环体的命令(即跳到下一个do开始,象loop命令),这对优化程式有很大好处。tuxw兄看 ...


我猜应该也许是continue命令吧,呵呵.
就是像C语言那样.
while (yy){
x1;
x2;
if (tt)
continue;
x3;
}
回复

使用道具 举报

608#
发表于 2010-10-24 22:15:37 | 只看该作者
原帖由 chenall 于 2010-10-24 20:58 发表


我猜应该也许是continue命令吧,呵呵.
就是像C语言那样.
while (yy){
x1;
x2;
if (tt)
continue;
x3;
}



是的。
有这个命令,将会提高效率。
如从txtsetup.oemf中取出WHID的行
wenv for /f "eol=# tokens=1-3 delims==," %i in ( (fd0)/TXTSETUP.OEM ) do (set a=%i ; check $${a}<>id loop ; .....)

呵呵,我还是习惯叫loop取代continue
回复

使用道具 举报

609#
发表于 2010-10-24 22:39:02 | 只看该作者
简单循环,loop/continue 可以改变结构通过条件限定实现,exit比较麻烦,通过kernel算个临时方案

现在支持复杂嵌套后,可以且个比较变态的方法实现复杂循环
将循环体语句逐条写入内存,再逐条运行
这个跟 read file 的区别是写内存后每条语名都有个地址,相当于高级语言的的标签
*${addr}$ 可以取出地址 addr 处的语句,改变 addr 就相当于 goto 了
回复

使用道具 举报

610#
发表于 2010-10-24 23:05:40 | 只看该作者
check 条件 break
可以退出循环,关键字不一定是break,只要不是 WENV 的子命令就可以了

这个比 CALL kernel 要好,因为 CALL 是合法子命令,在for命令里它是正常执行的,但最终结果如果取决于grub4DOS,不受WENV控制,如果kernel以后改变了它的行为,这个方法就要失效
用非支持的子命令break,结果可由WENV控制
回复

使用道具 举报

611#
发表于 2010-10-24 23:50:34 | 只看该作者
初步添加了 loop / break 子命令控制 for 循环




wenv-tuxw-2010-10-24.zip (35.22 KB, 下载次数: 23)

/F 中可以loop/break了
默认开关1111了,第三位开关1为10进制,0为16进制
wenv-tuxw-2010-10-25.zip (35.23 KB, 下载次数: 25)

[ 本帖最后由 tuxw 于 2010-10-25 00:55 编辑 ]
回复

使用道具 举报

612#
发表于 2010-10-24 23:58:41 | 只看该作者
建议取消空格作为默认分隔符,如:
wenv for "eol=#" %i in ( 文件 ) do (set a=%i ; echo $${a})
如果一行中间有空格,变量a的值现在是会截断的,不符合现状。
当参数"demils= "时空格才作为分隔符。

另switch 1111作为默认,便于记忆。

[ 本帖最后由 zhaohj 于 2010-10-25 00:08 编辑 ]
回复

使用道具 举报

613#
发表于 2010-10-25 00:13:33 | 只看该作者
for 命令还要慢慢熟悉,/F 文件部分我还没看
包括楼上那个 loop / break 目前还只能用在 /L 中

switch 1111 也可以,将第三个开关改为 USE_DEC,这样默认还是10进制
回复

使用道具 举报

614#
 楼主| 发表于 2010-10-25 00:29:07 | 只看该作者
原帖由 zhaohj 于 2010-10-24 23:58 发表
建议取消空格作为默认分隔符,如:
wenv for "eol=#" %i in ( 文件 ) do (set a=%i ; echo $${a})
如果一行中间有空格,变量a的值现在是会截断的,不符合现状。
当参数"demils= "时空格才作为分隔符。

另 ...


你可以加参数delims=来取消默认分隔符.这个你应该考虑到其它地方,总不能每次都要手工指定分隔符吧..

wenv for "eol=# delims=" xxx
可以取消默认的分隔符.和CMD的for命令设计是一样的.

for 设计是和cmd命令里面的for一样的,只是有一些功能没有实现,已经实现的功能用法都是一样的.

[ 本帖最后由 chenall 于 2010-10-25 00:35 编辑 ]
回复

使用道具 举报

615#
发表于 2010-10-25 00:34:04 | 只看该作者
for /f 中的loop有问题,没执行
for /l中测试正常,很好!命令体一下子缩短了不少,提高了效率。

不早了,各位晚安!

---------------------
刚看到,for /f 使用也正常了。辛苦了,再次道晚安!

[ 本帖最后由 zhaohj 于 2010-10-25 00:56 编辑 ]
回复

使用道具 举报

616#
发表于 2010-10-25 00:52:45 | 只看该作者
原帖由 zhaohj 于 2010-10-25 00:34 发表
for /f 中的loop有问题,没执行


先发的那个测试只是用在 /L 中,#613 有说明

现在 /F 中也可以 loop / break 了,下载链接还在 #611

收工了,呼呼~~~

[ 本帖最后由 tuxw 于 2010-10-25 00:54 编辑 ]
回复

使用道具 举报

617#
发表于 2010-10-25 10:20:15 | 只看该作者

回复 #616 tuxw 的帖子

有时间写个完整说明吧  增强的几个功能说明都分散在几个帖子里  不利于查找  这样也方便对新功能感兴趣的人进行测试
回复

使用道具 举报

618#
发表于 2010-10-25 16:59:57 | 只看该作者
for /f  ("string")测试出现了问题,记得以前是好的:
wenv set whid=$PCI\VEN_1000&DEV_0058=symmpi  ;这里是由chipci命令得到
wenv for /f "tokens=1-2 delims==" %i in ("${whid}") do (set ID=%i ; set ID=$${ID#$} ; set IDN=%j)

[ 本帖最后由 zhaohj 于 2010-10-25 17:07 编辑 ]

Snap1.jpg (41.39 KB, 下载次数: 76)

tuwx版测试

tuwx版测试

Snap2.jpg (45.08 KB, 下载次数: 74)

chenall版测试,结果正常

chenall版测试,结果正常
回复

使用道具 举报

619#
发表于 2010-10-25 17:28:33 | 只看该作者
改成下面也正常:
wenv set whid=$PCI\VEN_1000&DEV_0058=symmpi  ;这里是由chipci命令得到
wenv set whid=${whid#$}
wenv for /f "tokens=1-2 delims==" %i in ("${whid}") do (set ID=%i ; set IDN=%j)

Snap3.jpg (35.07 KB, 下载次数: 84)

tuxw版测试

tuxw版测试
回复

使用道具 举报

620#
发表于 2010-10-25 22:52:42 | 只看该作者
是对特殊字符$作为普通字符的处理不够,我再检查下

---------------------------------------------------------------
找到原因了,替换函数的问题,,还是对for命令理解不够。明天上传修复版

-----------------------------------------------------------------
修复 replace_str 处理 $ 符号的BUG
修复set var=string 后面 && 连写命令失败的BUG
修复call命令返回0时不设置?_WENV的BUG


wenv-tuxw-2010-10-26.zip (35.83 KB, 下载次数: 18)

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

使用道具 举报

621#
发表于 2010-10-26 12:19:46 | 只看该作者
debug off
wenv reset
chkpci -cc:01 /SRS_F6/SRSID.TXT | wenv set a=
wenv (set a=${a#$} ; set a=${a:0:-2})
wenv (set ID=${a%=} ; set IDN=${a#=})
pause --wait=10 continue...
wenv (echo a=${a} ; echo ID=${ID} ; echo IDN=${IDN})
debug off
pause && commandline
--------------------------
上面保存为makeoem.lst,用configfile /MAKEOEM.LST就失败,变量没有设置
但我在命令行下就正确,晕了

帮忙看一下错在哪里?

srsid.txt
PCI$
$PCI\VEN_1000&DEV_0622=symmpi
$PCI\VEN_1000&DEV_0624=symmpi
$PCI\VEN_1000&DEV_0628=symmpi
$PCI\VEN_1000&DEV_0030=symmpi
$PCI\VEN_1000&DEV_0032=symmpi
$PCI\VEN_1000&DEV_0050=symmpi
$PCI\VEN_1000&DEV_0054=symmpi
$PCI\VEN_1000&DEV_0058=symmpi
$PCI\VEN_1000&DEV_005E=symmpi
$PCI\VEN_1000&DEV_0056=symmpi
$PCI\VEN_1000&DEV_005A=symmpi
$PCI\VEN_1000&DEV_0640=symmpi
$PCI\VEN_1000&DEV_0646=symmpi
$PCI\VEN_1000&DEV_0062=symmpi

[ 本帖最后由 zhaohj 于 2010-10-26 12:27 编辑 ]

Snap10.jpg (40.64 KB, 下载次数: 72)

Snap10.jpg

Snap11.jpg (21.12 KB, 下载次数: 71)

configfile /SRS_F6/MAKEOEM.LST

configfile /SRS_F6/MAKEOEM.LST
回复

使用道具 举报

622#
发表于 2010-10-26 12:50:16 | 只看该作者
真见鬼了,下面命令行下正常
debug off
chkpci -cc:01 /SRS_F6/SRSID.TXT | wenv set a=
wenv get
----------
保存为test.lst,coonfigfile /test.lst就不正常,变量a消失。
回复

使用道具 举报

623#
发表于 2010-10-26 13:38:18 | 只看该作者
debug on
chkpci -cc:01 /SRS_F6/SRSID.TXT | wenv set a=

这两条命令试一下,看结果是不显示所有变量
回复

使用道具 举报

624#
发表于 2010-10-26 14:11:36 | 只看该作者
原帖由 tuxw 于 2010-10-26 13:38 发表
debug on
chkpci -cc:01 /SRS_F6/SRSID.TXT | wenv set a=

这两条命令试一下,看结果是不显示所有变量


debug on下是不行的,超出512字节就会出错。

关键问题是:命令行方式下都正常

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

使用道具 举报

625#
发表于 2010-10-26 14:15:07 | 只看该作者
chenall大侠看一下,新版怎么splashimage后显示异常?应该不是这个命令的问题,将UNIFONT /BOOT/GRUB/U16HZ挂起后,显示是正常的,换了最新的UNIFONT故障依旧。


挂起UNIFONT后正常

换图片文件也无用


[ 本帖最后由 hhh333 于 2010-10-26 14:28 编辑 ]
回复

使用道具 举报

626#
 楼主| 发表于 2010-10-26 14:55:34 | 只看该作者
原帖由 hhh333 于 2010-10-26 14:15 发表
chenall大侠看一下,新版怎么splashimage后显示异常?应该不是这个命令的问题,将UNIFONT /BOOT/GRUB/U16HZ挂起后,显示是正常的,换了最新的UNIFONT故障依旧。
103001

挂起UNIFONT后正常
103002
换图片文 ...


可不可以把附件传上来我试试看.

另外你是从哪里下载的unifont?因为后面的版本我没有传到grub4dos-chenall.googlecode.com上.

最新版是10月24日的.新的下载地址:

http://grubutils.googlecode.com

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

使用道具 举报

627#
发表于 2010-10-26 15:15:36 | 只看该作者

回复 #626 chenall 的帖子

用10月24日的版本没有问题了。
回复

使用道具 举报

628#
发表于 2010-10-26 16:08:26 | 只看该作者
原帖由 zhaohj 于 2010-10-26 14:11 发表


debug on下是不行的,超出512字节就会出错。

关键问题是:命令行方式下都正常


我初步测试了下,发现有时正常有时不正常,不正常的时候是 wenv 根本就没有运行,这个问题很奇怪,麻烦你用原版测试一下,将正常的结果贴出来看看。我不会用chkpci,不知道它正常时应该是什么样子的。
回复

使用道具 举报

629#
发表于 2010-10-26 16:18:14 | 只看该作者
可能新版grub4dos有点问题,我运行C大的CSPE(grub.exe已换成新版),也出问题,正在跟踪...
发现后面B盘无故丢了...

[ 本帖最后由 zhaohj 于 2010-10-26 16:31 编辑 ]

Snap1.jpg (128.44 KB, 下载次数: 77)

Snap1.jpg

Snap2.jpg (102.87 KB, 下载次数: 74)

Snap2.jpg
回复

使用道具 举报

630#
发表于 2010-10-26 16:33:06 | 只看该作者
@chenall
echo 命令现在不能输出中文了

问题在这里
if(*arg < (char)p_cmd_list.flags))  // 中文字符当负值了,比较时就退出了,强制转换下正常
    return wenv_help_ex(p_cmd_list.flags >> 8);
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-26 17:23

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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