无忧启动论坛

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

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

  [复制链接]
811#
发表于 2010-11-16 16:34:01 | 只看该作者
]]]  ]]& 再|| &&会出什么问题?
]]]  ]]&只能后接内部命令,外部命令只能用|| &&了。如:
WENV call cat --length=0 ()${srspath}TXTSETUP.OEM ]]& map --mem=0xB000 ()${srspath}TXTSETUP.OEM (rd) && FAT copy (rd)+1 (fd1)/OEM
回复

使用道具 举报

812#
 楼主| 发表于 2010-11-16 16:49:24 | 只看该作者
刚上传了一个新的GRUB4DOS测试版本。

尝试支持多个外部命令同时运行。(即外部命令再次调用其它外部命令)

例子
wenv call exec chkpci ${pcicfg}

注:中间的exec是为了兼容之前的设计。
可以通过修改wenv代码使得不用加exec字样(但是这样将不兼容之前的GRUB4DOS版本)。
修改以下代码。
        arg = skip_to(0,cmd); /* 取得参数部份 */
        nul_terminate(cmd); /* 取得命令部份 */
        ret = builtin_cmd(cmd, arg, flags);
改为
//        arg = skip_to(0,cmd); /* 取得参数部份 */
//        nul_terminate(cmd); /* 取得命令部份 */
        ret = builtin_cmd(NULL, arg, flags);
回复

使用道具 举报

813#
发表于 2010-11-16 17:13:54 | 只看该作者
不兼容没关系,tuxw马上编译一下吧
回复

使用道具 举报

814#
发表于 2010-11-16 17:36:02 | 只看该作者
我觉得保留exec比较好,这样明确的知道运行了两个外部命令。

@chenall
是否支持第二个外部命令再跟exec第三个外部命令?
回复

使用道具 举报

815#
发表于 2010-11-16 17:43:46 | 只看该作者
原帖由 zhaohj 于 2010-11-16 16:34 发表
]]]  ]]& 再|| &&会出什么问题?
]]]  ]]&只能后接内部命令,外部命令只能用|| &&了。如:
WENV call cat --length=0 ()${srspath}TXTSETUP.OEM ]]& map --mem=0xB000 ()${srspath}TXTSETUP.OEM (rd) && FAT  ...

]]]  ]]& 整体被视为一条命令,它们都由wenv处理,返回值由最后被执行的语句决定
到 || && 后,这里的命令行由Grub4Dos解析,这种混合写法是支持的
回复

使用道具 举报

816#
 楼主| 发表于 2010-11-16 17:47:01 | 只看该作者
原帖由 tuxw 于 2010-11-16 17:36 发表
我觉得保留exec比较好,这样明确的知道运行了两个外部命令。

@chenall
是否支持第二个外部命令再跟exec第三个外部命令?


可以的,你可以试一下.
回复

使用道具 举报

817#
发表于 2010-11-16 18:03:38 | 只看该作者
call exec wenv... ]]& exec wenv ...
这样有可能在read中实现复杂语句,带参数的批处理
回复

使用道具 举报

818#
发表于 2010-11-16 18:18:42 | 只看该作者
WENV find ${ID} (fd1)/OEM && WENV calc a=${?_WENV}

不知这样的语句能否简化成这样:

WENV find ${ID} (fd1)/OEM ]]& calc a=${?_WENV}
这样就调用一次WENV
回复

使用道具 举报

819#
发表于 2010-11-16 21:11:32 | 只看该作者
可是可以的,但动作会比较大,每一条子命令都要做递归处理
而且call命令中的连接符要重新定义,可能要变成这样  wenv call ... ]]& call ... &&] call ...
回复

使用道具 举报

820#
发表于 2010-11-17 00:10:37 | 只看该作者
    GET         显示变量/判断变是是否存在

文档说明中的一个错字。


命令使用参数和ms-dos有很多是一样的,这样减少了重复学习命令的时间,这个真是太好了。

[ 本帖最后由 freesoft00 于 2010-11-17 00:17 编辑 ]
回复

使用道具 举报

821#
发表于 2010-11-17 02:20:17 | 只看该作者
偿试扩展 ]]&, ]]|, ]]] 命令连写符到其它子命令
目前只支持5个子命令 check, call, calc, echo, switch
其它子命令返回点较多,处理起来较麻烦,测试看看,有必要的话就都扩展了,否则就取消这个特性

