无忧启动论坛

 找回密码
 注册
搜索

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

查看数: 188336 | 评论数: 1088 | 收藏 4
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2010-2-2 16:10

正文摘要:

[功能说明] 在GRUB4DOS还没有支持变量之前可以暂时代替着使用变量的功能 最新版本下载地址 http://grubutils.googlecode.com [使用方法] 注:变量名不能超过8个字符. 变量值不能超过512个字符 最多 ...

回复

chenall 发表于 2010-2-2 16:16:50
原理很简单.
读取其中一个扇区作为变量名的存放位置.

目前使用第65个扇区放变量名.

然后根据这个变量名所在的位置(以8个字节对齐)读取/写入 对应扇区的值 获取/设置 变量.


                    WENV 使用说明 (readme)
                    
                    chenall 整理于 2010-10-12
WENV 是一个基于GRUB4DOS的程序,可以用它来增强GRUB4DOS的脚本能力,来现一些不可思议的功能。
WENV 最初只支持简单变量和运行GRUB4DOS命令。到了现在已经支持各式各样的处理。
可以把让它当成是GRUB4DOS的增强形SHELL,方便各位grub4dos fans编写高效强大的菜单。
在这里要感谢无论启动论坛上众多朋友的支持,如果没有你们,WENV还只是一个小玩具。
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=159851
取之于网络,共享于网络。
本说明文件来源于无忧论坛zhaohj提供的README.TXT,我经过修改整理而成。
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=159851&page=46#pid2056205
如有发现错误,请通知我,谢谢。
WENV目前支持的命令列表(wenv-commands):
    SET         设置/修改/新增/删除变量
    GET         显示变量/判断变是是否存在
    FOR         类似于CMD的FOR命令,具体见后面介绍
    CALL        执行一个GRUB4DOS内部命令
    CALC        简易计算器(没有优先级从左往右计算,不支持括号)
    ECHO        在屏幕上显示信息
    READ        分析一个文件并执行里面的命令(必须是WENV支持的命令),并且支持参数。
    CHECK       判断/检测相当于if命令,后面可以跟WENV-COMMAND(当判断的返回值为真时执行)
两个内置变量:
?_WENV          保存上一次wenv call运行的返回值
?_GET           保存上一次wenv get variable变量的长度
一:SET 设置/修改/新增/删除变量
   
    1.WENV SET [variable=[string]]
    variable  指定环境变量名,区分大小写 (目前最多允许用户定义60个变量)
              不超过8个字符.可以使用字母(a-z/A-Z)、数字(0-9)、下划线(_)。不可以使用数字开头。
    string    指定要指派给变量的一系列字符串。不能超过512字节。
   
    无等号时显示指定名称的所有变量的值。
    SET P
   
    会显示所有以字母 P 打头的变量
   
    2.等号后面可以跟"$U,"或"$L,"
        $U,全转变为大写;
        $L,全转变为小写;
   
        例子: WENV SET a=$U,aBcDeF  得到 a=ABCDEF
    3.关键字 $input,来获取从键盘输入的字符。
        例子:获取从键盘输入的字符串,并转换为大写赋值给srspath
        WENV set srspath=$u,$input,please input SRS driver path:
   
    4.一些组合例子:
        WENV SET variable=$U,string
        WENV SET variable=$U,$input,Prompt
        
二、 GET 显示变量/判断变是是否存在
    GET 命令可以显示指定的变量,并设置?_GET为该变量的字符串长度。
   
    WENV get xxx
    返回变量xxx的值的字符串长度.
   
    注: 如果变量不存在会返回一个失败的值0,可以用于判断变量是否存在
    如: 当变量abc不存在时显示字符串"Variable abc not defined"
        wenv get abc || echo Variable abc not defined
