无忧启动论坛

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

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

  [复制链接]
451#
 楼主| 发表于 2010-10-9 12:19:28 | 只看该作者
@paladin15
恕我不再回你类似的贴子了,纯属浪费时间和论坛资源。
回复

使用道具 举报

452#
发表于 2010-10-9 12:19:40 | 只看该作者
今天抽空写了下WENV的README.TXT,望大家补充:
一:变量赋值
   WENV set VAR=[$|L,][$input,][STRING]
   VAR:变量名,不超过8个字符,首字符必须是"a_z"/"A_Z"/"_"开始,除首字符外允许"0~9"数字;
        变量名区分大小写;
   $U,全转变为大写;
   $L,全转变为小写;
   $input,从键盘输入;
   STRING,提示;
   注:所有参数不区分大小写;
   变量值不能超过512个字节,最多允许自定义64-1个变量.
   如:1)根据提示从键盘输入,全转为大写后保持给srspath变量
         WENV set srspath=$u,$input,please input SRS driver path:
       2)设置变量a,并把值全转为大写
         WENV set a=ABCDabcd1234
         WENV set a=$u,${a}
         得到a=ABCDABCD1234
       3)清除某个变量
         WENV set a=        =后为空,清除变量a
       4)清除某些字符开头的所有变量
         WENV reset a*      清除a开头的所有变量
         WENV reset sr*     清除sr开头的所有变量
       5)清除所有变量
         WENV reset
二:字符串运算
   1: ${VAR:X:Y}
    提取第X个字符后面的Y个字符,如果X为负数则从倒数第X个开始提取Y长度的字符;
    如果Y的值为空则提取第X个字符后面的所有有字符;
    如果Y的值为负数,则去掉倒数Y个字符;
    WENV set a=ABCDabcd1234
    WENV set b=${a:4:4}     得到b=abcd
    WENV set b=${a:-8:4}    得到b=abcd
    WENV set b=${a:4:-4}    得到b=abcd
    WENV set b=${a:-8:-4}   得到b=abcd
   2: ${VAR#STRING}
    提取STRING字符串后面的内容,从左往右第一个位置开始
    WENV set a=ABCD;abcd;1234
    WENV set b=${a#;}       得到b=abcd;1234
   3: ${VAR##STRING}
    提取STRING字符串后面的内容,从右往左第一个位置开始
    WENV set a=ABCD;abcd;1234
    WENV set b=${a##;}      得到b=1234
   4: ${VAR%STRING}
    提取STRING字符串前面的内容,从右往左第一个位置开始
    WENV set a=ABCD;abcd;1234
    WENV set b=${a%;}       得到b=ABCD;abcd
   5: ${VAR%%STRING}
    提取STRING字符串前面的内容,从左往右第一个位置开始
    WENV set a=ABCD;abcd;1234
    WENV set b=${a%%;}       得到b=ABCD

三:字符串或数值比较
    WENV check ${a} OPERATOR ${b}
    OPERATOR:==、<>、>=、<=
    如:WENV set a=abc
        WENV check ${a}==abc && echo ${a}=abc
        WENV calc a=123
        WENV check ${a}==123 && echo ${a}=123
        WENV check ${a}<=150 check ${a}>=100 && echo ${a}>=100.and.${a}<=150
    上面实现了IF语句功能.
    注: 注意比较时,后面的字符串忽略小写对比.
    如:
    abc==ABC 值为真
    aBc==abc 值为假
    abc==aBc 值为真.
    只要前面部分某个字符是大写,后面部分对应的一定要大写才能匹配

四:数值运算
    WENV calc [[VAR | INTEGER]=] INTEGER OPERATOR [INTEGER]
    =前面如果是一个非数字字符串,则会把计算结果赋值给变量;
    OPERATOR:包含+、-、*、/、&(与)、|(或)、^(位异或)、>>、<<
    *INTEGER表示内存地址的值;
    如:
    WENV calc a=*60000+1   表示把内存地址0x60000的值再加1赋值给变量a
    WENV calc a=1<<10      左移10位,即2的10次方,等于1024
    WENV calc a=b++         a=b,b=b+1
    WENV calc a=++b         b=b+1,a=b
    WENV calc a=b--         a=b,b=b-1
    WENV calc a=--b         b=b-1,a=b
    ++、--只能用在=右边.

五:命令序列依次执行
    WENV read FILE

六:执行内置命令
    WENV run COMMAND
    如:
    WENV set imgpath=/SRS_f6/srs_f6.IMG
    WENV set imgpath=$u,${imgpath}
    WENV run map --mem ${imgpath} (fd0)
    map --hook

    可以动态执行命令,如:
    write (md)0x300+1 map --status\0
    WENV run *0x60000

    run可以连续运行多条内部命令,命令与命令之间使用以下字符隔开
    ]]]  无条件执行
    ]]&  当前一条命令返回真时执行后面的语句.否则直接返回
    ]]|  当前一条命令返回假时执行后面的语句.否则直接返回.