连接符前后至少各有一个空格,后面必须是子命(call 内置命令连写时不能省略 call)
wenv echo abc ]]] echo def  # 输出两行
wenv echo abc ]]] def       # 不被判为连接符,输出 abc ]]] def
如不这样限制,带字符串的子命令将不能处理含连接符的字符串

除call外,只有子命令正常执行时,才会执行后面的连写命令


wenv check abc=abc ]]| echo ok
前一条语法错误,虽然它会返回0,但后面的 echo 不会执行

wenv check abc=abc || echo ok,这句会执行echo命令
这点跟 grub4dos 的连接符 || 不同,因为grub4dos不知道外部命令的执行情况,只能根据返回值处理
。同样的原因,wenv 不知道grub4dos内置命令的处理规则,所以call命令是例外的,只能根据返回值来决定是否继续执行。

原帖由 freesoft00 于 2010-11-17 00:10 发表

文档说明中的一个错字。

命令使用参数和ms-dos有很多是一样的,这样减少了重复学习命令的时间,这个真是太好了。

谢谢指正,已更改

[ 本帖最后由 tuxw 于 2010-11-17 10:49 编辑 ]

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

20.57 KB, 下载次数: 21, 下载积分: 无忧币 -2

回复

使用道具 举报

822#
发表于 2010-11-17 08:45:05 | 只看该作者
get、for也应该支持
wenv get a ]]& call ...使用较多
wenv for ...do ( )命令集中是否支持?
wenv check string <op> string wenv-command是否应该改成:
wenv check string <op> string 【]]&/]]|/]]]】wenv-command
wenv check string <op> string 【&&/||/!】grub-command
回复

使用道具 举报

823#
发表于 2010-11-17 09:55:29 | 只看该作者
现在只是测试,有必要的话,所有子命令都可以支持的,昨天晚上时间来不及,只改了几个命令

check 比较特殊,因为以前就可以直接跟命令,所以保留了这一特性,可以跟子命令,也可以跟连接符。如果以后确定全部支持连接符,可以去掉直接跟命令这个特性,便于用统一的方式来处理连接符。

另外集合命令也可能取消支持,因为功能重复了,可以用  ]]] 来代替 ; 做集合命令,这样编程简化点

注意
连接符组成子多个子命令实际上是一条 wenv 命令,多个子命令中引用同一变量时,需要用 $$ 甚至 $$$,原因这里有说明:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=180142&page=4#pid2079836

以后决定支持全部扩展连接符的话,可能通过改变扫描替换变量的次序来避免这一点。
但有个特性会损失,子命令名可能不能用变量来代替,比如:
write (md)0x300+1 calc 1+1\0
wenv *0x60000$
这个被支持是因为在没有确定子命令之前就扫描并了命令行中的变量,这样知道了子命令为 calc

如果不提前扫描,只能这样
write (md)0x300+1 1+1\0
wenv calc *0x60000$

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

使用道具 举报

824#
发表于 2010-11-17 12:56:53 | 只看该作者
所有子命令支持 ]]&, ]]|, ]]] 连接符
取消了集合命令(用 ]]] 代替分号实现集合命令)

取消原来的集合命令支持后,用非常简洁方法实现了连接符的扩展,不需要对每一个子命令进行改造
除了 call 命令连写跟以前不一样(不以省略 call),其它用法跟之前兼容

wenv-tuxw-2010-11-17.zip

52.68 KB, 下载次数: 24, 下载积分: 无忧币 -2

回复

使用道具 举报

825#
发表于 2010-11-17 15:52:08 | 只看该作者

回复 #824 tuxw 的帖子

呵,这样就简洁多了。可以避免多次重复调用wenv.
建议管道命令|也能在此连写至末尾。
如 wenv set a=123 ]]& echo ${a} | set b=
实现给b赋值。

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

使用道具 举报

826#
发表于 2010-11-17 16:30:02 | 只看该作者
原帖由 zxw 于 2010-11-17 15:52 发表
呵,这样就简洁多了。可以避免多次重复调用wenv.
建议管道命令|也能在此连写至末尾。
如 wenv set a=123 ]]& echo ${a} | set b=
实现给b赋值。


这个不行,管道是 grub4dos 的符号
回复

使用道具 举报

827#
 楼主| 发表于 2010-11-17 16:38:09 | 只看该作者
新的GRUB4DOS版本已经上传,重写优化了command_func(外部命令调用)的代码。

现在写外部命令可以省去以下几行。
        void *p = &main;
        char *arg = p - (*(int *)(p - 8));
        int flags = (*(int *)(p - 12));
