无忧启动论坛

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

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

  [复制链接]
871#
发表于 2010-11-20 18:50:10 | 只看该作者
今天恢复集合命令处理方式后,在你没有使用 ]]* 连接符的菜单中,效果应该等效于16号以前的版本

噢,想起改变集合命令处方式后,loop的处理不同,忘了改回去
回复

使用道具 举报

872#
 楼主| 发表于 2010-11-20 20:11:09 | 只看该作者
新上传了一个测试用的WENV版本.

主要是测试集合与连接符的混合使用,并且支持嵌套.

( command1; command2 ; command3) 算是一个语句.
所以可以这样
wenv command1 ]]& ( command2; command3; command3 ) ]]| echo test ]]! echo nono
也可以
wenv command1 ; command2 ; command3
如果命令1返回真就执行集合命令,否则执行echo nono

commandn 里面也可以用集合命令.

如果测试通过,将会考虑加入到grub4dos中.

注: 暂时还没有处理特殊符号的问题,如果你的命令里面需要用到需要使用引号""

wenv set abc="def)(";

注: 集合命令返回的是最后一条命令执行的结果.

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

使用道具 举报

873#
发表于 2010-11-20 22:49:05 | 只看该作者
与你最后一版(11-01)除上述不同外,其它没地方不同吧?

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

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

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

Snap1.jpg
回复

使用道具 举报

874#
发表于 2010-11-20 23:10:01 | 只看该作者
增加了一个开关 EXT_SET 用于扩展集合命令界定符。开关为on时,集合命令将使用 ([[, ]]) 作为界定符,一定程度可以避免字符串中含界定符的问题(如必要,可以将这个开关扩展为自定义界定符)。

恢复分隔符为分号后,]]] 重用的判断问题没有了,for 后的集合命令也可以跟连接符,现在这样的写法是支持的
wenv (calc s=0 ; for /L %i in (1,1,100) do (set a=%i ; calc s=s+a ; calc a=a % 10 ; check $${a}==0 echo %i,s=$${s})) ]]] get

注意for命令里求余操作符后面必须有一个空格,否则跟for的参数冲突

以后 GetSect.bat,GParts.bat 作为两个标准批处理样本随wenv一起上传了,有需要的可以在此基础上改造为自己适用的批处理

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

wenv-tuxw-2010-11-20.zip

55.17 KB, 下载次数: 22, 下载积分: 无忧币 -2

回复

使用道具 举报

875#
 楼主| 发表于 2010-11-20 23:21:15 | 只看该作者
原帖由 zhaohj 于 2010-11-20 22:49 发表
与你最后一版(11-01)除上述不同外,其它没地方不同吧?

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


这个错误是正常的,因为开启了DEBUG.

另外这个版本除了上面的区别就是修改了call代码.以前]]& ]]|等符号只能用于call.

现在call命令和其它命令平级,即call只处理自己的问题,连接符号可以随意使用.
回复

使用道具 举报

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

使用道具 举报

877#
 楼主| 发表于 2010-11-21 00:08:08 | 只看该作者
原帖由 zhaohj 于 2010-11-20 23:35 发表
现在焦点在FOR命令,我想知道这个与以前的不同点。
wenv for /f "tokens=1-3 delims==," %i in ( file ) do (sub1) ]]& (sub2) ]]| (sub3) ]]! (sub4)
还是??
]]!是第一个sub1的不成功就执行,还是??


这个命令的解释.

for /f "tokens=1-3 delims==," %i in ( file ) do (sub1)
执行返回值为真是执行后面的语句,否则执行 sub4

而for语句的返回直是由(sub1)决定的.

所以也可以解释为
(sub1) ]]& (sub2) ]]| (sub3) ]]! (sub4)

当sub1返回结果为假或sub2返回结果为真的时候都会执行sub4.

另外新的测试也已经上传了
这次带了源码,编译后比以前的版本小了1kb,但功能增强了,也更方便了.