七:显示变量值
    WENV get [VAR]
    如:WENV set a=img
        WENV get a    显示变量a及值
        WENV get      显示所有变量及值
    内部变量?_GET
    ?_GET这个内部变量定义了WENV get VAR的变量值长度(字节数)
    如:WENV set a=abcdABCD1234
        WENV get a && WENV calc len=${?_GET}  得到len=12

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

wenv使用说明.rar

1.7 KB, 下载次数: 58, 下载积分: 无忧币 -2

回复

使用道具 举报

453#
发表于 2010-10-9 13:42:35 | 只看该作者

回复 #451 chenall 的帖子

抱歉,给大家添麻烦了!
就此问题不再提问了,最后一帖。
如果版主觉得此帖多余请删除!
回复

使用道具 举报

454#
发表于 2010-10-9 14:14:53 | 只看该作者
5: ${VAR%%STRING}
    提取STRING字符串前面的内容,从左往右第一个位置开始
    WENV set a=ABCD;abcd;1234
    WENV set b=${a%%;}       得到b=ABCD

以前少写了个%,已修正。
回复

使用道具 举报

455#
发表于 2010-10-9 14:36:02 | 只看该作者
@zhaohj
字符串运算的2-5,通俗点说,一个#或%是取尽可能多的字符,而两个的##或%%是取尽可能少的字符。
这样是不是更易记忆呢。
回复

使用道具 举报

456#
 楼主| 发表于 2010-10-9 22:16:42 | 只看该作者
2010-10-09
   注意:命令行长度不要超过512个字节。
   1.初步添加for命令,目前支持以下两种操作.并且允许嵌套。(仿 CMD 的 for 命令)
        1). for /L $i IN (start,step,end) DO wenv-command
            以增量形式从START到END的一个数字序列。
            例子:
            wenv for /l $a in (1,1,5) do run echo $a\n
            wenv for /l $a in (5,-1,0) do run echo $a\n
        2). for /L $i IN ( file ) DO wenv-command
            读取 FILE 的每一行。忽略以":"开头的行。
            注:使用该功能file前后都必需要有空格隔开.
            例子:
            wenv for /l $a in ( /test.txt ) do run echo $a\n

另外:目前do后面只能执行一个命令。并且不可以两个for /f 同时使用(因为使用了固定的文件缓存).

这两个问题以后会有解决的。

[ 本帖最后由 chenall 于 2010-10-9 22:31 编辑 ]
回复

使用道具 举报

457#
发表于 2010-10-9 23:23:18 | 只看该作者
忽略以":"开头的行,这个能不能自定义,很多文本的注释是以"#"开头的。

“for /L $i IN ( file ) DO wenv-command,目前do后面只能执行一个命令。”因为大多时候读取文件的目的,是需要每项数据进行字符串处理等相关操作,最需要像do  ...enddo的命令集。
回复

使用道具 举报

458#
发表于 2010-10-9 23:27:47 | 只看该作者
请问Chenall 大:
9月版本的chkpci 能否支持这样的PCIDEVS.TXT格式:
PCI$
$PCI\VEN_103C&DEV_1028 AFCNT



PCI$
$PCI\VEN_103C&DEV_102=AFCNT
这样如果找到对应ID,能否显示为PCI\VEN_103C&DEV_1029 AFCNT或PCI\VEN_103C&DEV_102=AFCNT


我原本更新一下SRS_F6,把部分功能改为全grub4dos版本,不用依靠dos

[ 本帖最后由 zhhsh 于 2010-10-9 23:29 编辑 ]
回复

使用道具 举报

459#
发表于 2010-10-9 23:58:48 | 只看该作者
chkpci -c:01 /SRSID.TXT
SRSID.TXT内容如下:
PCI$
$PCI\VEN_103C&DEV_1028=AFCNT
...
硬件匹配后会显示这行的,输出还是匹配的这行$PCI\VEN_103C&DEV_1028=AFCNT
chkpci -c:01 /SRSID.TXT | WENV set id=

