Board logo

标题: [原创][批处理单行显示多种颜色字符] [打印本页]

作者: redtek     时间: 2006-12-19 05:35    标题: [原创][批处理单行显示多种颜色字符]

代码功能:   实现纯批处理在单行显示不同颜色的彩色字符功能,并且不影响相临行文字的颜色值。

实现意义:   不调用非微软第三方工具实现、不生成任何临时文件。
实现价值:   没任何实用价值,纯为技术而挑战看上去不可能的技术。
实现版本:   稍微修改后均可以在CMD与MS-DOS版本上实现同样功能。
关于注释:   下面代码只是显示一堆字符而已,只为思考想法的可实现性。
        如果用于显示特殊文字内容,下个版本可以随意完成,此演示无效。



测试版本: Windows CMD Shell 非全屏模式/全屏模式
      目前不支持纯DOS,因为命令行过长所至,除非使用 Debug E命令直接写内存减少命令长度
@echo off

::  显示单行彩色字符,其色彩值不影响本行以外的任何行
::  
::  Var Redtek 2006 - bbs.cn-dos.net



set "var=A$_MOV,AH,09$_MOV,AL,2A$_MOV,BH,00$_MOV,BL,0E$_MOV,CX,0020$_INT,10$_"
set "var=%var%MOV,BL,0A$_MOV,CX,000A$_INT,10$_INT,20$_$_g$_q$_"
echo exit|%ComSpec% /k prompt %var%|debug>nul
运行方法: 先进入CMD以后,再输入这个批处理的名字运行。]
[      如果在桌面直接鼠标双击运行,则一闪而过不会显示彩色内容]



上面代码没有任何实用价值,这也是偶然间想“挑战”一下那些调用第三方工具才能实现的功能,就想思考那些看上去不可能的事,
以上代码纯属思考着玩的一个想法,贴上和大家一起分享好玩的东东~:)

[ Last edited by redtek on 2006-12-23 at 05:30 PM ]
附件 1: 1.GIF (2006-12-19 05:35, 9.94 K, 下载附件所需积分 1点 ,下载次数: 6)



作者: ccwan     时间: 2006-12-19 05:48
=_=|||
如何实现?
作者: redtek     时间: 2006-12-19 05:57
是实现显示任何彩色字符串吗?
作者: ccwan     时间: 2006-12-19 05:58
是啊。
请兄详细说说,我很菜的。
作者: yardian     时间: 2006-12-19 06:08
可惜2003无效,提示:NTVDM遇到一个硬错误。希望能解释一下
作者: redtek     时间: 2006-12-19 06:10
1楼代码更改完成,这回可以了:)

[ Last edited by redtek on 2006-12-18 at 05:17 PM ]
作者: lxmxn     时间: 2006-12-19 06:22

  兄汇编进步好快,顶一个。以后编一个好的工具给兄弟们用用。呵呵。

作者: redtek     时间: 2006-12-19 06:25
多谢lxmxn兄鼓励~:)
作者: ccwan     时间: 2006-12-19 06:26
我还没有试出效果。
汗……
作者: redtek     时间: 2006-12-19 06:31
那个代码最后一句我忘了加  PAUSE 暂停了,可能在桌面上一执行完就没了:)
我每次都是在先进入CMD窗口,然后再键入批处理文件名执行的,所以总是忘了Pause~:)
作者: chenall     时间: 2006-12-19 06:32
利用DEBUG.等同于

  Quote:
@echo off

::  显示单行彩色字符,其色彩值不影响本行以外的任何行
::  
::  Var Redtek 2006 - bbs.cn-dos.net
>~debug.src echo.
>>~debug.src echo.A
>>~debug.src echo.MOV,AH,09
>>~debug.src echo.MOV,AL,2A
>>~debug.src echo.MOV,BH,00
>>~debug.src echo.MOV,BL,0E
>>~debug.src echo.MOV,CX,0020
>>~debug.src echo.INT,10   
>>~debug.src echo.MOV,BL,0A
>>~debug.src echo.MOV,CX,000A
>>~debug.src echo.INT,10
>>~debug.src echo.INT,20
>>~debug.src echo.
>>~debug.src echo.g
>>~debug.src echo.q
debug<~debug.src>nul
del ~debug.src