三、FOR 类拟于CMD的for
   比较强大的一个命令,可以分析字符串,文本文件。
   语法:
      FOR /L %variable IN (start,step,end) DO wenv-command
      该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列
      1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)
      
      FOR /F ["options"] %variable IN ( file ) DO wenv-command
      FOR /F ["options"] %variable IN ("string") DO wenv-command
   如果有 usebackq 选项:
      FOR /F ["options"] %variable IN (`string`) DO wenv-command
      options
       eol=c           - 指一个行注释字符的结尾(就一个)
       delims=xxx      - 指分隔符集。这个替换了空格和跳格键的
                         默认分隔符集。
       tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                         的 for 本身。这会导致额外变量名称的分配。m-n
                         格式为一个范围。通过 nth 符号指定 mth。
       usebackq        - 反向引号
      
     几个例子 分析myfile.txt的每一行,使用";"作为注释符,使用","分隔字符串,显示每行的第二和第三个字符串
      FOR /F "eol=; tokens=2,3 delims=," %i in ( myfile.txt ) do echo %i %j
      
      显示从1-10的数字
      FOR /L %i in (1,1,10) do echo %i
      
      以下语句会显示 1 2 3 6
      FOR /f "tokens=1-3,6" %i in ("1 2 3 4 5 6 7 8 9 0") do echo %i %j %k %l
      
      可以参考CMD的for命令帮助说明.
四、CALL 命令
    WENV call grub4dos-builtincmd
    CALL 命令用于执行GRUB4DOS内部命令,使得可以动态执行一些GRUB4DOS的命令.
   
    可以使用变量或*ADDR$代替命令的任意部份。
    例子:
   
    wenv set a=(hd0)
    wenv call map ${a} (hd1)
    扩展了变量${a} 相当于执行map (hd0) (hd1)
    wenv call write (fd0)/aa.txt *0x60000$
    这个会扩展*0x60000$,把从内存地址0X60000处的字符复制到命令行
   
    如果内存地址0x60000处有字符串abcdef
   
    那扩展后就是write (fd0)/aa.txt abcdef
    甚至还可以直接 wenv call ${mycmd}
    会扩展变量mycmd,如果它是一个GRUB4DOS内部命令,则会得到执行,否则返回失败值。
    call 可以连续运行多条内部命令,命令与命令之间使用以下字符隔开
    ]]]  无条件执行
    ]]&  当前一条命令返回真时执行后面的语句.否则直接返回
    ]]|  当前一条命令返回假时执行后面的语句.否则直接返回.
