无忧启动论坛

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

grub4dos传递参数的方法

[复制链接]
跳转到指定楼层
1#
发表于 2008-11-11 15:56:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
众所周知,BCDW有传递参数的功能,遗憾的是,只能用于光盘/ISO启动。
grub4dos作为一个启动管理器,功能强大,但可惜没有传递参数的功能。
时空论坛看到有人提出了此问题,zw2312914给出了解决的思路与办法。

感觉不错,转贴分享之。

原帖链接:http://bbs.znpc.net/viewthread.php?tid=5322&extra=page%3D1


Public:
就是能否在 menu.lst 文件里面设置怎样的路径链接,来直接运行 .img 里面的批处理程序吗
比如说 我有个dos.img 里面有 PQ.bat来运行魔术分区软件,DM.bat来运行DM程序,gho.bat来运行Ghost自动备份
C盘的操作等等。
我想在menu.lst 里面编辑一个菜单项,第1项加载PQ.bat,第2项加载DM.bat,第3项加载gho.bat
,但是这3个bat文件又都是同在一个dos.img里面的,(如果在各自不同的img文件里面的当然可以实现),请问一
下这个有办法解决吗??

-------------------------------------------
zw2312914:
第一个问题的实质是grub4和dos(操作系统)之间的参数传递的问题。
思考了一个方法,核心就是使用grub4目前唯一一个在文件系统内的写操作命令 savedefault 。然后在dos(操作系统)下对savedefault命令所保存的值进行判断,最后调用相应的批处理。
这个方法应该比写内存然后引导到dos(操作系统),更简洁和合理,而且也许扩展应用较大。

以楼主问题为例:

1.复制grub4dos下载包中的default文件到镜像中(镜像名是dos.img为例),并把default更名为default.txt。
2.在menu.lst中参照以下菜单项改写

title PQ.bat运行魔术分区软件
map --mem /dos.img (fd0)
map --hook
chainloader (fd0)+1
root (fd0)
default (fd0)/default.txt
savedefault 11
boot

title DM.bat来运行DM程序
map --mem /dos.img (fd0)
map --hook
chainloader (fd0)+1
root (fd0)
default (fd0)/default.txt
savedefault 22
boot

title 加载gho.bat
map --mem /dos.img (fd0)
map --hook
chainloader (fd0)+1
root (fd0)
default (fd0)/default.txt
savedefault 33
boot

3.在dos中增加一个bat,用来判断default.txt的开头字符,并根据这个字符值,调用需要加载的bat。

例如,choose.bat:

@echo off
find  "11" a:\defaut.txt  > nul
if not errorlevel 1  a:\PM.bat
find  "22" a:\defaut.txt  > nul
if not errorlevel 1  a:\DM.bat
find  "33" a:\defaut.txt  > nul
if not errorlevel 1  a:\GHOST.bat

(需注意:由defualt文件改名而来的default.txt,由于其中已有2 0 4 8 几个数字,所以savedefault时应避免与它相同。实际上只要保证写入前后deualt.txt文件的大小不变,即2048字节,可以自己建一个2048字节的空内容文本文件作为defualt.txt,不过不推荐这样做)
dos下准确和简洁的判断和处理,还是请教批处理高手吧。

[ 本帖最后由 lianjiang 于 2008-11-18 18:37 编辑 ]
2#
发表于 2008-11-11 18:31:41 | 只看该作者
叹为观止。
回复

使用道具 举报

3#
发表于 2008-11-11 20:48:49 | 只看该作者
新人刚来,看不懂。。。太深奥了
回复

使用道具 举报

4#
 楼主| 发表于 2008-11-11 20:58:04 | 只看该作者
简单讲,就是利用grub4ods的savedefault,向特定文件中写入特征数字,到dos后读取该特征数字,从而运行相应的程序。

以实现传递参数的功能。
回复

使用道具 举报

5#
发表于 2008-11-12 08:31:34 | 只看该作者
很强的应用。。。。。。。。。。。。。。
回复

使用道具 举报

6#
发表于 2008-11-14 19:11:00 | 只看该作者
强。想得到就做得到!
回复

使用道具 举报

7#
发表于 2008-11-14 19:22:07 | 只看该作者
厉害,拜读一下,谢谢分享
回复

使用道具 举报

8#
发表于 2008-11-16 21:37:38 | 只看该作者
这个方法很不错啊,就是不知道会不会出错.
回复

使用道具 举报

9#
发表于 2008-11-18 17:58:45 | 只看该作者
感觉离应用还是有点距离,不过这是lz一种独特的见解跟创新哈,支持~~~
回复

使用道具 举报

10#
发表于 2008-11-18 18:00:33 | 只看该作者
GRUB写入的本领还从来没体会过。。
回复

使用道具 举报

11#
 楼主| 发表于 2008-11-18 18:38:35 | 只看该作者