直接把主函数声明为
int main(char *arg,int flags)就可以了。
回复

使用道具 举报

828#
发表于 2010-11-17 17:41:42 | 只看该作者
问C大,下面错误是什么?
我一直找不到这个错误

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

Snap1.jpg (9.97 KB, 下载次数: 66)

Snap1.jpg

Snap2.jpg (13.14 KB, 下载次数: 49)

Snap2.jpg
回复

使用道具 举报

829#
发表于 2010-11-17 18:00:58 | 只看该作者
好像是调用批处理出错
奇怪的是单步运行都没有问题,但批处理最后会出错。
下面这个是TUXW的批处理:

!BAT
:设置变量INIFILE=INI文件名 [段名],打印该段内容
:
:参数检查
WENV get INIFILE || WENV (echo Variable INIFILE not defined ; call kernel)
WENV reset _ini_*
:
:定义输出文件
WENV set OUTFILE=(fd2)/OUTFILE
WENV call cat --length=0 ${OUTFILE} ]]& exec FAT del ${OUTFILE}
:文件名, 段名, 缓冲区
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%% })
:
:保存当前debug状态
debug status | WENV set -t _ini_db= && WENV set _ini_db=${_ini_db## }
:
:检查文件存在
debug 0 || WENV call cat --length=0 ${_ini_fn} || WENV (echo not found file ${_ini_fn} ; reset _ini_* ; call kernel)
debug 1
:
:记录偏移1
WENV find ${_ini_sc} ${_ini_fn} | WENV set -t _ini_s1=
WENV get _ini_s1 || WENV (echo not found sect ${_ini_sc} ; call debug ${_ini_db} ; reset _ini_* ; call kernel)
:
:查找下一个可能的段
WENV calc _ini_s2=_ini_s1+1
WENV find -skip=${_ini_s2} [ ${_ini_fn} | WENV set -t _ini_s2=
:如没找到,取文件长度,并转化为16进制
WENV get _ini_s2 || WENV call cat --length=0 ${_ini_fn} | WENV set -t _ini_s2= && WENV set _ini_s2=0x${_ini_s2}
WENV check " "<-"${_ini_s2}" set _ini_s2=${_ini_s2## }
:
:起始位置, 字节数
WENV (calc _ini_s1=_ini_s1+${_ini_sc,?} ; calc _ini_s2=_ini_s2-_ini_s1)
:
:显示
WENV get _ini_buf || WENV call cat --skip=${_ini_s1} --length=${_ini_s2} ${_ini_fn}
:
:输出
WENV get _ini_buf && WENV (call map --rd-base=${_ini_buf} ; call map --rd-size=${_ini_s2} ; reset INI_OK)
WENV get _ini_buf && WENV call cat --skip=${_ini_s1} --length=${_ini_s2} ${_ini_fn} > (rd)+1 && WENV set INI_OK=Y
WENV get INI_OK && WENV get OUTFILE && WENV call exec FAT copy /o (rd)+1 ${OUTFILE}
:
:恢复环境
WENV (call debug ${_ini_db} ; reset _ini_* ; reset INI_OK)
clear
回复

使用道具 举报

830#
发表于 2010-11-17 18:48:09 | 只看该作者
我在FTP://60.190.19.108中zhhsh/20101110SRSF6返回模块,无DOS/
上传了最新grldr测试版的srsf6,OEM驱动这步无论如何都通不过

问题出在makeoem.lst中下面:

#通过提取[Files.scsi.${scsi}]内容获取sys、inf后缀名的文件名
checkrange 2 debug && echo @@@extraction [Files.scsi.*] information
WENV set INIFILE=(fd1)/OEM [Files.scsi.${scsi}] 0xB00000
(fd2)/GETSECT.BAT
cat --length=0 (fd2)/OUTFILE || configfile (fd2)/ERROR.LST
FAT copy /o (fd2)/OUTFILE (fd1)/SYSINF


大家找找原因。
回复

使用道具 举报

831#
发表于 2010-11-18 10:06:03 | 只看该作者
如果用的是最新的WENV,已经不支持集合命令了,那个批处理要适当修改
回复

使用道具 举报

832#
发表于 2010-11-18 11:18:36 | 只看该作者
@tuxw:
FOR ...DO 后面支持集合命令吗?
因为for do可能要做很多判断,没有集合命令很不方便。

如下面:
WENV for /f "eol=# delims=;" %i in ( (fd2)/_LIST ) do (set a=$u,%i  ; check "\"<-"$${a}" set a=$${a!\=/}  ; check "$${a:-1}"<>"/" set a=$${a}/ ; echo $${a})  > (rd)+1
改成这样?
WENV for /f "eol=# delims=;" %i in ( (fd2)/_LIST ) do (set a=$u,%i ]]] check "\"<-"$${a}" set a=$${a!\=/} ]]] check "$${a:-1}"<>"/" set a=$${a}/ ]]] echo $${a}  > (rd)+1

------------
还有下面:
WENV get _ini_buf && WENV call map --rd-base=${_ini_buf} ]]] call map --rd-size=${_ini_l}
改成这样?
WENV get _ini_buf ]]& call map --rd-base=${_ini_buf} ]]] call map --rd-size=${_ini_l}

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

