本帖最后由 stevenldj 于 2013-12-29 12:22 编辑 一楼、学习笔记: [注:以后如果内容有改动,会用彩色文本标注,以便查阅,如果是改错字或改笔误,则仍使用黑色文本] ============================== 学习 Grub4Dos(最好在虚拟机中进行练习,以免损坏电脑中的系统和文件) ============================== 下载 Grub4Dos: http://code.google.com/p/grub4dos-chenall/downloads/list ============================== 版本 0.4.5c 和 0.4.6a 的区别: 0.4.5c 是稳定版。0.4.6a 处于 alpha 测试阶段。但是,这个系列有新功能,比如,支持微软的 exFAT 文件系统。0.4.6 最大的改动是启动代码,比如,grldr.mbr,bootlace.com 之类的。 差别主要在启动代码,即自举 grldr 。 0.4.6a 可以从 exFAT 文件系统启动(原内核已支持exFAT 文件系统); 0.4.6a 可以从 ext4 文件系统启动; 0.4.6a 可以在启动之初(加载 grldr 之前)加载 usb2.0 驱动,使被 BIOS 识别为软盘的 u 盘支持 LBA 读写; 0.4.6a 可以支持 udf 格式的光盘,可以支持 iso9600 扩展的 Joliet 格式,并启动之(修改了内核,正在优化中,近期发布)。 因为 Grub4Dos 还在不断的完善,所以上面的信息也不一定完全准确。 要稳定就用 0.4.5c,要支持更多的磁盘格式就用 0.4.6a。 ============================== 进入 Grub4Dos 的方法: 1、将下载的 grub4dos 压缩包解压 2、创建执行环境: 方法一:用 FbinstTool 创建一个 fba 文件,然后将解压后的文件拖拽到 fba 的根目录中,启动 Qemu 虚拟机,进入 Grub4Dos 环境(你要会用 FbinstTool)。 方法二:在纯 DOS 下运行解压后的 grub.exe,进入 Grub4Dos 环境(你要会用纯 DOS)。 方法三:将解压后的文件复制到 C 盘根目录,然后在 ntldr 的配置文件 boot.ini 中添加 C:\grldr="进入 GRUB4DOS",重启系统,选择 "进入 GRUB4DOS" 菜单项,进入 Grub4Dos 环境(你要有 ntldr 引导的分区,或者 WinXP 系统)。 方法四:将解压后的文件复制到 U 盘或硬盘任意分区的根目录中,然后用 BootICE 修改 U 盘或硬盘的主引导记录为 Grub4Dos,从 U 盘或硬盘启动,进入 Grub4Dos 环境(你要会用 BootICE)。 方法五:其它 ... ============================== 学习方法(一共83个命令): 在启动 Grub4Dos 的过程中不停的按 c 键,进入 Grub4Dos 的命令行模式,通过手动输入命令来学习 Grub4Dos。 学习过程中参考 Grub4Dos 0.4.5c 的帮助文档: http://bbs./forum.php?m ... &extra=page%3D1 Grub4Dos 命令要区分大小写,路径不区分大小写。 Tab 键可以实现命令或文件名补全 在终端中一条一条的输入下面的命令进行学习 ========================================================================================== 先学习这些命令(16个): ls、find、root、rootnoverify、map、cdrom、cat、cmp、dd、write、read、calc、checktime、echo、pager、clear ============================== ls 类似 Linux 中的 ls 命令,类似 Dos 下的 dir 命令,列出当前目录(工作目录)下的文件和目录 ls /boot 列出当前目录(工作目录)下名称以 boot 开头的文件和目录,不要用 ls boot,它只在根目录下有效。 ls /boot/ 列出当前目录下 boot 目录中的文件和目录,不要用 ls boot/,它只在根目录下有效。 ls (hd0,0)/ 列出 (hd0,0) 中的文件和目录,不要用 ls (hd0,0),它只在 (hd0,0) 为当前磁盘时有效。 ls dev 列出所有驱动器列表(驱动器不包括分区) ls /boot/ > nul && echo exist 判断目录 /boot/ 是否存在,如果存在,则输出 exist(这个方法对空目录无效) ls /boot > nul && echo exist ! echo not exist 判断当前目录(工作目录)中是否存在文件名以 boot 开头的文件或目录,如果存在,则输出 exist,否则输出 not exist ls (hd0,0)/boot/ > nul && echo exist ! echo not exist 判断目录 (hd0,0)/boot/ 是否存在,如果存在,则输出 exist,否则输出 not exist [注意:若文件夹下无任何文件,对 ls 命令而言,认为该文件夹不存在。] [注意:由于 (ud) 中不存在目录,所谓的目录只是带 / 的文件名所产生的假象,所以 ls (ud)/ 时,会列出 (ud) 中的所有文件,但是 ls (ud)/boot/ 却可以列出 /boot/ 下的所有文件,因为这些文件的文件名都是以 /boot/ 开头] ============================== debug on find 列出所有磁盘(磁盘包括分区)(debug off 静默模式下无法显示磁盘列表) debug on find +1 列出文件系统已知的所有磁盘(debug off 静默模式下无法显示磁盘列表) debug on find checkrange 0x07 parttype 列出分区类型为 0x07(NTFS)的所有分区(debug off 静默模式下无法显示磁盘列表) find /ntldr checkrange 0x07 parttype 在分区类型为 0x07(NTFS)的分区中查找 /ntldr 文件,并列出找到的分区。 find --set-root /ntldr 查找包含 /ntldr 文件的设备,把第一个找到的设备设为当前设备。 find --set-root --ignore-floppies --ignore-cd /ntldr 查找包含 /ntldr 文件的设备,把第一个找到的设备设为当前设备。忽略软盘和光盘。 find --set-root --devices=upnhcf /ntldr 查找包含 /ntldr 文件的设备,把第一个找到的设备设为当前设备。指定查找顺序:ud,pxe,网络设备,硬盘,光盘,软盘 find --set-root --devices=upnh /ntldr 查找包含 /ntldr 文件的设备,把第一个找到的设备设为当前设备。指定查找顺序,并忽略软盘和光盘。 find --set-root ls /grub/ 查找包含 /grub/ 目录的设备,把第一个找到的设备设为当前设备。/grub/ 目录不能为空,否则会忽略该目录。 debug on find --set-root makeactive --status 查找活动主分区,把第一个找到的设备设为当前设备。(debug off 静默模式下无法显示磁盘列表) find --set-root=/boot/grub /boot/grub/menu.lst 查找包含 /boot/grub/menu.lst 的设备,把第一个找到的设备设为当前设备,并将工作目录设置为 /boot/grub [注意:查找的时候会优先查找当前设备(如果在列表中的话),不再查找 (hdx) 设备,仍会查找 (hdx,y) 设备] [题外话:如果 find 支持 find /FILE 和 find /DIR/ 就好了,这样可以实现更精确的查找。] ============================== root 显示当前设备名称及其相关信息。 root (hd0,0) 将 (hd0,0) 作为当前磁盘,工作目录为 /,效果和 root (hd0,0)/ 一样。 root (hd-1,0) 将 (hd-1,0) 作为当前磁盘,工作目录为 /,效果和 root (hd-1,0)/ 一样 root (hd0,0)/boot 将 (hd0,0) 作为当前磁盘,工作目录为 /BOOT,效果和 root (hd0,0)/boot/ 一样。 root ()/boot 修改工作目录为当前磁盘下的 /BOOT 目录,效果和 root ()/boot/ 一样。 root (hd0,0) > nul && echo ok ! echo fail root (hd0,0) > nul || echo fail ! echo ok 将 (hd0,0) 设置为当前设备,如果成功,则输出 ok,如果不成功,则输出 fail。(上面两条命令效果相同) ============================== rootnoverify (hd0,0) 相当于 root (hd0,0),但不测试安装该分区。这用于有些系统装在 GRUB 能访问的磁盘区之外, 但仍需要设置正确的根分区的情况。有些需要安装分区才能确定的参数可能会有问题。 下面的命令可以正确执行,但是换成 root 就不行了: rootnoverify (hd0) chainloader +1 boot [题外话:这个命令如果改成 root --nv (hd0) 或许更简单一些,输入字符也少一些] ============================== 设备类型: (fd0) 第一个软盘 (fd1) 第二个软盘 (hd0) 第一个硬盘 (hd1) 第二个硬盘 (hd-1) 最后一个硬盘 (hd) 最后一个硬盘之后的硬盘号码,创建新的虚拟硬盘时使用 (cd0) 第一个光驱,相当于 (hd32),由 cdrom --init 创建 (cd1) 第二个光驱,相当于 (hd33),由 cdrom --init 创建 由于 cdrom 的识别能力太低,同时市场上的光驱设备几乎全被U盘代替,所以 (cd?) 这种格式可能面临淘汰。 (hd0,0) 第一块硬盘的第一主分区 (hd0,4) 第一块硬盘的第一扩展分区 (hd-1,0) 最后一块硬盘的第一主分区,没有 (hd-2,0) 这种格式,也没有 (hd-1,-1) 这种格式。 (hd#,0) 第一主分区(在硬盘#上) (hd#,1) 第二主分区(在硬盘#上) (hd#,2) 第三主分区(在硬盘#上) (hd#,3) 第四主分区(在硬盘#上) (hd#,4) 第一逻辑分区(在硬盘#上) (hd#,5) 第二逻辑分区(在硬盘#上) (hd#,6) 第三逻辑分区(在硬盘#上) (hd#,7) 第四逻辑分区(在硬盘#上) (hd32) 第一个光驱 (hd33) 第二个光驱 (0xFF) 最后一个光驱(hd127) () 当前磁盘 (bd) 初始启动设备(设备包括磁盘和驱动器) (cd) 从光盘启动后,Grub4Dos 捕获到的启动光盘,如果不是从光盘启动,则没有 (cd) 设备 (ud) Fbinst 启动方式制作的隐藏分区 (pd) PXE 网络启动设备 (nd) 网络驱动器,现已不常用(nd 已经不存在了,已经被pd代替) (md) 内存驱动器,实现了将整个内存作为一个磁盘驱动器来访问 (rd) 随机存贮驱动器。(md) 设备访问内存是从物理地址 0 开始,而 (rd) 可以访问起始于任何基地址的内存 以数字命名的设备: fd0 - fd126 : 0x0 - 0x7E (软盘和虚拟软盘,排除 0x21 和 0x23) pxe : 0x21 (网络启动设备) ud : 0x23 (Fbinst 隐藏分区) rd : 0x7F (随机存贮驱动器) hd0 - hd30 : 0x80 - 0x9E (硬盘和虚拟硬盘) cd : 0x9F (捕获到的启动光盘,这个不一定正确,视 bios 而定) hd32 - hd127 : 0xA0 - 0xFF (光盘和虚拟光盘) 设备后面跟随 +1 表示将设备的第 1 个扇区当作一个单一的文件看待: (hd0)+1 将整个硬盘的第一个扇区当作一个文件(共 1 个扇区) (hd0,0)+1 将整个分区的第一个扇区当作一个文件(共 1 个扇区) (fd0)+1 将整个软盘的第一个扇区当作一个文件(共 1 个扇区) (cd0)+1 将整个光盘的第一个扇区当作一个文件(共 1 个扇区) (md)+1 将整个内存的第一个扇区当作一个文件(共 1 个扇区) (rd)+1 这个比较特殊,将指定内存的所有内容当作一个文件 [注意:(rd)+1 这个标志始终代表文件,它包含存储在 (rd) 中的所有字节。 ] 同样可以使用 +2、+3 等,表示将前 2 个或前 3 个扇区当作单一的文件看待: (hd0)+2 将整个硬盘的前 2 个扇区当作一个文件(共 2 个扇区) (hd0,0)+3 将整个分区的前 3 个扇区当作一个文件(共 3 个扇区) (fd0)+5 将整个软盘的前 5 个扇区当作一个文件(共 5 个扇区) (cd0)+10 将整个光盘的前 10 个扇区当作一个文件(共 10 个扇区) (md)+32 将整个内存的前 32 个扇区当作一个文件(共 32 个扇区) (rd)+2 将指定内存的前 2 个扇区当作一个文件(共 2 个扇区) 也可以使用类似 32+5 的方法: (hd0)512+2 将整个硬盘的第 512 个扇区之后的 2 个扇区当作一个文件(共 2 个扇区) (hd0,0)32+3 将整个分区的第 32 个扇区之后的 3 个扇区当作一个文件(共 3 个扇区) (fd0)1+1 将整个软盘的第 2 个扇区当作一个文件(共 1 个扇区) (cd0)128+1 将整个光盘的第 129 个扇区当作一个文件(共 1 个扇区) (md)0+32 将整个内存的前 32 个扇区当作一个文件(共 32 个扇区) (rd)0+1 等效于 (rd)+1,将指定内存的所有内容当作一个文件 关于 (rd) 设备: (rd) 设备只是对内存区域的引用,(rd) 设备所引用的内存区域是不被保护的,你可以将 (rd) 理解为指向内存块的指针。在 Grub4Dos 中,很多东西都是自由的、无保护的、没有限制的,(rd) 就是其中之一。 (rd) 不是一个 int13 设备,而仅仅是一个 grub4dos 设备。在 grub4dos 里面,存在 (rd) 设备,但进入 DOS 以后,就没有 (rd) 设备了。 (rd)+1 始终表示 (rd) 设备的整个内容,而不是第一个扇区。 通过下面的地址可以获取 (rd) 设备的信息: set /a rdnum=*0x82CC # (rd) 设备的设备号 set /a rdbase=*0x82D0 # (rd) 设备的起始地址 set /a rdsize=*0x82D8 # (rd) 设备的总长度 通过下面的方法可以自由设置 (rd) 设备的信息: map --ram-drive=0xFF7F # 修改 (rd) 设备的设备号 map --mem --rd-base=50000 # 设置 (rd) 设备的起始地址 map --mem --rd-size=30000 # 设置 (rd) 设备的总长度 下面的命令仅仅修改了 (rd) 设备的信息: map --mem /FILE (rd) 这里的 (rd) 指向了一块内存区域,这块内存区域中存放了 /FILE 文件的内容,但是这块内存是不被保护的,这块内存随时都可能被其他代码修改,甚至被 Grub4Dos 自身修改。 下面的命令也修改了 (rd) 设备的信息,但是 (rd) 指向的内存区域是受保护的,因为它和 (fd0) 重叠,而 (fd0) 是受保护的: map --mem /FILE (rd) map --mem /FILE (fd0) map --hook 如果第一条命令和第二条命令交换一下顺序,那么结果就不一样了。 什么情况下需要使用 (rd) 设备?当你需要它的时候就去用它,如果你实在不知道什么时候需要用到 (rd),那么很简单,不要用它。 ============================== map --status 显示磁盘仿真的状态。 map /PE.ISO (0xFF) map --hook 将 /PE.ISO 映射到 (hd127) 仿真磁盘,/PE.ISO 必须在磁盘中连续存放,不能有碎片。 map --mem /PE.ISO (0xFF) map --hook 先将 /PE.ISO 加载到内存,然后再映射到 (hd127) 仿真磁盘,/PE.ISO 可以有碎片。 map --mem=-2880 /FLOPPY.IMG (fd0) map --hook 先将 /FLOPPY.IMG 加载到内存,然后再映射到 (fd0) 仿真软盘,(fd0) 将占用至少 1440KB 的内存。 map --mem --top /PE.ISO (0xFF) map --hook 将 /PE.ISO 加载到高端内存,然后再映射到 (hd127) 仿真磁盘,把镜像加载到高位内存就不能使用 gzip 压缩,两者不能同时实现。 在 grub4dos 中,内存在 3.25G 处被分成了高端内存和低端内存两端,镜像不能跨 3.25G 这个点。如果你的内存小于 3.25G,你就没有高端内存可用。 map --unmap=0xFF map --rehook 卸载 (hd127) 仿真磁盘。不能使用 --unmap=(0xFF) 的方法卸载,--unmap= 后面必须是数字。 --rehook 用于停止仿真盘并释放内存,相当于 --unhook 然后 --hook(这样看来,map --unhook 命令似乎不会被单独使用了) map --unmap=0,0x80,0xFF map --rehook 卸载多个仿真磁盘。 map --unmap=0:0xFF map --rehook 卸载所有仿真磁盘。 如果要通过设备名的方法卸载某个设备,可以这样做: map (hd127) (hd127) map --rehook map --read-only /FLOPPY.IMG (fd0) map --hook (fd0) 只能读,不能写,防止 /FLOPPY.IMG 文件被破坏。 映射到仿真盘中的文件都是可以修改的,无论是 IMG、ISO、VHD 等,除非使用 --read-only 参数。 map --fake-write /FLOPPY.IMG (fd0) map --hook (fd0) 处于假写状态,可以写入数据,但并未记录到 (fd0) 上,防止 /FLOPPY.IMG 文件被破坏。 map --unsafe-boot /FLOPPY.IMG (fd0) map --hook 这个参数不知道是什么作用,大概是允许修改 (fd0) 的引导扇区。 map ---disable-chs-mode /FLOPPY.IMG (fd0) map --hook 禁用 (fd0) 的 CHS 访问功能。 map --disable-lba-mode /FLOPPY.IMG (fd0) map --hook 禁用 (fd0) 的 LBA 访问功能。 map 命令还可以用来修改 (rd) 随机存储器的信息,上面已经说过了。 [注:其他 map 参数似乎不怎么常用,也不太理解其含义,这里就不总结了] [注意:在map命令行中,(hdm,n)+1 式的写法被解释成代表整个(hdm,n)分区,而不仅仅是此分区的第一扇区。] [注意:--unhook 的仿真盘,如果没有 --unmap,则在需要的时候会自动 --hook。] ============================== 关于 map 命令的磁盘交换: # 打算把当前设备映射为(hd0) map () (hd0) # 打算把(hd0)映射为当前设备 map (hd0) () #开始执行映射 map --rehook ============================== cdrom --init map --hook 挂载 ATAPI 接口的光驱(map --hook 后才能访问) cdrom --stop map --rehook 卸载 ATAPI 接口的光驱 ============================== cat /menu.lst 显示 /menu.lst 的内容 cat --hex /grldr 以十六进制显示 /grldr 的内容 cat --skip=1024 /menu.lst 显示 /menu.lst 的内容,跳过前面 1KB 的内容 cat --length=10 /menu.lst 显示 /menu.lst 的内容,只显示前面 10 个字节的内容 cat --locate="\x20 " /menu.lst 在 /menu.lst 中查找连续的两个空格(转义字符 + 非转义字符)(区分大小写) cat --locate=abc /menu.lst 在 /menu.lst 中查找 abc 字符串(非转义字符)(区分大小写) cat --locatei=abc /menu.lst 在 /menu.lst 中查找 abc 字符串(不区分大小写) cat --locate=abc --number=3 /menu.lst 在 /menu.lst 中查找 abc 字符串,只显示前 3 个找到的结果 cat --locate=abc --replace=def /menu.lst 在 /menu.lst 中查找 abc 字符串,并替换为 def cat --locate=abc --replace=def --number=3 /menu.lst 在 /menu.lst 中查找 abc 字符串,并替换为 def,只替换前 3 个找到的结果 cat --locate=abc --replace=def --locate-align=16 /menu.lst 在 /menu.lst 中查找 abc 字符串,并替换为 def,只替换位置与 16 对齐的结果 通过下面的命令来查看 --locate-align=16 的效果: echo -n > /menu.lst cat --locate=\x0 --replace=1 /menu.lst cat /menu.lst cat --locate=1 --replace=0 --locate-align=16 /menu.lst cat /menu.lst cat --length=0 ()-1 固定用法,获取当前分区地址偏移 cat --length=0 ()/menu.lst 获取 /menu.lst 的文件大小 cat --length=0 ()/menu.lst > nul && echo exist ! echo not exist 判断文件 /menu.lst 是否存在,如果存在,则输出 exist,否则输出 not exist 转义字符总结: \??? 1到3位八进制代码表示的字符(\377)八进制最大取值 \377,超出 377 的代码将与 377 取模后再进行转换,比如 \400 表示 \0 \x?? 1到2位十六进制代码表示的字符(\xFF)最大取值 \xFF \空格 空格字符 \\ \ 字符(反斜线) \" " 字符(双引号) \' ' 字符(单引号) \a 警报 (声音) \b 退格符 \f 换页符 \n 换行符 \r 回车符 \t 水平制表符 \v 垂直制表符 [注意:执行 cat --locate= 或 cat --locatei= 后,可以用 %?% 获取最后一个查找结果,只有在 cat 命令行执行完毕后,才能获取正确的 %?%] 例如: cat --locate=a /File && set /a Last=%?% > nul ! set Last=-1 由于 %?% 和 cat 命令在同一条语句中,所以得不到正确的 %?% 结果。只有在 cat 命令行执行完毕后,再执行 set Last=%?% 才能获取正确的 %?% 结果。 有一个技巧,可以用 &; 操作符实现变量的刷新: set Last=-1 && cat --locate=a /File &; set /a Last=%?% > nul ============================== cmp /menu.lst /m.lst 比较两个文件是否相同。 cmp --hex /menu.lst /m.lst 比较两个文件是否相同,并以十六进制格式显示对比结果。 cmp /menu.lst /m.lst > nul && echo same ! different 比较两个文件是否相同,如果相同,则输出 same,否则输出 different。 ============================== dd if=()/menu.lst of=()/m.lst 将 /menu.lst 的内容复制到 /m.lst 中 dd if=()/menu.lst of=()/m.lst bs=32 count=5 以 32 为块大小(默认 512),从 /menu.lst 中复制 5 块数据到 /m.lst 中。e dd if=()/menu.lst of=()/m.lst bs=10 skip=5 seek=6 以 10 为块大小,从 /menu.lst 中复制数据到 /m.lst 中。复制时,跳过 /menu.lst 的前 5 个块,从第 6 个块开始读取,写入时,跳过 /m.lst 的前 7 个块,从第 8 个块开始写入。 dd if=()/menu.lst of=()/m.lst buf=0x2000000 buflen=0x2000000 将 /menu.lst 的内容复制到 /m.lst 中,复制时,从内存的 0x2000000 位置(32M的位置)取 0x2000000 空间(32M的空间)作为缓存,对于复制大文件来说,增加缓存的大小能够加快 dd 的读写速度。 [注意:源文件和目标文件都必须存在,路径必须以设备名开头,超出文件长度的部分会被丢弃,目标文件不能是 gz 压缩文件,源文件可以是 gz 压缩文件,压缩文件在复制前会被解压。dd 可以对整个设备进行读写操作:dd if=(fd0) of=(fd1),慎用。] [注意:使用 dd 命令时,不建议设置缓存,因为设置的缓存区域可能被其它程序混用,从而导致不可预知的后果] ============================== write /menu.lst abc 在 /menu.lst 文件的开头写入 3 个字符 abc,覆盖原来的字符。 write /menu.lst "abc" 在 /menu.lst 文件的开头写入 5 个字符 "abc",覆盖原来的字符。 write /menu.lst \"abc\" 在 /menu.lst 文件的开头写入 5 个字符 "abc",覆盖原来的字符。 [注意:被写入的字符串,除了开头的空格,其他空格或单引号或双引号都不需要转义,转义也可以被处理,反斜线必须被转义] [注意:被写入的目标文件必须存在,超出文件长度的部分会被丢弃,目标文件不能是 gz 压缩文件,源文件可以是 gz 压缩文件,压缩文件在复制前会被解压。write 命令可以对设备进行操作:write (fd0) abc,慎用。] write 0x8274 0x2001 [建议:使用和 calc 相同的语法 write *0x8274 0x2001 和 write *0x8274 *0x8280] 如果写入的对象不是文件或设备,而是一个数字,则该数字表示内存地址,write 将该地址处的内存数据修改为指定值,被写入的数据必须为整数,不能是字符串。用下面的内存地址进行练习: write 0x50000 -1 redad 0x50000 write 0x50000 0 redad 0x50000 ============================== read 0x8280 [建议:使用和 calc 相同的语法 read *0x8280] 从内存的指定位置读取一个 32-bit 的值,并以十六进制形式显示出来。 ============================== 现在 grub4dos 本身对常规内存的占用情况如下: 00000~0FFFF 被 grub4dos 的程序代码和堆栈占用。 10000~1FFFF 为 grub4dos 将来的代码和数据保留。 20000~2FFFF 被 grub4dos 内核中的自动几何参数探测占用,作为缓冲区。 30000~37FFF 被 grub4dos 内核中的常规磁盘读写缓冲区占用。 38000~4FFFF 保留给 grub4dos 将来的扩展。 50000~7FFFF 保留给用户使用 100000~110000 被 dd 命令的磁盘缓冲区占用。 [注意:以上关于内存分配的内容不一定准确,希望开发人员指正] ============================== calc 1+1 计算 1+1 的结果,可执行的操作:+(加)、-(减)、*(乘)、/(除)、%(余)、<<(左移)、>>(右移)、&(与)、|(或)、^(异或) calc 0xFF 显示 0xFF 的十进制和十六进制结果 calc *0x8280 显示内存 0x8280 处存储的整数值 calc *50000=1 将内存 0x50000 处存储的整数值修改为 1 calc *50000=*0x8280 将内存 0x50000 处存储的整数值修改为 0x8280 处存储的整数值 calc *50000=1<<4 将内存 0x50000 处存储的整数值修改为计算后的结果(1<<4=16) [注意:在 set /a var=value 中,value 也可以用上面的方法进行计算:set /a b=*0x8280] calc 和 set /a 可以将负数当做被减数处理,不过要在减号之后添加一个空格,例如下面的代码: set a=-32 set /a b=0-%a% 上面的 set 命令无法计算 0--32 的值,用下面的写法就可以计算了(在减号之后添加一个空格): set a=-32 set /a b=0- %a% 上面的 set 命令可以计算 0- -32 的值,结果为 32。 ============================== checktime 显示当前日期时间星期 checktime * 0-12 * * * && echo 上午 ! echo 下午 根据不同的时间显示不同的信息。(checktime 分 时 日 月 星期) checktime * * * * 6,0 && echo 周末 ! echo 非周末 根据不同的时间显示不同的信息。(checktime 分 时 日 月 星期) checktime * * * * */2 && echo 双周 ! echo 单周 根据不同的时间显示不同的信息。(checktime 分 时 日 月 星期) checktime 0,1-59/15 * * * * && echo 整刻钟 ! echo 非整刻钟 根据不同的时间显示不同的信息。(checktime 分 时 日 月 星期) ============================== echo \\Hello 在屏幕上输出 \\Hello(行尾会自动添加换行符) echo -n \\Hello 在屏幕上输出 \\Hello(行尾不会自动添加换行符) echo -e \\Hello 在屏幕上输出 \Hello(-e 表示处理转义字符) echo -h 显示 echo 支持的颜色表 echo $[0x1F] abc 使用颜色表 1F 处的前景色和背景色显示 abc echo $[0x1F] abc $[0xE4] def 使用颜色表 1F 处的前景色和背景色显示 abc,然后使用颜色表 E4 处的前景色和背景色显示 def echo -P:0101 abc 在屏幕的第一行第一列显示 abc echo -n > /menu.lst 清空 /menu.lst 文件的内容 ============================== pager on 打开满屏分页显示模式 [Hit Q to quit, any other key to continue] pager off 关闭满屏分页显示模式 pager 切换满屏分页显示模式 pager status 输出当前满屏分页显示模式 ============================== clear 清屏(清除屏幕上显示的内容) ========================================================================================== 接下来学习这些命令(9个): graphicsmode、vbeprobe、testvbe、setvbe、terminal、terminfo、font、background、foreground ============================== graphicsmode 显示当前使用的图形模式 graphicsmode 0x12 使用 vga 模式(640×480),推荐使用 vbe 模式 graphicsmode 0x6A 使用 vga 模式(800x600,对一些机子支持不是很好,有可能会死机),推荐使用 vbe 模式 graphicsmode -1 640 使用 vbe 模式,指定分辨率宽度为 640,若显示器不支持此宽度的分辨率,将执行失败 graphicsmode -1 800 600 使用 vbe 模式,指定分辨率宽度为 800,高度为 600,若显示器不支持此分辨率,将执行失败 graphicsmode -1 1024 768 32 使用 vbe 模式,指定分辨率宽度为 1024,高度为 768,使用 32 位色,若显示器不支持此分辨率或位色,将执行失败 graphicsmode -1 100:1000 100:1000 使用 vbe 模式,分辨率宽度从 100 到 1000 这个范围内选取可用的最大值,高度从 100 到 1000 这个范围内选取可用的最大值 即,上面的命令可选 320×200,320×400,640×400,640×480,800×600 等分辨率,从中选取可用的最高分辨率 graphicsmode -1 100:1000 100:1000 24:32 效果同上,但是增加了颜色深度的范围,同样,在 24 位色和 32 位色中选取可用的最高颜色深度 [注意:grub4dos 的 vbe 不支持 16 位及更低的色深,只支持 24 位和 32 位色深。所以,你的所有的 graphicsmode 命令,都需要显式地指定 24:32 的色深,不可以省略。比如,使用 graphicsmode -1 和 graphicsmode -1 800 600 都是不完全正确的,应该分别改成 graphicsmode -1 -1 -1 24:32 和 graphicsmode -1 800 600 24:32 才算是对的。] ============================== vbeprobe 侦测 vbe 信息 vbeprobe 1024x768x32 侦测指定的 vbe 信息 vbeprobe 0x100 侦测指定的 vbe 信息 ============================== testvbe 800x600 测试指定的 vbe 模式,直接调用有时候会花屏 ============================== setvbe 800x600x32 在系统核心运行前用来改变视频模式,视频模式信息会传递给核心。直接调用大部分情况下会花屏 [注意:setvbe 命令主要是为了某些 Linux 启动过程的图形界面而设计的,一般是用不着的。建议永远不要使用它。如果你能避免使用它,就尽量避免使用它。通常 Linux 在自己的启动过程中,会自行设置相应的图形模式,而不是需要经过 grub4dos 的设置才行。所以,将来有可能取缔这条 setvbe 命令。] ============================== terminal console 选择文本模式的终端 terminal graphics 选择图形模式的终端 terminal --no-echo graphics 选择图形模式的终端,并且不显示用户输入的字符 terminal --font-spacing=1:2 在 vbe 模式下,设置字距为 1,行距为2,单位:像数点。 [注:更多关于 terminal 的用法不知道怎么用,似乎也用不上。] ============================== terminfo 显示当前终端的配置信息 [注:更多关于 terminfo 的用法不知道怎么用,似乎也用不上。] ============================== font /unifont.hex.gz 加载字库文件,用于在 vbe 模式下显示汉字 字库下载地址: https://code.google.com/p/grub4d ... name=unifont.hex.gz http://bbs./forum.php?mod=viewthread&tid=256198 ============================== background 303030 在 vga 模式下设置背景色,其它模式下不起作用 ============================== foreground FFFF00 在 vga 模式下设置前景色,其它模式下不起作用 ========================================================================================== 接下来学习这些命令(11个): halt、reboot、hide、unhide、hiddenflag、makeactive、partnew、parttype、blocklist、uuid、fstest ============================== halt 关机(halt 还有很多参数,当你关机出问题的时候再去研究它的参数吧) ============================== reboot 重启(没有参数) ============================== hide (hd0,0) 隐藏第一硬盘第一主分区 ============================== unhide (hd0,0) 取消隐藏第一硬盘第一主分区 ============================== hiddenflag 显示当前根设备的显/隐状态(对 ud、cd 等不起作用) hiddenflag (hd0,0) 显示第一硬盘第一主分区的显/隐状态 hiddenflag --set 将当前跟设备设置为隐藏 hiddenflag --set (hd0,0) 将第一硬盘第一主分区设置为隐藏(即若原分区类型为 0x07,现在分区类型为 0x17) hiddenflag --clear 将当前跟设备设置为显现 hiddenflag --clear (hd0,0) 将第一硬盘第一主分区设置为显现(即若原分区类型为 0x17,现在分区类型为 0x07) ============================== makeactive 将当前设备设置为活动 makeactive (hd0,0) 将第一硬盘第一主分区设置为活动 makeactive --status 显示当前设备是否为活动状态 makeactive --status (hd0,0) 显示第一硬盘第一主分区是否为活动状态 ============================== partnew [--active] 分区号 类型 起始扇区 [长度] 这个不多研究,要修改分区,还是用专用软件吧。 Grub4Dos 0.4.5c 的帮助文档中有一些例子,感兴趣的可以研究一下。 ============================== parttype 显示当前分区的分区类型 parttype (hd0,0) 显示第一硬盘第一分区的分区类型 parttype (hd0,0) 0x17 将第一硬盘第一分区的分区类型改为 0x17 ============================== blocklist /grldr 显示文件的块信息,即文件所在区域的起始块和块长度。 blocklist 命令不能用于 pxe 设备上的文件。 [注意:如果文件有碎片,blocklist 会列出文件的所有块,包括碎片,如果碎片太多,超出了 Grub4Dos 的缓冲区,则该命令会失败] ============================== uuid 列处所有设备的 uuid 号 uuid (hd0,0) 显示指定设备的 uuid 号 uuid 000E0336000C1B8D 查找 uuid 号为 000E0336000C1B8D 的设备,并将其设置为当前设备 uuid (hd0,0) 000E0336000C1B8D && echo yes ! echo no 如果 (hd0,0) 的 uuid 号为 000E0336000C1B8D 则输出 yes,否则输出 no ============================== fstest 为了帮助开发者开发文件系统支持代码而设置的命令,终端用户不需要它。 ========================================================================================== 接下来学习这些命令(8个): kernel、initrd、module、modulenounzip、chainloader、boot、pxe、quit ============================== kernel [--no-mem-option] [--type=TYPE] FILE [ARG ...] 尝试载入主引导映像文件。其它项将被作为内核的命令行参数而传递给内核。 使用此命令以前,内核所用到的模块应该被重新载入。 参数 --type 用于说明内核的类型,包括 "netbsd", "freebsd", "openbsd", "linux", "biglinux" 和 "multiboot"。 参数 --no-mem-option 用于说明不必自动传递 Linux 的内存参数。 ============================== initrd FILE [FILE...] 加载 Linux 格式的初始化虚拟盘, 并设置必要的参数。 指定在系统启动访问真正的根文件系统前,访问的 ramdisk 映象。 下面通过 kernel 和 initrd 命令启动 Ubuntu 13.10 LiveCD: # 菜单标题 title 启动 Ubuntu 13.10 amd64 LiveCD # 查找 UBUNTU-13.10-X64.ISO 所在磁盘并将其设置为当前磁盘 find --set-root /BOOT/UBUNTU/UBUNTU-13.10-X64.ISO # 尝试载入主引导映像文件 vmlinuz.efi,后面是传递给 vmlinuz.efi 的参数。 kernel /BOOT/UBUNTU/vmlinuz.efi boot=casper iso-scan/filename=/BOOT/UBUNTU/UBUNTU-13.10-X64.ISO locale=zh_CN.UTF-8 # 加载 Linux 格式的初始化虚拟盘 initrd.lz。 initrd /BOOT/UBUNTU/initrd.lz ============================== module FILE [ARG ...] 对多重启动映像, 加载启动模块文件(不处理该文件的内容, 用户必须自己确定核心的要求)。 剩余参数作为“模快命令行”传递,象 kernel 命令一样。 这个命令一般用不上,当你要启动 Linux 系统的时候,而且系统要求加载模块文件的时候,才会用到,相关 Linux 系统中会有说明,一般用户可以忽略这个命令。 ============================== modulenounzip FILE [ARG ...] 与 module 类似,但是禁用了自动解压缩。 功能同上,一般用户可以忽略这个命令。 ============================== chainloader /ntldr 加载 ntldr 启动文件 chainloader (hd0,0)+1 加载 (hd0,0) 的第一扇区 chainloader +1 加载当前设备的第一扇区 chainloader --force (hd0,0)+1 加载 (hd0,0) 的第一扇区,忽略该扇区启动标识的有效性,强制启动 [注:chainloader 还有许多其它参数,可以在启动之前修改 CPU 的寄存器,不过对于普通用户来说,这些东西不会用到,如果想知道 chainloader 的更多参数,可以参考《Grub4Dos 0.4.5c 的帮助文档》] ============================== boot 引导已加载的操作系统或扇区链式加载器,确定进行启动,通常和 chainloader 命令搭配使用,在菜单文件中可以省略,命令行模式下需要。 chainloader /ntldr boot 加载 ntldr 启动文件,然后启动。 boot -1 调用 BIOS 的 int18 功能,根据 BIOS 设置的启动顺序,启动下一设备。 boot --int18 功能同上,调用 BIOS 的 int18 功能,根据 BIOS 设置的启动顺序,启动下一设备。 ============================== pxe 这个命令比较复杂,以后再研究,先把本地启动搞懂。 ============================== quit 如果是从 DOS 环境进入 GRUB 环境中,使用本命令可以退回到 DOS 环境中。 quit --disable-a20 使用 --disable-a20 参数,将会在把控制权移交给 DOS 时关闭 A20 总线。 ========================================================================================== 接下来学习这些命令(15个): configfile、default、savedefault、timeout、title、iftitle、hiddenmenu、password、lock、md5crypt、commandline、gfxmenu、splashimage、color、outline ============================== 用在命令行或菜单文件中: configfile /menu.lst 加载当前设备根目录下的菜单文件 /menu.lst。 configfile (hd0,0)/menu.lst 加载 (hd0,0)/menu.lst。 configfile (md)4+8 特殊用法,回到 grldr 内置菜单。 新版返回内置菜单的命令: write 0x307ff8 1 && configfile [注意:configfile 命令执行后,当前设备和当前目录将同时更新为 FILE 文件所在的设备。如果在内置菜单的初始化命令组中出现不带任何参数的 configfile 命令,那么控制将转到启动设备上的 menu.lst 文件。] ============================== 用在所有菜单项之前: default 0 默认选择第一个菜单项(如果用户不手动选择的话) default saved 默认选择上次 savedefault 保存的菜单项(savedefault 在菜单项中执行,默认保存到 /default 文件中) default /FILE 默认选择上次 savedefault 保存的菜单项(savedefault 在菜单项中执行,默认保存到 /FILE 文件中) [注意:/default 文件或 /FILE 文件必须为 2048 字节,手动修改后也要保证文件长度为 2048 字节] ============================== 用在菜单项中: savedefault 将当前菜单项作为默认菜单保存到 /default 中或 default 命令指定的 /FILE 中。 savedefault --wait=5 将当前菜单项作为默认菜单保存到 /default 中或 default 命令指定的 /FILE 中,保存前给用户一个 5 秒的提示: About to write the entry number x to file Press Y to allow or N to deny. 如果用户在 5 秒内没有按 Y 键,则默认不保存菜单项。 ============================== 用在所有菜单项之前: timeout 10 在出现菜单列表后,10 秒钟之内,如果用户没有手动进行选择,则执行默认菜单项。 ============================== title 菜单标题 指定菜单项的标题文本 title 菜单标题\n菜单提示第一行\n菜单提示第二行\n... 指定菜单项的标题文本和提示文本 [注意:如果菜单项中没有启动敏感命令,则该菜单不能用上下方向键选择,只能用左右方向键选择。] 启动敏感命令: boot、chainloader、configfile、command、commandline、halt、kernel、pxe、quit、reboot 在菜单列表界面可以执行如下操作: e :编辑当前的启动菜单项 b :启动当前的菜单项 c :进入 grub 的命令行方式 在编辑菜单项时可以执行如下操作: e :编辑当前行 d :删除当前行 o :在当前行下面插入新行 O :在当前行上面插入新行 b :启动当前菜单 c :进入 grub 的命令行方式 esc:返回 grub 菜单列表,取消对当前菜单项所做的任何修改 [注意:对菜单的修改只是临时的,只对本次启动有效] 在命令行下可以执行如下操作: esc:返回 grub 菜单列表 在菜单列表中可以按数字键来选择菜单,如果要选择 9 以上的菜单项,可以按两次数字键,比如要选择第 25 菜单项,可以先按下 2 再按下 5(菜单序号从 0 开始,即第一个菜单的序号为 0)。 ============================== iftitle [if exist (hd0,0)/bootmgr] 启动 (hd0,0) 中的 NT6.x 如果 [] 中的条件成立,则显示该菜单,否则不显示该菜单 ============================== 用在所有菜单项之前: hiddenmenu 3 不显示菜单列表,使用菜单项 3 启动,在 timeout 时间内按任意键可以显示菜单列表。 hiddenmenu --chkpass=0x5700 不显示菜单列表,使用菜单项 default 启动,在 timeout 时间内按 F11 键可以显示菜单列表。 [注意:按键代码如果不清楚可以使用 pause --test-key 命令来获取功能] ============================== 用在菜单项中,或用在所有菜单项之前: password 密码 对菜单进行加锁,看下面的示例: title 菜单标题 password 123 commandline 要执行该菜单需要输入密码 123 title 菜单标题 password --md5 $1$JS/2$CKT61E11gzkdEKQnEpqjhS1 commandline 要执行该菜单需要输入密码 123(密码 123 是经过 md5 加密的) timeout 10 default 0 password 123 title 菜单1 commandline title 菜单2 commandline 对整个菜单列表进行加锁,被加锁后的菜单列表不能按 e 键进行编辑,不能按 c 键进入命令行,解锁后才能使用这些功能,在菜单列表界面下按下 p 键可以输入解锁密码。 [注意:要想获取字符串的 md5 编码,可以执行 md5crypt 123] ============================== 用在菜单项中: lock 锁定当前菜单,需要解锁后才能进入。看下面的示例: timeout 10 default 0 password 123 title 菜单1 lock commandline title 菜单2 commandline 解锁前,“菜单1”不能执行,“菜单2”可以执行,解锁后,“菜单1”和“菜单2”都可以执行 ============================== 用在命令行中: md5crypt abc 获取字符串 abc 的 md5 编码。 ============================== 用在菜单项中: commandline 进入 Grub4Dos 的命令行。 ============================== 用在所有菜单项之前: gfxmenu /message 使用 /message 中的图形菜单 由于 gfxmenu 与 Grub4Dos 兼容性不好,所以不建议使用 ============================== 用在所有菜单项之前: splashimage /FILE vbe 图形模式下载入背景图片文件。在 vbe 模式下,可使用 24位色或32位色 BMP 格式或 XPM 格式的图片作为背景。 ============================== 用在所有菜单项之前: color normal=0xFFFFFF highlight=0xFF0000 设置未选中菜单为白色,选中菜单为红色 color heading=0x0000FF helptext=0x00FF00 设置菜单顶部信息的颜色为蓝色,菜单帮助信息的颜色为绿色 color standard=0xFFFFFF 设置控制台的文本颜色为白色 color border=0xFF00FF 设置菜单边框颜色为品红色(VBE模式下有效) color normal=0xFFFFFF highlight=0xFF0000 heading=0x0000FF helptext=0x00FF00 standard=0xFFFFFF border=0xFFFF00 同时设置上面所有颜色 color 0xFFFFFF 0xFF0000 0x0000FF 0x00FF00 0xFFFFFF 0xFFFF00 同时设置上面所有颜色(如果按顺序设置,可以省略状态标记) color 0xFFFFFF 0xFF0000 设置未选中菜单为白色,选中菜单为红色(如果按顺序设置,可以省略状态标记) [注:0xFFFFFF 表示红绿蓝三种颜色的值:0xRRGGBB] ============================== 用在所有菜单项之前: outline on 打开图形模式下的字符轮廓显示模式。 outline off 关闭图形模式下的字符轮廓显示模式。 outline 切换图形模式下的字符轮廓显示模式。 outline status 显示当前图形模式下的字符轮廓显示模式。 [注:当由于背景的原因字迹显示不清时可以尝试开启,会获得比较好的显示效果] ========================================================================================== 接下来学习这些命令(16个): call、exit、shift、goto、set、setlocal、endlocal、if、checkrange、errorcheck、errnum、fallback、pause、command、insmod、delmod ============================== call :标签1 参数1 参数2 ... 转到到“标签1”执行行并在 :eof 处返回,通过 goto :eof 或 exit 可以跳转到 :eof 处。 !BAT #注:文件头 !BAT 是必须的,用于识别这是一个 Grub4Dos 批处理脚本 # 将此文件保存为 test,然后在 Grub4Dos 的命令行中输入 test 执行它 call :label1 参数1 参数2 参数3 参数4 参数5 参数6 && echo ok ! echo fail call :label2 参数1 参数2 参数3 参数4 参数5 参数6 && echo ok ! echo fail echo 脚本结束 exit :label1 echo %1 %2 %3 %4 %5 %6 %7 %8 %9 exit 0 :label2 echo %9 %8 %7 %6 %5 %4 %3 %2 %1 exit 1 调用 label1 并获取其返回值,根据返回值显示 ok 或 fail 调用 label2 并获取其返回值,根据返回值显示 ok 或 fail label1 始终返回 true label2 始终返回 false call 可以刷新环境变量,进入新的环境,例如下面的代码: iftitle [find --set-root --devices=h /bootmgr && call set bootmgr=%@root^%] load BOOTMGR of Windows VISTA/WIN7/WIN2008 on %bootmgr% 如果不加 call 则 --set-root 不能立即生效。 这里还要注意一点,整行命令在执行之前会被解析,解析的过程中,会将其中的变量替换成实际的值。%@root^% 的写法就是为了防止在解析命令行的时候将其扩展成实际的值,而是将其扩展成字符串 %@root%,以便下次解析的时候继续扩展。当 find --set-root --devices=h /bootmgr 执行成功后,需要执行 && call set bootmgr=%@root^%(此时 %@root^% 已经被扩展成 %@root% 了)的时候,又要执行一次解析,此时会将 %@root% 扩展成实际的值。 ============================== exit 跳转到脚本文件的 :eof 处(脚本文件的结尾处)。功能同 goto :eof ============================== shift 批处理专用,丢弃第一个参数,后面的参数向前移动。 shift 3 批处理专用,丢弃第三个参数,后面的参数向前移动。 [注意:Grub4Dos 中可以使用 %1~%9 参数,其中 %9 指剩下的所有参数] ============================== goto :标签1 批处理专用,跳转到“标签1”处执行,不返回,不支持参数。 goto 3 菜单专用,跳转到指定的菜单项执行。 ============================== 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 个] ============================== setlocal 和 endlocal setlocal 与 endlocal 之间的变量为本地变量,见下面的例子: set a=123 setlocal set a=4 echo %a% endlocal echo %a% 在 setlocal 与 endlocal 之间将 a 赋值为 4,但是这不影响 setlocal 之前设置的变量 a,在 endlocal 之后,变量 a 恢复为之前的值 123。 setlocal @ 和 endlocal @ setlocal 与 endlocal 之间的变量为本地变量,setlocal @ 和 endlocal @ 可以跨脚本文件存在。 [注意:setlocal @ 之前的 setlocal 将失效,setlocal @ 之后的 setlocal 不能跨脚本。] ============================== if #%a%==#123 echo ok 如果变量 a 的值等于 123 则输出 ok if #%a%<=#123 echo ok 如果变量 a 的值小于等于 123 则输出 ok if #%a%>=#123 echo ok 如果变量 a 的值大于等于 123 则输出 ok if #%a%>=#abc echo ok 如果变量 a 的值等于字符串 abc 则输出 ok(区分大小写) if /i #%a%>=#abc echo ok 如果变量 a 的值等于字符串 abc 则输出 ok(忽略大小写) if #%a%==# echo ok 如果变量 a 的值为空则输出 ok if #%a%==#123 && echo ok 如果变量 a 的值等于 123 则输出 ok if #%a%==#123 || echo fail 如果变量 a 的值不等于 123 则输出 fail if not #%a%==#123 echo fail 如果变量 a 的值不等于 123 则输出 fail if exist a echo ok 如果存在变量 a 则输出 ok if not exist a echo fail 如果不存在变量 a 则输出 fail if exist /grldr && echo ok ! echo fail 如果存在文件 /grldr 则输出 ok,否则输出 fail 判断文件或目录是否存在,对驱动器无效,比如 (ud)/: if exist /FILE && 文件或目录存在 ! echo 文件或目录不存在 判断文件是否存在: cat --length=0 /FILE && echo 文件存在 ! echo 文件不存在 判断目录是否存在,对驱动器无效,比如 (ud)/: cat --length=0 /FILE && echo 目录不存在 || if exist /FILE && echo 目录存在 ! echo 目录不存在 ============================== checkrange 范围 命令 && 成功 ! 失败 如果“命令”的返回值在“范围”内,则执行“成功”,否则执行“失败”。 checkrange 23 calc 20+3 && echo ok ! echo fail 如果 20+3 的值为 23,则输出 ok,否则输出 fail checkrange 0x21,0x23,0x80 read 0x8280 && echo ok ! echo fail 如果从 0x8280 处读出的值为 0x21 或 0x23 或 0x80 则输出 ok,否则输出 fail checkrange 0:100 calc %a% && echo ok ! echo fail 如果变量 a 的值在 0-100 之间,则输出 ok,否则输出 fail ============================== errorcheck on 打开错误检查,遇到错误将终止执行 errorcheck off 关闭错误检查,执行中遇到错误将忽略,直至执行完毕 errorechek 切换错误检查模式 errorcheck status 显示当前错误检查模式 [注:errorcheck 命令控制着错误是否被处理。默认 errorcheck 是开启的,即在错误发生时命令脚本将停止执行。如果 errorcheck 是关闭的,则脚本将一直执行到 boot 命令(即 off 状态下,fallback 命令等将失效)。一条 boot 命令可以把错误检查转变为开启] ============================== errnum 返回上一条命令的错误代码。若上一条命令未出错,则返回错误代码为 0,否则返回相应的错误代码。 ============================== fallback 3 如果当前菜单项执行出错,则转移到第 3 菜单项继续执行。该命令仅在菜单中使用,用于无人引导模式:如果默认菜单项执行出错,无需等待用户操作,立即跳转到第 3 菜单项继续执行。 ============================== pause press any key to continue 暂停命令的运行,并给出一段提示信息,按下任意键后继续。 pause --wait=10 press any key to continue 暂停命令的运行,并给出一段提示信息,按下任意键后继续。如果在 10 秒内没有按下任意键,则自动返回命令行。 pause --test-key 执行该命令后,按下任意键,将显示该按键的扫描码。 pause && set /a key=*0x4CB00 ! set key= 暂停命令的运行,按下任意键后继续,并将该按键的 ASCII 码存入变量 key 中。如果按下的是 ESC 键,则删除变量 key ============================== command 显示当前指定的外部命令的位置 command --set-path=/boot/grub 指定外部命令的位置为 /boot/grub command RUN /pe.iso 查找外部命令 RUN 并执行,参数为 /pe.iso command /boot/RUN /pe.iso 执行外部命令 /boot/RUN,参数为 /pe.iso [注意:查找外部命令的顺序如下: 如果是以 '(' 或 '/' 开头的文件被认为是一个绝对路径的文件,将直接执行。否则先查找 insmod 加载的命令。再查找当前目录下的同名文件。再查找 --set-path 指定位置的同名文件。] ============================== insmod RUN 将外部命令 RUN 加载到内存,使得执行外部命令时直接从内存读取,而不是从源设备读取,加快执行速度。 insmod FILE.MOD FILE.MOD 是使用 makemod 程序生成的外部命令合集,免去多次使用 insmod 加载外部命令的麻烦。也可以使用 Fbinsttool 工具来制作 FILE.MOD 文件。 insmod /boot/grub/fat.gz fat 将外部命令 fat.gz 加载到内存,同时指定新的名字 fat,此时可直接使用 fat 调用本外部命令。 [注意:insmod 载入的文件,其文件名长度不能超过 11 个字符。] ============================== delmod 显示已加载的外部命令 delmod RUN 卸载已加载的外部命令 RUN delmod * 卸载所有已加载的外部命令 delmod -l %~nx0 || insmod %0 判断当前脚本是否已经载入内存,如果没有,则将其载入内存。 ========================================================================================== 接下来学习这些命令(8个): help、debug、displaymem、geometry、is64bit、serial、tpm、setkey ============================== help 显示内部命令列表 help --all 显示所有命令列表 help root 显示 root 命令的帮助信息 ============================== debug off 或 debug 0 开启静默模式 debug normal 或 debug 1 开启标准模式 debug on 开启冗余模式,从 debug 2 到 debug 0x7fffffff 都等同于 debug on(调试报告 BUG 时请使用该模式,可以获得更详细的信息) debug -1 隐藏倒计时提示 debug 3 开启批处理脚本调试模式(单步执行),debug 3 模式下按 c 键可以进入命令行,按 Ctrl + c 组合键可以中止脚本的执行。 ============================== displaymem 显示 GRUB 所判断的当前系统的内存分布,包括所有物理内存区域。 ============================== geometry (hd0) 输出 (hd0) 的相关信息。 ============================== is64bit 如果 CPU 支持 64 位的话返回 true,否则返回 false。 ============================== serial 初始化一个串口设备。串口,不研究。 ============================== tpm --init 在地址 0000:7C00 处使用 512 字节数据作为初始化 TPM(可信赖平台模块)的缓存。用不上,不研究。 ============================== setkey a b 将按键 b 映射为按键 a,此时按下 b 键等同于按下 a 键。 [注:这里的键必须是字母, 数字, 和以下特殊键: escape(转义), exclam(!), at(@), numbersign(#), dollar($), parenright ()) , caret(^), ampersand(&), asterisk(*), plus(+), percent(%), minus(-), underscore(_), equal(=), parenleft[(], backspace(退格), tab(制表), bracketleft([), braceleft({), bracketright(]), braceright(}), enter(回车), control(控制), semicolon(;), colon(:), quote('), doublequote("), slash(/), backquote(`), tilde(~), shift(换档), backslash(\), bar(|), comma(,), less(<) period(.), greater(>), question(?), alt(交互), space(空格), capslock(大写), Fx(功能键) 和 delete(删除)。 ========================================================================================== |
|
来自: Hongrongqi > 《grub4doc》