无忧启动论坛

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

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

  [复制链接]
211#
发表于 2010-11-17 08:45:05 | 显示全部楼层
get、for也应该支持
wenv get a ]]& call ...使用较多
wenv for ...do ( )命令集中是否支持?
wenv check string <op> string wenv-command是否应该改成:
wenv check string <op> string 【]]&/]]|/]]]】wenv-command
wenv check string <op> string 【&&/||/!】grub-command
回复

使用道具 举报

212#
发表于 2010-11-17 17:41:42 | 显示全部楼层
问C大,下面错误是什么?
我一直找不到这个错误

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

Snap1.jpg (9.97 KB, 下载次数: 66)

Snap1.jpg

Snap2.jpg (13.14 KB, 下载次数: 50)

Snap2.jpg
回复

使用道具 举报

213#
发表于 2010-11-17 18:00:58 | 显示全部楼层
好像是调用批处理出错
奇怪的是单步运行都没有问题,但批处理最后会出错。
下面这个是TUXW的批处理:

!BAT
:设置变量INIFILE=INI文件名 [段名],打印该段内容
:
:参数检查
WENV get INIFILE || WENV (echo Variable INIFILE not defined ; call kernel)
WENV reset _ini_*
:
:定义输出文件
WENV set OUTFILE=(fd2)/OUTFILE
WENV call cat --length=0 ${OUTFILE} ]]& exec FAT del ${OUTFILE}
:文件名, 段名, 缓冲区
WENV set -t _ini_fn=${INIFILE% [}
WENV set -t _ini_sc=${INIFILE#${_ini_fn}}
WENV check " "<-"${_ini_sc}" (set -t _ini_buf=$${_ini_sc#]} ; set _ini_sc=$${_ini_sc%% })
:
:保存当前debug状态
debug status | WENV set -t _ini_db= && WENV set _ini_db=${_ini_db## }
:
:检查文件存在
debug 0 || WENV call cat --length=0 ${_ini_fn} || WENV (echo not found file ${_ini_fn} ; reset _ini_* ; call kernel)
debug 1
:
:记录偏移1
WENV find ${_ini_sc} ${_ini_fn} | WENV set -t _ini_s1=
WENV get _ini_s1 || WENV (echo not found sect ${_ini_sc} ; call debug ${_ini_db} ; reset _ini_* ; call kernel)
:
:查找下一个可能的段
WENV calc _ini_s2=_ini_s1+1
WENV find -skip=${_ini_s2} [ ${_ini_fn} | WENV set -t _ini_s2=
:如没找到,取文件长度,并转化为16进制
WENV get _ini_s2 || WENV call cat --length=0 ${_ini_fn} | WENV set -t _ini_s2= && WENV set _ini_s2=0x${_ini_s2}
WENV check " "<-"${_ini_s2}" set _ini_s2=${_ini_s2## }
:
:起始位置, 字节数
WENV (calc _ini_s1=_ini_s1+${_ini_sc,?} ; calc _ini_s2=_ini_s2-_ini_s1)
:
:显示
WENV get _ini_buf || WENV call cat --skip=${_ini_s1} --length=${_ini_s2} ${_ini_fn}
:
:输出
WENV get _ini_buf && WENV (call map --rd-base=${_ini_buf} ; call map --rd-size=${_ini_s2} ; reset INI_OK)
WENV get _ini_buf && WENV call cat --skip=${_ini_s1} --length=${_ini_s2} ${_ini_fn} > (rd)+1 && WENV set INI_OK=Y
WENV get INI_OK && WENV get OUTFILE && WENV call exec FAT copy /o (rd)+1 ${OUTFILE}
:
:恢复环境
WENV (call debug ${_ini_db} ; reset _ini_* ; reset INI_OK)
clear
回复

使用道具 举报

214#
发表于 2010-11-17 18:48:09 | 显示全部楼层
我在FTP://60.190.19.108中zhhsh/20101110SRSF6返回模块,无DOS/
上传了最新grldr测试版的srsf6,OEM驱动这步无论如何都通不过

问题出在makeoem.lst中下面:

#通过提取[Files.scsi.${scsi}]内容获取sys、inf后缀名的文件名
checkrange 2 debug && echo @@@extraction [Files.scsi.*] information
WENV set INIFILE=(fd1)/OEM [Files.scsi.${scsi}] 0xB00000
(fd2)/GETSECT.BAT
cat --length=0 (fd2)/OUTFILE || configfile (fd2)/ERROR.LST
FAT copy /o (fd2)/OUTFILE (fd1)/SYSINF


大家找找原因。
回复

使用道具 举报

215#
发表于 2010-11-18 11:18:36 | 显示全部楼层
@tuxw:
FOR ...DO 后面支持集合命令吗?
因为for do可能要做很多判断,没有集合命令很不方便。

如下面:
WENV for /f "eol=# delims=;" %i in ( (fd2)/_LIST ) do (set a=$u,%i  ; check "\"<-"$${a}" set a=$${a!\=/}  ; check "$${a:-1}"<>"/" set a=$${a}/ ; echo $${a})  > (rd)+1
改成这样?
WENV for /f "eol=# delims=;" %i in ( (fd2)/_LIST ) do (set a=$u,%i ]]] check "\"<-"$${a}" set a=$${a!\=/} ]]] check "$${a:-1}"<>"/" set a=$${a}/ ]]] echo $${a}  > (rd)+1

------------
还有下面:
WENV get _ini_buf && WENV call map --rd-base=${_ini_buf} ]]] call map --rd-size=${_ini_l}
改成这样?
WENV get _ini_buf ]]& call map --rd-base=${_ini_buf} ]]] call map --rd-size=${_ini_l}

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

