无忧启动论坛

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

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

  [复制链接]
931#
发表于 2010-11-24 12:59:09 | 只看该作者
原帖由 chenall 于 2010-11-24 10:44 发表

:两个引号通过,一个引号失败
WENV set a=abc""def\
WENV check abc""def\==${a} echo ok: check [${a}]

GRUB4DOS批处理其实是不管引号的。它是碰到回车符就截断,把这个命令丢给命令行去执行。

...

发的样本里是两个引号,运行正常的,将那两个引号改成一个引号就不正常了。不正常时在命令行运行这两句是正常的,应该不是check的原因。

下面是先批处理,再命令行运行的截图


@zhaohj
是的,我编译时只在wenv运行时清一次errnum,当时考虑的时,子命令设置了errnum肯定是出错了,应该退出。既然发现这个问题,我清一下好了。
事实上贸然清掉errnum是有负面影响的,比如read命令,中途碰到有命令设置errnum,就会中止执行,清掉errnum后这个特性将丧失,中途出错它也将继续执行下去,如果出错的是一个影响后续命令的关键条件,结果将不可预期。

是否清errnum只影响call内部命令,因为有些内部命令可以正常执行但会设置errnum,比如find没找到文件时,语法上命令是正常执行的,但它要设置errnum(我觉得这个应该只返回0就行了,errnum应该代表“出错”),还有map命令。

或者变更一下处理方式,只在call命令前后清掉errnum,这样就可以正常调用内部命令。

[ 本帖最后由 tuxw 于 2010-11-24 13:16 编辑 ]
回复

使用道具 举报

932#
 楼主| 发表于 2010-11-24 13:18:14 | 只看该作者
清errnum可以和grub4dos内部机制一样(最新版的WENV就是这样的,源码在SVN上。)

如果后一个语句是]]& ]]| ]]! 时才会清,否则不清。

前面的问题,我下午再抽空试一下。
回复

使用道具 举报

933#
发表于 2010-11-24 13:51:17 | 只看该作者
@tuxw:
最新版,还是发现问题,但问题很难查

在运行OEM驱动时,出现错误,你可以在菜单中“按4”打开debug

问题出在这一段(makeoem.lst):
(fd2)/ENVI.BAT
(fd2)/DRIVERS.BAT
##检查(fd1)中是否存在.sy?文件,如果没有提示错误返回
checkrange 1 debug && echo @@@check (fd1) exist .sy? file?
map --rd-base=0xF00000 && map --rd-size=1024
ls (fd1)/ > (rd)+1
WENV find .sy (rd)+1 && WENV set sys=${?_WENV} ! WENV reset sys
WENV get sys || configfile (fd2)/ERROR.LST
checkrange 1 debug && ls (fd1)/ && echo && pause --wait=10 Display (fd1) files information ,Press any key ...

-----------------
(fd2)/DRIVERS.BAT已经运行后,看图片复制已经成功。

[ 本帖最后由 zhaohj 于 2010-11-24 13:59 编辑 ]

Snap1.jpg (85.41 KB, 下载次数: 118)

Snap1.jpg

test6_tuxw.rar

87.5 KB, 下载次数: 37, 下载积分: 无忧币 -2

回复

使用道具 举报

934#
发表于 2010-11-24 14:23:14 | 只看该作者

回复 #933 zhaohj 的帖子

和内存有关系吧  昨天测试dos时代菜鸟的工具箱157版时也出现了这样的错误提示
回复

使用道具 举报

935#
 楼主| 发表于 2010-11-24 15:03:54 | 只看该作者
原帖由 tuxw 于 2010-11-24 12:59 发表

发的样本里是两个引号,运行正常的,将那两个引号改成一个引号就不正常了。不正常时在命令行运行这两句是正常的,应该不是check的原因。

下面是先批处理,再命令行运行的截图
105844


查了一下应该是skip_to函数的bug,正在修正、优化。
回复

使用道具 举报

936#
发表于 2010-11-24 15:24:54 | 只看该作者
1.call 命令后清除 errnum
    wenv check 1=1 ]]] echo here                 # 前面语法错误,命令终止
    wenv call find /not_find_file ]]] echo here  # 会执行echo

2.echo 命令添加 -a 参数显示ASCII转义符
3.添加伪命令 echar 将最多3个字符转为转义符,可以直接用在字符串中
   
如果确实要显示 echar(*) 这样的字符
wenv switch dis_echar=on, 可以禁止这个转换特性

wenv-tuxw-2010-11-24.zip

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

回复

使用道具 举报

937#
 楼主| 发表于 2010-11-24 17:12:38 | 只看该作者
因为时间不连续,一会儿改一点,改得有点乱了,几个命令执行函数重写。

不知会不会有问题,已经上传了一个新的GRUB4DOS测试版。先试一下再说。

[ 本帖最后由 chenall 于 2010-11-24 17:48 编辑 ]

grldr.rar

116.39 KB, 下载次数: 33, 下载积分: 无忧币 -2

回复

使用道具 举报

938#
发表于 2010-11-24 17:33:25 | 只看该作者
GRUB4DOS测试版,不认识GOTO了?不会跳转。
回复

使用道具 举报

939#
 楼主| 发表于 2010-11-24 17:48:47 | 只看该作者
重新上传了,前面上传的有问题。

只上传了grldr.在上一楼。

已经上传,修正了skip_to在处理引号配对时出现的BUG。


另外对几个可能会发生错误的地方也进行了调整。

[ 本帖最后由 chenall 于 2010-11-24 22:37 编辑 ]
回复

使用道具 举报

940#
发表于 2010-11-24 21:39:02 | 只看该作者
楼主上管道命令有问题
回复

使用道具 举报

941#
发表于 2010-11-24 22:13:22 | 只看该作者
不点也上传了新的版本
回复

使用道具 举报

942#
 楼主| 发表于 2010-11-24 22:36:42 | 只看该作者
原帖由 tuxw 于 2010-11-24 21:39 发表
楼主上管道命令有问题



OK,一个地方没有改过来。

重新上传了。

grub4dos-0.4.5b-2010-11-24-fix2.zip


已经集成不点发布的版本补丁。
回复

使用道具 举报

943#
发表于 2010-11-24 23:20:35 | 只看该作者
@zhaohj
用 wenv-tuxw-2010-11-24 测试了下你的 SRSF6模块,用法上有些细节问题,我修改了几个菜单,现在 TXT/SIF/OEM 都可以进到这个画面,再往后我就不懂了。

菜单的修改我是根据你的调用次序,改到了 makeoem.lst ,再往后的就没动了。



顺便加了个二值切换菜单实时显示



后面的列表方式、手动输入方式我没改过。太累了,我对 SRS 一点也不懂,调试这个很废劲。

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

SRSF6.zip

92.24 KB, 下载次数: 17, 下载积分: 无忧币 -2

回复

使用道具 举报

944#
发表于 2010-11-24 23:31:11 | 只看该作者
原帖由 chenall 于 2010-11-24 22:36 发表

OK,一个地方没有改过来。
重新上传了。
grub4dos-0.4.5b-2010-11-24-fix2.zip

已经集成不点发布的版本补丁。


OK,现在 set a=abc"def\, check ... 的问题也通过了
回复

使用道具 举报

945#
发表于 2010-11-25 00:02:51 | 只看该作者
@tuxw:
我也刚找到病因,问题出在这两句for
WENV for /f "tokens=3 delims==," %i in ( (fd1)/SYSINF ) do (set a=$u,%i ; check %<-$${a} loop ; set -e b=\x26\x26 ; echo cat --length=0 $${srspath}$${a} $${b} FAT copy /o $${srspath}$${a} (fd1)/) >> (fd2)/DRIVERS.BAT
WENV for /f "tokens=3 delims==," %i in ( (fd1)/SYSINF ) do (set a=$u,%i ; check %<-$${a} loop ; check .SYS<-$${a} ]]& (set a=$${a!.SYS=.SY_} ; set -e b=\x26\x26 ; echo cat --length=0 $${srspath}$${a} $${b} FAT copy /o $${srspath}$${a} (fd1)/)) >> (fd2)/DRIVERS.BAT

