无忧启动论坛

标题: grub大师,有问题请进! [打印本页]

作者: zds1210    时间: 2013-5-26 21:38
标题: grub大师,有问题请进!
本帖最后由 zds1210 于 2013-5-26 22:27 编辑

不点大师:
你好!又有两个问题问你了。
一是grub内置菜单这句起什么作用 ?
if "%@root%"=="(ud)" && calc *0x82A0=*0x82b9&0xff


二是在我的半解开统一方案中的极速PE中,
1.光盘量产时候要用到以下语句:不直接map二级内核
title 7.运行Win2003 PE极速版(老机)
echo $[1106] loading win2003 mini pe, please wait ...
map --mem ()/winpe/boot_mini.iso (0xff) || find --set-root /winpe/boot_mini.iso && map --mem  /winpe/boot_mini.iso (0xff)
map --e820cycles=3
map --hook
chainloader (0xff)/WXPE/SETUPLDR.BIN
2.而在U盘可写隐藏版时,又要用到以下语句:要直接map二级内核
title 7.运行Win2003 PE极速版(老机)
echo $[1106] loading win2003 mini pe, please wait ...
map ()/winpe/xyly_mini.iso (0xfa) || find --set-root /winpe/xyly_mini.iso && map /winpe/xyly_mini.iso (0xfa)
map --mem ()/winpe/boot_mini.iso (0xff) || find --set-root /winpe/boot_mini.iso && map --mem  /winpe/boot_mini.iso (0xff)
map --e820cycles=3
map --hook
chainloader (0xff)/WXPE/SETUPLDR.BIN
3.我用以下语句去统一,不知道当否:
title 7.运行Win2003 PE极速版(老机)
echo $[1106] loading win2003 mini pe, please wait ...
if not "%@root%"=="(cd)" echo nocd &&  map ()/winpe/xyly_mini.iso (0xfa) || if "%@root:~1,1%"=="f" && find --set-root --devices=f /winpe/xyly_mini.iso && map  /winpe/xyly_mini.iso (0xfa) || find --set-root --ignore-floppies --ignore-cd /winpe/xyly_mini.iso && map  /winpe/xyly_mini.iso (0xfa)
map --mem ()/winpe/boot_mini.iso (0xff) || find --set-root /winpe/boot_mini.iso && map --mem  /winpe/boot_mini.iso (0xff)
map --e820cycles=3
map --hook
chainloader (0xff)/WXPE/SETUPLDR.BIN
谢谢指点!
作者: 不点    时间: 2013-5-26 22:07
仔细看了,两个问题都答复不了。你自己研究吧。我主要是记不住内存变量的意义。

"或者"、"而且" 这类操作符,一行中连续使用多次,其逻辑关系究竟是否正确,那可是个细致的活。我感觉很乱。但我也不能肯定一定有错。很抱歉,帮不上。看chenall能否帮你。
作者: 俊采星驰    时间: 2013-5-26 23:51
第一个问题,看看这里:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=206185

第二个问题,是可以合并的。不过你的语句啰嗦了些,if "%@root:~1,1%"=="f" && find --set-root --devices=f /winpe/xyly_mini.iso && map  /winpe/xyly_mini.iso (0xfa) || find --set-root --ignore-floppies --ignore-cd /winpe/xyly_mini.iso && map  /winpe/xyly_mini.iso (0xfa)
可以换为find --set-root --ignore-floppies --ignore-cd /winpe/xyly_mini.iso && map  /winpe/xyly_mini.iso (0xfa)这最后的一句。

map --e820cycles=3这个防蓝屏的参数最好不要乱用,我的经验是有些机器必须用它,有些机器加上“3”就完蛋。因此你可以加个变量,比如3秒内不按某个键,就自动加上参数并设置为“3”,否则按ESC可免参数,即设置参数为0,按数字0-9变可设置相应参数。
作者: zds1210    时间: 2013-5-27 00:08
本帖最后由 zds1210 于 2013-5-27 00:09 编辑
俊采星驰 发表于 2013-5-26 23:51
第一个问题,看看这里:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=206185

第二个问题,是可以 ...