我小试了一下看起来没有问题,有空你们可以做一下更复杂的测试.等一段时间以后再把增强的功能加入到GRUB4DOS中.

关于特殊符号的处理方式:
1.连续两个""会处理成一个"
2.为了安全起见,需要使用特殊字符时最好使用引号
如: "abcd () ]]& def"
3.一个命令或语句可以使用引号开头,这样它里面就可以包含特殊字符.
如: wenv "echo \\  abcd ( "" abcdefgh   "
执行时会自动去掉前后的引号.
执行时显示: \\  abcd ( " abcdefgh   .

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

使用道具 举报

878#
发表于 2010-11-21 00:30:37 | 只看该作者
原帖由 zhaohj 于 2010-11-20 23:35 发表
现在焦点在FOR命令,我想知道这个与以前的不同点。
wenv for /f "tokens=1-3 delims==," %i in ( file ) do (sub1) ]]& (sub2) ]]| (sub3) ]]! (sub4)
还是??
]]!是第一个sub1的不成功就执行,还是??


for的返回值取决于最后一次循环时sub1的返回值,前面条件不同、文件不同,这个返回值是无法确认的,应该尽量避免这种for后需要确定返回值的写法

]]& 很好记忆,从前往后,任一个连接命令不能继续下去时就跳到 ]]!
回复

使用道具 举报

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

使用道具 举报

880#
 楼主| 发表于 2010-11-21 00:59:56 | 只看该作者
原帖由 zhaohj 于 2010-11-21 00:49 发表
测试一下不错,FOR命令里check很重要,测试了一下,支持这样的:
for /f...%i in ( file ) do (set a=%i ; check $${a}==aa (sub1) ]]| (sub2))
这样十分ok!
-------
tuxw的字符串操作


这个要等明天再弄了.
回复

使用道具 举报

881#
发表于 2010-11-21 01:31:47 | 只看该作者
原帖由 chenall 于 2010-11-21 00:59 发表


这个要等明天再弄了.


嗯,不早了,晚安!

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

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

使用道具 举报

882#
发表于 2010-11-21 10:54:13 | 只看该作者
@chenall

WENV set a=abc"def\
WENV check abc"def\==${a} echo ok

这两句在命令行可以,在批处理中出错(grldr版本11-18)。
要双写引号才可以通过,如果变量a是从文件中分离出来的,则批处理中这样的用法会出错


你的最新版好象没有 ]]] 符号了
WENV set a=5 ]]] get,后面的连接命令当成了串
WENV set a=abc"def\ ]]] get ,同上
WENV set a=abc"def\ ]]& get,同上

WENV set a=abc"def\     这样可以
WENV check abc"def\==${a} echo ok,出错
WENV check "abc"def\"=="${a}" echo ok,出错

