香菇肥牛的博客

欢迎您来到我的博客https://qing.su 且听我慢慢倾诉……

香菇肥牛的博客

BAT批处理程序显示彩色文字的方法的探讨 | 香菇肥牛的博客

02/14/2013

脚本与程序>

BAT批处理程序显示彩色文字的方法的探讨

关于BAT脚本显示彩色文字的方法,网络中对此已有不少讨论,今天我在此归纳总结一下,并提出一些其他的方法。

对于单一颜色的彩色文字,直接用color指令即可,不再赘述。

方法一:findstr。显示多种颜色的彩色文字,比较普遍的方法是使用findstr /A指令逐字读入字符串并显示颜色。具体使用的时候需要将findstr和退格键结合起来使用(退格键是批处理中比较重要的一个操作,很多涉及到文字和字符串的处理的地方都需要用到退格键)。由于退格键打不出来,所以把代码放到这里来,因此我在这里附上一个网上找到的使用findstr来输出彩色字符的写得很好的范例(来源cn-dos.net),大家可以自行下载调试。(查看、下载链接)

方法二:调用第三方工具。比较有名的一种方法是使用ANSI.SYS系统文件,实现相应功能。具体方法请自行百度,个人认为这个系统文件会有平台差异的限制,所以没有过多测试。如果利用debug,可以先编写一个C语言程序并将其包含在批处理中从而实现彩色显示,这个显然是可以做到的。调用三方工具有些背离批处理编程的初衷,因此我们这里不做过多讨论。

方法三:debug汇编指令。这种方法需要用到一点汇编语言的知识。我们之前提到,debug可以执行汇编或者机器指令,因此我们很容易地想到,可以直接在批处理中写汇编代码实现彩色字符的输出,然后用debug执行这些指令即可。熟悉汇编语言的朋友都知道,windows系统中debug程序为我们提供了一个虚拟的8086CPU。而在8086CPU中,B8000H~BFFFFH这32KB的空间为显存,如果我们向这个地址空间写入数据,写入的内容将立即出现在显示器上。基于这一点知识,我们可以写出如下包含汇编指令的批处理脚本,可以在屏幕上输出彩色的qing.su这几个字符:

1
2
3
4
5
6
7
8
9
10
11
12
@echo off&more +1 <"%~0"|debug>nul&pause>nul&goto:eof
a 100      ;指定从偏移地址100处开始写入程序
mov ax,b800         ;将b800赋值给ax寄存器
mov ds,ax           ;将ax寄存器的值赋给ds寄存器(不能直接用mov给ds赋值)
mov word ptr [7d0],1471      ;在偏移地址7d0处写入字符q(ascii码为71h),颜色码14h
mov word ptr [7d2],5269
mov word ptr [7d4],416E
mov word ptr [7d6],1467
mov word ptr [7d8],522E
mov word ptr [7da],4173
mov word ptr [7dc],1475
int 20h     ;调用中断实现程序返回

r cx
30
g
q
测试时请删去所有注释。另外,int 20h与r cx之间的空行不可少,它表示的是在debug程序中的一个用于结束指令输入的换行标记。30表示的是上面这段代码的长度(16进制)。执行 后的效果如下图所示,
BAT脚本显示彩色文字-00

这一种脚本有一个固有缺陷,就是有的时候需要在全屏模式下才能看到,有的时候又不需要,而且我也没搞清楚是什么情况下普通窗口就能看到,什么情况需要全屏。因此,该方法有待改进(下面的方法四就是一种改进方法),之前我在cn-dos上提过相关的问题,可惜没人解答:(

方法四:调用SYBC屏幕与鼠标插件,这个东西我也不是很熟悉,下次开个单章来介绍。

讨论到这里,我们可以发现,在上述所有方法中,除了findstr这个最简单的方法,其他每一种方法都需要用到debug。不得不说,debug是批处理中的一个神器。我个人推荐的是第四种方法,效果比较好,可以实现彩色背景及闪烁(修改颜色代码即可)。当然,一定的汇编基础是不可少的。我们可以看到,在批处理达到了一定的程度之后,BAT编程和VBS脚本技术、汇编语言技术几乎是密不可分的。

来一发吐槽