无忧启动论坛

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

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

  [复制链接]
211#
发表于 2010-11-27 23:15:13 | 显示全部楼层
嗯,动态分配内存比较灵活,用起来麻烦,执行效率也较低

char buf[SIZE];
这样一条句是否成功,程序自己是不能控制的,应该是编译器和操作系统决定的
回复

使用道具 举报

212#
发表于 2010-11-29 11:01:48 | 显示全部楼层
1.将C大的 dir 命令搬过来了, 增加了一个 -c 参数路径名大小写敏感

2.添加 fclear 命令,小于1M的文件清零
    wenv clear FILE
    调用内置命令dd实现,FILE 要用绝对路径
   
3.getrd/setrd 可指定变量名
    wenv getrd a  # 保存到变量a中
    wenv setrd a  # 从变量a恢复(rd)指向
    wenv getrd    # 保存到内置变量 ?_RD
    wenv setrd    # 从内置变量 ?_RD 恢复
   
4.find 调整, 文件中要用括号开头的绝对路径
    1> 增加反查ini段名用法
    wenv find [...] [-end[=ENDS]] STRING FILE
    没有 ENDS 时,找到 STRING 后,反向查找最近的一个段名
    如果多个段中均存在 STRING,找到的将是第一个
   
    2> -end 参数不主动改变rd指向
    如找到结果,数据已在内存中准备好,并设置好 ?_RD 变量,可以setrd后使用 (rd)+1
    如输结果>=512,?_WENV是skip值, ?_FIND是length值,可以用在cat命令中
    如果结果<512, ?_FIND是其长度,结果直接放在 ?_WENV 中(skip值没有了)
    批处理GetSect.bat可以退休了
   
    3>返回值变化
    如果有参数 -end,未找到后续结果时返回0(之前是只要找到 STRING 就返回 1)

    4>开关 END_FILE=on 时,rd文件将增加3字节,后面添加回车/换行和二进制结束符
    影响的是 ?_RD 变量
    不影响skip和length,用 cat 显示时还是原始内容
   


[ 本帖最后由 tuxw 于 2010-11-29 11:04 编辑 ]

wenv-tuxw-2010-11-29.zip

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

回复

使用道具 举报

213#
发表于 2010-11-29 16:35:56 | 显示全部楼层
我这里所谓二制结束符实际上就是加了个字节,其值为0,对文本文件没影响,作个开关项看看有没有什么用处。

文件结束符是旧式操作系统用来判断文件结束的,在不同的系统中定义可能不一定相同,有的是0,有的是-1,但这个结束符并不包含在文件内容中。现在Windows好象不需要这个东西了,新建一个文件用16进制软件乱写几个字节它也能识别出来,估计使用了类似文件头信息之类的东西识别。
回复

使用道具 举报

214#
发表于 2010-12-1 12:02:45 | 显示全部楼层
原帖由 zhaohj 于 2010-12-1 08:47 发表
现在不知道怎样查找最后一个段落的内容,如txtsetup.oem中[config.SYMMPI]这样的内容

参数-end=[ENDS]没有考虑最后段落问题


