|  | 
 
| 本帖最后由 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.wuyou.net/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.wuyou.net/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(删除)。
 
 ==========================================================================================
 
 
 
 | 
 评分
查看全部评分
 |