无忧启动论坛

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

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

  [复制链接]
781#
发表于 2010-11-13 16:47:52 | 只看该作者
现在的引号处理应该是个可以接受的方案了
1.find 命令未到到目标时将内置变量 ?_WENV 的值清空
    为了适应 WENV find ... | WENV set a=  这种不判断返回值的用法

2.check -e 改回只对左边的串转义, 实在需要两边转义的用 -ee

3.check 处理引号规则变化

    不含空格,没有用引号括起来的串都可以直接比较
    引号作界定符时,必须使用紧凑语法

    对左边的串,如果第一个字符是引号,试图查找配对的引号
    配对引号后面必须紧跟操作符,找不到时,引号作为普通字符

    对右边的串,如果操作后第一个字符是引号,试图查找配对的引号
    配对引号后面必须是一个空格然后紧跟子命令或结束符,否则引号作为普通字符

    简单一点说就是:
    希望引号作为符时,命令行中不要有多余的空格
    不希望引号做界定符时,操作符两边各留一个空格
       

4.set -x=delims 修复多个delims连续时的BUG
    另外,这里delims跟for命令中的意义不同
    for 命令中将delims中的每个字符都当作分隔符
    这里是将delims整个串当作分隔符

    如果要用 " 或 , 这种特殊字符为分隔,需要用引号括起来
    此时不省略,N 且逗号前不能有空格
   

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

wenv-tuxw-2010-11-13.zip

52.53 KB, 下载次数: 13, 下载积分: 无忧币 -2

回复

使用道具 举报

782#
发表于 2010-11-13 16:51:12 | 只看该作者
原帖由 zhaohj 于 2010-11-13 16:38 发表
11-12号的版本替换11-9版本后,我发布的SRSF6没法通过。
这次改动与前一版本不兼容,不知原来的参数改动了哪些?

是否能在11-9版本基础上,改良“\"问题。功能增加不要影响原来的参数。


不好意思,带来麻烦了
9-12 号间动作比较大,一下子难以说是哪里引起的
请用13号的版先测试,最好能定位出是哪个语句不正常,这样容易找问题
回复

使用道具 举报

783#
发表于 2010-11-13 17:16:20 | 只看该作者
哪里的话,感谢你还来不及呢!

13号的版本比较好一点,-e参数有变化,有个地方出现问题了。
我查查是哪个问题

check我都没有带参数,怎么会错误呢?

[ 本帖最后由 zhaohj 于 2010-11-13 17:26 编辑 ]

Snap1.jpg (84.56 KB, 下载次数: 42)

Snap1.jpg
回复

使用道具 举报

784#
发表于 2010-11-13 17:33:09 | 只看该作者
找到问题了:

Snap2.jpg (30.23 KB, 下载次数: 37)

Snap2.jpg
回复

使用道具 举报

785#
发表于 2010-11-13 23:21:42 | 只看该作者
原帖由 zhaohj 于 2010-11-13 17:33 发表
找到问题了:


汗,手误,判断引号后的操作符时直接将==的条件复制了5次,忘了改细节,有引号时其它操作符都不正常

wenv-tuxw-2010-11-13.zip

52.55 KB, 下载次数: 13, 下载积分: 无忧币 -2

回复

使用道具 举报

786#
发表于 2010-11-13 23:49:14 | 只看该作者
在本地建了个wenv的svn库管理源代码,以后改动除错会方便点
回复

使用道具 举报

787#
发表于 2010-11-14 00:18:09 | 只看该作者
上面的错误没有了,但导致结果错误。

现在难找了。

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

使用道具 举报

788#
发表于 2010-11-14 00:38:30 | 只看该作者
主要检查用到check的地方,这几天的改变主要是check跟你关系较大
回复

使用道具 举报

789#
发表于 2010-11-14 01:26:27 | 只看该作者
前一个版本(13号),有两个流程是通过的,这两个流程没用到 check " "<-,现在都没有通过了。
回复

使用道具 举报

790#
发表于 2010-11-14 01:40:41 | 只看该作者
请教一个问题,一个菜单,想调用另一个菜单后返回到指定地方,有什么办法?
如:
#0
title
...
#1
title
...
#2
configfile (fd1)/1.lst

就是在#2的configfile (fd1)/1.lst执行完毕,返回到#1。
回复

使用道具 举报

791#
发表于 2010-11-14 08:21:45 | 只看该作者
原帖由 zhaohj 于 2010-11-14 01:26 发表
前一个版本(13号),有两个流程是通过的,这两个流程没用到 check " "

将这个文件传上来大家一起看一下
原帖由 zhaohj 于 2010-11-14 01:40 发表
请教一个问题,一个菜单,想调用另一个菜单后返回到指定地方,有什么办法?
...
就是在#2的configfile (fd1)/1.lst执行完毕,返回到#1。