一运行就死
回复

使用道具 举报

946#
发表于 2010-11-25 00:09:06 | 只看该作者
check %<-$${a}
for 里面的 % 作普通字符后面最好空一格
check % <-"$${a}" loop
不管a有没有空格,但它是变量,我们不知道,都给它加上界定符

set -e b=\x26\x26

现在可以用 echar(&&) 代替,直接用在echo命令中

[ 本帖最后由 tuxw 于 2010-11-25 00:11 编辑 ]
回复

使用道具 举报

947#
发表于 2010-11-25 00:31:12 | 只看该作者
check % <-"$${a}" loop 还是死机
不是check % <-"$${a}" loop 引起的,是后面语句引起的,奇怪了

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

使用道具 举报

948#
发表于 2010-11-25 00:32:08 | 只看该作者
#945这段在哪个文件中,我再测试一下

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

已下载了 933# 附件,明天再测试
943# 我是在你11-09的基础上改的的 IMG,驱动目录用的是 11-24 的

[ 本帖最后由 tuxw 于 2010-11-25 00:51 编辑 ]
回复

使用道具 举报

949#
发表于 2010-11-25 00:47:22 | 只看该作者
933#
makeoem.lst
回复

使用道具 举报

950#
发表于 2010-11-25 08:27:29 | 只看该作者
毛病在字符替换:
set a=$${a!.SYS=.SY_}

这个替换在11-15版本的WENV中是没有问题的

---------------------
同样的语句,在命令行下是没有问题的。
改成以下通过:
WENV for /f "tokens=3 delims==," %i in ( (fd1)/SYSINF ) do (set a=$u,%i ; check %<-$${a} loop ; check .SYS<-$${a} ]]& (set a=$${a%.}.SY_ ;  echo -n cat --length=0 $${srspath}$${a} & ; echo &  FAT copy /o $${srspath}$${a} (fd1)/)) >> (fd2)/DRIVERS.BAT

[ 本帖最后由 zhaohj 于 2010-11-25 08:56 编辑 ]

Snap1.jpg (31.61 KB, 下载次数: 80)

Snap1.jpg
回复

使用道具 举报

951#
发表于 2010-11-25 08:53:36 | 只看该作者
这是个综合问题,不是单哪个语句的毛病,同样这个集合命令,搬到for这外是没有问题的(目前的版本跟11-15最大的区别就是扩展了连接符和集合命令),可能是 ]]& 与集合命令、for 配合的BUG引起的,但它一到这里就死机比较难跟踪。要请chenall来帮忙看看了。

#这句死机,可能连接符有BUG
#WENV for /f "tokens=3 delims==," %i in ( (fd1)/SYSINF ) do (set a=$u,%i ; check ".SY"<-"$${a}" ]]& (set a=$${a!.SYS=.SY_} ; echo -e cat --length=0 $${srspath}$${a} echar(&&) FAT copy /o $${srspath}$${a} (fd1)/)) >> (fd2)/DRIVERS.BAT

#下面这个可以,而且也是推荐的优化用法
WENV for /f "tokens=3 delims==," %i in ( (fd1)/SYSINF ) do (set a=$u,%i ; check ".SY"<-"$${a}" ]]| loop ; set a=$${a!.SYS=.SY_} ; echo -e cat --length=0 $${srspath}$${a} echar(&&) FAT copy /o $${srspath}$${a} (fd1)/) >> (fd2)/DRIVERS.BAT

#这个也可以(没有连接符)
#WENV for /f "tokens=3 delims==," %i in ( (fd1)/SYSINF ) do (set a=$u,%i ; check ".SY"<-"$${a}" (set a=$${a!.SYS=.SY_} ; echo -e cat --length=0 $${srspath}$${a} echar(&&) FAT copy /o $${srspath}$${a} (fd1)/)) >> (fd2)/DRIVERS.BAT