原帖由 tangfu 于 2008-11-18 17:58 发表
感觉离应用还是有点距离,不过这是lz一种独特的见解跟创新哈,支持~~~


不知道存在什么距离,呵呵。
关键就看是否需要。
回复

使用道具 举报

12#
发表于 2008-11-19 13:11:51 | 只看该作者
学习了,收藏,慢慢研究了
回复

使用道具 举报

13#
发表于 2009-3-6 21:51:32 | 只看该作者
现在极度郁闷
做个几个菜单给DOS传递参数,用的就是这几种方法。
  1. @echo off
  2. find  "11" a:\defaut.txt  > nul
  3. if not errorlevel 1  a:\PM.bat
  4. find  "22" a:\defaut.txt  > nul
  5. if not errorlevel 1  a:\DM.bat
  6. find  "33" a:\defaut.txt  > nul
  7. if not errorlevel 1  a:\GHOST.bat
复制代码
a:\defaut.txt  应该是 a:\default.txt

另外 find  "11" a:\defaut.txt > nul  不可靠,不是所有数字都能使用!
我还没想到在纯DOS下可靠的判断方法。
那位高手帮助改进一下.

[ 本帖最后由 happymy 于 2009-3-7 00:49 编辑 ]
回复

使用道具 举报

14#
 楼主| 发表于 2009-3-7 07:52:00 | 只看该作者
原帖由 happymy 于 2009-3-6 21:51 发表
现在极度郁闷
做个几个菜单给DOS传递参数,用的就是这几种方法。@echo off
find  "11" a:\defaut.txt  > nul
if not errorlevel 1  a:\PM.bat
find  "22" a:\defaut.txt  > nul
if not errorlevel 1  a:\ ...


不明白什么叫“另外 find  "11" a:\defaut.txt > nul  不可靠,不是所有数字都能使用!”

最好用实例说明哪里有问题,你是如何使用的。
回复

使用道具 举报

15#
发表于 2009-3-7 10:40:49 | 只看该作者
原帖由 lianjiang 于 2009-3-7 07:52 发表


不明白什么叫“另外 find  "11" a:\defaut.txt > nul  不可靠,不是所有数字都能使用!”

最好用实例说明哪里有问题,你是如何使用的。


确实有问题。例如
  1. find "10" a:\default.txt > nul
  2. if not errorlevel 1 echo  10
  3. find "12" a:\default.txt > nul
  4. if not errorlevel 1 echo 12
  5. find "13" a:\default.txt > nul
  6. if not errorlevel 1 echo 13
  7. find "14" a:\default.txt > nul
  8. if not errorlevel 1 echo 14
  9. find "16" a:\default.txt > nul
  10. if not errorlevel 1 echo 16
  11. find "17" a:\default.txt > nul
  12. if not errorlevel 1 echo 17
  13. find "18" a:\default.txt > nul
  14. if not errorlevel 1 echo 18
  15. find "20" a:\default.txt > nul
  16. if not errorlevel 1 echo 20
  17. find "21" a:\default.txt > nul
  18. if not errorlevel 1 echo 21
  19. find "22" a:\default.txt > nul
  20. if not errorlevel 1 echo 22
  21. find "24" a:\default.txt > nul
  22. if not errorlevel 1 echo 24
  23. find "25" a:\default.txt > nul
  24. if not errorlevel 1 echo 25
  25. find "26" a:\default.txt > nul
  26. if not errorlevel 1 echo 26
  27. find "28" a:\default.txt > nul
  28. if not errorlevel 1 echo 28
  29. find "29" a:\default.txt > nul
  30. if not errorlevel 1 echo 29
  31. find "30" a:\default.txt > nul
  32. if not errorlevel 1 echo 30
  33. find "32" a:\default.txt > nul
  34. if not errorlevel 1 echo 32
  35. find "33" a:\default.txt > nul
  36. if not errorlevel 1 echo 33
  37. find "34" a:\default.txt > nul
  38. if not errorlevel 1 echo 34
  39. find "36" a:\default.txt > nul
  40. if not errorlevel 1 echo 36
  41. find "37" a:\default.txt > nul
  42. if not errorlevel 1 echo 37
  43. find "38" a:\default.txt > nul
  44. if not errorlevel 1 echo 38
  45. find "40" a:\default.txt > nul
  46. if not errorlevel 1 echo 40
  47. find "41" a:\default.txt > nul
  48. if not errorlevel 1 echo 41
  49. find "42" a:\default.txt > nul
  50. if errorlevel 1 echo 42
  51. find "44" a:\default.txt > nul
  52. if not errorlevel 1 echo 44
  53. find "45" a:\default.txt > nul
  54. if not errorlevel 1 echo 45
  55. find "46" a:\default.txt > nul
  56. if not errorlevel 1 echo 46
  57. find "48" a:\default.txt > nul
  58. if not errorlevel 1 echo 48
  59. find "49" a:\default.txt > nul
  60. if not errorlevel 1 echo 49
  61. find "50" a:\default.txt > nul
  62. if not errorlevel 1 echo 50