确实有这个问题,语法上就没办法指定 ENDS 了
这样看行不行:当查找的 STRING 第一个字符是 [ 且 ENDS 只有一字符 [  时,就认定查找的是INI文件,找不到 [ 是就作最后一段处理。

如果INI文件是你自己生成的,可以在后面加一个空的段名

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

1.修复 dir 中通配符 * 后面跟数字会转换为地址的 BUG

2.添加 gpart 子命令获取目标磁盘活动分区与最后分区号
3.添加 diskid 子命令

4.find 命令针对 INI 最后一段特别处理
5.取消了 END_FILE 开关

整合 DISKID 主要是为了实现  GPART 命令,目前的 GPart.bat 依赖 geometry 命令的输出,如果硬盘分区较复杂输出信息超过 512 字节时会失败。而之前纯靠 WENV 实现的菜单又过于复杂不方便使用所以干脆实现一个 GPART 命令,站在 DISKID 的肩膀上可以省很多事。

我本来是为了做这 GPart 开始试着修改 WENV 的,中途越绕越远,现在又回到起点了,当然,这个过程中学到了不少东西,特别感谢 chenall 帮助。
我的修改工作应该告一段落了,以后只除BUG不会这么频繁修改了(如果还有些想法的话就是想加入一些内存处理子命令,比如memcpy,memcmp,strstr,因为md,rd实际上是一个可变的全局数组,这些函数可以实现一些“可编程”的特性,但估计用到的人不多,留待以后有必要再弄)。
现在的修改版与原版用法基本兼容,但也有较多不兼容的地方,专门写了个 CHM 格式的 readme 读起来方便点。

[ 本帖最后由 tuxw 于 2010-12-1 13:44 编辑 ]

wenv-tuxw-2010-12-01.zip

65.28 KB, 下载次数: 38, 下载积分: 无忧币 -2

WENV-readme.chm.zip

24.32 KB, 下载次数: 35, 下载积分: 无忧币 -2

回复

使用道具 举报

215#
发表于 2010-12-1 13:38:55 | 显示全部楼层
已上传,在990#.
回复

使用道具 举报

216#
发表于 2010-12-1 16:47:26 | 显示全部楼层
wenv-readme.chm 更新
因与原版有较大的变化,help 中信息稍作处理以示区别
提示的下载地址也改了下,到时放在博客上有个固定的下载地方

help 信息压缩到1屏以内

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

增加伪命令 key(*) 引用最多3个特殊字符(key前面必须有一个空格),替换时去掉key和括号,直接变成 *
(开关 DIS_KEY=on 禁止这个特性)
例:
WENV  echo  echo abc  key(]]&)  echo def
显示:echo abc ]]& echo def

这条命令等效于
WENV echo -e echo abc echar(]]&) echo def

但 key(*) 可以避免 ehcar 必须使用 -e 转义,可能与其它串中的 \ 字符冲突的问题,便于动态生成批处理文件。

WENV ehco echo abc ]]& key(get)
输出:echo abc ]]& get

[ 本帖最后由 tuxw 于 2010-12-4 13:39 编辑 ]

wenv-tuxw-2010-12-04.zip

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

回复

使用道具 举报

217#
发表于 2010-12-4 23:11:04 | 显示全部楼层
reset 命令增加 -s 参数,复位时预置开关状态

WENV reset -s=???1
复位所有变量和开关状态,第4个开关(use_x32)=on

wenv-tuxw-2010-12-04.zip

84.97 KB, 下载次数: 75, 下载积分: 无忧币 -2

回复

使用道具 举报

218#
发表于 2010-12-5 19:29:04 | 显示全部楼层
原帖由 zhaohj 于 2010-12-5 07:25 发表
尽量少使用参数,不用尽量不用
WENV reset -s=???1
==》wenv (reset  ; switch ???1)

有了key(),echar()也无用处


用于动态批处理生成,key比echar更好用,但echar有些特殊的地方会用到。跟 get VAR=ADDR 一样,有时候还是很有用的。

-s 跟 就是 reset 再 switch,效果一样,因为我的应用里都要用32位,加个参数少打几个字。


发现 gpart 一个BUG:活动分区是第一个分区时,只会生成 ?_WENV ,不会生成 GP_ 开头的4个变量,修复了这个问题。

wenv-tuxw-2010-12-05.zip

84.96 KB, 下载次数: 202, 下载积分: 无忧币 -2

回复

使用道具 举报

219#
发表于 2010-12-6 18:11:35 | 显示全部楼层
太棒了,read命令几乎可以退休了
回复

使用道具 举报

220#
发表于 2010-12-13 16:36:39 | 显示全部楼层
修复check ""==" " 返回真的BUG