试图将一个引号先替换成两个引号
WENV set a=${a!"=""} 出错,它自己又将两个引号换成一个引号了
WENV set a=${a!"=""""},替换成功
WENV check "abc""def\"="${a}" echo,失败

用双写引号的方法来识别引号为字符,只适合一次性的常量文本(好象HTML中是这样处理的),不适合二次变出来的字符串,比如PCI信息中,很多含有引号的行,截断后再来check会出错

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

使用道具 举报

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

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

使用道具 举报

884#
发表于 2010-11-21 12:54:42 | 只看该作者
分号一直就是可以这样用,不一定要在集合命令里,只是括起来语法结构明显些

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)

效果一样的

[ 本帖最后由 tuxw 于 2010-11-21 12:58 编辑 ]
回复

使用道具 举报

885#
 楼主| 发表于 2010-11-21 17:22:28 | 只看该作者
原帖由 tuxw 于 2010-11-21 10:54 发表
@chenall

WENV set a=abc"def\
WENV check abc"def\==${a} echo ok

这两句在命令行可以,在批处理中出错(grldr版本11-18)。
要双写引号才可以通过,如果变量a是从文件中分离出来的,则批处理中这样的用 ...


1.取消了 ]]] 功能.可以用;代替
2.WENV set a=${a!"=""}  这个算是一个BUG,二次替换了.
3.其它的一般情况下很少用到.再慢慢修正.
有没有实用的例子?我研究一下看该如何调整.

或者干脆提供一个选项,可以使用其它符号代替引号的功能,这样或许是比较完美的解决方案.


新的测试已经上传.
相对上个版本修改内容.
1.修正前面的第2点问题.
2.添加三个伪变量
@DATE  当前日期: 2010-11-21
@TIME  当前时间: 17:05:30
@RANDOM 产生一个随机数
例子,显示今天日期. echo [email=${@DATE]${@DATE[/email]}
3.check添加符号 <-
4.运行出错时如果DEBUG ON状态,则会显示执行的命令,方便查错.

另外
]]& ]]| 会清除前一句的ERROR值,而分号不清除.

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

使用道具 举报

886#
发表于 2010-11-21 18:06:43 | 只看该作者
<-测试有误。
检测空字符时需要引导引起来,如wenv check " "<-"${a}"

主要是空字符怎么表达?

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

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

Snap1.jpg
回复

使用道具 举报

887#
 楼主| 发表于 2010-11-21 19:07:09 | 只看该作者
重新上传了一个
,

比较时先去掉前后的引号.
回复

使用道具 举报

888#
 楼主| 发表于 2010-11-21 19:36:39 | 只看该作者
新的GRUB4DOS已经上传.
1.支持PXE文件列表.
2.修正fb_dir的一个bug,现在可以在(ud)上正常使用自动完成功能.
3.对于 > 如果文件小于64KB,则会把文件内容置0.
回复

使用道具 举报

889#
发表于 2010-11-21 22:22:42 | 只看该作者
字符串替换已经加入,很好!

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

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

使用道具 举报

890#
 楼主| 发表于 2010-11-21 22:47:38 | 只看该作者
原帖由 zhaohj 于 2010-11-21 22:22 发表
字符串替换已经加入,很好!

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


字符串替换,很早之前的版本就已经是支持的,只是没有公开.


q:还缺wenv find,这个功能用处很大。
汗,加了这个,可能就会想还要其它的,目前不考虑这些,先把目前的功能弄稳定了再说.

准备为GRUB4DOS添加集合的功能,所以先放用WENV测试,没问题了再加上去.
回复

使用道具 举报

891#
发表于 2010-11-21 23:35:20 | 只看该作者
其他功能就无所谓了。find主要代替inifile。

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

使用道具 举报

892#
发表于 2010-11-22 00:37:22 | 只看该作者
1.调整了集合命令与连接符的处理方式
2.EXT_SET 开关自动切换,两种集合界定符可以混合嵌套
3.取消 call 别名 run
4.echo 换行改为 \r\n
5.命令行缓冲区增加到3K

EXT_SET开关为隐性(不在switch状态中显示)开关自动切换,两种集合界定符可以混合使用并嵌套,集合命令中可以使用分号以外的连接符

wenv ([[reset ; set a=) ; set b=1 ; check ${b}==1 (set c=2 ; echo ok) ]]| echo not ; calc 0]]) ]]& (get ; echo return 1) ]]! ([[get ; echo return 0]])

calc 0 这句将决定第一个大集合命令的返回值
a=) 不会影响配对检查,因为外面的界定符使用了扩展符号 ([[, ]]) 。

这个方式跟用引号避免界定符配对错各有特点。
用引号的方式可以少打几个字符,判断比较准确,缺点是字符串中使用引号不方便,常量可以手工输入两个引号,变量将导致整句出错。而且自动去掉引号会影响本来就需要引号的地方。
扩展界定符方式输入要麻烦,而且字符串中仍可能包含扩展的界定符(这种情况还是会出错),但避开了引号的问题,不含空格的任意串,都可以直接比较。

可以考虑将扩展符号自定义,如这样
wenv set SET_SIGN=<<<>>>
将这个变量一份为二,作为界定符,输入更可能输入更麻烦,但灵活性增加

连接符后面跟的必须是子命令或集合命令,否则被判为普通字符,如
wenv echo abc ]]& def,不是子命令,直接输出了
wenf echo abc ; 123,不是子命令,直接输出了

]]] 操作符保留,作用与分号相同。我个人更倾向于使用 ]]],保留 ; 纯粹是为了兼容。
]]] 需要5个字符相同(前后空格),才会被误判,而且增加了后跟子命令的限制后,误判的几率非常低。

[ 本帖最后由 tuxw 于 2010-11-22 00:56 编辑 ]

wenv-tuxw-2010-11-22.zip

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

回复

使用道具 举报

893#
发表于 2010-11-22 01:04:11 | 只看该作者
@chenall

wenv set a=abc"def
这句在命令行可以执行(我编译的版本里),但批处理中报错error 28,写两个引号则可以,是否引号的处理策略已引入了grldr?
回复

使用道具 举报

894#
发表于 2010-11-22 09:11:13 | 只看该作者
原帖由 chenall 于 2010-11-21 19:36 发表
新的GRUB4DOS已经上传.
1.支持PXE文件列表.
2.修正fb_dir的一个bug,现在可以在(ud)上正常使用自动完成功能.
3.对于 > 如果文件小于64KB,则会把文件内容置0.


小于64KB文件内容并没置0,不过几K的文件测试有效

Snap1.jpg (95.19 KB, 下载次数: 57)

Snap1.jpg
回复

使用道具 举报

895#
 楼主| 发表于 2010-11-22 12:52:12 | 只看该作者
是我写错了,呵呵.
下次再修正.
现在是10K以内的(10000),前面加上0x就是64K了.
回复

使用道具 举报

896#
发表于 2010-11-22 14:19:13 | 只看该作者
下面有什么不同?
1:
WENV for /f "eol=; tokens=1-2 delims==;" %i in ( (fd1)/TXT ) do (set a=%i ; check "$${a:0:4}"=="PCI\" (set b=%j ; echo -n $ ; echo $${a}=$${b}))

2:
WENV for /f "eol=; tokens=1-2 delims==;" %i in ( (fd1)/TXT ) do (set a=%i ; check "$${a:0:4}"=="PCI\" ]]& (set b=%j ; echo -n $ ; echo $${a}=$${b}))

结果是1无法显示输出

而在非for命令中测试是完全一样的,bug?

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

使用道具 举报

897#
 楼主| 发表于 2010-11-22 16:06:40 | 只看该作者
嗯,这个是BUG,忘了截断了.
回复

使用道具 举报

898#
 楼主| 发表于 2010-11-22 17:54:32 | 只看该作者
新版已经上传,
但是该版做了比较大的调整,可能会有BUG.

关于引号的问题,目前暂时不提供命令替换,

暂时可以通过修改内存地址0X4CA30处的值来改变.默认是"(0x22).
注:wenv reset 之后会重置.
回复

使用道具 举报

899#
发表于 2010-11-22 22:26:25 | 只看该作者
运行FOR会死机:
WENV for /f "eol=; tokens=1-2 delims==;" %i in ( (fd1)/TXT ) do (set a=%i ; check "$${a:0:4}"=="PCI\" (set b=%j ; echo -n $ ; echo $${a}=$${b}))

下面是这个txt文件,很标准的。

如果直接输出到内存或文件,马上死机。

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

TXT.rar

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

回复

使用道具 举报

900#
发表于 2010-11-23 00:10:11 | 只看该作者
奇怪,输出到屏幕,开始几页并没死机,不过第一页开头内容有点问题的。

估计是内存冲突了。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-20 09:05

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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