复制代码
折腾了一晚上(我是菜鸟,纯DOS又限制太多……)。我想到了一种更好的方法:

不过有两个缺点:
1.需要建立一个临时文件
2.执行的bat文件名必需和查找的数字相同。

先建立11.bat、12.bat、13.bat、14.bat
  1. @echo off
  2. del temp.bat
  3. cls
  4. type default.txt|find "11" >>temp.bat
  5. type default.txt|find "12" >>temp.bat
  6. type default.txt|find "13" >>temp.bat
  7. type default.txt|find "14" >>temp.bat
  8. temp.bat
复制代码
不要使用0开头的数字。

[ 本帖最后由 happymy 于 2009-3-7 12:38 编辑 ]
回复

使用道具 举报

16#
 楼主| 发表于 2009-3-7 11:00:13 | 只看该作者
原帖由 happymy 于 2009-3-7 10:40 发表


确实有问题。例如

find "10" a:\default.txt > nul
if errorlevel 1 echo  10
find "12" a:\default.txt > nul
if errorlevel 1 echo 12
find "13" a:\default.txt > nul
if errorlevel 1 echo  ...


使用的数字不能以0开头,这是grub所要求的,不能称之为问题。

只写出例子,但并未交代哪里有问题。
另外,原始的default.txt存在2024的字符,因此是用原始文件的话,不能用像2,4,20,24,202之类的来判断,需要避开。【例子中的20是不能用的。】
当然也可以用其他字符替换掉原来里面有的数字。
回复

使用道具 举报

17#
发表于 2009-3-7 11:05:38 | 只看该作者
原帖由 lianjiang 于 2009-3-7 11:00 发表


使用的数字不能以0开头,这是grub所要求的,不能称之为问题。

只写出例子,但并未交代哪里有问题。
另外,原始的default.txt存在2024的字符,因此是用原始文件的话,不能用像2,4,20,24,202之类的来 ...


就是所有数字都不能用的问题。 这两种方法各有各的优点。
不生成 temp.bat 就需要第三方工具。
type default.txt|find "14"|call 这种写法我也想过,但是使用call 会返回调用的BAT。
回复

使用道具 举报

18#
 楼主| 发表于 2009-3-7 11:11:35 | 只看该作者
原帖由 happymy 于 2009-3-7 11:05 发表


就是所有数字都不能用的问题。 这两种方法各有各的优点。
不生成 temp.bat 就需要第三方工具。
type default.txt|find "14"|call 这种写法我也想过,但是使用call 会返回调用的BAT。


所有者数字都不能用,这是不可能的。除非你没有按要求做。
回复

使用道具 举报

19#
发表于 2009-3-7 11:18:57 | 只看该作者
原帖由 lianjiang 于 2009-3-7 11:11 发表


所有者数字都不能用,这是不可能的。除非你没有按要求做。

笔误(一晚上没睡,有点精神恍惚了),应该是有的数字不能使用。
回复

使用道具 举报

20#
 楼主| 发表于 2009-3-7 11:29:48 | 只看该作者
原帖由 happymy 于 2009-3-7 11:18 发表

笔误(一晚上没睡,有点精神恍惚了),应该是有的数字不能使用。


请写出哪些数字不能用。

所谓不能用,表现是什么?是写不到default.txt里?

问题交待很不清楚,作为一个版主,实不应该,呵呵。
回复

使用道具 举报

21#
发表于 2009-3-7 11:33:26 | 只看该作者
原帖由 lianjiang 于 2009-3-7 11:29 发表


请写出哪些数字不能用。

所谓不能用,表现是什么?是写不到default.txt里?

问题交待很不清楚,作为一个版主,实不应该,呵呵。


你刚才不是已经写出来了么?

原始的default.txt存在2024的字符,因此是用原始文件的话,不能用像2,4,20,24,202之类的来判断,需要避开。【例子中的20是不能用的。】

我这种也存在一些问题,用原始的default.txt 发现会输出一些非数字的内容。看来需要继续改进。
回复

使用道具 举报

22#
 楼主| 发表于 2009-3-7 11:47:46 | 只看该作者
原帖由 happymy 于 2009-3-7 11:33 发表


你刚才不是已经写出来了么?

原始的default.txt存在2024的字符,因此是用原始文件的话,不能用像2,4,20,24,202之类的来判断,需要避开。【例子中的20是不能用的。】

我这种也存在一些问题,用原始的 ...



这是问题吗? 假如认为是问题的话,也只能说明没有理解此方法,呵呵。

