无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: chenall
打印 上一主题 下一主题

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

  [复制链接]
961#
发表于 2010-11-25 21:02:21 | 只看该作者
竟然发现下面没起作用:
WENV reset a
WENV call cat --length=0 ${srs} && WENV (call map --mem=0xB000 ${srs} (rd) ; set a=${IDN}.SY_)
WENV call cat --length=0 ${srs1} && WENV (call map --mem=0xB000 ${srs1} (rd) ; set a=${IDN}.SYS)
WENV get a || configfile (fd2)/ERROR.LST
WENV echo ${a} | FAT copy /o (rd)+1 (fd1)/
-----------------
改成下面成功:
WENV reset a
WENV call cat --length=0 ${srs} ]]& call map --mem=0xB000 ${srs} (rd) ]]] set a=${IDN}.SY_
WENV call cat --length=0 ${srs1} ]]& call map --mem=0xB000 ${srs1} (rd) ]]] set a=${IDN}.SYS
WENV get a || configfile (fd2)/ERROR.LST
WENV echo ${a} | FAT copy /o (rd)+1 (fd1)/

因为有菜单,不敢用wenv call exec fat

[ 本帖最后由 zhaohj 于 2010-11-25 21:03 编辑 ]
回复

使用道具 举报

962#
发表于 2010-11-25 21:17:49 | 只看该作者
另外发现一个怪现象:下面的仿真盘都是完好的,但出现:

Snap1.jpg (15.04 KB, 下载次数: 85)

Snap1.jpg

Snap2.jpg (35.85 KB, 下载次数: 101)

Snap2.jpg
回复

使用道具 举报

963#
发表于 2010-11-25 21:22:40 | 只看该作者
我目前用这样的办法解决:
echo -n ########### >> (fd1)/TXTSETUP.OEM
echo -n ########### >> (fd1)/SRS.INF

感觉是文件没有闭合(close).

这个问题比较严重,影响正常使用。
回复

使用道具 举报

964#
发表于 2010-11-25 23:56:51 | 只看该作者
@tuxw  

wenv echo命令是不是有点问题  http://bbs.wuyou.net/forum.php?mod=viewthread&tid=181756
  1. WENV check ${path##.}==ISO call clear ]]& echo \nNow loading ${path} ...\n ]]& map --mem ()${path} (0xff) ]]& map --hook ]]| map ()${path} (0xff) ]]& map --hook
复制代码
以前的版本执行时是在显示Now loading WIN$.ISO ...后开始加载ISO镜像

24号的版本测试显示的是
  1. Now loading WIN$.ISO ...
  2.   ]]& map --mem ()/WIN$.ISO (0xff) ]]& map --hook ]]| map ()/WIN$.ISO (0xff) ]]& map --hook
复制代码
没有加载镜像

