无忧启动论坛

 找回密码
 注册
搜索
最纯净的「微PE装机优盘」UEPON大师作品系统gho:最纯净好用系统下载站数据恢复、数据保护、视频编辑
Win To Go 极致利器(IXUNCIS固态U盘)无忧启动网成立20周年!广告联系 QQ:184822951 微信:wuyouceo
楼主: chenall

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

[复制链接]
发表于 2010-2-4 10:17:38 | 显示全部楼层
原帖由 NicTense 于 2010-2-4 09:55 发表
不是相当于  if 条件 命令 else 命令 吗
如果是应该会执行 || 后面的才对啊

你的意思是改造之后,只能连续执行命令,当第一个不执行,则后面的都不会执行吗


&& 前面是真时执行后面的命令
||  前面是假时执行后面的命令

既然是连续执行命令,当某个不执行时,则后面的都不会执行

[ 本帖最后由 zhaohj 于 2010-2-4 10:21 编辑 ]
回复

使用道具 举报

发表于 2010-2-4 10:30:03 | 显示全部楼层

回复 #31 zhaohj 的帖子

我还以为是 if ...else...

这样要实现if...else...至少还是要2个一样的 checkrange
回复

使用道具 举报

发表于 2010-2-4 11:57:19 | 显示全部楼层
如果
允许嵌套||和&&,并可加括号表示优先级
http://bbs.znpc.net/viewthread.php?tid=5842&page=1&fromuid=14511#pid43913

则if else可通过加括号实现。

可能要通过堆栈之类的机制来支持这种括号嵌套。

1、变量
2、(嵌套)||和&&
3、goto
是构成程序结构的基本要素。1、3目前差不多了,2最好再加强一下,更方便些。

[ 本帖最后由 pseudo 于 2010-2-4 12:09 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2010-2-4 12:01:05 | 显示全部楼层
实现if else在内部命令可能比较麻烦。

外部命令可以考虑写一个if命令来实现。
回复

使用道具 举报

发表于 2010-2-4 12:04:26 | 显示全部楼层
既然有那么多要求,那我觉得你直接用C语言编一个类似BASIC的解释器(BASIC解释器比较容易实现)得了:)
回复

使用道具 举报

发表于 2010-2-4 12:13:11 | 显示全部楼层

回复 #35 netwinxp 的帖子

两回事啊,c大是用极小的代码换来grub质的飞跃

现在做的事情是由针对性的,而不是编译器那种具通用性的东西啊
回复

使用道具 举报

 楼主| 发表于 2010-2-4 12:15:51 | 显示全部楼层
呵呵,N版说的是。

一些比较简单的实用的功能可以考虑实现,比较复杂的就没有必要了。
回复

使用道具 举报

发表于 2010-2-4 12:18:11 | 显示全部楼层
原帖由 netwinxp 于 2010-2-4 12:04 发表
既然有那么多要求,那我觉得你直接用C语言编一个类似BASIC的解释器(BASIC解释器比较容易实现)得了:)

版主所言极是
chenall兄可以考虑做一个特别的外部命令,其作用是命令解释器,类似Pro*C、SQLJ。
回复

使用道具 举报

发表于 2010-2-4 12:23:10 | 显示全部楼层

回复 #34 chenall 的帖子

哦,我明白了,我弄错了一个东西
&& || 并不是 checkrange 的符号,是grub本身的符号

算了,可以连续执行已经比原来好很多了

if的外部命令,感觉跟 checkrange有点同质化,等于一个增强版的checkrange
回复

使用道具 举报

 楼主| 发表于 2010-2-4 12:25:02 | 显示全部楼层
原帖由 pseudo 于 2010-2-4 12:18 发表

版主所言极是
chenall兄可以考虑做一个特别的外部命令,其作用是命令解释器,类似Pro*C、SQLJ。


汗。。。

这些可不是一个简单的工程。。

我的C也是刚起步,以我目前的情况根本不可能。。

(我学习,是需要用到什么东西就去学什么。所以我学的很乱,甚至还有一些很基础的东西我都没有接触过。)


其实pseudo也可以自己考虑编写一些外部程序。。
回复

使用道具 举报

发表于 2010-2-4 12:42:58 | 显示全部楼层
这样子行不行

