grub4dos icon indicating copy to clipboard operation
grub4dos copied to clipboard

请问下如何设置变量,set貌似不工作.

Open senioi opened this issue 4 years ago • 10 comments

第一次接触grub4dos,感谢无私的贡献. 请问下如何设置变量呢?在grub或者grub2下可以用set正常设置变量传递.z 这个是在linux下的grub和grub2用的配置文件.

menuentry "FreeBSD" { set isofile="/boot/mfsbsd-12.1-RELEASE-amd64.iso" loopback loop (hd0,1)$isofile kfreebsd (loop)/boot/kernel/kernel.gz -v kfreebsd_loadenv (loop)/boot/device.hints kfreebsd_module (loop)/boot/kernel/ahci.ko kfreebsd_module (loop)/mfsroot.gz type=mfs_root set kFreeBSD.vfs.root.mountfrom="ufs:/dev/md0" }

在grub4dos下该如何设置变量呢? 比如这个: set kFreeBSD.vfs.root.mountfrom="ufs:/dev/md0"

senioi avatar Dec 21 '19 18:12 senioi

set 用法: SET [variable=[string]] 描述: 一些系统内置变量可参见 其他相关中 的 变量使用相关以及内置变量 部分 (by zxw@wuyou)

set 命令主要用于显示、设置或删除变量 set设置变量的基本形式:SET [variable=[string]] variable 指定变量名(最长8个字符)。 string 指定要指派给变量的一系列字符串(最长512个字符)。 1、不带参数的 SET 命令会显示当前变量。 2、要删除某个变量,只需要让=后面为空就可以 set myvar= #将会删除变量myvar 3、显示已使用的名称的所有变量的值。例如: set A #会显示所有以A开头的变量,如果没有任何匹配返回0. 注: 1.使用和MSDOS一样的处理方法,一整行的命令会在执行前先进行变量替换。 2.变量名不允许使用非字母或_开头。否则你将无法访问你的变量。 3.长度限制请看前面说明。 4.输入"set *"可以清除所有已设置的变量。 使用set设置变量是批处理中一个重要的部分,一定好好把握。 set设置的变量要用双%括起来引用,如要取消之前变量直接set 变量名= set 的参数 /a /A 常用以计算赋值,/A 使用16进制数保存变量,/a 使用十进制数保存变量. 注意:目前只支持简单的整型数,只能从左至右进行计算。如果变量是字母或符号则错误。 目前支持的运算符(也可参见 calc 命令 部分): 1.基本运算符

  • 加法运算符。如 set /a a=3+7 的值为10, set /A a=3+7 的值为0xA
  • 减法运算符。如 set /a a=3-5 的值为-2
  • 乘法运算符。如 set /a a=3*5 的值为15 / 取整运算符。如 set /a a=3/5 的值为0, set /a a=7/2 的值为3 % 求余运算符,或模运算符。如 set /a a=7%2 的值为1 2.位运算符,位运算仅限于以二进制位为单位的整数运算。 按位与 运算符 ( & ) (1) 运算规则   运算的两个二进制位值都为 1,结果才为1 (2) 举例 set /a a=3&5的值为1 按位或 运算符 ( | ) (1) 运算规则   运算的两个二进制位值有一个为 1,结果就为1 (2) 举例 set /a a=3|5的值为7 按位异或 运算符 ( ^ ) (1) 运算规则   运算的两个二进制位值不同,结果为 1,否则结果为0 (2) 举例 set /a a=3^5的值为6 按位左移 运算符 ( << ) (1) 运算规则 整体左移,右补 0,左移出的高位丢弃 左移 1位,相当于乘2(高位未移出时) 左移 n位,相当于乘2的n方(高位未移出时) (2) 举例 set /a a=1<<1的值为2 按位右移 运算符 ( >> ) (1) 运算规则 整体右移,左补 0/1,右移出的低位丢弃右移 1位, 相当于除2(低位未移出时)右移 n位,相当于除2的n方(低位未移出时) (2) 举例 set /a a=5>>2的值为1 /p 设置与用户的交互输入开关: set /p var=Please input: ::提示 Please input,暂停执行等待用户输入 echo %var% :: "提示"不作变量的值,var的值为用户输入 pause 注:如果在输入过程中按Esc或没有任何输入,则直接返回假,不修改变量的值。 /p:N 默认时间内没有输入则自动退出。 语法:set /p:N variable=prompt 如果在N秒之内没有任何输入,则返回,并且不改变变量variable的值。 /l /u 将变量中的字母转换为小写或大写。 如set /l a=Abcd,a的值为abcd.