第二个问题是,如果在光盘版中,忽略光驱找不到二级内核,会不会提示出错。
map --e820cycles=3
哪个参数怎么智能出来?能不能编 个现在的,让我用。不加参数,就是-1了。
作者: zds1210    时间: 2013-5-27 00:12
第一个问题,帖子说太多了,你把答案简单的 说给我吧。
作者: 俊采星驰    时间: 2013-5-27 00:23
其实那文章说得很清楚了。
#*0x82b9的低8位为ud区的设备类型。比如calc *0x82b9&0xff得0x80,说明ud区被格式化为hdd类型
0x82a0是当前根驱动器。
这句话的意思是说,当以fbinist方式启动时,将UD区被格式化成的类型传递给当前根驱动器,即()/
作者: zds1210    时间: 2013-5-27 00:26
俊采星驰 发表于 2013-5-27 00:23
其实那文章说得很清楚了。
#*0x82b9的低8位为ud区的设备类型。比如calc *0x82b9&0xff得0x80,说明ud区被格 ...

很好,我大概已经知道意思了。嗯。
下面请说一下第二个问题。、
还有智能参数写法。
作者: 俊采星驰    时间: 2013-5-27 00:38
这个也很简单,可以把
  1. map --e820cycles=3
  2. map --hook
复制代码
换成这样:
  1. set keyt=
  2. pause --wait=3 && set /A keyt=*0x4CB00
  3. if /i not "%keyt%"=="0x20" map --e820cycles=3
  4. map --hook
  5. set keyt=
复制代码
这样,按空格取消参数,不按键或者按其它任意键则设置参数map --e820cycles=3。
我这样改还没遇到不能过蓝屏这关的。
作者: 俊采星驰    时间: 2013-5-27 00:38
俊采星驰 发表于 2013-5-27 00:38
这个也很简单,可以把换成这样:这样,按空格取消参数,不按键或者按其它任意键则设置参数map --e820cycles ...

你可以简单修改即可弄成自己想要的。
作者: zds1210    时间: 2013-5-27 00:56
本帖最后由 zds1210 于 2013-5-27 00:59 编辑
俊采星驰 发表于 2013-5-27 00:38
这个也很简单,可以把换成这样:这样,按空格取消参数,不按键或者按其它任意键则设置参数map --e820cycles ...


我想改成按esc键取消参数,代码怎么改?谢谢 了。最好还可以选择其它参数,毕竟 3 -1这俩个参数,还是有蓝屏 ,复杂就算了啊。
作者: 俊采星驰    时间: 2013-5-27 01:25
zds1210 发表于 2013-5-27 00:56
我想改成按esc键取消参数,代码怎么改?谢谢 了。最好还可以选择其它参数,毕竟 3 -1这俩个参数,还是有 ...
  1. set keyt=
  2. pause --wait=3 && set /A keyt=*0x4CB00
  3. set e820=
  4. if not exist keyt set e820=-1
  5. if exist keyt set e820=%keyt:~-1%
  6. map --e820cycles=%e820%
  7. map --hook
  8. set e820=
  9. set keyt=
复制代码
没测试过,试试吧
作者: 俊采星驰    时间: 2013-5-27 01:32
未按键或者按ESC,应该都没有keyt变量。
如果按0-9,%keyt:~-1%取keyt变量的最后一位字符,即0~9。
请你自行改进吧,最好在虚拟机里敲代码,然后修正之。

那个担心找不到光盘中内核的问题,主要看bios能否识别量产的CD,能的话就能find到。
作者: zds1210    时间: 2013-5-27 11:28
俊采星驰 发表于 2013-5-27 01:32
未按键或者按ESC,应该都没有keyt变量。
如果按0-9,%keyt:~-1%取keyt变量的最后一位字符,即0~9。
请你自 ...

我想改成,按空格键参数为-1,按0-9键得到0-9参数,按其它键或不按键得参数为3。测试好提供给我。这样子比较完美些。
作者: 俊采星驰    时间: 2013-5-28 00:45
本帖最后由 俊采星驰 于 2013-5-28 01:04 编辑
zds1210 发表于 2013-5-27 11:28
我想改成,按空格键参数为-1,按0-9键得到0-9参数,按其它键或不按键得参数为3。测试好提供给我。这样子比 ...