方法很多,但都不一定完美

一、利用default文件,在1.lst中修改default文件

二、这个方法需要m.lst可写,而且 m.lst 本身不是自动执行的

m.lst
================
#efault 1
cat --locate=default --replace=#efault (fd0)/m.lst

title 0
echo title 0
pause any key ...

title 1
configfile (fd0)/1.lst
pause any eky ...

1.lst
================
title 0
echo title 0
pause any eky ...
cat --locate=#efault --replace=default (fd0)/m.lst
configfile (fd0)/m.lst

三、通过标志在入口处分流

m.lst
===============
default 20
timeout 1

#0 隐藏菜单
title
clear

#1
title 1
configfile 1.lst

#20 隐藏入口菜单
titile
WENV get MYFLAG && fallback --go 1 ! fallback --go 0

如果 m.lst 本来就需要自动执行,改一下 go 0
在1.lst中设置变量 MYFLAG 后 configfile m.lst
或者用内存变量,用calc判断,就不需要外部命令了

四、完全动态生成菜单
可以先放一个模板在内存中,需要时修改部分内容再configfile它
回复

使用道具 举报

792#
发表于 2010-11-14 13:11:53 | 只看该作者
ftp://60.190.19.108/zzhsh/20101110SRSF6返回模块,无DOS
是9号的版本,你测试一下。
回复

使用道具 举报

793#
发表于 2010-11-14 23:22:12 | 只看该作者
跟踪发现你的GETSECT.BAT下面没通过:
WENV set -t _ini_fn=${INIFILE% [}
WENV set -t _ini_sc=${INIFILE#${_ini_fn}}
WENV check " "<-"${_ini_sc}" (set -t _ini_buf=$${_ini_sc#]} ; set _ini_sc=$${_ini_sc%% })
----------
WENV set INIFILE=(fd1)/OEM [Files.scsi.lsi_sas] 0x200000

_ini_buf没生成,set _ini_sc=[Files.scsi.lsi_sas] 0x200000

说明字符串含空字符处理有问题

[ 本帖最后由 zhaohj 于 2010-11-14 23:45 编辑 ]
回复

使用道具 举报

794#
发表于 2010-11-15 00:06:26 | 只看该作者
我这里测试 GETSET.BAST 是正常的

刚下了SRSF6.ISO 测试,我对SRS不太懂,在虚拟机里测试,3个选择菜单都转向 error.lst,我不知道正常应该是什么样子?

用 winimage 替换 wenv 后发现 fat 不工作了,连帮助都不能显示

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

我只要修改ISO,fat 就不工作,error 13

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

在虚拟机这样试了下:
1.将 wenv 先复制到硬盘
2.从 SRSF6.ISO 启动,此时 FAT 可以正常工作
3.用 FAT  从硬盘上复制 wenv 替换 (fd2)/ext/wenv

再执行3个驱动菜单,中途不会报错,表现和10-9一样,都转向error.lst ,提示没找到驱动

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

使用道具 举报

795#
发表于 2010-11-15 00:43:22 | 只看该作者
原帖由 zhaohj 于 2010-11-14 23:22 发表
跟踪发现你的GETSECT.BAT下面没通过:
WENV set -t _ini_fn=${INIFILE% [}
WENV set -t _ini_sc=${INIFILE#${_ini_fn}}
WENV check " "
...
说明字符串含空字符处理有问题


是有问题,我测试getsect的恰好是没空格的
这个是引号规则的问题,操作右边引号界定符的规则是第一个引号要紧跟操作符,最后一个引号后面必须是结束符或空格+子命令,漏判了集合命令的括号这种情况

===================
仍然要求紧凑语法,集合命令的 ( 和子命令间不允许有空格,否则不会将引号当作界定符
但这里传的这个版没有这一要求,即
WENV check " "<-"${a}" ( echo ok ; get)
现在也会通过,但这样不严谨,在复杂字符串中可能会错判,下次上传会要求
WENV check " "<-"${a}" (echo ok ; get)

[ 本帖最后由 tuxw 于 2010-11-15 01:23 编辑 ]

wenv-tuxw-2010-11-15.zip

52.6 KB, 下载次数: 15, 下载积分: 无忧币 -2

回复

使用道具 举报

796#
发表于 2010-11-15 08:54:46 | 只看该作者
还有一个引号引起的问题,你下载的SRSF6.IMG中(最好用VDM打开修改),有TXT2PCI.LST、SIF2PCI.LST、OEM2PCI.LST 3个文件,都是提取ID信息的。
打开一个TXT2PCI.LST,其中一行
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
这样生成的(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
就没有问题了,说明引号的问题目前这样的处理是有问题的。
你讲到check比较,左边的字符串前后引号不参与运算,可能与这有关。如果这样,这里应改成check "$${a:0:4}"<>PCI\ loop
但这样也会引起问题,当右边的字符串中间包含空格字符的时候,会出问题的。

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

使用道具 举报

797#
发表于 2010-11-15 09:20:32 | 只看该作者
还是规则考虑不全面,判断引号后的子命令时没有包含loop/break,所以这两个命令都会出错

不是左边的串引号不参与计算,是引号被判为界定符时不参与比较。
这个是为了适应 <-,如果不去掉引号,查找结果显然是不对的。

[ 本帖最后由 tuxw 于 2010-11-15 12:26 编辑 ]

wenv-tuxw-2010-11-15.zip

52.64 KB, 下载次数: 14, 下载积分: 无忧币 -2

回复

使用道具 举报

798#
发表于 2010-11-15 09:22:58 | 只看该作者
引号还是当做普通字符处理不会搞晕。
回复

使用道具 举报

799#
发表于 2010-11-15 09:35:56 | 只看该作者
现在问题已经逐渐明朗了,只要完善这个引号规则就OK了。
现在不可能再走回去了,如果简单的将引号作普通字符处理,check的实用性将大打折扣,内部含空格、引号、操作符时,大多不能正工作,<-也只能在简单串中查找
回复

使用道具 举报

800#
发表于 2010-11-15 12:56:18 | 只看该作者
嗯,已经OK啦。现在也兼容11-9的版本。

下面这个版本测试比较方便点

SRSF6.rar

79.51 KB, 下载次数: 17, 下载积分: 无忧币 -2

回复

使用道具 举报

801#
发表于 2010-11-15 14:37:01 | 只看该作者
几点建议供你参考下

1.所有涉及到启动、当前设备的保存恢复都使用32位的calc
  calc *0x60010=*0x8280
  这条语句同时保存了 0x8284,我们不知道 0x8284 的作用时,它有可能被其它命令改变,
  而 calc *0x8280=*0x60010 恢复时,又将 0x8284 恢复为之前保存的值,有隐患
  
  实际上这个菜单不需要64位计算,可以在 wenv reset 后 switch use_x32=on 一次改变
  (SRSF6.LST 中第一个 command --set-path=(fd2)/ext/ 后也要打开这个开关)
  
2.二值切换菜单可以简洁些,如  Firadisk/Wvblk 切换
wenv calc *0x60030=*0x60030+1&1
wenv check *0x60030==1 && echo -n Selected is Firadisk ! echo -n Selected is Wvblk
pause , Press any key continue...
  
  x86/x64 切换同理
  
  debug 状态切换
wenv call debug
wenv check ${?_WENV}==2 && debug off ! debug on
wenv call debug
wenv check ${?_WENV}==2 && pause Debug is now on ... ! pause Debug is now off ...

3.echo不会自动缩进,希望缩进时在 wenv echo 后面加个参数如 -e
echo                    ........................................
echo                    .                                      .
echo                    .  Program Process ......              .
echo                    .                                      .
echo                    ........................................

wenv echo -e                    .  Program Process ......
              .
4.cat --locate 可以直接返回查找结果数量不需自己分析输出计算目录个数
   cat --locate=// (fd2)/_LIST | WENV set -t a=
   如果目录太多,输出被截断,计算结果不正确
   
   用 wenv call 调用,找到的结果在 ?_WENV 中
   wenv call cat --locate=// (fd2)/_LIST
   
5.选择一个驱动后,Return GRUB4DOS Boot Menu
   当前设备没有恢复到最第一菜单的状态,再次执行 find /menu.lst, ... 会失败
   (可能SRSF6就是这样要求的,这个我不太懂)
   
只看到这里,还没深入
回复

使用道具 举报

802#
发表于 2010-11-15 15:03:24 | 只看该作者
内置 echo 命令支持缩进输出的小技巧

echo -e 1\x0D          abc
回复

使用道具 举报

803#
发表于 2010-11-15 16:53:26 | 只看该作者
谢谢你的建议,有很多地方有待优化。
刚才在查debug状态时,发现configfile会改变debug状态为debug 1,这个看来是grldr的bug
回复

使用道具 举报

804#
发表于 2010-11-16 11:08:41 | 只看该作者
下面的版本一直找不到问题所在,麻烦tuxw帮忙看一下

title      *[A] Directory table of contents schedule method     
title      * Manual Input Driver path

这两个菜单都不正常

奇怪的地方:/ext/menusrs.lst与/ext/list.lst写法是相同的,一个菜单能执行,另一个就无法执行。

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

test3.rar

77.65 KB, 下载次数: 16, 下载积分: 无忧币 -2

回复

使用道具 举报

805#
发表于 2010-11-16 14:33:13 | 只看该作者
找到问题了,是WENV返回值引起的问题:

原菜单:
#14
title
clear
WENV call cat --length=0 ()${srspath}TXTSETUP.OEM ]]| find --set-root ${srspath}TXTSETUP.OEM
WENV call cat --length=0 ()${srspath}TXTSETUP.OEM ]]& map --mem=0xB000 ()${srspath}TXTSETUP.OEM (rd) && FAT copy (rd)+1 (fd1)/OEM
cat --length=0 (fd1)/OEM && write 0x60050 3 && WENV (calc *0x60060=*0x82a0 ; calc *0x60070=*0x829c) && goto 18
goto 15


改成:
#14
title
clear
WENV call cat --length=0 ()${srspath}TXTSETUP.OEM || WENV call find --set-root ${srspath}TXTSETUP.OEM || GOTO 15
WENV call map --mem=0xB000 ()${srspath}TXTSETUP.OEM (rd)
FAT copy (rd)+1 (fd1)/OEM
cat --length=0 (fd1)/OEM && write 0x60050 1 && WENV (calc *0x60060=*0x82a0 ; calc *0x60070=*0x829c)
goto 18


改成这样问题解决。这样要怀疑返回值的问题了。
是否改动了]]|、]]&、]]!几个连接符?或原来就有问题?

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