只不过这个有生成了临时文件

偶不懂汇编,看不懂上面的是什么意思.
作者: ccwan     时间: 2006-12-19 06:32
我和兄的操作方法一样,但看不到效果,不知为什么。
作者: chenall     时间: 2006-12-19 06:33
在代码后最后加一个pause
作者: ccwan     时间: 2006-12-19 06:38
还是不行。
作者: 9527     时间: 2006-12-19 06:41
真希望Redtek兄能够做出漂亮的P处理动画那就更牛XXXXXXXXXXXXXXXXXX了,继续努力吧!!!!!!!
作者: lxmxn     时间: 2006-12-19 06:41

  我的问题和 ccwan 兄的一样。

作者: redtek     时间: 2006-12-19 06:47
原理,下面的汇编代码使用prompt原理通过管道给Debug运行~:)
下面的代码中加入了注解~:)
0B03:0100 MOV,AH,09              ;    09H号功能调用
0B03:0102 MOV,AL,2A              ;    把字符2AH(就是*号的16进制ASCII码)装入AL寄存器
0B03:0104 MOV,BH,00              ;    彩色显示卡支持0~7页,把0页装入BH寄存器
0B03:0106 MOV,BL,0E              ;     把颜色值送入BL寄存器。(黄颜色:1110二进制,转16进制为:0EH
0B03:0108 MOV,CX,0020            ;    这个符号的显示次数20H送入CX.
0B03:010B INT,10                 ;    显示器中断调用10H  
0B03:010D MOV,BL,0A              ;    换一种颜色 (1010绿色,转16进制是AH)
0B03:010F MOV,CX,000A            ;    和上面一样,显示次数
0B03:0112 INT,10
0B03:0114 INT,20                 ;    结束返回
初学汇编,原理没什么神秘的,用批处理“包装”了一下~:)
等以后再做更多更好玩的东东~:)

[ Last edited by redtek on 2006-12-18 at 05:57 PM ]
作者: 9527     时间: 2006-12-19 06:49
真诱人啊,我也想学汇编...............
作者: electronixtar     时间: 2006-12-19 07:30
顶呀,加分~~~牛xxxxx贴
作者: electronixtar     时间: 2006-12-19 07:31
我最多就只能+23了,明天继续给你加~~
作者: hxuan999     时间: 2006-12-19 07:47
我运行的结果如下:



删除"echo exit|"代码后可以看到如下结果:



要再输入exit来退出.如下:



不知是什么原因,好像那一串星号一闪而过的感觉.
请高手指教

[ Last edited by hxuan999 on 2006-12-18 at 07:54 PM ]
作者: yardian     时间: 2006-12-19 10:10
呵呵,我可以了啊。不错。效果挺好的。
作者: redtek     时间: 2006-12-19 12:00


  Quote:
Originally posted by electronixtar at 2006-12-18 18:31:
我最多就只能+23了,明天继续给你加~~

@#$@#%#$@%狂晕!
被electronixtar兄这么高的加分和大家的加分感动死了!!!
作者: redtek     时间: 2006-12-19 12:05
看hxuan999兄的截图是日文版CMD~:)
看到那个 echo exit| …… 好象 exit 没有 “走” 管道,
如果猜的没错的话日文CMD环境中所用的管道符号不是 "|" ,而是另一个。

(等等……或是 "|" 这个管道符号的ASCII码在日文里是另一个编码--反正就是编码不一样导制了不识别,兄试一下看看)

(或是,兄在日文界面内执行 CHCP 437 切到英文状态,看看是不是可以运行这个代码了?)
作者: namejm     时间: 2006-12-19 12:18
  真是奇怪了,在我的电脑上始终没有彩色效果。另外,右侧的下拉条有时候还是会出现。
作者: zh159     时间: 2006-12-19 12:25
我的电脑上也没有效果,只显示暂停-_-|||
作者: qzwqzw     时间: 2006-12-20 01:22
程序使用了debug的汇编脚本,应该算不上“纯批处理”

当然,过多纠缠于概念是没有什么意义的,这里着重讨论技术