下面这段应该可以实现,不过由于使用了goto命令,需要把这段代码弄成批处理,然后调用。
  1. set keyt=
  2. pause --wait=3 && set /A keyt=*0x4CB00
  3. set e820=
  4. if /i "%keyt%"=="0x20" set e820=-1
  5. if %keyt%>=0x30 && if %keyt%<=0x39 set e820=%keyt:~-1%
  6. if exist e820 goto E3
  7. set e820=3
  8. :E3
  9. map --e820cycles=%e820%
  10. map --hook
  11. set e820=
  12. set keyt=
复制代码
不加if %keyt%>=0x30 && if %keyt%<=0x39这个判断的话会乱套,末尾为0~9的键多了。
另外不按键时,keyt=0x1
按下ESC,keyt变量不存在。
作者: zds1210    时间: 2013-5-28 09:12
if exist e820 goto E3
set e820=3
goto E3:
E3

似乎要加这句才对
作者: zds1210    时间: 2013-5-28 11:40
本帖最后由 zds1210 于 2013-5-28 11:43 编辑

感觉这样子修正,不用调用批处理,更加好,不知道对不对?
  1. set keyt=
  2. pause --wait=3 && set /A keyt=*0x4CB00
  3. set e820=
  4. if /i "%keyt%"=="0x20" set e820=-1
  5. if %keyt%>=0x30 && if %keyt%<=0x39 set e820=%keyt:~-1%
  6. if not exist e820 set e820=3
  7. map --e820cycles=%e820%
  8. map --hook
  9. set e820=
  10. set keyt=
复制代码
按空格键参数设置为-1,按数字键为0-9,不按键或其它键参数设置为3。这样子很完美了。哈哈。
作者: 俊采星驰    时间: 2013-5-28 12:12
zds1210 发表于 2013-5-28 11:40
感觉这样子修正,不用调用批处理,更加好,不知道对不对?按空格键参数设置为-1,按数字键为0-9,不按键或其 ...

嗯,没有问题。可以弄到你合盘测试了。
作者: zds1210    时间: 2013-5-28 12:49
本帖最后由 zds1210 于 2013-5-28 12:57 编辑
  1. title 3.运行win 2003 PE 强化版   
  2. echo $$[1106] loading win 2003 pe, please wait ...
  3. set keyt=
  4. echo set map --e820cycles .
  5. echo Press space key set -1, press 0-9 key set 0-9, otherwise set 3 .
  6. pause --wait=15 && set /A keyt=*0x4CB00
  7. set e820=
  8. if /i "%keyt%"=="0x20" set e820=-1
  9. if %keyt%>=0x30 && if %keyt%<=0x39 set e820=%keyt:~-1%
  10. if not exist e820 set e820=3
  11. echo e820cycles=%e820%
  12. pause
  13. map --e820cycles=%e820%
  14. map --hook
  15. set e820=
  16. set keyt=
  17. chainloader (0xff)
复制代码
俊采星驰 发表于 2013-5-28 12:12
嗯,没有问题。可以弄到你合盘测试了。


测试完全成功了。哈哈。
测试代码如下


实机使用中,在12句加前#关闭语句就可以用了。
作者: nytc006    时间: 2013-5-28 14:17
好东东,值得学习哈~
感谢分享
作者: kkcing    时间: 2013-7-25 17:34
这方法不错,小改一下

按0-9设置为0-9,按空格设置为3,其他任意键都使用默认值-1

  1. echo -e \t$[0003]设置e820cycles参数防止蓝屏\n
  2. echo -e \t$[0003]请输入$[0004]0-9$[0003]或三秒后自动使用默认值$[0004]-1\n

  3. set keyt=
  4. set e820=-1
  5. pause --wait=3 && set /A keyt=*0x4CB00
  6. if %keyt%>=0x30 && if %keyt%<=0x39 set e820=%keyt:~-1%
  7. if /i "%keyt%"=="0x20" set e820=3
  8. map --e820cycles=%e820%
  9. map --hook
  10. set e820=
  11. set keyt=
  12. chainloader (0xff)
复制代码





欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3