更正
  1. WENV check ${path##.}==ISO call map --mem ()${path} (0xff) ]]& map --hook ]]| map ()${path} (0xff) ]]& map --hook
复制代码
这样写也不能执行  应该怎样改

[ 本帖最后由 sratlf 于 2010-11-26 00:04 编辑 ]
回复

使用道具 举报

965#
发表于 2010-11-26 00:03:56 | 只看该作者
改成如下试试:
WENV check ${path##.}==ISO ]]& call clear ]]& echo -e \nNow loading ${path} ...\n ]]& call map --mem ()${path} (0xff) ]]& call map --hook ]]| call map ()${path} (0xff) ]]& map --hook

[ 本帖最后由 zxw 于 2010-11-26 00:08 编辑 ]
回复

使用道具 举报

966#
发表于 2010-11-26 00:11:27 | 只看该作者

回复 #965 zxw 的帖子

不行  还是一样不执行

24号版

WENV set path=/WIN$.ISO
WENV check ${path##.}==ISO call map --mem ${path}    无反应  不执行 (确定WIN$.ISO文件存在)
WENV check ${path##.}==ISO call echo 1               显示 1

[ 本帖最后由 sratlf 于 2010-11-26 00:47 编辑 ]
回复

使用道具 举报

967#
发表于 2010-11-26 07:54:34 | 只看该作者
@stralft
如zxw,扩展了连接符后,调用内部命令不能省略 call

另外 map 命令不一定返回1,有时map成功,根据文件格式不同,可能返回0
这样试一下:
WENV check ${path##.}==ISO (call clear ]]] echo -e \nNow loading ${path} ...\n ]]] call map --mem ()${path} (0xff) ]]] call map --hook ]]] call map ()${path} (0xff) ]]] map --hook)

966#的我情况这样试了下成功
WENV set a=/BOOT/XDOS.IMA
WENV check ${a##.}==IMA (call map --mem ${a} (fd0) ; call map --hook ; call ls (fd0)/)


@zhaohj
WENV 目前只有 find 命令可能会改变 (rd) 指向,可以之前先将它保存起来,使用完后用户可以恢复原值

你也可以通过保存 0x82D0, 0x82D8(注意它们是64位的),之后它用保存值恢复 --rd-base,--rd-size

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

使用道具 举报

968#
发表于 2010-11-26 23:41:00 | 只看该作者
这几天查这个导致机器重启的BUG,比较完整的学习了cmd下for命令的用法,然后逐句看for命令的源码,到处插调试输出信息,始终找不到原因,它并不在固定的地方重启,故障点是随机的。

无奈可奈何回滚到11-15,一步步查哪些改动,每改一下就去测试zhaohj那个for命令,最后查到一个让人吐血的原因,缓冲区太大了(11-19将缓冲区增到大3k,匹配Grub4Dos的管道输出)。

@chenall
这个应该是Grub4Dos内存分配的隐藏BUG,目前扩展 ]]* 连接符后,wenv递归太多内存开销大增,我增大缓冲区后这个问题尤为突出,复杂命令递归时,不停的分配缓冲区,超越了Grub4Dos限制,但正常情况下应该是失败终止程序执行,而不是导致重启。
缓冲区具体能到多大,我没有详细测试,直接改为2K后正常了,在更复杂的命令中仍有可能导致重启的。

@zhaohj
for命令中空行时导致 a=%i 这个问题我试了最好不要改
我测试改过后对语法要求非常严,用户要做更多的判断,如
... do (set a=%i ; check abc==$${a} ...
%i为空时,如果不想出现 a=%i,那么变量a将不存在
后面的 check 就不能这样写了,必须先判断 get a,否则 check 会语法错误

1.命令行缓冲区改为2K
2.修复 set 从命令行输入时直接回车会添加空变量的BUG
3.增加 reset ?* 用法,清除动态的内置变量
4.添加 getrd/setrd 子命令保存恢复 rd 指向(reset命令会清除保存的rd值)
5.find 命令(如果)修改 rd 指向,会自动保存(之后可以 setrd 恢复)

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

wenv-tuxw-2010-11-26.zip

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

回复

使用道具 举报

969#
发表于 2010-11-26 23:54:07 | 只看该作者
辛苦了,怪不得15日的版本正常,后来的版本会发生递归死机问题。
FOR中空行的问题是否解决?
另外,962楼的问题怎么解释?
回复

使用道具 举报

970#
发表于 2010-11-27 00:19:55 | 只看该作者
这是一个空行不会出现 a=%i 的版本,你有条件可以测试下,看看哪种方式比较好,以后再改

wenv for /F %i in ( /SYSINF ) do (set a=%i ; set a) # set a 相当于get a*,这个是跟debug状态无关的,调试时方便点

962# 原因尚不清楚

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

15.36 KB, 下载次数: 20, 下载积分: 无忧币 -2

回复

使用道具 举报

971#
发表于 2010-11-27 00:41:41 | 只看该作者
test这样处理还是不太好,只是把set a=%i变成变量reset a,这样后面还得get a ]]& ...这样处理。
这个问题不大。
WENV文件大小已经达到40k,对一个外部命令来说已经够大的了。我看了下find代码,这部分占了很大空间。为何不单独分离出来处理。
-----------
新版本已经解决了死机问题,CALL调用外部命令是否处理好?
回复

使用道具 举报

972#
发表于 2010-11-27 01:29:10 | 只看该作者
明白你的意思了,下面这个是可以跳过文件中空行的

find要调用其它的字符串函数,如果单独将find分离出去,find+wenv 的大小要远大于40K

call exec 外部命令目前有什么问题吗?最近比较少关注grub4dos的进度。如果没有其它问题的话,没必要分成两个命令,那样wenv的体积还会增大。

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

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

回复

使用道具 举报

973#
发表于 2010-11-27 07:49:50 | 只看该作者
call exec在菜单中是否有效?
我测试在菜单中无效。
回复

使用道具 举报

974#
发表于 2010-11-27 09:48:10 | 只看该作者
我试过了, call exec 在菜单中有效的(grub4dos 11-24)
下面这个已经分离出了exec命令
实际上新版grub4dos可以直接call外部命令,exec只是形式上的将内部命令与外部命令分开

这样改一下的负面影响是只能用新版的Grub4dos了(2010-11-24以后)
之前的版在旧版的2010-11-17以前的grub4dos上也可以使用的
不过WENV只是少数人使用的工具,这部分人跟进Grub4Dos的能力较强,影响不大

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

wenv-tuxw-2010-11-27.zip

56.99 KB, 下载次数: 34, 下载积分: 无忧币 -2

回复

使用道具 举报

975#
 楼主| 发表于 2010-11-27 17:32:15 | 只看该作者
@tuxw
如果你没有使用malloc函数那这个内存分配是由程序自己处理的。

建议你可以试试配合新版的GRUB4DOS,使用malloc函数来分配内存。

注:使用malloc函数必须要用对应的free函数来释放内存,会比较麻烦些,但可以保证程序的正常运行。
回复

使用道具 举报

976#
发表于 2010-11-27 23:15:13 | 只看该作者
嗯,动态分配内存比较灵活,用起来麻烦,执行效率也较低

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

使用道具 举报

977#
发表于 2010-11-28 23:17:50 | 只看该作者
这个版本差不多稳定了就固定下来,完善一下说明。
961#我还得验证一下。
回复

使用道具 举报

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

回复

使用道具 举报

979#
发表于 2010-11-29 16:23:30 | 只看该作者
后面添加回车/换行和二进制结束符

二进制结束符用什么表示的?是不是 >> 也是缺少这个导致文件没有结束标志。
回复

使用道具 举报

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

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

使用道具 举报

981#
 楼主| 发表于 2010-11-29 22:22:24 | 只看该作者
目前wenv dir输出和管道命令有冲突。

暂时应用不大。
回复

使用道具 举报

982#
 楼主| 发表于 2010-11-29 22:55:07 | 只看该作者
重新编译了一个grub4dos版本,尝试解决上面输出重定向冲突的问题。
回复

使用道具 举报

983#
发表于 2010-11-30 22:09:05 | 只看该作者

wenv 1129 取消 ]]| 语法了?

wenv 1129 call 的 fix 把 ]]| 语法废掉了?之前用了这语法的菜单全部挂了,囧

