中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 关于&&用法 上一主题 | 下一主题
yaya
银牌会员





积分 1009
发帖 353
注册 2003-9-4
状态 离线
『楼 主』:  关于&&用法

请教不点:
    cat (hd0,0)/grubhere.id || chainloader (hd0,0) +1
    cat (hd0,0)/grubhere.id && map (hd0) (hd1)
    cat (hd0,0)/grubhere.id && map (hd1) (hd0)
    cat (hd0,0)/grubhere.id && chainloader (hd1,0)
语句本意是当u盘识别为a:时,(hd0,0)/grubhere.id 不存在,执行chainloader +1,
当u盘识别为c:时,(hd0,0)/grubhere.id 存在,执行后3条.
可是程序执行时,提示找不到文件.按任意键又返回了启动菜单.
怎样才能实现这一功能?请赐教!谢谢!

2008-8-1 16:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不点
银牌会员

不甘寂寞的人


积分 2491
发帖 1115
注册 2003-9-24
状态 离线
『第 2 楼』:  

谢谢报告此问题。

grub 中的函数在执行完了之后,有一个出错值 errnum,以及一个返回值。

|| 和 && 操作符不使用 errnum 的值,而使用的是函数的返回值。

当 cat 遇到失败时,errnum 可能也同时设置了,如果执行 || 之后的命令之前没能将 errnum 重置为 0,则整个复合命令的执行结果也将被认为是失败的,于是终止后续的菜单命令的执行。

似乎合理的方案应该在执行 || 之后的命令之前清除 errnum,但是,有时候保留这一 errnum 或许是有用的,所以,我现在还不能肯定是否应该清除 errnum 的值。

作为权宜之计,大家可以配合 errorcheck off 来使用 || 和 && 操作符。很抱歉,给大家带来一些不便,不过今后会解决的。

当使用 errorcheck off 之后,一定要在执行 boot 之前有一条 errorcheck on 来结束 errorcheck off 的指定,否则后续的菜单操作会失败。

    errorcheck off
    cat (hd0,0)/grubhere.id || chainloader (hd0,0) +1
    cat (hd0,0)/grubhere.id && map (hd0) (hd1)
    cat (hd0,0)/grubhere.id && map (hd1) (hd0)
    cat (hd0,0)/grubhere.id && chainloader (hd1,0)
    errorcheck on



因为我们亲手创建,这个世界更加美丽。
2008-8-1 22:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yaya
银牌会员





积分 1009
发帖 353
注册 2003-9-4
状态 离线
『第 3 楼』:  

使用
    errorcheck off
    cat (hd0,0)/grubhere.id || chainloader (hd0,0)+1
    cat (hd0,0)/grubhere.id && map (hd0) (hd1)
    cat (hd0,0)/grubhere.id && map (hd1) (hd0)
    cat (hd0,0)/grubhere.id && chainloader (hd1,0)+1
    errorcheck on
后,不再提示找不到文件,但必须修改成
    errorcheck off
    cat (hd0,0)/grubhere.id || chainloader (hd0,0)/ntldr
    ......
或者
    errorcheck off
    find --set-root /ntldr
    cat (hd0,0)/grubhere.id || chainloader +1
    ......
才能正确执行.

    使用 cat (hd0,0)/grubhere.id || chainloader (hd0,0)+1 后,光标不停闪烁,死机.

    使用grub4dos 2008.8.3版问题依旧.

2008-8-6 09:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不点
银牌会员

不甘寂寞的人


积分 2491
发帖 1115
注册 2003-9-24
状态 离线
『第 4 楼』:  

嗯,其实并不能把所有的问题都归结为 grub4dos 的 bug。

比如说,chainloader (hd0,0)+1 之后能否启动,与你在 (hd0,0)+1 上放置的引导代码有关,如果是微软的,则它的启动失败不是很意外的,因为微软的代码并不特别考虑对 USB 的支持。

根据其他人的报告,今天晚上可能还会发布一个版本,解决相关问题。谢谢支持。



因为我们亲手创建,这个世界更加美丽。
2008-8-6 13:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yaya
银牌会员





积分 1009
发帖 353
注册 2003-9-4
状态 离线
『第 5 楼』:  

使用grub4dos 2008.8.10版,不用加errorcheck off和errorcheck on就能正常运行.发现菜单可以循环选择了.

用u盘启动,不论识别为A:或者C:,以下命令都可以启动winxp.
title 启动 Windows NT/2K/XP/2K3
cat (hd0,0)/grubhere.id && map (hd0) (hd1)
cat (hd0,0)/grubhere.id && map (hd1) (hd0)
cat (hd0,0)/grubhere.id && map --hook
find --set-root /ntldr
chainloader /ntldr

grubhere.id 是u盘上的1个空文件.

2008-8-15 09:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zw2312914
初级用户





积分 39
发帖 16
注册 2007-2-19
状态 离线
『第 6 楼』:  

看了楼主的菜单,有个执行效率的小疑问。
你的grubhere.id相当于是个判断u盘的标志文件。你是使用cat来判断的,但 cat 命令实际上是找到并显示文件内容的命令,所以,实际执行效率可能和用 ls 命令来判断相仿。
而 find 命令只判断存在与否,不用再显示文件内容,因此效率可能要高一点。比如:
find (hd0,0)/grubhere.id && map (hd0) (hd1)

2008-8-15 16:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
不点
银牌会员

不甘寂寞的人


积分 2491
发帖 1115
注册 2003-9-24
状态 离线
『第 7 楼』:  

root 和 rootnoverify 命令后面不加任何参数,则返回当前磁盘是否为硬盘:如果当前磁盘是软盘,则返回 false;如果当前盘是硬盘,则返回 true。

如果能用上这个,可能会简化一些。不过 cat 也是很好的,因为显示空文件其实也很快。

楼上的 find 命令不行,find 似乎并不适合用作这样的目的。ls 也不太好,因为 ls 有 auto completion 的功能,比如 ls /grldr 能够列出 grldr1, grldr2, grldr.mbr, grldr.tmp 等等,凡是以 grldr 打头的都能列出来。

[ Last edited by 不点 on 2008-8-15 at 05:31 PM ]



因为我们亲手创建,这个世界更加美丽。
2008-8-15 17:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yaya
银牌会员





积分 1009
发帖 353
注册 2003-9-4
状态 离线
『第 8 楼』:  

可以使用以下语句,更简化一些。
title 启动 Windows NT/2K/XP/2K3
root && map (hd0) (hd1)
root && map (hd1) (hd0)
root && map --hook
find --set-root /ntldr
chainloader /ntldr

2008-8-18 10:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: