无忧启动论坛

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

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

  [复制链接]
361#
发表于 2010-10-6 13:54:18 | 只看该作者
++、--目前是否有问题?
加减乘除与或(左右)移位操作正常

[ 本帖最后由 zhaohj 于 2010-10-6 14:04 编辑 ]

Snap1.jpg (41.41 KB, 下载次数: 67)

Snap1.jpg
回复

使用道具 举报

362#
发表于 2010-10-6 14:28:51 | 只看该作者
^是异或

++/--是不正常
wenv calc ${t1}++ 计算结果正确,但它并不会自增

[ 本帖最后由 tuxw 于 2010-10-6 14:48 编辑 ]
回复

使用道具 举报

363#
发表于 2010-10-6 14:40:37 | 只看该作者
增加整数比较功能
字符串比较支持*${VAR}写法

[local]2[local]

wenv_tuxw_1006.zip (14.54 KB, 下载次数: 19)

整数比较.png (6.76 KB, 下载次数: 91)

整数比较.png
回复

使用道具 举报

364#
 楼主| 发表于 2010-10-6 15:09:01 | 只看该作者
原帖由 zhaohj 于 2010-10-6 13:54 发表
++、--目前是否有问题?
加减乘除与或(左右)移位操作正常


++ --
我取消了这个功能.只保留了=前面的++/--
=后面的目前不再支持.
回复

使用道具 举报

365#
发表于 2010-10-6 15:33:36 | 只看该作者
++/--本来是单目操作,后面的意义不大
但目录对地址可以自增,对变量不起作用,我看了下到calc里面后没有名字信息,要处理在替换之前处理变量
回复

使用道具 举报

366#
发表于 2010-10-6 15:43:37 | 只看该作者
++ --干脆全取消算了,现在有点乱。${var}++与${var}+1没区别。

字符串处理已经够用了,文本处理要再增加功能。

[ 本帖最后由 zhaohj 于 2010-10-6 16:05 编辑 ]
回复

使用道具 举报

367#
 楼主| 发表于 2010-10-6 17:40:02 | 只看该作者
今天晚上可能没有空了

先更新一下.
2010-10-06
1.添加四个比较符 ==,<>,>=,<=

2.支持按数字比较
例,以下都会返回真.
001 == 1 或 0x20 == 32
3.修正前面WENV SET XXX=
如果XXX变量不存在时会设置变量的BUG.
回复

使用道具 举报

368#
发表于 2010-10-6 18:07:39 | 只看该作者
添加了对变量的自增自减

WENV calc ${VAR}++/--

只支持简单语法
WENV calc ${VAR}++
WENV calc ${VAR}++ &...
WENV calc ${VAR}++ |...
WENV calc ${VAR}++ ]...

其它写法均不合法,如
WENV calc ${VAR}++ a
WENV calc t1=${VAR}++

wenv_tuxw_1006.zip (15.4 KB, 下载次数: 19)
回复

使用道具 举报

369#
发表于 2010-10-6 18:37:52 | 只看该作者
这结果让我有点无奈

回复

使用道具 举报

370#
发表于 2010-10-6 18:44:15 | 只看该作者
Filename Must be either ...
这个提示一般是语法有问题,比如哪里少了个空格,或掉了文件名之类的
回复

使用道具 举报

371#
发表于 2010-10-6 18:49:33 | 只看该作者

回复 #370 tuxw 的帖子

那个错误是正常  直接执行kernel都这样  是这判断结果让我郁闷  

比如 WENV ${de}==ISO || kernel  此时de值为IMA  这样判断的话应该会执行kernel  但是没有

WENV ${de}==ISO && kernel  进行判断不应该执行kernel  结果却执行了

想不明白了  不知道为什么结果会这样

[ 本帖最后由 sratlf 于 2010-10-6 19:02 编辑 ]
回复

使用道具 举报

372#
 楼主| 发表于 2010-10-6 19:12:14 | 只看该作者
原帖由 sratlf 于 2010-10-6 18:49 发表
那个错误是正常  直接执行kernel都这样  是这判断结果让我郁闷  

比如 WENV ${de}==ISO || kernel  此时de值为IMA  这样判断的话应该会执行kernel  ...


看起来是WENV的BUG,我再查一下.
回复

使用道具 举报

373#
发表于 2010-10-6 19:26:01 | 只看该作者
这个问题是比较奇怪,可以先不在菜单上
比如这个 WENV ${de}==ISO 结果不为预期

先在命令行单独执行
WENV set  path=.../xxx.IMG
WENV set de=${path:-3:3}
WENV img==${de} && ECHO yes
这样逐步定位问题出在哪里


另外这个菜单写法
WENV get de=IMG && WENV run map --mem ${path} (fd0) && map --hook && rootnoverify (fd0) && chainloader ()+1 && boot
WENV run map --mem ${path} (0xff) && map --hook && chainloader (0xff) && boot
是有问题的
即使IMG判断正常,但如果后面的任一条语句失败,它会转而执行ISO句,而这时外部命令路径很可能已经变了,前面的WENV 就会出错,而且IMG去用ISO的方式启动也不可能正常。所以后面一条命令也应该用条件限制住
回复

使用道具 举报

374#
 楼主| 发表于 2010-10-6 19:27:33 | 只看该作者
是一个隐藏的BUG,汗,没注意

已经修正并重新上传新版.
回复

使用道具 举报

375#
发表于 2010-10-6 19:49:22 | 只看该作者
@tuxw  #369的图片就是在虚拟机测试  手动输入来的  结果就是那个

另外这个菜单写法
WENV get de=IMG && WENV run map --mem ${path} (fd0) && map --hook && rootnoverify (fd0) && chainloader ()+1 && boot
WENV run map --mem ${path} (0xff) && map --hook && chainloader (0xff) && boot
是有问题的
即使IMG判断正常,但如果后面的任一条语句失败,它会转而执行ISO句,而这时外部命令路径很可能已经变了,前面的WENV 就会出错,而且IMG去用ISO的方式启动也不可能正常。所以后面一条命令也应该用条件限制住


确实有道理  会加上个限制  谢谢提醒

@chenall

新版测试没有问题了  测试比较结果这次没问题了
回复

使用道具 举报

376#
 楼主| 发表于 2010-10-7 01:18:23 | 只看该作者
更新了一下.支持变量自增/自减

注,++/--必须跟在一个变量后面,否则都算非法操作.并且变量是直接引用不需要使用${}

但是使用${VARIABLE}的方式可以加快运行的速,建议如果不是自增/减的变量就用${}

例子:

wenv set a=1
wenv calc a++
wenv calc b=a++
wenv calc b=${a}+b++

注:用起来应该挺好用的(^_^),只是我对实现的方式不是很满意,以后再优化改进了.现在是保证能用先.
另一点,这个++的C语言的处理不一样,会优先计算++.
回复

使用道具 举报

377#
发表于 2010-10-7 07:57:08 | 只看该作者
自增/自减现在这样比较符合习惯。
回复

使用道具 举报

378#
 楼主| 发表于 2010-10-7 16:07:54 | 只看该作者
昨天晚上上传的版本如果对*ADDR执行++/--计算时会出错.今天的版本已经修正,并修改了一下.
运算符 ++/--使用C语言的语法进行操作.

2010-10-07
   1.CALC支持自增/自减运算符++/--,和C语言的语法一样
   例子,注意执行的顺序.
   wenv calc a=b++ //结果a=b b=b+1
   wenv calc a=++b //结果b=b+1 a=b
回复

使用道具 举报

379#
发表于 2010-10-7 17:17:53 | 只看该作者
比较指令还有问题
WENV 123<>abc || ECHO tip
WENV 123==abc || ECHO tip
这两句返回相同的结果

下面这个版本修正的这一问题
对比较指令,如果比较符前后都能转换成数值,优先按数值比较,否则按字符串比较
如 WENV 16==0x10,这个返回真
但如果明确要按字符串比较,可以用引号括起来
WENV set TT=0x10
WENV "0x10"=="${TT}"

wenv_tuxw_1007.zip (15.07 KB, 下载次数: 16)
这个版本没有包含chenall刚发布的更新,chenall请更新
回复

使用道具 举报

380#
 楼主| 发表于 2010-10-7 18:20:02 | 只看该作者
原帖由 tuxw 于 2010-10-7 17:17 发表
比较指令还有问题
WENV 123abc || ECHO tip
WENV 123==abc || ECHO tip
这两句返回相同的结果

下面这个版本修正的这一问题
对比较指令,如果比较符前后都能转换成数值,优先按数值比较,否则按字符串比较 ...


已经更新...

另外
strstrn函数里面
while( NULL != (s=(strstr(p, s2))) && p > s1 );