使用道具 举报

216#
发表于 2010-11-18 11:53:00 | 显示全部楼层
]]!感觉也需要,功能与grldr一样:“否则”
回复

使用道具 举报

217#
发表于 2010-11-18 13:40:37 | 显示全部楼层
]]! 连接符有问题

Snap1.jpg (18.51 KB, 下载次数: 72)

Snap1.jpg
回复

使用道具 举报

218#
发表于 2010-11-18 14:24:01 | 显示全部楼层
这个连接符为何要3个符号?两个不是行了吗?
]& 、]|、 ]]、 ]!

哇,C大新版本已经把cat命令默认已经打开。

[ 本帖最后由 zhaohj 于 2010-11-18 14:32 编辑 ]
回复

使用道具 举报

219#
发表于 2010-11-18 15:46:37 | 显示全部楼层
主要是FOR
如果FOR命令用加分号连接呢?
wenv for .... do sub1 ;  sub2  ;  sub3

这样看起来是平级的,每个sub中命令用连接符连接。
回复

使用道具 举报

220#
发表于 2010-11-18 16:00:29 | 显示全部楼层
for语句目前空行不会跳过,这个希望改进一下。
回复

使用道具 举报

221#
发表于 2010-11-18 16:42:51 | 显示全部楼层
FOR存在严重问题:
echo PCI$ > (fd1)/PCI
WENV for /f "eol=; tokens=1-2 delims==;" %i in ( (fd1)/TXT ) do set a=%i ]]] check "$${a:0:4}"<>"PCI\" loop ]]] set b=%j ]]] echo -n $ ]]] echo $${a}=$${b} >> (fd1)/PCI

[ 本帖最后由 zhaohj 于 2010-11-18 16:47 编辑 ]

Snap1.jpg (21.46 KB, 下载次数: 55)

Snap1.jpg
回复

使用道具 举报

222#
发表于 2010-11-19 12:33:32 | 显示全部楼层
嗯,不错,这样改动比较少,语法也比较合理。
下面那句比较合理?

WENV get _ini_l ]]& for /f "eol=# delims=" %i in ( ${OEMFILE} ) do echo %i > (rd)+1 && WENV (call exec FAT copy /o (rd)+1 ${OEMFILE} ]]] reset =${_ini_buf})

WENV get _ini_l ]]& (for /f "eol=# delims=" %i in ( ${OEMFILE} ) do echo %i) > (rd)+1 && WENV (call exec FAT copy /o (rd)+1 ${OEMFILE} ]]] reset =${_ini_buf})