当条件为false时,找到并执行其后面的第一个||跟着的命令,而其前面的所有命令将被跳过
同样的
当条件为true时,找到并执行其后面的第一个&&跟着的命令,其前面的所有命令同样被跳过

执行完该命令后,继续按以上原则找到并执行下一条命令,直到命令行完毕

也不用括号了,还是顺序关系,改造起来应该不太难
这样就可以实现 if else了,虽然嵌套规则上有点不同
回复

使用道具 举报

 楼主| 发表于 2010-2-4 17:14:22 | 显示全部楼层
这样改造会很混乱...


还不如再写一个if命令更简单.

类似c语言那样

if (表达式) 命令1 else 命令2
回复

使用道具 举报

 楼主| 发表于 2010-2-4 18:48:00 | 显示全部楼层
我想这样的grldr应该基本能够满足像
if xxx else之类的要求了

虽然效果不是很理想..但是勉强可以用.

新增加了一个 ! 符号必须配合&& ||使用.

前面的语句执行出错时就跳到!后面执行

例子
当echo外部命令存在,echo1不存在
以下命令
echo aa && echo bb || echo cc ! echo dd

先执行
echo aa 成功
后面的符号是&&
继续执行echo bb 成功
后顺的符号是 ||
所以echo cc不执行.直接跳到echo dd

又如下
echo1 aa && echo bb && echo cc ! echo dd

echo1 aa执行失败,后面的符号是&&所以后面的语句不会执行直接跳到!后面!
执行echo dd


当然了这样和 真正的 if 命令还是相差很远.

[ 本帖最后由 chenall 于 2010-2-27 19:02 编辑 ]
回复

使用道具 举报

发表于 2010-2-4 21:22:16 | 显示全部楼层
看上去还不错,换了个符号,可以避免意外错误导致的||乱转

这样 if 命令可以不要了,应该够用了

我试试有没有bug再来报告
回复

使用道具 举报

 楼主| 发表于 2010-2-4 23:06:45 | 显示全部楼层
原帖由 zhaohj 于 2010-2-4 09:53 发表
C大,新版本1.23的grldr有一个小毛病,在菜单中选择菜单项的时候,
default 1
timeout 10
title 0
....
如果第一次用“向上箭头”选择菜单项,下方会一直出现时间倒计时,用“向下箭头”选择就不会出现时间 ...



我自己试了一下没有发现这个问题..

另外"128M内存都无法进入“user menu",

单单这条信息无法确定是GRLDR的问题..
回复

使用道具 举报

发表于 2010-2-5 03:47:40 | 显示全部楼层
测试了一下,基本上没什么问题,可以用了,就是逻辑上跟if else不太一样,用的时候注意就是了

title u盘启动后的从本地硬盘启动菜单
checkrange 0x80 read 0x8280 && rootnoverify (hd1) ! rootnoverify (hd0)
chainloader +1

就是如果当条件为真时不需要执行任何东西,当条件为假时要执行一串命令,就只能

条件 || 命令1 && 命令2 ...
或者
条件 && ! 命令1 && 命令2...

而不能

条件 ! 命令1 && 命令2

也就是 ! 之前至少要有一个 && 或者 ||  否则就会出错

这个也无可厚非,就像 if else 可以没有else 但是不能没有if

所以结论就是这个方案基本上应该够用了
回复

使用道具 举报

发表于 2010-2-5 09:47:40 | 显示全部楼层
2.4版测试通过,发个完整版吧!
C大有没有考虑把几个新开发的常用命令也集成进去,我们收藏一下!
回复

使用道具 举报

发表于 2010-2-5 10:16:46 | 显示全部楼层

回复 #47 zhaohj 的帖子

呵呵,我觉得 calc 和 goto 比较适合内置,因为用到的地方特别多,而且代码小,也就增加2k多
回复

使用道具 举报

 楼主| 发表于 2010-2-5 18:23:57 | 显示全部楼层
http://grub4dos-chenall.googleco ... 4.5a-2010-02-05.zip

内置了calc命令的版本,有空试下看有没有什么BUG.

另外给fallback命令加了一个参数 --go 相当于goto功能.(未公开参数,不对使用这个功能的后果负责)
例子.
fallback --go 2

还有一点.因为fallback命令的返回值为真.
以下句语是合法的,并且会执行echo bb语句.
fallback --go 2 && echo bb

