:: 创建引导菜单 ::

你可以在"下载" 页面找到我制作出来的相应文件。注意看一下我的"cdshell.ini"文件,这样你差不多就应该知道CD Shell的脚本是怎样工作的了。如果你把那个文件复制到你的"CDSH"文件加并且运行debugger程序,你就可以看到我的引导菜单是怎样工作的。不用担心,那里的选项不会实际运行任何程序的,这只是向你演示了我的文件起了什么作用。

现在看一些有趣的东西。要创建我们自己的引导菜单,需要CD Shell 2.0.9b这个软件,这个软件以前叫做BootScriptor。现在你还是可以下载到BootScriptor的,它们之间的差别相当大,所以BootScriptor的内容在这里不再讨论。

如果你决定使用比较老的"diskemu.cmd"的方式,可能更容易做一些,然而这里也不讨论哪种方法。

要注意这部分文章非常长,因为没有相关的文件,因此要得到CD Shell使用中的小窍门就很困难了,然而一旦你掌握了基本的操作,那么你就不会遇到太大的问题了。

使用CD Shell有很多好处,首先CD Shell中显示的目录结构非常清晰明了,你可以设置不同的颜色,你可以直接察看文本文件,而不用打开那个丑陋的蓝色界面的Edit程序,你可以直接预览你的菜单而不用真的把这些文件刻录成光盘或者制作成镜像文件并载入虚拟机中。

这里就是一个用CD Shell创建的引导菜单的截图:

如果你是照着“准备开始”一节一直做过来的,那么你的ROOT文件夹下应该有一个"CDSH"文件夹,这个文件夹中的"cdshell.ini"文件就包含了引导菜单中要显示的内容。用记事本或者写字板或者其他你喜欢的编辑器打开那个文件。

重要:在以下工作都完成后注意看本文的最末尾处。

CD Shell 命令

CD Shell的脚本命令非常庞大,而相应的文档则有些缺乏,所以我会在这里演示一些基本的创建引导菜单的内容。如果想要我的完整的"cdshell.ini"文件,请到下载页面中去下载。

想要获得更多的关于CD Shell的文档,可以参考以下链接:

http://www.cs.uic.edu/~mter/cdshell/bguide.html
http://www.cs.uic.edu/~mter/bscript/bscript.html (Documentation 部分)
http://www.911cd.net/bscript/

显示文字

cls
print "1) Windows XP Professional SP1 Corporate \n"

"cls"命令会在显示文字之前先清空整个屏幕上显示的内容。所有想要显示出来的文字必须包含在引号里面。通过使用分号(;),输入一次命令可以执行多个print命令,只要两个print命令之间用分号隔开。\n命令会创建一条横线并返回,因此如果我们要在两个菜单选项之间空出一点空间的时候就可以在第一条Print命令后第二个print命令使用前先使用一个 \n\n 命令。

要想居中、左对齐或者右对齐,可以使用"c","l"和"r"命令。

print c "This is an example of centered text"

如果你想添加注释,只要在你的注视内容前添加一个"#"字符即可。

# This is a comment. It will not print anything on the screen.

Creating Sections

区段(Setions)被用来保持代码整洁和有组织,并且允许命令直接跳到某个特定的区段以执行特定的代码。要想创建一个区段,首先输入区段的名称,然后后面紧跟一个冒号。通常我习惯于把我的第一个区段命名为"menu:"。注意,代码是严格按照写入的顺序按顺序执行的,因此要记得在每个操作系统区段之后要紧跟一个针对那个操作系统的关键区段(key section)。在你看到操作系统区段的时候就明白我在说什么了。例如:

boot:
xp_pro:
moreoptions:

设置颜色 - 可选

在每个区段的最前面使用以下命令就可以为整个引导菜单设置颜色。

menu:
set textColor= color[grey on black]
set boldColor= color[cyan on black]

可用的颜色有:黑色,蓝色,绿色,紫色,红色,品红、棕色,灰色、亮灰色、亮蓝色、亮绿色、亮品红、亮红色、黄色还有白色。

想要用不同颜色高亮显示某些特定的文字,可以使用"\cXX" 和 "\cxx"命令。"\cXX" 指出随后的文字将会使用高亮色(bold color),而"\cxx" 命令指出随后的文字将会使用普通的颜色。如果你想要使用更多的颜色而不想每次都设置一边,那么可以把XX 用两位数字代替,第一位表示背景色,第二位表示文字的颜色,例如:

print "\cXXThis text is boldcolor. \cxxThis text is normal color."

以上的命令会用黑色背景青色文字显示出"This text is boldcolor",并在后面用黑色背景灰色文字显示 "This text is normal color."。

代码 颜色 代码 颜色
0 黑色 8 灰色
1 蓝色 9 亮蓝色
2 绿色 A 亮绿色
3 青绿 B 亮青色
4 红色 C 亮红色
5 品红色 D 亮品红
6 棕色 E 黄色
7 亮灰色 F 白色

因此如果你仔细看了本也前面的那张截图,那么你就应该明白以下的代码会产生怎样的效果:

print l "\cXXPress \c0BF1 \cXXfor Help"; print r "\c0Bckite@portraitofakite.com \n"

"Press"这个词是用青色显示在黑色背景上的,而"F1"则是用亮青色显示在黑色背景上,"For Help"又使用青色显示在黑色背景上,然后我的email地址又一次用亮青色显示在了黑色背景上。

用户输入

接下来我们新建一个名为"MainKey:"的区段,这个区段可以放在"menu:"后面,这里是这个区段的头两行:

MainKey:
getkey 20 boot 0x80
if $lastKey == key[1]; then goto XP_Pro

第一行指定了区段的名称。

第二行使用"getkey"命令来保存用户输入的信息。"20" 是一个时间的上限,这意味着如果在20秒内没有任何按键被按下去,"boot 0x80"就会被运行。"boot 0x80"会自动从系统中的第一个硬盘驱动器尝试启动。如果当前的硬盘中还没有装操作系统,那么自然什么都不会发生。你可以不设置时间显示,这样如果你一直不按键盘,那么屏幕上就会一直显示最初的信息,直到你按下某个键。

最后一行用了一个"if"命令来检查用户输入的内容,这里的意思是,如果“$lastkey”中被输入的内容是"1",那么将会转到(goto)"XP_Pro"区段。

运行文件和条约到区段

chain /PRO1.DAT

这个命令将会运行PRO1.DAT这个文件,文件名前面的一个斜线"/"用以告诉 CD Shell PRO1.DAT这个文件保存在光盘的根目录下。

memdisk /98SE.IMA

这个命令会运行98 SE 启动盘的磁盘镜像,并开始安装98 SE。在IMA和IMG文件之前必须先使用一个"memdisk"命令。

goto XP_Pro:

这个命令会跳到"XP_Pro:"区段并继续执行那里的代码。

type /keycodes.txt

这个命令会在屏幕上显示"keycodes.txt"文件的内容,实际上这并不会打开那个文本文件,它只是把文件的内容显示在屏幕上而已。

操作系统区段

以"User Input:"区段为例说明,我们现在新建一个名为"XP_Pro:"的区段,每个操作系统的区段后面都要跟着一个关键区段,这个区段会为我们的XP选项新建一个菜单。以下是我的"XP_Pro"区段的内容。注意 "Ä"字符,使用在命令中后,这个字符会显示出一个连续的横线,如果用连字符的话横线就变成了中间有间断的虚线了,像这样:"-----"。
 

XP_Pro:
cls
print r "\n\cXXPress \c0BF1 \cXXfor Help \n"
print c "\n\cXXMicrosoft Windows XP Professional SP1 Corporate \n"
print c "\cXXÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ \n"
print "1) Regular \n"
print "2) Unattended \n"
print "3) OEMPreinstall \n"
print c "\n\n"
print "Press any key to return to main menu... \n"

XP_Pro_Key:
getkey 20 goto menu
if $lastKey == key[1]; then chain /PRO1.DAT
if $lastKey == key[2]; then chain /PRO2.DAT
if $lastKey == key[3]; then chain /PRO3.DAT
if $lastKey == key[F1]; then goto Help
goto menu

会发生什么事?计算机会显示出XP_Pro:区段中的内容,然后继续执行下一个区段(XP_Pro_Key:),在这个区段中就会使用到getkey 命令。因此计算机会等待用户按下一个按键,如果用户按下的是"1",计算机就会开始执行"PRO1.DAT"文件,并开始XP的安装过程。如果20秒之内没有任何按键被按下,那么CD Shell就会返回主菜单。

如果对于XP你只有一个选项,并且不想再有其他的额外菜单,那么你就可以跳过"XP_Pro:"和"XP_Pro_Key:"这两个区段。

getkey 20 boot 0x80
if $lastKey == key[1]; then goto XP_Pro

以上命令可以变为:

getkey 20 boot 0x80
if $lastKey == key[1]; then chain /PRO1.DAT

更多选项:

为了使用Partition Magic 8.0, Norton Ghost等程序以及察看相应的产品序列号,我还在我的文件中使用了MoreOptions:这个区段。同时,在"menu:"和"MainKey:"这两个区段还要有相应的入口。

MoreOptions:
cls
print r "\n\cXXPress \c0BF1 \cXXfor Help \n"
print c "\n\cXXMore Options \n"
print c "\cXXÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ \n"
print "1) Read/Copy Files From NTFS Volumes To FAT32/16 Drives \n"
print "2) Partition Magic 8.0 \n"
print "3) Norton Ghost \n"
print "4) View Serial Numbers \n"
print c "\n\n"
print "Press any key to return to main menu... \n"

MoreOptions_Key:
getkey 20 goto menu
if $lastKey == key[1]; then memdisk NTFS.IMA
if $lastKey == key[2]; then memdisk PM8.IMG
if $lastKey == key[3]; then memdisk GHOST.IMA
if $lastKey == key[4]; then goto SerialNumbers
goto menu

结尾

再你的cdshell.ini文件的最末尾处应该有一个"end"标示。

end

大体上就是这些了, "end"命令会把你带入一个CD Shell的命令行界面,就像DOS界面一样,但在那里支持更多的命令并且目录结构的显示也更加漂亮。在命令行中输入"HELP"就可以察看都能做些什么。

调试

CD Shell最好用的一个功能就是调试了。想要调试的话只要简单的双击“CDSH”文件夹下的"cdshw.com"文件就可以了。这将会运行一个模拟器,并能精确模仿出计算机启动时将会发生的事情。你不用担心无意中安装了XP或者错误地进行了类似的操作,因为所有的调试过程都是模拟出来的,"chain"或者"boot"或者其他类似的命令实际上是不被调试模式支持的。要退出调试模式,只要在命令行中输入"exit"命令即可。如果你无法退出调试模式,也只用按下"Ctrl+Alt+Del"来结束调试模式的进程。

如果因为某些原因调试模式无法正常启动,那么你可以把你的整个"CDSH"文件夹复制到其他位置试试看,多换几个地方,直到能够正常工作。例如,你可能会收到类似这样的一个错误信息:"set" command or "print" command or something like that is not supported。我把我的"CDSH"文件夹复制到桌面上然后重新进入调试模式,这下就可以正常工作了。所以我就在桌面上编辑了剩下的代码,然后重新移动到ROOT文件夹下的"CDSH"目录中。

小花样

以下的代码我放在了我的"cdshell.ini"文件的最开头处,它能实现如下效果:

首先,它以一个"boot:"区段开始,这个区段首先在屏幕上显示"Press enter to boot from DVD...",然后才会显示出菜单。如果在5秒钟之内没有按下回车键,那么程序就会跳过菜单,直接引导第一个硬盘分区上的操作系统,无论那是什么系统。

后面的两个区段时我写的用来显示当前的日期和时间,这个代码的效果可以在顶部的截图中看到。

boot:
cls
print "\n"
print "Press Enter to boot from DVD... \n"
getkey 5 boot 0x80
if $lastKey == key[enter]; then goto time
# When no key found...
goto boot

# Function to display time of day
time:
set hour = $timeHour
set ampm = "am"
if $timeHour > 12; then set hour = $timeHour - 12
if $timeHour > 12; then set ampm = "pm"
set time = "$hour:$timeMinute$ampm"

# Function to display date
date:
set month = "n/a"
if $dateMonth == 1; then set month = "Jan."
if $dateMonth == 2; then set month = "Feb."
if $dateMonth == 3; then set month = "Mar."
if $dateMonth == 4; then set month = "Apr."
if $dateMonth == 5; then set month = "May."
if $dateMonth == 6; then set month = "Jun."
if $dateMonth == 7; then set month = "Jul."
if $dateMonth == 8; then set month = "Aug."
if $dateMonth == 9; then set month = "Sep."
if $dateMonth == 10; then set month = "Oct."
if $dateMonth == 11; then set month = "Nov."
if $dateMonth == 12; then set month = "Dec."
set date = "$month$dateDay,$dateYear"

如果想要在实践和日期旁显示一条线,我使用了如下的代码:

print c "\n\cXXÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ<\c0B$time $date\cXX>ÄÄ \n\n"

使用"Ä"字符可以在屏幕上显示一条直线,而不是用连字符号形成的虚线(-----)。

 

简体中文版翻译:CC Tips Site
该简体中文版出于个人爱好翻译,仅供学习和研究使用,水平有限,如有歧义请以
英文原版为准