set a=123 设置变量 a 的值为字符串 123 set /a a=123 设置变量 a 的值为十进制整数 123 set /A a=123 设置变量 a 的值为十六进制整数 0x7B set /a a=123+4 设置变量 a 的值为十进制整数 127(可参考 calc 命令) set /A a=123+4 设置变量 a 的值为十六进制整数 0x7F(可参考 calc 命令) set a 显示变量 a 的值 set a= 删除变量 a set *0x8280=0x80 设置内存地址 0x8280 处的整数值为 0x80 set 列出所有变量列表 set a=abcdef set len_a=%@retval% 通过 %@retval% 获取最后一次设置的变量的长度 set a=abcdef && set /a len_a=*0x4cb00 通过 *0x4cb00 获取最后一次设置的变量的长 [注意:变量名最长为 8 个字符,变量内容最长为 512 字节,变量最多只能设置 60 个]

请以后注意,如果不是反馈错误,如果不是提出改进建议,请到以下网址发表: http://bbs.wuyou.net/forum.php?mod=forumdisplay&fid=60

yaya2007 avatar Dec 22 '19 00:12 yaya2007

@yaya2007 谢谢回复,抱歉,以后注意.

senioi avatar Dec 22 '19 08:12 senioi

set *0x8280=0x1234 not work ??? calc *0x8280=0x1234 OK (64-bit value)

kfreebsd variables not supported in grub4dos - only grub2 ???

steve6375 avatar Dec 22 '19 09:12 steve6375

抱歉,我重开了这个issue 我尝试在menu.lst里加入一个freebsd的iso 这是参数

title freeBSD find --set-root --ignore-floppies --ignore-cd /mfsbsd.iso map /mfsbsd.iso (0xff) map --hook chainloader (0xff) set kFreeBSD.mfsbsd.test="test"

但是提示参数错误,我该如何才能支持参数传递呢? linux的grub和grub2下是直接设置: set kFreeBSD.mfsbsd.test="test", grub4dos是不是不支持kfreebsd? image

senioi avatar Dec 22 '19 16:12 senioi

grub4dos environment variables cannot be over 8 characters.

steve6375 avatar Dec 22 '19 16:12 steve6375

title freeBSD find --set-root --ignore-floppies --ignore-cd /mfsbsd.iso map /mfsbsd.iso (0xff) map --hook chainloader (0xff) ~~set kFreeBSD.mfsbsd.test="test"~~

你如果map启动的话应该不需要传递这个参数。

a1ive avatar Dec 23 '19 02:12 a1ive

title freeBSD find --set-root --ignore-floppies --ignore-cd /mfsbsd.iso map /mfsbsd.iso (0xff) map --hook chainloader (0xff) ~set kFreeBSD.mfsbsd.test="test"~

你如果map启动的话应该不需要传递这个参数。

对,如果是单纯启动,是不需要传递参数的, 但是要让bsd加载特定驱动或无人值守或设置网络等等BSD系统引导设置调整都需要设置变量传递参数呢,实属无奈啊.

senioi avatar Dec 23 '19 03:12 senioi

对,如果是单纯启动,是不需要传递参数的, 但是要让bsd加载特定驱动或无人值守或设置网络等等BSD系统引导设置调整都需要设置变量传递参数呢,实属无奈啊.

那我就不清楚了。 grub2下这个变量是通过特殊方式直接传递给内核的。 我大概看了下grub4dos的代码,好像没有实现这个。

a1ive avatar Dec 23 '19 06:12 a1ive

If you want to modify the parameters, it is best to load grub2 from grub4dos. You can extract and edit the grub.cfg file - or you can load the ISO into memory or directly map the ISO and then use grub4dos to overwrite the grub.cfg file with new contents.

If you have a specific ISO and a specific modification, contact me for help if you want to use this method ([email protected]).

steve6375 avatar Dec 23 '19 09:12 steve6375

If you want to modify the parameters, it is best to load grub2 from grub4dos. You can extract and edit the grub.cfg file - or you can load the ISO into memory or directly map the ISO and then use grub4dos to overwrite the grub.cfg file with new contents.

If you have a specific ISO and a specific modification, contact me for help if you want to use this method ([email protected]).

Good idea, thanks for your share. but, if grub2dos can support the kfreebsd variable, I think this is better.

senioi avatar Dec 23 '19 11:12 senioi