一般情况下只会匹配一行,或没有。
回复

使用道具 举报

460#
 楼主| 发表于 2010-10-10 00:12:09 | 只看该作者
原帖由 zhhsh 于 2010-10-9 23:27 发表
请问Chenall 大:
9月版本的chkpci 能否支持这样的PCIDEVS.TXT格式:
PCI$
$PCI\VEN_103C&DEV_1028 AFCNT



PCI$
$PCI\VEN_103C&DEV_102=AFCNT
这样如果找到对应ID,能否显示为PCI\VEN_103C&DEV_10 ...


不支持(因为,1:为了编程方便,2.高度自定义).

但是你可以自定义显示内容。
比如文件内容如下就会按你要求的来显示了。(我们的文件大小限制不像DOS的64KB,所以文件大一点没有关系,使用GZ压缩一下就好了)
PCI$
$PCI\VEN_103C&DEV_1028
PCI\VEN_103C&DEV_1028=AFCNT

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

使用道具 举报

461#
 楼主| 发表于 2010-10-10 00:21:31 | 只看该作者
原帖由 zhaohj 于 2010-10-9 23:23 发表
忽略以":"开头的行,这个能不能自定义,很多文本的注释是以"#"开头的。

“for /L $i IN ( file ) DO wenv-command,目前do后面只能执行一个命令。”因为大多时候读取文件的目的,是需要每项数据进行字符串处 ...


这可以间接的通过read命令来实现。。

刚刚重新上传了一个更新的版本。

   2.read 命令支持参数
     read 的文件可以使用$0-$9代替传入的参数。
     其中$0 是代表自身. $1-$9 分别是第1个-第9个参数.
   这样可以配合for等命令实现一些强大的功能..
   3.修正check命令比较数字的BUG.
回复

使用道具 举报

462#
发表于 2010-10-10 01:18:24 | 只看该作者
read 命令支持参数,一下没有看懂,举例说明一下。
回复

使用道具 举报

463#
 楼主| 发表于 2010-10-10 01:33:48 | 只看该作者
就是像批处理那样的。
文件里面的$1会被替换成第一个参数,支持9个参数。像
wenv read /test.wbt 1 2 3 4 5 6 7 8 9
回复

使用道具 举报

464#
发表于 2010-10-10 13:08:07 | 只看该作者
2). for /L $i IN ( file ) DO wenv-command
应该是:
     for /f $i IN ( file ) DO wenv-command
回复

使用道具 举报

465#
 楼主| 发表于 2010-10-10 16:14:42 | 只看该作者
原帖由 zhaohj 于 2010-10-10 13:08 发表
2). for /L $i IN ( file ) DO wenv-command
应该是:
     for /f $i IN ( file ) DO wenv-command


嗯,写错了。

另外使用说明我先收下了,看看还有没有什么需要修改的,以后上传的WENV里面就附带这个说明文件。

[ 本帖最后由 chenall 于 2010-10-10 16:15 编辑 ]
回复

使用道具 举报

466#
发表于 2010-10-10 16:34:01 | 只看该作者
变量的清除补充了一点,新加的命令如for就交给你处理了。
一:变量赋值
   WENV set VAR=[$[U]|L,][$input,][STRING]
   VAR:变量名,不超过8个字符,首字符必须是"a_z"/"A_Z"/"_"开始,除首字符外允许"0~9"数字;
        变量名区分大小写;
   $U,全转变为大写;
   $L,全转变为小写;
   $input,从键盘输入;
   STRING,提示;
   注:所有参数不区分大小写;
   变量值不能超过512个字节,最多允许自定义64-1个变量.
   如:1)根据提示从键盘输入,全转为大写后保持给srspath变量
         WENV set srspath=$u,$input,please input SRS driver path:
       2)设置变量a,并把值全转为大写
         WENV set a=ABCDabcd1234
         WENV set a=$u,${a}
         得到a=ABCDABCD1234
       3)清除某个变量
         WENV set a=        =后为空,清除变量a
       4)清除某些字符开头的所有变量
         WENV reset a*      清除a开头的所有变量
         WENV reset sr*     清除sr开头的所有变量
       5)清除所有变量
         WENV reset
回复

使用道具 举报

467#
 楼主| 发表于 2010-10-10 17:44:14 | 只看该作者
为了简化程序统一处理,准备修改一下*的定义。

新的将使用以下方案之一代替,如果明确要读取的是字符则再加一个$符号。
*ADDR还是读取一个数值(这个比较常用)

1.处理速度比较快
*ADDR 读取的是一个数值。
$*ADDR 读取的是一个字符串。 或 *$ADDR
2.看起来好像比较直观
*ADDR 读取的是一个数字。
*ADDR$ 读取的是一个字符串。

请太家讨论一下,处理方案如何,或者有没有什么更好的方案?

特别是之前有使用内存地址的功能读取字符串的朋友。

[ 本帖最后由 chenall 于 2010-10-10 17:46 编辑 ]
回复

使用道具 举报

468#
发表于 2010-10-10 19:06:36 | 只看该作者
字符串截取有个BUG,变量长度为8时将失败,或者在变量后加空格,将截取符挤到8字符外也会失败,因为没有机会去判断 :#% 了

获取变量长度将占去一个变量空间,现在最大的变量数是应该改成62,但第63个变量在使用过 WENV get 前仍可以设置,此时将不能再取变量长度了。
我正在将它改成 ?{VAR} 来获取变量,取变量前不需要先get,可以取任意变量的长度,但这项改动比较大,因为replace_str要配合 ?{VAR}

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

使用道具 举报

469#
 楼主| 发表于 2010-10-10 19:11:00 | 只看该作者
原帖由 tuxw 于 2010-10-10 19:06 发表
字符串截取有个BUG,变量长度为8时将失败,或者在变量后加空格,将截取符挤到8字符外也会失败,因为没有机会去判断 :#% 了

获取变量长度将占去一个变量空间,现在最大的变量数是应该改成62,但第63个变量在使 ...


看了一下,确实是这样的,下个版本进行修正。
回复

使用道具 举报

470#
 楼主| 发表于 2010-10-10 20:28:04 | 只看该作者
原帖由 tuxw 于 2010-10-10 19:06 发表
字符串截取有个BUG,变量长度为8时将失败,或者在变量后加空格,将截取符挤到8字符外也会失败,因为没有机会去判断 :#% 了

获取变量长度将占去一个变量空间,现在最大的变量数是应该改成62,但第63个变量在使 ...


?{VAR} 也不好,之前我就有考虑过类似的。
有时我们需要显示像?{VAR}之类的呢。
回复

使用道具 举报

471#
发表于 2010-10-10 21:22:36 | 只看该作者
原帖由 chenall 于 2010-10-10 20:28 发表


?{VAR} 也不好,之前我就有考虑过类似的。
有时我们需要显示像?{VAR}之类的呢。