附件是我已经改好了

[ 本帖最后由 tuxw 于 2010-11-25 09:02 编辑 ]

SRSF6-test.zip

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

回复

使用道具 举报

952#
发表于 2010-11-25 08:59:25 | 只看该作者
另外,FOR语句中空行是参与运行的,能否改进一下,以免出现:
set a=%i  ;结果变量a的值是%i

上面的附件,因为srspath中包含路径,如srspath=/SRS/OEM/,前面不能转义
而且echar(&&)前后都要有空字符。

C大新版可以直接用:
“echo cat --length=0 $${srspath}$${a} && FAT copy /o $${srspath}$${a} (fd1)/"

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

使用道具 举报

953#
发表于 2010-11-25 09:15:48 | 只看该作者
现在的问题是FOR语句中字符串替换出现问题,不管什么一替换就死机。与连接符无关。
回复

使用道具 举报

954#
发表于 2010-11-25 09:20:58 | 只看该作者
/ 是不会转义的,953#的附件就是用 -e 一次输出的

echar(*) 前后不需要有空格的,这样也可以
wenv echo abcechar(123)def

953#后面的两种写法替换都没问题呀

==================
如果路径中含\,就存在转义冲突问题

a=%i 的问题,这个要修改for命令,我再看看

[ 本帖最后由 tuxw 于 2010-11-25 09:36 编辑 ]
回复

使用道具 举报

955#
发表于 2010-11-25 09:46:50 | 只看该作者
试了下C大的版本,好象这个没有连接符的写法不支持了?
WENV for /f "tokens=3 delims==," %i in ( (fd1)/SYSINF ) do (set a=$u,%i ; check ".SY"<-"$${a}" (set a=$${a!.SYS=.SY_} ; echo -e cat --length=0 $${srspath}$${a} echar(&&) FAT copy /o $${srspath}$${a} (fd1)/)) >> (fd2)/DRIVERS.BAT



[ 本帖最后由 tuxw 于 2010-11-25 09:49 编辑 ]
回复

使用道具 举报

956#
发表于 2010-11-25 10:27:39 | 只看该作者
C大这个一定要加]]& ,不然一次扫描后check ... (wenv-comnand)是一条命令


你在FOR中用字符替换不会死机?

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

使用道具 举报

957#
发表于 2010-11-25 10:41:27 | 只看该作者
不会死,951# 中有这样一行用法,但注释掉了,你可以换过试一下
回复

使用道具 举报

958#
发表于 2010-11-25 11:16:41 | 只看该作者
不行,FOR中字符替换还是死机。VM7虚拟机(vmware player),难道是虚拟机问题?
你用下面文件测试一下,命令行下 FOR也行

[ 本帖最后由 zhaohj 于 2010-11-25 11:19 编辑 ]

sysinf.rar

127 Bytes, 下载次数: 49, 下载积分: 无忧币 -2

回复

使用道具 举报

959#
发表于 2010-11-25 11:56:45 | 只看该作者
不是替换的问题,下面两种写法都是可以的



这个BUG比较隐藏,要for里面,check 后跟连接符再接集合命令,才表现出来。
主要是到这里就死掉了,不方便跟踪。但这个BUG表现的这么有规律,花点时间总是可以解决的。

[ 本帖最后由 tuxw 于 2010-11-25 15:17 编辑 ]
回复

使用道具 举报

960#
发表于 2010-11-25 20:16:33 | 只看该作者
问C大、tuxw:
map --rd-base=xxx
map --rd-size=yyy
运行后怎么恢复初始值?
不然我后面
map --mem /file (rd)
FAT copy (rd)+1 (fd1)/file1会出问题,文件变成yyy大小了。

-------------
奇怪,在命令行下测试并没有发现这个问题,但我运行SRSF6后仿真盘上文件都一样大,如上面size=2048

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

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-26 11:53

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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