应该是 while( NULL == (s=(strstr(p, s2))) && p > s1 );
回复

使用道具 举报

381#
 楼主| 发表于 2010-10-7 18:23:25 | 只看该作者
另外字符串处理有没有什么好的建议,大家可以讨论一下.具体要如何实现??

字符串处理,目前有简单的截取了.

需要添加的功能有:
1.字符串替换
2.读取文本文件.
3.循环(类似for)..
回复

使用道具 举报

382#
发表于 2010-10-7 19:03:04 | 只看该作者
字符串处理希望有检测字符串长度(<512字节);
如WENV set a=abcd1234
WENV calc length=$${a},  或WENV calc length=L${a},  得到length=8

文本文件最希望实现>>功能,即 append
比如我们存在一个可写的1M文本文件,write --offset=0 (fd0)/1.txt abcd1234\n\r
但我们要接着写入一行,不知怎么写?所以最希望有write --append ,DOS中的>>
另,文本文件的字符串替换

[ 本帖最后由 zhaohj 于 2010-10-7 19:50 编辑 ]
回复

使用道具 举报

383#
 楼主| 发表于 2010-10-7 21:03:59 | 只看该作者
原帖由 zhaohj 于 2010-10-7 19:03 发表
字符串处理希望有检测字符串长度(>功能,即 append
比如我们存在一个可写的1M文本文件,write --offset=0 (fd0)/1.txt abcd1234\n\r
但我们要接着写入一行,不知怎么写?所以最希望有write --append ,DOS中的 ...


如果需要修改文件大小,这涉及到文件系统,目前不太可能实现(当然不排除有人愿意写一个补丁)..

当然了FAT文件系统,因为我有去了解过,要在FAT文件系统上实现还是比较容易的,但目前没有这个计划.

目前我们可以先修改FAT命令让它可以APPEND.
回复

使用道具 举报

384#
发表于 2010-10-7 23:42:53 | 只看该作者
麻烦C大看下是否是bug



接上图

回复

使用道具 举报

385#
 楼主| 发表于 2010-10-7 23:51:50 | 只看该作者
这不是BUG.

find 查找文件必须使用/开头,你可以用/WIN$.ISO就不会了.

find 命令后面如果没有/开头,则认为这是一个命令.
回复

使用道具 举报

386#
发表于 2010-10-7 23:52:54 | 只看该作者
title [09] Install MS Windows NT5X (/WIN$.ISO default) \n Install OS MS 2K/XP/2003 From /WIN$.ISO as default
clear
fallback 15
(cd)/BOOT/G4D/WENV run pause --wait=0 Please input ISO/IMG PATH or press Enter to use /WIN$.ISO as default.
(cd)/BOOT/G4D/WENV set path=$U,$input,Input PATH here, begin with "/" :
(cd)/BOOT/G4D/WENV ${path}== && (cd)/BOOT/G4D/WENV set path=/WIN$.ISO && pause --wait=0 Now use /WIN$.ISO as default.
(cd)/BOOT/G4D/WENV set de=${path:-3:3}
(cd)/BOOT/G4D/WENV run find --set-root --ignore-floppies --ignore-cd ${path}
(cd)/BOOT/G4D/WENV run pause --wait=0 Now loading ${path} ...
(cd)/BOOT/G4D/WENV run pause --wait=0 1
(cd)/BOOT/G4D/WENV ${de}==ISO || (cd)/BOOT/G4D/WENV run map --mem ${path} (fd0) && map --hook && rootnoverify (fd0) && chainloader (fd0)+1 && boot
(cd)/BOOT/G4D/WENV run pause --wait=0 2

cat --length=0 (cd)/BOOT/IMGS/FIRADISK.IMG && root (cd) || find --set-root --ignore-floppies /BOOT/IMGS/FIRADISK.IMG
(cd)/BOOT/G4D/WENV run pause --wait=0 3
map --mem ()/BOOT/IMGS/FIRADISK.IMG (fd1)
(cd)/BOOT/G4D/WENV run pause --wait=0 4
map --mem (md)0x6000+800 (fd0)
(cd)/BOOT/G4D/WENV run pause --wait=0 5
(cd)/BOOT/G4D/WENV run find --set-root --ignore-floppies --ignore-cd ${path}
(cd)/BOOT/G4D/WENV run pause --wait=0 6
(cd)/BOOT/G4D/WENV run map --mem ()${path} (0xff) || (cd)/BOOT/G4D/WENV run map ()${path} (0xff)
(cd)/BOOT/G4D/WENV run pause --wait=0 7

map --hook
dd if=(fd1) of=(fd0) count=1
(cd)/BOOT/G4D/WENV run pause --wait=0 Input D to boot from the disk,or press Enter to boot form the ISO.
(cd)/BOOT/G4D/WENV set in=$U,$input,Input here :
(cd)/BOOT/G4D/WENV ${in}==D || chainloader (0xff) && boot
find --set-root --ignore-floppies --ignore-cd /$LDR$ && ls /WIN_NT$.~BT/SETUPLDR.BIN && chainloader --force /$LDR$ && boot
find --set-root --ignore-floppies --ignore-cd /$LDR$ && ls /NTDETECT.COM && chainloader --force /$LDR$ && boot
find --set-root --ignore-floppies --ignore-cd /NTLDR && ls /NTDETECT.COM && chainloader --force /NTLDR && boot
kernel

同时测试着还有一个问题  上面是测试用完整菜单  

用WIN$.ISO测试时在1和2中间会加载一次WIN$.ISO   (理论来说此处不应该加载,de值为ISO,不应执行后面)  在6和7中间会再加载一次

正常来说应该只加载一次  (即6和7中间那次)

而且1和2中间部分(蓝字部分)在手动输入测试时却正常  不明白为什么  附图

回复

使用道具 举报

387#
发表于 2010-10-7 23:55:06 | 只看该作者
原帖由 chenall 于 2010-10-7 23:51 发表
这不是BUG.

find 查找文件必须使用/开头,你可以用/WIN$.ISO就不会了.

find 命令后面如果没有/开头,则认为这是一个命令.



哦  是我的疏忽  不过为什么后面几个随便写的变量 find却说是(hd0,0)呢
回复

使用道具 举报

388#
 楼主| 发表于 2010-10-8 00:41:09 | 只看该作者
(cd)/BOOT/G4D/WENV ${path}== && (cd)/BOOT/G4D/WENV set path=/WIN$.ISO && pause --wait=0 Now use /WIN$.ISO as default.

注意这里
(cd)/BOOT/G4D/WENV set path=/WIN$.ISO &&

设置的变量后面会有一个多一个空格。。。
具体你在菜单中添加一行显示的命令就知道了
wenv run echo #${path}#
但是以上命令在命令行中执行是正常的,因为命令行我有修正过,但菜单的好像忘了修正了。


不过为什么后面几个随便写的变量 find却说是(hd0,0)呢

那要看变量是什么了,
find --set-root 后面如果有一个文件以/开头的就找这个文件,如果不是可能是执行一条命令(命令返回真就设root)

如果是空白,则设置第一个分区为root具体你可以看看我的NTBOOT.IMG里面的菜单注释。

通过find --set-root 定位第一个激活分区,最后分区。

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

使用道具 举报

389#
发表于 2010-10-8 01:55:20 | 只看该作者

回复 #388 chenall 的帖子

那什么时候修正下吧

现在是把
(cd)/BOOT/G4D/WENV ${path}== && (cd)/BOOT/G4D/WENV set path=/WIN$.ISO && pause --wait=0 Now use /WIN$.ISO as default.
分成两行来执行就没问题了
回复

使用道具 举报

390#
发表于 2010-10-8 02:04:44 | 只看该作者
原帖由 sratlf 于 2010-10-7 23:52 发表
...

(cd)/BOOT/G4D/WENV ${path}== && (cd)/BOOT/G4D/WENV set path=/WIN$.ISO && pause --wait=0 Now use /WIN$.ISO as default.

...



版主又发明了个用法:WENV ${path}== && ...
这个是比较边缘的用法(以后不一定被支持),因为有两种可能:
1、path不存在
2、path存在但值为空(目前除了一个默认变量外不会有这个情况,且新版用户不能访问__wenv了,但以前的版本是可以的)
判断path不存在应该用 WENV get path ||

@chenall
从这个用法里我发现一个问题
wenv set T1=abc def
wenv set abc==${T1} 会返回真值

这个行为可能要重新定义下,是不允许set值后有空格,还是判断时不要过滤掉空格。或者要求将串用引号括起来?

另特别感谢一下chenall,你帮我将coLinux网络调正常后好用多了,省了在虚拟机内外倒来倒去的麻烦。

[ 本帖最后由 tuxw 于 2010-10-8 02:14 编辑 ]
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-24 00:51

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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