五、calc 命令 用于grub4dos的简单计算,从左到右计算,不支持优先级
    WENV calc [[VAR |
  • INTEGER]=]
  • INTEGER OPERATOR [
  • INTEGER]
       
        calc 命令可以直接操作内存中的数据,请使用*ADDR的形式。
        =前面如果是一个非数字字符串,则会把计算结果赋值给变量;
        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 calc a++               变量a的值加1;
       
        注:calc可以对变量进行计算,但一般情况下请使用如下的例子获得更快的运算速度。
        wenv calc a=${b}+${c}
        以上的例子不会对变量b和c进行修改。
       
        wenv calc a=${b}+c++
        这个例子会修改变量c的值
    六、echo 命令
        WENV ECHO strings
       
        用于显示一个字符串,支持\x转义符。比如\n是一个回车。
    七、READ 命令
        WENV READ wenv-bat-file parameters
       
        用于执行一个WENV的批处理文件,该批处理文件里面必须是 wenv-commands。
        忽略以冒号":"开头的行。
       
        在批处理中可以使用参数$0-$9
        其中: $0 代表批处理文件自身。$1-$9 分别代表第一个参数到第九个参数。
       
        参数之间使用空格分隔。
       
        一个例子:
        wenv.bat文件内容如下
        echo $0
        echo $1
        echo $2
        使用命令WENV READ /wenv.bat abcd 12345
        将会在屏幕上显示如下内容
        /wenv.bat
        abcd
        12345
    八:CHECK 判断命令相当于IF命令
        1.WENV check string1 compare-op string2 wenv-command
       
        比较符号可以使用其中一个: ==、<>、>=、<=
       
        where compare-op may be one of:
        == – equal
        <> – not equal
        <= – less than or equal
        >= – greater than or equal
        注: 注意比较时,后面的字符串忽略小写对比.
        如:
        abc==ABC 值为真
        aBc==abc 值为假
        abc==aBc 值为真.
        只要前面部分某个字符是大写,后面部分对应的一定要大写才能匹配
    其它说明:
        1、要使用命令序列,可以把要执行的命令放在()之内,使用" ; "分隔每个命令。
           格式: (wenv-command1 ; wenv-command2 ; wenv-command3)
           应用的例子:
       
                      wenv (set a=1 ; set b=2 ; set c=3)
                      wenv for /l %i in (1,1,5) do (set a=%i ; echo %i)
       2、从内存中复制字符串 *ADDR$
          说明:程序执行时会从内存地址ADDR处复制一个字符串替换命令行的*ADDR$
          例子:显示内存地址0x60000处的字符串信息
          wenv echo *0x60000$
          执行时先复制内存0x60000处的字符串到命令行替换后再执行。

    通用字符串处理(以下方法可以应用于任何地方)
       
       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
       6: 支持嵌套变量。
       像下面的例子:
        wenv echo ${${${a:0:1}:0: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
            6)显示所有变量信息(不包括内置变量)
            WENV set
            7)显示所有以prefix开头的变量
            WENV set prefix
    wenv call 的例子:
        如:
        WENV set imgpath=/SRS_f6/srs_f6.IMG
        WENV set imgpath=$u,${imgpath}
        WENV call map --mem ${imgpath} (fd0)
        map --hook
        可以动态执行命令,如:
        write (md)0x300+1 map --status\0
        WENV call *0x60000$
       
    wenv check 的例子:
        如: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语句功能.

    [ 本帖最后由 chenall 于 2010-10-14 08:41 编辑 ]
  • ddnflier 发表于 2022-3-24 15:54:30
    很好用,谢谢楼主。继续使用中......
    2011whp 发表于 2022-2-25 19:47:07
    本帖最后由 2011whp 于 2022-2-25 20:00 编辑

    好像   g4d 复杂的 分析,得用 内存 (批处理)
    代码多: 适当地  ;; 成一行,好像单行支持 很长的(得注意:本地变量延时)

    ——————————————
    echo -n 不能实现。

    echo -n 对 空格(或+换行) 分隔的 短文章,有些用 (太多的 分隔 没意义了,cat分析通用些)
    ,不能实现 逗号 分隔

    配合 外部命令  cmdline 分析 不多的参数,有用



    liuzhaoyzz 发表于 2022-2-25 19:24:01
    2011whp 发表于 2022-2-25 18:51
    cat 分析 文章



    厉害呀!感觉代码略微有点多。
    echo -n也能实现吗?没看懂
    2011whp 发表于 2022-2-25 18:51:25
    本帖最后由 2011whp 于 2022-2-25 18:57 编辑

    cat 分析 文章



    echo -n   ( 相似 shift )


    点评

    厉害呀!感觉代码略微有点多。 echo -n也能实现吗?没看懂  详情 回复 发表于 2022-2-25 19:24
    liuzhaoyzz 发表于 2022-2-25 11:20:35
    wintoflash 发表于 2022-2-25 11:05
    直接截去后两个字符不行吗?
    如果考虑超过9个分区情况的话可能不好办,你问问批处理大佬有没有解决方 ...

    你的这种字符串截取的用法,我是第一次见到,因为BIOS版本的grub4dos-help-2015-02-09.CHM里面,似乎没有这样子的说明啊。
    这样子的用法,超过9个,的确感觉不好办,grub4dos的字符串截取,我没有研究过。
    liuzhaoyzz 发表于 2022-2-25 11:11:12
    本帖最后由 liuzhaoyzz 于 2022-2-25 13:38 编辑
    wintoflash 发表于 2022-2-25 11:05
    直接截去后两个字符不行吗?
    如果考虑超过9个分区情况的话可能不好办,你问问批处理大佬有没有解决方 ...

    很多细节的问题,用法我基本上快忘光了,wenv-tuxw-2011-05-23,有个wenv.chm,以前摸索着用的:
    ${VAR%%STRING}        删除STRING后面的字符,贪婪模式
    WENV set a=ABCD;abcd;1234
    WENV set b=${a%;}         得到b=ABCD;abcd
    WENV set b=${a%%;}      得到b=ABCD

    %p%/boot/grub/wenv set x=${root%,},3),意思是删除root=(hdx,y)里面的逗号以后的字符,得到(hdx,然后再加上,3),就得到了(hdx,3),这个是已经实现的代码,我已经用批处理写好了的,全自动写好批处理。
    wintoflash 发表于 2022-2-25 11:05:08
    liuzhaoyzz 发表于 2022-2-25 10:36
    比如说用grub4dos用partnew方式启动veket:
    title /linux/veket/v22.a-2022.02.02/veket_22.a.iso-partn ...


    直接截去后两个字符不行吗?
    如果考虑超过9个分区情况的话可能不好办,你问问批处理大佬有没有解决方法。

    点评

    你的这种字符串截取的用法,我是第一次见到,因为BIOS版本的grub4dos-help-2015-02-09.CHM里面,似乎没有这样子的说明啊。 这样子的用法,超过9个,的确感觉不好办,grub4dos的字符串截取,我没有研究过。  详情 回复 发表于 2022-2-25 11:20
    很多细节的问题,用法我基本上快忘光了,wenv-tuxw-2011-05-23,有个wenv.chm,以前摸索着用的: 5: ${VAR%%STRING} 删除STRING后面的字符,贪婪模式 WENV set a=ABCD;abcd;1234 WENV set b=${a%;}  详情 回复 发表于 2022-2-25 11:11
    liuzhaoyzz 发表于 2022-2-25 10:36:26
    本帖最后由 liuzhaoyzz 于 2022-2-25 10:48 编辑
    wintoflash 发表于 2022-2-25 09:19
    能不能举个例子?
    我看看可不可以单独写个外部命令。

    比如说用grub4dos用partnew方式启动veket:
    title /linux/veket/v22.a-2022.02.02/veket_22.a.iso-partnew[not_recommend]
    find --ignore-floppies --ignore-cd --set-root /linux/veket/v22.a-2022.02.02/veket_22.a.iso
    map /linux/veket/v22.a-2022.02.02/veket_22.a.iso (hd32) ;; map --hook
    set root=%@root% ;; find /boot/grub/wenv | set p= ;; %p%/boot/grub/wenv set x=${root%,},3) ;; partnew %x% 0x00 /linux/veket/v22.a-2022.02.02/veket_22.a.iso
    kernel (hd32)/vmlinuz PSUBDIR=/ pmedia=cd pfix=fsck
    initrd (hd32)/initrd.gz

    partnew那段,就是把root=(hdx,y)这样子的替换为(hdx,3)这样子的,创建第四个MBR分区表项,主分区,用于“挂载”(我喜欢用这个形象但不准确的词语)linux.iso启动。
    要想实现字符串替换,grub4dos内部命令似乎没有相关的函数语句(或者是我不知道),所以想要借用wenv外部命令处理字符串。

    点评

    [attachimg]496365[/attachimg] 直接截去后两个字符不行吗? 如果考虑超过9个分区情况的话可能不好办,你问问批处理大佬有没有解决方法。  详情 回复 发表于 2022-2-25 11:05
    wintoflash 发表于 2022-2-25 09:19:33
    liuzhaoyzz 发表于 2021-2-10 16:30
    wenv外部命令好像不能完全被取代,比如变量里面的字符串截取功能,内置命令好像就做不到?

    ch ...
    比如变量里面的字符串截取功能

    能不能举个例子?
    我看看可不可以单独写个外部命令。

    点评

    比如说用grub4dos用partnew方式启动debian: title /linux/veket/v22.a-2022.02.02/veket_22.a.iso-partnew[not_recommend] find --ignore-floppies --ignore-cd --set-root /linux/veket/v22.a-2022.02.02/veket_  详情 回复 发表于 2022-2-25 10:36
    liuzhaoyzz 发表于 2021-2-10 16:30:53
    本帖最后由 liuzhaoyzz 于 2021-2-10 16:33 编辑
    不点 发表于 2017-1-20 21:22
    wenv 已经过时,不再使用了。目前的外部命令都不需要 wenv 了。

            wenv外部命令好像不能完全被取代,比如变量里面的字符串截取功能,内置命令好像就做不到?

    chenall的网址已经打不开了。友情重新分享下。@chenall


    tuxw修改版本的wenv好像也很强大。


    点评

    能不能举个例子? 我看看可不可以单独写个外部命令。  详情 回复 发表于 2022-2-25 09:19
    不点 发表于 2017-1-20 21:22:32
    2010DOS622 发表于 2017-1-20 07:49
    chenall 你所提供下载地址已经失效

    wenv 已经过时,不再使用了。目前的外部命令都不需要 wenv 了。

    点评

    wenv外部命令好像不能完全被取代,比如变量里面的字符串截取功能,内置命令好像就做不到? chenall的网址已经打不开了。友情重新分享下。@chenall  详情 回复 发表于 2021-2-10 16:30
    2010DOS622 发表于 2017-1-20 07:49:44
    chenall 你所提供下载地址已经失效

    点评

    wenv 已经过时,不再使用了。目前的外部命令都不需要 wenv 了。  详情 回复 发表于 2017-1-20 21:22
    tuxw 发表于 2011-5-24 12:25:35
    我测试好象是正常的


    这两天更新了几个小问题,没有涉及过for命令,有可能跟相关的字符串函数有关系。你用新版试一下
        修正 dir 最后一个通配符不能匹配空字符的BUG  (dir file*  不能匹配  file)
        修正 check 将数字开头的字符串当数值比较的BUG
        dir 列表适应新版grub4dos里带 \空格 的名字
        dir 列表没有文件时, 不显示 Error 15 错误
        修正 dir 列表没有文件时, ?_WENV不会置0的BUG

    [ 本帖最后由 tuxw 于 2011-5-24 12:30 编辑 ]

    wenv-tuxw-2011-05-23.zip

    79.13 KB, 下载次数: 74, 下载积分: 无忧币 -2

    zhaohj 发表于 2011-5-24 11:23:37
    发现一个bug,下面文件内容:
    [Config.iaStor]
    value = "", tag, REG_DWORD, 1b
    value = "", ErrorControl, REG_DWORD, 1
    value = "", Group, REG_SZ, "SCSI Miniport"
    value = "", Start, REG_DWORD, 0
    value = "", Type, REG_DWORD, 1

    WENV  for /f "eol=; delims=" %i in ( ${OEMFILE} ) do echo %i > (rd)+1
    我的目的是清除多余的注释行,结果发现生成的结果变成:
    [Config.iaStor]
    value = ", tag, REG_DWORD, 1b
    value = ", ErrorControl, REG_DWORD, 1
    value = ", Group, REG_SZ, "SCSI Miniport"
    value = ", Start, REG_DWORD, 0
    value = ", Type, REG_DWORD, 1

    现在还是采取简单办法:
    cat --locate=\x22 --replace=\x21 %OEMFILE%
    到时再变回来。

    [ 本帖最后由 zhaohj 于 2011-5-24 11:25 编辑 ]
    zhaohj 发表于 2011-5-19 23:43:06
    原帖由 zxw 于 2011-5-19 23:36 发表
    应该还是debug on吧


    没用的,批处理内部是无法控制调试状态的。
    目前只有批处理再调用批处理。

    所以,我认为P处理的单步跟踪,不要使用debug on,或采用debug 3以上比较好。

    [ 本帖最后由 zhaohj 于 2011-5-19 23:46 编辑 ]
    tuxw 发表于 2011-5-19 23:37:52
    @zhaohj
    前一段时间连续做两个新项目,几乎封闭了,很少关注业余的爱好了

    debug 0|1|2 比较常用,实际上你 debug 99 也是可以的

    内置变量功能后,wenv的功能很多都重复了,本来想做一些重复功能精简,但考滤兼容性问题就不改了
    有些增强的功能用wenv还是要方便的,比如
    字符串替换与#/%的截取
    操作内置变量(%?_WENV%这样是不能访问的)
    数值/大小比较、子串查找
    精确计算,内置calc有个不严重的BUG,除法返回32位的有效值(注意不是返回整型,实际上是64位只有32位有效,用变量时不要紧,写入内存时会表现出来)
    wenv getdev d1
    wenv calc *0x829c=*0x829c/1
    wenv getdev d2
    calc *0x829c=*0x829c/1 (这里因为只有32位有效,会将82A0修改为0)
    wenv getdev d3
    wenv setdev d1
    set
    这样看得到的3个d值,calc 意外的修改了内存,这个因为操作内存的人比较少,没有突出表现出来,严格的说是一个很严重的BUG
    zxw 发表于 2011-5-19 23:36:39
    应该还是debug on吧
    zhaohj 发表于 2011-5-19 23:27:35
    关于P处理的单步跟踪问题:
    在批处理运行之前,执行debug on来开启P处理的单步跟踪。

    问题:
    比如我只有一个P处理,不返回命令行的情况下,怎么达到单步跟踪?
    zxw 发表于 2011-5-19 23:13:38

    回复 #1070 zhaohj 的帖子

    debug N
    最初,N大于等于1,基本上相当于on。
    最近,开发者们逐渐给予了一些拓展:
    debug 2
    debug 3
    赋予了一些特别的功能。
    以后,或许会有更多的……

    [ 本帖最后由 zxw 于 2011-5-19 23:23 编辑 ]
    zhaohj 发表于 2011-5-19 23:07:10
    @tuxw:
    好久不见终于归队!

    自从内置命令增强后,WENV已经很少用了,除了for命令。其实FOR也可以用P处理来解决。
    ------
    debug 0|1|2,没见过debug 3 啊?
    tuxw 发表于 2011-5-19 22:13:13
    2011-05-19
         find 命令-end参数不再输出结果到内置变量?_WENV(已有外部命令inifile)
         set 命令增加参数 -u -l -p, 同内置命令/u /l /p(没有 :N 延时),仍支持$u/l(新参数优先)
        check/if  命令增加参数 -i 忽略大小写(原来的右边小写左边不分在大小写的方法不好记忆,不再支持),去掉 -ee(-e扩展为操作两边同时转义)
        check/if  修复了一个字符串大小比较的BUG
        check/if  在 debug 3 时显示详细信息

    check 中引号的用法原版的兼容性问题导致感觉用法复杂,其实所谓“紧凑语法”与“非紧凑语法”用文字描述觉得不易理解,用一个例子就能看明白
    它们之间的区别是:紧凑语法时,引号会被去掉,还原出原始的比较对象
    下面的例子要在 debug 3 时才能看到详细信息


    引号特别处理的另一个作用是允许比较对象中间含有引号、空格
    如果仅仅是防止对象为空导致语法出错,在比较对象前/后加上任意字符都可以

    [ 本帖最后由 tuxw 于 2011-5-19 23:08 编辑 ]

    wenv-tuxw-2011-05-19.zip

    76.72 KB, 下载次数: 44, 下载积分: 无忧币 -2

    tuxw 发表于 2011-5-18 14:43:40
    另外实现一个shell的话比较麻烦而且是重复开发(非除想实现比较特别的功能),因为独立shell的工作模式不同,在用户接口方面它始终在前台,这在兼容性方面可能会出现问题,不兼容的地方用户会不习惯而拒绝使用那开发就没有意义,可能还要经常跟进grub4dos的更新。
    这个由grub4dos来做的话工作量要小很多,只需要在处理 "Warning! No such command: ..." 时将命令行参数交给 %ComSpec% 就行了,而外部命令并不需要编写任何代码,是个通用的方法,每个外部命令都可以成为shell。
    shell 的问题不重要先不管了,目前还没想出它有什么更多的好处,就是写外部命令时可省一个wenv,或者以后觉得有必要了再弄吧。

    原帖由 chenall 于 2011-5-18 13:51 发表
    ...这个直接使用内置的功能(非set)也可以实现的.
    http://bbs.wuyou.net/forum.php?mod=viewthread&tid=193054&page=6#pid2226293


    嗯,这样当然也可以。实现 chr 和 ascii 二个伪函数就是图个方便,不用知道ascii码,直接转换为可见字符用 if 的 /i 参数只需要比较一次。

    cat --length=1 --skip=0x100 (md)0x265+1 | set JX=
    if /i "%JX%"=="y" && exit
    if /i "%JX%"=="n" && goto :end
    这个方法存在几个“魔数”对用户不够友好(老实说我看到这个前也不知道pause将返回值放在哪个地址的),新人会忘而却步,读“高人”写的菜单时需要对grub4dos内部较为熟悉才能读懂,而目前grub4dos恰恰缺少这方面的文档。

    其实对grub4dos功能较熟悉的人来说,,通过(rd)和(md)的变换操作,wenv 的几乎所有功能都可以通过命令组合来实现,只某些功能实现起来麻烦点而已。

    [ 本帖最后由 tuxw 于 2011-5-18 14:50 编辑 ]
    chenall 发表于 2011-5-18 13:51:37
    @tuxw
    你可以尝试为WENV添加一个SHELL,由SHELL处理WENV可以处理的问题,不能处理的再丢给GRUB4DOS。

    这样一来WENV就是一个增强型的SHELL。

    另外关于?_WENV的位置
    我主要是为了编程方便快速,所以才直接使用60开始。这样可以减少判断,也省几个语句。


    如获取pause命令的按键
    wenv call pause input=
    wenv echo chr(${?_WENV}) | set key=
    if /i %key%=="y" && do something ...

    set /P:N 可以实现相同的功能,但这个要按回车,输入可能是多个字符(必须是可见字符),要做额外的判断
    用 pause 获取单键输入的好处是可以不用按回车,可以任意键跳过

    这个直接使用内置的功能(非set)也可以实现的.
    http://bbs.wuyou.net/forum.php?mod=viewthread&tid=193054&page=6#pid2226293

    [ 本帖最后由 chenall 于 2011-5-18 13:58 编辑 ]
    tuxw 发表于 2011-5-18 10:49:01
    2010-12-25
         dir 命令设置 ?_WENV 为列表文件数
         增加 chr(*) 转换ascii码为字符,开关 DIS_CHR=on 禁止该特性
         增加 ascii(*) 转换字符为ascii码,开关 DIS_ECHAR=on 禁止该特性
    2011-05-18
        ?_WENV 放在固定位置,避免与内置变量功能互相清除
        其它细节调整适应内置set命令的新版grub4dos
        添加编译日期
        echar(*), ascii(*) 允许最大字符数64个
        允许用 if 替换 check 命令

    很久没关注grub4dos,最近整一个相关的东西,发现wenv与内置set命令后的grub4dos有些冲突,作了些调整适合新版,顺便更新些细节。
    主要是?_WENV的位置,原版固定放在变量60的位置,我为了修改内置变量数目方便,将它放在最后一个名字位置,内置变量从后往前使用,记得以前与chenall勾通过这一点但没有达成共识,这会造成交替使用两个版本的wenv时反复初始化。如果仅仅是外部命令,这不是个大问题,但grub4dos内置set命令后问题就大了,我注意到chenall为了兼容这个问题,在变量区放了2个?_WENV来解决初始化的问题,但这个造成?_SWITCH不能正常初始化。现在执行 wenv reset ?* 时会清掉变量区多余的那个 ?_WENV。

    另外修改版的WENV最大可能会使用到5个内置变量,现在原版增了一个内置变量 ?_UUID 的使用,这样有可能导致内置变量区不够用,此时请用 wenv reset ?* 清除内置变量

    新增加的 chr, ascii 有一些小的用途,不是很常用,但要用到时会比较方便

    如获取pause命令的按键
    wenv call pause input=
    wenv echo chr(${?_WENV}) | set key=
    if /i %key%=="y" && do something ...

    set /P:N 可以实现相同的功能,但这个要按回车,输入可能是多个字符(必须是可见字符),要做额外的判断
    用 pause 获取单键输入的好处是可以不用按回车,可以任意键跳过

    ASCII串转U串
    set a=abc123
    wenv echo ascii(%a%) | set a=
    wenv set a=${a!0x=\0\x}
    set a=%a:~2%\0
    此时 a=\x61\0\x62\0\x63\0\x31\0\x32\0\x33\0

    wenv-tuxw-2011-05-18.zip (76.08 KB, 下载次数: 45)

    [ 本帖最后由 tuxw 于 2011-5-18 10:53 编辑 ]
    tuxw 发表于 2011-5-16 02:36:10
    原帖由 zhaohj 于 2011-1-19 11:29 发表
    @tuxw:
    wenv dir -c 参数是否有问题,目前文件名大小写无法区别


    那个错误是 ls 命令产生的,只是一个提示,实际并不是出错了

    -c  是强制大小写敏感(默认是不区分大小写的),指定了 -c 时大小必须完全匹配(不指定 -c 时跟 chenall 的版本是一样的)
    所以用 *.SY? 是列不出小写扩展名文件的

    设计这个参数的目的是是为了过滤出小写的文件名(默认情况下如果文件名小写没法将大写文件名排除)
    chenall 发表于 2011-4-22 11:11:01

    回复 #1063 2011886 的帖子

    这个你可以自己变通,比如以下命令,文件未找到时就只会提示File not found,而不会中止运行了。
    wenv dir *.iso || echo File not found
    需要转向也是一样的
    wenv dir *.iso > (md)0x300+1  || echo File not found
    smine 发表于 2011-4-21 18:16:08
    原帖由 chenall 于 2011-4-21 17:26 发表
    1.确定是使用我的版本。
    2.确定是最新版本。

    使用wenv不带参数可以获取版本信息。。。。

    最新版本的WENV下载
    http://grubutils.googlecode.com


    哇,你太伟大了,新版一切OK,只希望你出下一版的时候把文件未找到异常去掉,返回空就可以了,不然我的动态加载ISO,当用户没有放置任何ISO的时候直接出错,连生成默认菜单的机会都没有
    chenall 发表于 2011-4-21 17:26:16
    1.确定是使用我的版本。
    2.确定是最新版本。

    使用wenv不带参数可以获取版本信息。。。。

    最新版本的WENV下载
    http://grubutils.googlecode.com
    smine 发表于 2011-4-20 18:09:11
    原帖由 chenall 于 2011-1-19 12:20 发表
    WENV内部都是区分大写不区分小写的..

    即如果你输入的是小写则不区分大小写,如果你输入的是大写就有区分大小写..

    你只要全部用小写就可以保证不区分大小写了,这个要求很简单吧.


    这个要求一点都不简单,我只想返回当前目录下的所有.ISO文件 和  .iso 文件,我该怎么写?

    如果写两遍输出到内存,总会有一个失败直接跳出,如果写一遍小写的话,看下图,大写的文件名根本不认!!

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

    闽公网安备 35020302032614号

    GMT+8, 2024-11-24 23:11

    Powered by Discuz! X3.3

    © 2001-2017 Comsenz Inc.

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