使用道具 举报

833#
发表于 2010-11-18 11:36:26 | 只看该作者
是的,do后面的括号不要了,第二个 map 前面也要有 call

====================
for 后面可能有点问题,我再想一下

[ 本帖最后由 tuxw 于 2010-11-18 11:38 编辑 ]
回复

使用道具 举报

834#
发表于 2010-11-18 11:53:00 | 只看该作者
]]!感觉也需要,功能与grldr一样:“否则”
回复

使用道具 举报

835#
发表于 2010-11-18 12:08:11 | 只看该作者
set -x=delims,N a=${b}, 当第N段不存在时删除变量a(之前是直接取b值)

这样分离参数非常方便
wenv set P=/T1.TXT [Disks] 0x600000
分离出三个参数
wenv set -t -x=,0 p1=${P}   # delims为空格时,可以省略
wenv set -t -x=,1 p2=${P}
wenv set -t -x=,2 p3=${P}
当对应的参数不存在时,相应的参数变量不存在

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

wenv-tuxw-2010-11-18.zip

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

GETSECT.zip

677 Bytes, 下载次数: 30, 下载积分: 无忧币 -2

回复

使用道具 举报

836#
发表于 2010-11-18 12:47:55 | 只看该作者
原帖由 zhaohj 于 2010-11-18 11:53 发表
]]!感觉也需要,功能与grldr一样:“否则”

正考虑这个问题

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

添加 ]]! 连接符,只作了简单测试
wenv get a ]]& echo yes ]]! echo not
太复杂的连接命令没测试

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

wenv-tuxw-2010-11-18.zip

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

回复

使用道具 举报

837#
发表于 2010-11-18 13:40:37 | 只看该作者
]]! 连接符有问题

Snap1.jpg (18.51 KB, 下载次数: 72)

Snap1.jpg
回复

使用道具 举报

838#
发表于 2010-11-18 14:24:01 | 只看该作者
这个连接符为何要3个符号?两个不是行了吗?
]& 、]|、 ]]、 ]!

哇,C大新版本已经把cat命令默认已经打开。

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

使用道具 举报

839#
 楼主| 发表于 2010-11-18 15:27:05 | 只看该作者
@tuxw
我觉得还是应当保留 ; 的功能。

最近连续时间不多,比较零散。

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

使用道具 举报

840#
发表于 2010-11-18 15:28:34 | 只看该作者
原帖由 zhaohj 于 2010-11-18 14:24 发表
这个连接符为何要3个符号?两个不是行了吗?
]& 、]|、 ]]、 ]!

哇,C大新版本已经把cat命令默认已经打开。



这个是为了在复杂环境下尽可能避免符号冲突,就目前的应用来说,简化成两个字符是可以的

下面这个修复了 ]]! 的问题
注意: ]]! 之前至少有一个 ]]& 或 ]]|
不是前面条件为假时执行行 ]]!,而是前面的任一个连接命令不能继续执行时,就跟到 ]]!

wenv set a=1
wenv check ${a}==1 ]]& echo here 1 ]]! echo here 2
输出 here 1

wenv check ${a}==1 ]]| echo here 1 ]]! echo here 2
输出 here 2

@chenall
for 后面用 ]]] 代替集合命令有问题,这样 ]]] 后的子命令跟 for 平级了,不是跟在 do 后面执行的
待我想个比较简洁避免冗余的办法再改,用分号这个方法代码功能上重复了,现在wenv体积长得太快了

有可能是加上括号
wenv (sub1 ]]] sub2 ]]] sub3)
这样在现在代码基础上改造较少,不需要以前判断括号和分号那么多代码

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

wenv-tuxw-2010-11-18.zip

52.91 KB, 下载次数: 23, 下载积分: 无忧币 -2

回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-25 10:12

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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