注意:
check ""=="" 仍返回真,这样参数为空或变量不存在时仍可比较


@chenall
这个不是check的问题,是基础函数 grub_memcmp 的BUG,没有检查 s2 长度为0 的情况。
在你的版本中因为不允许比较空或不存在的变量(直接返回参数错误了),所以这个BUG被隐藏了

wenv-tuxw-2010-12-13.zip

85.01 KB, 下载次数: 65, 下载积分: 无忧币 -2

回复

使用道具 举报

221#
发表于 2010-12-14 12:26:53 | 显示全部楼层
没看明白,setrd没有屏幕输出,\n加在什么地方?
回复

使用道具 举报

222#
发表于 2010-12-14 15:04:43 | 显示全部楼层
不是竟然没有,输出的是文件原始内容,没有增减过换行
find 输出的是 STRING 和 ENDS 之间的内容
输出中间段时,一般段名前会有个换行,输出就有换行
最后一段时,ENDS实际上是文件结束符,如果文件没有换行,输出也没有换行。

加个换行倒是不麻烦,这个问题看有没有必要,因为加换行实际上改变了文件内容。
目前可以通过修改rd_size,然后用echo追加一个换行符
回复

使用道具 举报

223#
发表于 2010-12-14 15:40:20 | 显示全部楼层
1.增加 getdev/setdev 命令,保存恢复引导、当前设备
2.取消 read 命令(可完全由批处理取代了)
3.dir 命令增加 -f 参数,显示文件大小


WENV  getdev  [VAR]

保存 0x8208, 0x8280, 0x829C, 0x82A0 四个32位整数值到 VAR 中。保存格式是空格分开 4 个 16 进制数。
这个保存值可以被 SETDEV 命令使用。
如未指定变量,将保存到内置变量 ?_DEV

如希望保存值生存周期比较长,尽量指定变量名。因为目前可能动态使用的变量有三个: ?_FIND, ?_RD, ?_DEV,但动态使用变量名字空间只有2个,中间可能需要使用 reset ?* 清理动态生成的内置变量


WENV  setdev  [-b] [-c]  [VAR]

从指定变量 VAR 或 内置变量 ?_DEV 恢复引导、当前设备。
-b 只恢复引导设备
-c 只恢复当前设备

======================
这么快有1个下载了,先上传的忘了打包源代码,重新上传了


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

wenv-tuxw-2010-12-14.zip

74.18 KB, 下载次数: 143, 下载积分: 无忧币 -2

回复

使用道具 举报

224#
发表于 2010-12-14 16:38:12 | 显示全部楼层
我在使用过程中也碰到这个问题,多个模块既可独立工作,也可相互配合工作,独立使用是reset没问题,配合使用时reset会清掉需要相互传递环境变量。目前暂时只能随用随清除,尽量少用reset全清。

这是个比较有用的需求,可以考虑一下用什么样的语法来实现这个问题。或者将60个变量分成两类,如50+10,reset -u 清掉前50个,reset 清所有,这样对set命令会有一些要求,就是如何区分一个变量是放在50中还是放在10中

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

一个折中的方案
wenv reset -keep=prefix
指前缀的变量不要清除,这样改动比较少,用户可以使用自己习惯的前缀。

[ 本帖最后由 tuxw 于 2010-12-14 16:55 编辑 ]
回复

使用道具 举报

225#
发表于 2010-12-14 21:22:03 | 显示全部楼层
原帖由 zhaohj 于 2010-12-14 18:22 发表
蓝色部分改成下面就通过了:
WENV find // (fd2)/_LIST || configfile (fd2)/ERROR.LST

发现使用12-14的WENV又没有问题了,看来12-13的wenv有问题


12-13 修改没动过set命令,有可能是debug状态0时cat没有输出,管道后面相当于 wenv set a=


1.reset增加参数
2.用户变量59个,内置变量5个

WENV reset [-k[=prefix]]