这个是无法避免的,比如我们用 ${ 表示变量,必然就占了这两个符号,还有截取字符串的符号 :#% 都一样,使用变量时就有所限制
回复

使用道具 举报

472#
发表于 2010-10-10 23:16:59 | 只看该作者
?{VAR} 取变量长度,不需要先get,可以同时取多个变量
如 WENV run ECHO ?{a}+?{b}

字符串截取修复了变量名长度为8时失败的BUG,同时修改了一些特性

${VAR:x:y}
y 为负值时倒序截取
WENV set a=12345
WENV set a=${a:-1:-512},可以将a反过来 54321
-512是不知道变量长度时的最大值

#%以前的不好记,容易混淆,重新定义
% 截取左边字符
# 截取右边字符
默认查找方向正向(从左向右查找)
双写截取符则反向(从右向左查找)
原来的定义估计是chenall受了那个参考帖子的影响,其实我们不必要拘限于那个语法

字符串截取语法中间允许有空格
主要是以后增加$嵌套,比如 ${VAR:${start}:${length}}, 嵌套内的变量可能含有空格。
还有个原因是我想实现二次截取,如 {${VAR}:x:y}:x:y。这样对于
WENV set path=.../xxx.iso
我们想取出iso,不知后面是否有空格时就可以
{${VAR}##.}:0:3
一次将iso取出
这个语法有很大的变化,截取不是针对变量名,而是替换变量后的字符串,也可以是常规字符串
红色部分未实现

这次改动比较大,我将变量名规则判断那部做成子函数,replace_str 也做了较大的改动,并进行了初步的代码自注释改善
如果不好整合就还是按 chenall 的思路发展吧。其实我自己的版本还整理了代码的缩进对齐排版,不过估计那样你更不好比较了。

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

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

使用道具 举报

473#
发表于 2010-10-10 23:20:17 | 只看该作者
原帖由 chenall 于 2010-10-10 17:44 发表
为了简化程序统一处理,准备修改一下*的定义。

新的将使用以下方案之一代替,如果明确要读取的是字符则再加一个$符号。
*ADDR还是读取一个数值(这个比较常用)

1.处理速度比较快
*ADDR 读取的是一个数 ...


我认为把变量名区分开比较直观:
字符串变量用$表示,如a$、B$
非字符串变量,后面不加$。
回复

使用道具 举报

474#
发表于 2010-10-11 00:12:55 | 只看该作者
@chenall
svn上的R15不能编译,不是指wenv,是针对整个外部命令

EPS_3.jpg (111.27 KB, 下载次数: 57)

EPS_3.jpg
回复

使用道具 举报

475#
 楼主| 发表于 2010-10-11 00:27:13 | 只看该作者
额..这次的改动都挺大的...

我先上传一个测试吧。基本上算是搞定for命令(for 只要再增加一个字符分隔的功能就算完工了)

2010-10-10
   1.修正由(tuxw)提出来的BUG,在使用变量提取时会失败的问题。
   2.重新调整程序架构,优化代码。
   3.支持命令序列。使用()里面的语句是一个序列。每个语句之前使用“ ; ”隔开.
     例:wenv (set a=1 ; set c=2 ; set b=3).可以配合for命令使用.允许嵌套;
   4.set 命令也可以显示变量(按cmd的set命令使用习惯).如果后面没有=,则显示所有以输入的字符开头的变量.
   5.修改*的定义。(处理速度比较快,如果各位觉得这样子不好的话可以提出来,看看支持率如何再进行修改)
     $*ADDR从内存地址中取字符串。*ADDR取一个数值。
   6.$$反义一个$(像批处理的%%),即两个$$处理时第一次会变成一个$,方便在for里面使用变量.
回复

使用道具 举报

476#
 楼主| 发表于 2010-10-11 00:28:57 | 只看该作者
原帖由 tuxw 于 2010-10-11 00:12 发表
@chenall
svn上的R15不能编译,不是指wenv,是针对整个外部命令


你的文件不完整?
重新下载试试
回复

使用道具 举报

477#
发表于 2010-10-11 00:30:47 | 只看该作者
上面的截图是我已经试过了删除grubutils目录,重新checkout,后编译
回复

使用道具 举报

478#
 楼主| 发表于 2010-10-11 00:40:43 | 只看该作者
原帖由 tuxw 于 2010-10-11 00:30 发表
上面的截图是我已经试过了删除grubutils目录,重新checkout,后编译


我刚刚重新下载测试还是正常的。
回复

使用道具 举报

479#
 楼主| 发表于 2010-10-11 00:42:24 | 只看该作者
原帖由 tuxw 于 2010-10-10 23:16 发表
?{VAR} 取变量长度,不需要先get,可以同时取多个变量
如 WENV run ECHO ?{a}+?{b}

字符串截取修复了变量名长度为8时失败的BUG,同时修改了一些特性

${VAR:x:y}
y 为负值时倒序截取
WENV set a=12345
...



#%以前的不好记,容易混淆,重新定义
% 截取左边字符
# 截取右边字符
默认查找方向正向(从左向右查找)
双写截取符则反向(从右向左查找)
原来的定义估计是chenall受了那个参考帖子的影响,其实我们不必要拘限于那个语法

嘿嘿。这是linux shell里面的用法,按照linux shell的语法格式,使用起来比较大众化。
回复

使用道具 举报

480#
发表于 2010-10-11 00:46:43 | 只看该作者
%#的改变我就是改了那个%的默认方向,让它跟#方向统一
我还想增加一个 ${VAR:string:length}

原帖由 chenall 于 2010-10-11 00:40 发表

我刚刚重新下载测试还是正常的。


见鬼了
cd
rm -rf ./grubutils
svn co http://grubutils.google.com/svn/trunk ./grubutils
(现在是 R16 了)
cd ./grubutils/src
./build
现象依旧,还是满屏提示,滚屏太快,看不见前面的提示,后面可以看见的主要是 font.h

ls ./bin
生成了6个文件
chkpci
diskid
echo
fontfile
g4d_off
snake
wenv

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

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-9 03:48

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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