[GRUB4DOS] 外部命令WENV [2010-10-17]

[功能说明] 
GRUB4DOS菜单脚本命令增强.
在GRUB4DOS还没有支持变量之前可以暂时代替着使用变量的功能.
可以让GRUB4DOS内部命令支持变量或动态参数(WENV run)功能
目前已经增加了许多的强大功能.具体见后面的介绍.
推荐使用高级GRUB4DOS应用菜单必备,可以简化许多命令.
[下载地址]
WENV 是一个基于GRUB4DOS的程序,可以用它来增强GRUB4DOS的脚本能力,来现一些不可思议的功能。
WENV 最初只支持简单变量和运行GRUB4DOS命令。到了现在已经支持各式各样的处理。
可以把让它当成是GRUB4DOS的增强形SHELL,方便各位grub4dos fans编写高效强大的菜单。
在这里要感谢无论启动论坛上众多朋友的支持,如果没有你们,WENV还只是一个小玩具。
http://bbs.wuyou.com/viewthread.php?tid=159851
取之于网络,共享于网络。
本说明文件来源于无忧论坛zhaohj提供的README.TXT,我经过修改整理而成。
http://bbs.wuyou.com/viewthread.php?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 *0×60000$
    这个会扩展*0×60000$,把从内存地址0X60000处的字符复制到命令行
   
    如果内存地址0×60000处有字符串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        表示把内存地址0×60000的值再加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$
      例子:显示内存地址0×60000处的字符串信息
      wenv echo *0×60000$
      执行时先复制内存0×60000处的字符串到命令行替换后再执行。

通用字符串处理(以下方法可以应用于任何地方)
  
   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
一些应用举例:
        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)0×300+1 map –status\0
    WENV call *0×60000$
   
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's blog
本文链接地址: [GRUB4DOS] 外部命令WENV [2010-10-17]

无觅相关文章插件,快速提升流量

  1. I cannot get the source file wenv.c to compile using build or gcc under MINGW32 or CYGWIN. How can I compile code?
    Can we have a memscan command please?

    e.g. memscan 0xd0000 0xfffff 0×32 0×42 0×54 0×99 0×12 0xaa

    returns true if the byte sequence 32,42,54,99,12,aa exists between D000:0 and F000:FFFF

    or
    memscan 0xd0000 0xfffff ‘ASUS 1015PD’
    returns true if string ASUS 1015PD exists between D000:0 and F000:FFFF

    or memscan 0f0000 0xfffff 0×12345678
    returns true if byte sequence 78,56,34,12 exists in top 64K

    This means we can test for MAC address or DMI/SMBIOS values (e.g. mainboard serial number or model) etc.

    • Current only compile under linux.
      for memscan try command `cat`
      cat –locate=\x32\x42\x54\x99\x12\xaa –skip=0xd0000 –length=0x2ffff (md)+800

  2. bscq :请教博主 wenv get tmp=0×600000 此句将tmp值以unicode 代码写入内存0×600000 对于新版的grub4dos 或是wenv 该怎么写?

    chenall 回复:一月 11th, 2011 at 15:39
    没有变化。

    我用11.29的wenv 配合1.11新版的GRLDR 不能实现原有功能
    新版的wenv 里也没有谈到 get 能把变量以UNICODE写入内存的功能

    • 这个本来就是未公开的功能,不受支持的,随时会取消这个功能。
      你的写法没有错,有问题那是你自己使用的问题了。

  3. 请教博主 wenv get tmp=0×600000 此句将tmp值以unicode 代码写入内存0×600000 对于新版的grub4dos 或是wenv 该怎么写?

  4. 为什么我这里会提示找不到wenv命令?如果前面加/,用/wenv可以执行,但在菜单里,有/wenv的就选不了

    • 这是你自己使用的问题,
      菜单不能选择是因为没有启动命令,boot /chainloader /kernel之类的
      你可以在菜单后面加上一个boot就可以选择了.

  5. 你好,我看了无忧上的f6的文章,我还是不成功,你能告诉我你是怎么做的吗,最好有具体的代码
    就是可以用u盘安装原版xp系统,还得是在sata硬盘上安装,就是加载驱动的问题,我还是不成功

    • 加载SATA驱动比较简单的语句如下。
      #虚拟一个空白软盘A:
      map –mem (md)+2880 (fd0)
      #OEM SATA驱动虚拟到B:
      map –mem /oem_srs.img (fd1)
      map –hook
      dd if=(fd1)+1 of=(fd0)
      再进入安装程序,如果OEM驱动加载成功就可以正常找到SATA硬盘。
      这里关键的是OEM_SRS.IMG就是对应驱动软盘的镜像。

  6. 我的号在无忧怎么不能发言,为什么?特在此说下。
    请博主说明${VAR:N:L} 中N是从0开始算起,或者改成从1开始,与-1保持一致。
    另外下面补充一句,一个#或%是取尽可能多,两个##或%%是取尽可能少,方便大家记忆。

    • 遵从linux shell的语法.
      注意: 这里的提取是指提取第N个字符后面的的,可能是我解释得不够清楚,谢谢提醒,已经修改的文章内容,这样可能就比较清楚了.

  7. wenv 6.20版,测试wenv set有问题:
    wenv calc aa=*0×8288 & 0xff
    wenv set bb=${aa}
    bb变量不正确。请C大测试。