WENV (get _ini_l ]]& for /f "eol=# delims=" %i in ( ${OEMFILE} ) do echo %i) > (rd)+1 && WENV (call exec FAT copy /o (rd)+1 ${OEMFILE} ]]] reset =${_ini_buf})

WENV get _ini_l ]]& for /f "eol=# delims=" %i in ( ${OEMFILE} ) do echo %i > (rd)+1 ]]]  (call exec FAT copy /o (rd)+1 ${OEMFILE} ]]] reset =${_ini_buf})

WENV get _ini_l ]]& for /f "eol=# tokens=1-2 delims=" %i in ( ${OEMFILE} ) do (echo %i  %j)> (rd)+1 && WENV  (call exec FAT copy /o (rd)+1 ${OEMFILE} ]]] reset =${_ini_buf})




第三句可能不支持吧,因为有(...(.....)....)

最希望实现的:
WENV get _ini_l ]]& (for /f "eol=# tokens=1-2 delims=" %i in ( ${OEMFILE} ) do (echo %i ) ]]]  (echo %j) > (rd)+1 ]]]  call exec FAT copy /o (rd)+1 ${OEMFILE} ]]] reset =${_ini_buf})
                             |                                                                                                                                                                                                                                    |               
               

[ 本帖最后由 zhaohj 于 2010-11-19 13:41 编辑 ]
回复

使用道具 举报

223#
发表于 2010-11-19 13:55:32 | 显示全部楼层
ok,语法检查确实很重要,常常因为多敲了个字符或写错个字符给测试带来很大麻烦。

WENV calc s=0
WENV for /L %i in (1,1,100) do (set a=%i ]]] calc s=s+a)
WENV check ${s}==5050 echo ok: for 1

用for /F 处理就没有意义了,/F是对文本及字符串的处理,除非这样检查:
map --rd-base=0xf00000 && map --rd-size=1024
WENV reset =0xf00000 1k
#检测试for /L
WENV calc s=0
WENV for /L %i in (1,1,100) do (set a=%i ]]] calc s=s+a ]]] echo $${a}) > (rd)+1
WENV check ${s}==5050 echo ok: for /L 1

#检测试for /F
WENV calc s=0
WENV for /F  %i in ( (rd)+1 ) do (set a=%i ]]] calc s=s+a)
WENV check ${s}==5050 echo ok: for /F 2

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

使用道具 举报

224#
发表于 2010-11-19 18:37:37 | 显示全部楼层
11-19版本看来还有问题,主要是FOR /F
回复

使用道具 举报

225#
发表于 2010-11-20 09:52:05 | 显示全部楼层
下面是for/f 生成id的信息文件:
cat --length=0 (fd1)/OEM && FAT mkfile size=* (fd1)/PCI
WENV echo PCI$ > (fd1)/PCI
pause make PCI ...
WENV for /f "eol=: tokens=1-3 delims==," %i in ( (fd1)/OEM ) do (set a=%i ]]] check $${a}==ID ]]& set b=%j ]]] set c=%k ]]] echo -n $ ]]] echo $${b}=$${c}) >> (fd1)/PCI

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

Snap1.jpg (102.01 KB, 下载次数: 59)

Snap1.jpg
回复

使用道具 举报

226#
发表于 2010-11-20 10:11:26 | 显示全部楼层
刚开始怀疑loop命令,我取消loop还是这样。
这些命令应该很简单了,现在最大的可能是check

或者怀疑g4d,换老一点的我再测试一下

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

使用道具 举报

227#
发表于 2010-11-20 10:59:13 | 显示全部楼层
WENV for /f "eol=: tokens=1-3 delims==," %i in ( (fd1)/OEM ) do (set a=%i ]]] check "$${a}"==ID set b=%j ]]] set c=%k ]]] echo -n $ ]]] echo $${b}=$${c}) >> (fd1)/PCI
还是死机

WENV for /f "eol=: tokens=1-3 delims==," %i in ( (fd1)/OEM ) do (set a=%i ]]]  set b=%j ]]] set c=%k ]]] echo -n $ ]]] echo $${b}=$${c}) >> (fd1)/PCI
还是死机

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

使用道具 举报