WENV reset -k,     保留内置变量,清除用户变量
WENV rseet -k=abc, 保留内置变量和abc打头的用户变量
-k 不能与 -s 同时使用

现在3个内置变量 ?_DEV, ?_RD, ?_FIND 可以当全局变量用

======================
修复可 reset 两个固定内置变量的BUG,附件已更新

[ 本帖最后由 tuxw 于 2010-12-14 22:06 编辑 ]

wenv-tuxw-2010-12-14.zip

74.57 KB, 下载次数: 428, 下载积分: 无忧币 -2

回复

使用道具 举报

226#
发表于 2010-12-14 23:37:47 | 显示全部楼层
-s 复位同时预置开关状态
回复

使用道具 举报

227#
发表于 2010-12-15 12:49:45 | 显示全部楼层
原帖由 xiaoy 于 2010-12-15 10:32 发表
请教  WENV set tmp=$input,Enter path to the .VHD (default: /boot/boot.VHD):
怎么加个时间限制  如果2秒钟内没有按键则自动回车


目前WENV不能实现这个要求,需要grub4dos支持才行,因为键盘输入是调用grub4dos的接口实现的。
如果只输入一个字符,可以通过pause实现,现在pause支持返回按键值了。
回复

使用道具 举报

228#
发表于 2010-12-16 21:00:07 | 显示全部楼层
修复 calc *ADDR>>/<< bug
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=180142&page=23#pid2113044

wenv-tuxw-2010-12-16.zip

75.43 KB, 下载次数: 207, 下载积分: 无忧币 -2

回复

使用道具 举报

229#
发表于 2010-12-16 22:00:00 | 显示全部楼层
批处理会将2个%处理成一个,只能在批处理里多写几个%
回复

使用道具 举报

230#
发表于 2010-12-16 22:13:57 | 显示全部楼层
这个问题应该由grldr处理,不要将非参数的%%替换成%。
wenv是无能为力的,因为执行命令时命令行已经被grldr替换过了,wenv不可能猜测用户的原始命令再将%再替换成%%,那样会引出更多的问题,如何知道用户需要的两个%还是截取操作符呢?

其实这个问题是win cmd遗留下来的BUG,被grldr继承了,目前只能按cmd的习惯,批处理中双写%

[ 本帖最后由 tuxw 于 2010-12-16 22:19 编辑 ]
回复

使用道具 举报

231#
发表于 2010-12-17 09:59:12 | 显示全部楼层
原帖由 chenall 于 2010-12-17 00:32 发表

呵呵,GRLDR的批处理同样不可能正确猜测用户的命令行%n到底是应该替换成参数呢,还是不替换.
虽然可以做到不符合参数条件的不处理,但因为这个参数条件是多样的.处理起来很麻烦.
符合条件的字符组合.
%,0-9 ...


噢,我对批处理参数的了解一直停留在 %0-%9,什么时候已经扩展了 dpnx~ 这些截取特性?如果是这样的话,确实不好判断

有没有可能只处理偶数个的%%?这样WENV有可能将它再替换回去,目前这样不行,因为命令行里的%%被grldr替换前有可能是3个也有可能是4个,wenv不能还原它。还有一点,WENV如何识别当前的命令是在批处理中运行的?

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

使用道具 举报

232#
发表于 2011-5-16 02:36:10 | 显示全部楼层
原帖由 zhaohj 于 2011-1-19 11:29 发表
@tuxw:
wenv dir -c 参数是否有问题,目前文件名大小写无法区别


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

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

设计这个参数的目的是是为了过滤出小写的文件名(默认情况下如果文件名小写没法将大写文件名排除)
回复

使用道具 举报

233#
发表于 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 编辑 ]
回复

使用道具 举报

234#
发表于 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 编辑 ]
回复

使用道具 举报

235#
发表于 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

回复

使用道具 举报

236#
发表于 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
回复

使用道具 举报

237#
发表于 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

回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-10 02:12

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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