使用 %comspec% 来传递脚本虽有创新意义,但是缺乏实用意义

从可读性上来讲,可以将汇编脚本分行下载批处理前段,这样的形式可以更好的注释

从简洁性上来讲,可以将汇编代码的16进制值保存在变量中,然后使用for+echo传递

另外——

汇编脚本虽然很通用且有效,但因为过于底层,所以需要穿越的障碍较多

比如在我的主机上测试时,它被KAV6拦截了,允许后方可正常显示效果
作者: vkill     时间: 2006-12-20 01:26
我这也没有什么效果
作者: redtek     时间: 2006-12-20 01:31
多谢qzwqzw兄指点~:)))
作者: redtek     时间: 2006-12-20 01:47
vkill兄行进入 CMD ,再输入这个批处理代码的文件名运行就可以了:)
如果直接鼠标双击在桌面上的这个批处理,则一闪而过,不会有效果~:)

%comspec% 在 Windows环境内是调用 CMD.EXE
       为了在纯 MS-DOS 环境内也兼容,在纯DOS内, %comspec% 就自动调用 Command.com 。
作者: namejm     时间: 2006-12-20 01:50
  我在命令行里也运行也没效果呢。太奇怪了。
作者: redtek     时间: 2006-12-20 01:52
奇怪,发现 CMD /K 的执行在桌面上双击的执行文件 和 先进入CMD然再运行.bat的方式在屏幕显示上有细微的差别~:)
作者: vkill     时间: 2006-12-20 01:53
我在网吧的机子上试的,还是不行,好象网吧的机子做了手脚
作者: redtek     时间: 2006-12-20 01:56
网吧的机器是不是把 Debug 这种非常危险的DOS外部工具给删掉了?
作者: vkill     时间: 2006-12-20 02:00


  Quote:
Originally posted by redtek at 2006-12-20 01:56:
网吧的机器是不是把 Debug 这种非常危险的DOS外部工具给删掉了?

没有,还在,没有提示不是命令
作者: hxuan999     时间: 2006-12-20 04:48
redtek兄说的没错,我是在日文系统下测试的,另外,我也在中文件下试了,也是一样的,用CHCP 437后也是一样的.
    还有"|"在哪里应该都是管道符吧,反正日文下是,不然DEBUG也就不会执行了,也就不可能在去掉ECHO EXIT|后可以看到效果了.
    另外,我还试了多次,发现有时可以看到那一串星号闪了一下就没了,好像是被删除了的感觉,然后就变成了PAUSE的提示符了.我把EXIT换成了其它的命令也是一样的效果,好像是/K的作用没有起到一样.

[ Last edited by hxuan999 on 2006-12-19 at 04:50 PM ]
作者: Billunique     时间: 2007-4-6 02:13
各位同学,刚开始我也试不出效果,但后来我执着地多试了几次,终于出现效果:)有点奇怪,输了三次之后才会出现,每回试都是这样,呵呵~
作者: scriptor     时间: 2007-9-15 15:18
没有效果啊!!
怎么解释啊?
作者: ptfeelins     时间: 2008-1-3 13:47
感谢!收获很大:lol:

基于这个,我写了个小东西,希望有人指点一二。
这段东西看着觉得比较繁琐,不晓得有没有更好一点的写法 :(

另:
    运行的时候,有时候会有错误提示:
    The process tried to write to a nonexistent pipe.
这个时候,字符串就显示不出来……不确定是什么原因,待达人指教!THX!
::Feelin' [CMD@WinXP Pro SP2]
::[Purpose] Display name with the color
::[Date] 2008-01-03
::[Time] 2:55:43.29

::main
@title LOVE

@set varF=
@set varC=
@set varL=
@set line=

::Feelins [46,65,65,6C,69,6E,73]
@set "varF=A,100$_MOV,AH,09$_MOV,AL,20$_MOV,BH,00$_MOV,BL,0C$_MOV,CX,09$_INT,10"
@set "varF=%varF%$_MOV,AL,73$_MOV,BL,08$_MOV,CX,08$_INT,10"
@set "varF=%varF%$_MOV,AL,6E$_MOV,BL,08$_MOV,CX,07$_INT,10"
@set "varF=%varF%$_MOV,AL,69$_MOV,BL,08$_MOV,CX,06$_INT,10"
@set "varF=%varF%$_MOV,AL,6C$_MOV,BL,08$_MOV,CX,05$_INT,10"
@set "varF=%varF%$_MOV,AL,65$_MOV,BL,08$_MOV,CX,04$_INT,10"
@set "varF=%varF%$_MOV,AL,46$_MOV,BL,08$_MOV,CX,02$_INT,10"
@set "varF=%varF%$_MOV,AL,20$_MOV,BL,08$_MOV,CX,01$_INT,10"
@set "varF=%varF%$_INT,20$_$_G$_Q$_"

::Cecilia [43,65,63,69,6C,69,61]
@set "varC=A,100$_MOV,AH,09$_MOV,AL,20$_MOV,BH,00$_MOV,BL,0C$_MOV,CX,09$_INT,10"
@set "varC=%varC%$_MOV,AL,61$_MOV,BL,07$_MOV,CX,08$_INT,10"
@set "varC=%varC%$_MOV,AL,69$_MOV,BL,07$_MOV,CX,07$_INT,10"
@set "varC=%varC%$_MOV,AL,6C$_MOV,BL,07$_MOV,CX,06$_INT,10"
@set "varC=%varC%$_MOV,AL,69$_MOV,BL,07$_MOV,CX,05$_INT,10"
@set "varC=%varC%$_MOV,AL,63$_MOV,BL,07$_MOV,CX,04$_INT,10"
@set "varC=%varC%$_MOV,AL,65$_MOV,BL,07$_MOV,CX,03$_INT,10"
@set "varC=%varC%$_MOV,AL,43$_MOV,BL,07$_MOV,CX,02$_INT,10"
@set "varC=%varC%$_MOV,AL,20$_MOV,BL,07$_MOV,CX,01$_INT,10"
@set "varC=%varC%$_INT,20$_$_G$_Q$_"

::Loves [4C,6F,76,65,73]
@set "varL=A,100$_MOV,AH,09$_MOV,AL,73$_MOV,BH,00$_MOV,BL,0C$_MOV,CX,07$_INT,10"
@set "varL=%varL%$_MOV,AL,65$_MOV,BL,0C$_MOV,CX,06$_INT,10"
@set "varL=%varL%$_MOV,AL,76$_MOV,BL,0C$_MOV,CX,05$_INT,10"
@set "varL=%varL%$_MOV,AL,6F$_MOV,BL,0C$_MOV,CX,04$_INT,10"
@set "varL=%varL%$_MOV,AL,4C$_MOV,BL,0C$_MOV,CX,03$_INT,10"
@set "varL=%varL%$_MOV,AL,20$_MOV,BL,0C$_MOV,CX,02$_INT,10"
@set "varL=%varL%$_INT,20$_$_G$_Q$_"

@set "line=A,100$_MOV,AH,09$_MOV,AL,2A$_MOV,BH,00$_MOV,BL,02$_MOV,CX,0A$_INT,10"
@set "line=%line%$_INT,20$_$_G$_Q$_"

::Display
@CLS
@echo/
@echo exit|%ComSpec% /K prompt %line%|Debug>nul
@echo/
@echo exit|%ComSpec% /K prompt %varF%|Debug>nul
@echo/
@ping -n 1 127.1 1>nul 2>nul
@echo exit|%ComSpec% /K prompt %varL%|Debug>nul
@echo/
@ping -n 1 127.1 1>nul 2>nul
@echo exit|%ComSpec% /K prompt %varC%|Debug>nul
@echo/
@echo exit|%ComSpec% /K prompt %line%|Debug>nul
@echo/
@echo/
@pause>nul

::End

作者: londragon     时间: 2008-1-13 16:44
不错啊。
作者: 106942397     时间: 2008-4-25 10:01
看不懂!~~~我菜了!~~~~~~~~~
作者: zljzsm     时间: 2008-5-12 06:32
我也是进CMD运行批处理的,但什么效果也没看到,一闪就没了。我是在网吧机子上试,但我搜索了,机子上的debug在的,没有被删。这是为什么呢?XP系统。