使用道具 举报

806#
发表于 2010-11-16 15:50:59 | 只看该作者
连接符没有改过,而且我单独测试这个连接符也是正常的
wenv set F=/T1.TXT
wenv call cat --length=0 ()${F} ]]& echo ok
Filesize is 0x37DF
ok

wenv set F=/T2.TXT
wenv call cat --length=0 ()${F} ]]| find --set-root --ignore-floppies ${F}
Error 15: File not found
回复

使用道具 举报

807#
发表于 2010-11-16 16:01:15 | 只看该作者
奇怪的问题,我手动测试也都正常。
下面这句是否有问题:
cat --length=0 (fd1)/OEM && write 0x60050 3 && WENV (calc *0x60060=*0x82a0 ; calc *0x60070=*0x829c) && goto 18
--------------
WENV (calc *0x60060=*0x82a0 ; calc *0x60070=*0x829c) 这样的语句返回值是否正常?

测试也是正常的
WENV (calc *0x60060=*0x82a0 ; calc *0x60070=*0x829c) && echo ok
显示ok

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

使用道具 举报

808#
发表于 2010-11-16 16:13:29 | 只看该作者
最有可能是这句
WENV call cat --length=0 ()${srspath}TXTSETUP.OEM ]]& map --mem=0xB000 ()${srspath}TXTSETUP.OEM (rd) && FAT copy (rd)+1 (fd1)/OEM

WENV call cat --length=0 ()${srspath}TXTSETUP.OEM ]]& map --mem=0xB000 ()${srspath}TXTSETUP.OEM (rd) 是个整体,返回值是否正确?
------------
手动测试也正常的。
非常郁闷!!!

不知我上传的你测试过没有?这个问题不解决,这个隐藏的bug影响很大。

goto语句不会出问题吧?

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

使用道具 举报

809#
发表于 2010-11-16 16:22:57 | 只看该作者
集合命令返回值取决于最后一条命令
WENV (calc *0x60060=*0x82a0 ; calc *0x60070=*0x829c) && goto 18
这条命令将取决于你的当前设备环境,0x829C 的值为0时,后面的 goto 不会执行的

这样测试:
wenv (calc 1 ; calc 0) && echo,交换集合命令内两条语句的顺序,输出结果不同

同样的,call 命令连写时返回值取决于已被执行的最后一条语句的返回值

这样测试
wenv call debug 0 ]]] debug ]]& echo ok
wenv call debug 1 ]]] debug ]]& echo ok
回复

使用道具 举报

810#
发表于 2010-11-16 16:33:18 | 只看该作者
1. find 增加 -e 参数用于查找特殊字符
    wenv find -e #2\r\ntitle file
    这条命令定位到2号菜单

2. find 中的查找串支持引号括起来,可以查找带空格的内容
    引号被判断为界定符的条件是第一个字符必须是引号,且最后引号后跟的是空格+(或/
    wenv find "abc"456 /T1.txt   #查找 "abc"456
    wenv find "abc"456" /T1.txt  #查找 abc"456

这可特性可以用于动态刷新菜单而不需要每次改写菜单都要重新计算偏移值,比如某个菜单实现两个值的切换,可以在菜单上显示当前的状态

wenv-tuxw-2010-11-16.zip

52.86 KB, 下载次数: 15, 下载积分: 无忧币 -2

回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-1 14:12

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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