228#
发表于 2010-11-20 11:07:15 | 显示全部楼层
象下面简单一点的正常:
wenv for /f "eol=# delims=" %i in ( ${OEMFILE} ) do echo %i > (rd)+1

说明是连接符引起的问题

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

使用道具 举报

229#
发表于 2010-11-20 11:53:59 | 显示全部楼层
这个就是N版的OEM集合,对了解OEM驱动很有帮助。

[ 本帖最后由 zhaohj 于 2010-11-20 11:57 编辑 ]

OEM.rar

2.48 KB, 下载次数: 18, 下载积分: 无忧币 -2

回复

使用道具 举报

230#
发表于 2010-11-20 13:22:17 | 显示全部楼层
一个$$测试没问题,两个$$就出问题了
回复

使用道具 举报

231#
发表于 2010-11-20 17:06:46 | 显示全部楼层
你是说恢复成这样?
WENV (command1 ; command1 ; command3 ; ...)
回复

使用道具 举报

232#
发表于 2010-11-20 18:35:09 | 显示全部楼层
11-15号的版本最稳定,用今天的版本替换15号的版本,在原本良好运行的SRSF6都出现异常。
我的FTP中有这个稳定的版本,你可以测试一下
回复

使用道具 举报

233#
发表于 2010-11-20 22:49:05 | 显示全部楼层
与你最后一版(11-01)除上述不同外,其它没地方不同吧?

下面的显示错误参数,应该是正常的吧?!

[ 本帖最后由 zhaohj 于 2010-11-20 22:50 编辑 ]

Snap1.jpg (33.44 KB, 下载次数: 61)

Snap1.jpg
回复

使用道具 举报

234#
发表于 2010-11-20 23:35:11 | 显示全部楼层
现在焦点在FOR命令,我想知道这个与以前的不同点。
wenv for /f "tokens=1-3 delims==," %i in ( file ) do (sub1) ]]& (sub2) ]]| (sub3) ]]! (sub4)
还是??
]]!是第一个sub1的不成功就执行,还是??
回复

使用道具 举报

235#
发表于 2010-11-21 00:49:04 | 显示全部楼层
测试一下不错,FOR命令里check很重要,测试了一下,支持这样的:
for /f...%i in ( file ) do (set a=%i ; check $${a}==aa (sub1) ]]| (sub2))
这样十分ok!
-------
tuxw的字符串操作<- 很不错,能否把它先用上,这样我基本不用改动,就可以完整测试SRSF6.

发觉SRSF6测试,还是比较全面的,基本上所有的子命令都用上了。

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

使用道具 举报

236#
发表于 2010-11-21 01:31:47 | 显示全部楼层
原帖由 chenall 于 2010-11-21 00:59 发表


这个要等明天再弄了.


嗯,不早了,晚安!

希望实现两个功能:
1)字符串操作<-

2)reset =起始位置 大小
或者实现> 能清空文件内容
PS:这样做是为了写入的文件能在其他系统能用。
回复

使用道具 举报

237#
发表于 2010-11-21 11:30:52 | 显示全部楼层
]]]连接符这个版本可以用分号代替,如

wenv (set a=1 ; set b=2) ; (check ${a}==1 set c=3 ]]& get)
这样也行
wenv ((set a=1 ; set b=2) ; (check ${a}==1 set c=3 ]]& get))

只要()配对就可以,比较灵活。
回复

使用道具 举报

238#
发表于 2010-11-21 18:06:43 | 显示全部楼层
<-测试有误。
检测空字符时需要引导引起来,如wenv check " "<-"${a}"

主要是空字符怎么表达?

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

Snap1.jpg (24.04 KB, 下载次数: 61)

Snap1.jpg
回复

使用道具 举报

239#
发表于 2010-11-21 22:22:42 | 显示全部楼层
字符串替换已经加入,很好!

还缺wenv find,这个功能用处很大。

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

使用道具 举报

240#
发表于 2010-11-21 23:35:20 | 显示全部楼层
其他功能就无所谓了。find主要代替inifile。

目前测试没有发现问题,刚想整体测试,忘了这个find。
或以后加吧
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-6-2 22:56

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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