举出的那几个数字,并非不能用,而是dos下假如采用find "20"之类来处理的话,要避开。
对策:
1,替换掉原始的2024的数字
2,直接读取写入的数字,而不用type。
3,用type,改成“find "20  "之类。
方法肯定有很多,关键在于你自己要知道在干什么,应如何处理。


就像明明知道ghost恢复后,会把原来盘上的数据全部搞掉,你还不先采取其他手段处理,而是说ghost“应该改进”。呵呵。
作为使用者,首先是根据软件、及各种处理方法的特点加以利用。

要说改进,那么新加的dd及write就是实现参数传递的完美方案。不过个人以为,仅仅只是传递几个简单参数default足够了。
回复

使用道具 举报

23#
发表于 2009-3-7 12:36:17 | 只看该作者
原帖由 lianjiang 于 2009-3-7 11:47 发表



这是问题吗? 假如认为是问题的话,也只能说明没有理解此方法,呵呵。

举出的那几个数字,并非不能用,而是dos下假如采用find "20"之类来处理的话,要避开。
对策:
1,替换掉原始的2024的数字
2, ...


都先说我是DOS菜鸟。

因为find本身的问题,default.txt里面内容又不是空的。
find 在查找字符的时候并不是精确查找,default.txt里的内容会被显示出来。

例如 20


  1. A:\find "20" A:\default.txt
  2. 返回的结果:

  3. ---------- A:\DEFAULT.TXT
  4. 20
  5. # !!!!!!! The file size is 2048 bytes. Don't change the file size !!!!!!!
  6. # !!!!!!! The file size is 2048 bytes. Don't change the file size !!!!!!!
复制代码
另外bat里连续查找某些数字的时候。
返回:
  1. # !!!!!!! The file size is 2048 bytes. Don't change the file size !!!!!!!
  2. # !!!!!!! The file size is 2048 bytes. Don't change the file size !!!!!!!
  3. 查找的数字
  4. # !!!!!!! The file size is 2048 bytes. Don't change the file size !!!!!!!
  5. # !!!!!!! The file size is 2048 bytes. Don't change the file size !!!!!!!
复制代码
我这种方法,在遇到这两种返回结果的时候不会出现问题。查20这个数字也不会出现错误

10-99都不会出现错误。

不足的是看到几行 Bad command or file name

[ 本帖最后由 happymy 于 2009-3-7 12:40 编辑 ]
回复

使用道具 举报

24#
 楼主| 发表于 2009-3-7 12:44:31 | 只看该作者
当使用菜单很多时,用type判断效率低,可用直接读取第一个数字的办法。

比如nset。
回复

使用道具 举报

25#
发表于 2009-3-7 12:49:57 | 只看该作者
原帖由 lianjiang 于 2009-3-7 12:44 发表
当使用菜单很多时,用type判断效率低,可用直接读取第一个数字的办法。

比如nset。

type default.txt|find "14"

type default.txt
是为了去掉 find 返回的
---------- A:\DEFAULT.TXT

另外A:\DEFAULT.TXT 存在于内存中,速度是很快的。

用第三方工具是个不错的方法。
回复

使用道具 举报

26#
 楼主| 发表于 2009-3-7 13:06:37 | 只看该作者
原帖由 happymy 于 2009-3-7 12:49 发表

type default.txt|find "14"

type default.txt
是为了去掉 find 返回的
---------- A:\DEFAULT.TXT

另外A:\DEFAULT.TXT 存在于内存中,速度是很快的。

用第三方工具是个不错的方法。

因为你的例子,从10一直type到50,用了80行,而直接读取2行就够了。
回复

使用道具 举报

27#
发表于 2009-3-7 13:13:12 | 只看该作者
原帖由 lianjiang 于 2009-3-7 13:06 发表

因为你的例子,从10一直type到50,用了80行,而直接读取2行就够了。


帮我写个改进的:)

另外1楼的内容修改、添加点内容。

来个完美的,方便大家。
回复

使用道具 举报

28#
 楼主| 发表于 2009-3-7 13:36:02 | 只看该作者
nset  /l1 aa=$1 <a:\default.txt
echo Num. is "%aa%".
pause
回复

使用道具 举报

29#
发表于 2009-3-9 20:13:21 | 只看该作者
savedefault传参数有里程碑似的重要意义。
不过现在已经有更多的的方法,例如#22楼提到的dd和write,尤其是后者目前最方便。

dd的一个例子:Sending the selected menu item number to DOS
write的例子:
write --offset=100 (fd0)/ENV.BAT set itNum=4\r\n

其中ENV.BAT是一个超过512字节的内容全部是空格的文件。
回复

使用道具 举报

30#
 楼主| 发表于 2009-3-9 21:40:16 | 只看该作者
savedefault的独有优势是哪个版本都支持,而新增dd和write严重依赖于版本,在应用上应注意此问题。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-19 03:05

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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