wenv call find --set-root --devices=uh /${WISO} ]]| find --set-root --devices=uh /!ISO/${WISO} ]]| find --set-root --devices=uh /!ISO/${WISO}.ISO ]]| pause --wait=0 Can not find ${WISO}


Error 30: Invalid Arguments
回复

使用道具 举报

984#
发表于 2010-11-30 22:20:02 | 只看该作者

回复 #983 2010qaqz111 的帖子

wenv (call find --set-root --devices=uh /${WISO} ]]| call find --set-root --devices=uh /!ISO/${WISO} ]]| call find --set-root --devices=uh /!ISO/${WISO}.ISO ]]| call pause --wait=0 Can not find ${WISO})

格式早就改了
回复

使用道具 举报

985#
发表于 2010-11-30 22:37:38 | 只看该作者
原帖由 sratlf 于 2010-11-30 22:20 发表
wenv (call find --set-root --devices=uh /${WISO} ]]| call find --set-root --devices=uh /!ISO/${WISO} ]]| call find --set-root --devices=uh /!ISO/${WISO}.ISO ]]| call pause --wait=0 Can not find $ ...

原来要放在括号里面了,谢谢,我试试。


另外一个问题,wenv 的包里有个说明文件,里面说到可以用(wenv-command1 ; wenv-command2 ; wenv-command3) 连续执行多个命令,
还有就是
]]]
]]&
]]|
的格式,其中]]]是无条件执行,是不是就是和 ; 一样的效果了?

[ 本帖最后由 2010qaqz111 于 2010-11-30 22:45 编辑 ]
回复

使用道具 举报

986#
发表于 2010-11-30 22:58:18 | 只看该作者

回复 #985 2010qaqz111 的帖子

应该是,我也不敢保证,wenv更新了很多,那个说明还是旧版的
回复

使用道具 举报

987#
 楼主| 发表于 2010-12-1 00:07:37 | 只看该作者
原帖由 2010qaqz111 于 2010-11-30 22:37 发表

原来要放在括号里面了,谢谢,我试试。


另外一个问题,wenv 的包里有个说明文件,里面说到可以用(wenv-command1 ; wenv-command2 ; wenv-command3) 连续执行多个命令,
还有就是
]]]
]]&
]]|
的格式 ...


往前翻几页就可以得到答案了。你可以不要括号。

]]] 和 ; 的区别。
]]]会清除前一句的error值,而;不会,对于一般用户来说区别不是很大。
回复

使用道具 举报

988#
发表于 2010-12-1 00:10:31 | 只看该作者
@tuxw:
wenv find感觉有问题

哇,自己多写了个0,sorry!

[ 本帖最后由 zhaohj 于 2010-12-1 00:23 编辑 ]

Snap1.jpg (94.41 KB, 下载次数: 96)

Snap1.jpg

Snap2.jpg (15.44 KB, 下载次数: 103)

Snap2.jpg
回复

使用道具 举报

989#
发表于 2010-12-1 08:47:31 | 只看该作者
现在不知道怎样查找最后一个段落的内容,如txtsetup.oem中[config.SYMMPI]这样的内容

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

[ 本帖最后由 zhaohj 于 2010-12-1 08:53 编辑 ]
回复

使用道具 举报

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

回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-29 23:19

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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