还有 && ||的改进(同样属未公开,所以不对使用这个功能的后果负责)

以上两个功能使用起来比较混乱,所以不公开.自己小心就是.

[ 本帖最后由 chenall 于 2010-2-5 18:29 编辑 ]
回复

使用道具 举报

发表于 2010-2-5 19:11:32 | 显示全部楼层

回复 #49 chenall 的帖子

hoho,听起来有点害怕,我豁出去了。。。

如果给fallback加参数的话
按grub4dos的传统习惯,这个参数貌似应该是  --force

个人觉得有calc和goto,这个grub在功能上应该算是完满了,
剩下的像ghostid,fat,wenv这些应该外置就可以了
毕竟都属于比较个性化的功能
就是如果有可能的话,多几个人帮忙找bug,然后做一个新的稳定版本
回复

使用道具 举报

 楼主| 发表于 2010-2-5 19:44:46 | 显示全部楼层
嘿嘿,即然是未公开的就不用讲究那么多了.

用--go代表马上跳转也挺直观的..


另外
现在的calc 允许多个从左到右的计算.(相对之前的版本只是加了两行代码而已,就顺便支持一下了,也比较方便,)

注:这个是没有优先级的,只是依次从左边算到右边.

例子
calc 1+2+3+4+5+6+7+8+9+10
calc *0x60000 = *0x8284 >> 8 & 0xff

还有以下也是合法的,一个++代表+1
calc 1++++++++++++
回复

使用道具 举报

发表于 2010-2-6 13:25:03 | 显示全部楼层
fallback 2 与fallback --go 2不是一样的吗?为何要加这个参数?
回复

使用道具 举报

 楼主| 发表于 2010-2-6 18:20:54 | 显示全部楼层
呵呵,不公开的命令参数..
懂得用的就用,不懂的就不要乱用了...

具体可以看下前面的贴子.
回复

使用道具 举报

发表于 2010-2-6 20:12:57 | 显示全部楼层
哈哈,这个是grub的彩蛋

对了,c大,echo,这个你最开始的例子是不是也考虑内置了

这个功能也很实用的,1行代码

下个版本考虑一下吧
回复

使用道具 举报

 楼主| 发表于 2010-2-6 20:28:26 | 显示全部楼层
echo没有必要吧,目前的PAUSE命令就可以实现同样的功能.
回复

使用道具 举报

发表于 2010-2-6 21:54:58 | 显示全部楼层
呵呵,区别就是,pause会暂停
回复

使用道具 举报

 楼主| 发表于 2010-2-6 22:18:03 | 显示全部楼层
pause --wait=0
不暂停的
回复

使用道具 举报

发表于 2010-2-6 22:22:26 | 显示全部楼层
好吧,我错了。。。

对了,我在看那些不常用的命令,有个问题

module 和 modulenounzip

这两个命令是用来装载什么文件的

我没弄懂这两个命令和kernel的区别

还有 outline 是干吗用的,我找了老半天也没找到这个资料,什么是字符轮廓模式?

[ 本帖最后由 NicTense 于 2010-2-7 01:50 编辑 ]
回复

使用道具 举报

发表于 2010-2-7 01:43:52 | 显示全部楼层
哈哈,新版本很不错

修正部分usb-zip启动后root为(fd0,0)的问题

checkrange 0 read 0x8280 && checkrange 0 calc 0=*0x8208 >> 16 && root (fd0) && calc *0x8208 | 0xff0000

从本地硬盘启动
checkrange 0x80 read 0x8280 && rootnoverify (hd1) ! rootnoverify (hd0)
chainloader +1

[ 本帖最后由 NicTense 于 2010-2-7 03:22 编辑 ]
回复

使用道具 举报

发表于 2010-2-7 06:52:52 | 显示全部楼层
module 和 modulenounzip

当 kernel 加载了一个内核后,内核也可能需要某些模块,这时候就可以用上述两条命令了。很少用到。

outline 是图形模式下显示字符笔画的边框。在图形模式下,如果 splashimage 的颜色与字符颜色很接近,则字符就不能看清。有了 outline,给字符加上轮廓,就可以看清字符了。outline 对文本模式不起作用。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2021-3-5 15:14

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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