Windows cmd(DOS)命令窗口中echo命令ANSI转义显示彩色字或背景

原创
2018/11/24 12:07
阅读数 1.8W

前言

3个星期的周末了解LINUX下、WINDOWS下的ANSI颜色转义控制,LINUX下根据网上的搜索结果一下就成功了,但WINDOWS的CMD(dos)窗口中始终都没有成功,一直不甘心,今天再来试试,终于成功。关键点在于ESC的输入问题在以前看过的文章中都没有提及。

发现根本不需要加载ANSI.SYS驱动,WINDOWS应该是默认就加载了。

先看一下最终效果:

命令

注意以下命令中^[这2个字符是表示ASCII的一个字符27(即ESC), 其输入方法要用特殊的方式(见后述),所以下面的命令复制、粘贴后执行是看不到效果的。

还要注意的是^[后面还有一个正常的[。

 



C:\>cmd /cecho ^[[1;31m111],^[[32m222^[[33;44m333^[[34m4444^[[35m555^[[0m 
C:\>cmd /cecho ^[[1;31m dfsaafds],^[[32mNO222222222^[[33;34m55555^[[34m4444^[[0m 
C:\>cmd /cecho ^[[1;35m dfsaafds],^[[33madsfsk^[[42;35m55555^[[0m 
C:\>cmd /cecho ^[[1;35m dfsaafds],^[[33madsfsk^[[48;35m55555

 

不要前面的cmd /c也是可以的

echo ^[[31m111;^[[32m222;^[[33m333^[[41;34m444;^[[42;35m555^[[43;36m666^[[0m

ESC^[) 0x1B, \033字符的输入方法

^[是ANSI的ESC一个字符,并不是我们看到的键盘上左上角那个'ESC'按键。其ASCII码值10进制是27, 八进制是33(一般写为\033),16进制1b(一般写为\x1b)。 ,其输入方法有以下几种:

ESC字符输入方法一:

在cmd窗口中先按住ALT键,然后按一下小键盘(有些笔记本没有这个键盘)上的数字键2,7,然后放开ALT按键(一定要放开,否则不会显示)。

 ESC字符输入方法二:

在cmd窗口中先按住CTRL键,再按[键

 ESC字符输入方法三,NPP(NotePad++):

使用查找、替换法

 

替换后:

 

 

color命令

补充一个color命令,这是改变CMD窗口的整个背景及前景,和ECHO的颜色控制不是一个范畴的。

color帮助信息

C:\Windows\system32>color /?
设置默认的控制台前景和背景颜色。

COLOR [attr]

  attr        指定控制台输出的颜色属性。

颜色属性由两个十六进制数字指定 -- 第一个
对应于背景,第二个对应于前景。每个数字
可以为以下任何值:

    0 = 黑色       8 = 灰色
    1 = 蓝色       9 = 淡蓝色
    2 = 绿色       A = 淡绿色
    3 = 浅绿色     B = 淡浅绿色
    4 = 红色       C = 淡红色
    5 = 紫色       D = 淡紫色
    6 = 黄色       E = 淡黄色
    7 = 白色       F = 亮白色

如果没有给定任何参数,此命令会将颜色还原到 CMD.EXE 启动时
的颜色。这个值来自当前控制台

color命令的几个效果

 

运行环境

1、Windows 2016

2、Windows10

 

参考

  1. 批处理CMD显示彩色文字  https://blog.csdn.net/zhoujiaxq/article/details/22785803

  2. ANSI颜色使用研究https://blog.csdn.net/jennyvenus/article/details/18168

附LINUX下的echo彩色字符显示

ESC使用\033

 

 

支持ASNI颜色转义控制的终端软件

PuTTY

最简洁、最有名的吧  ,现在发现的缺点2个:一、是不能暂停滚屏,二、查找、高亮    

AT(AbsoluteTelnet)

没有上述PuTYY的两个缺点  ,

但有一个问题:退格键输入回显不删除字符

MobaXterm  

https://mobaxterm.mobatek.net/download-home-edition.html 

没有putty和AT的缺点,但感觉界面太复杂

LOG到文件功能

log到文件三者都有,但感觉AT每次要手支启动不是很方便, PuTYY,MobaXterm  只需设置一次

 

LUA控制台打印

--lua cmd-ansi-color
print("lua v".._VERSION);
io.write("ANSY color control\n");
local cmdhead = "echo ";
if 1 then
for i=0, 7 do
    for j=0, 7 do
        local parm = string.format("\x1b[4%d;3%dm --3%d/4%d--\x1b[0m", i, j, i, j)
        local cmd = cmdhead .. parm
        io.write(string.format("%s  :", string.gsub( cmd,"\x1b","ESC" )));
        os.execute(cmd)
    end
end
end

for i=0, 7 do
    for j=0, 7 do
        local parm = string.format("\x1b[4%d;3%dm --samshou3%d/4%d--\x1b[0m", i, j, i, j)
        local cmd = cmdhead .. parm
       --io.write(string.format("%s  :", string.gsub( cmd,"\x1b","ESC" )));
       io.write(parm);
    end
    io.write("\n");
end

 

==结果==

>lua cmd-ansi-color.lua
Lua 5.3
ANSY color control
echo ESC[40;30m --40/30--ESC[0m  : --40/30--
echo ESC[40;31m --40/31--ESC[0m  : --40/31--
echo ESC[40;32m --40/32--ESC[0m  : --40/32--
echo ESC[40;33m --40/33--ESC[0m  : --40/33--
echo ESC[40;34m --40/34--ESC[0m  : --40/34--
echo ESC[40;35m --40/35--ESC[0m  : --40/35--
echo ESC[40;36m --40/36--ESC[0m  : --40/36--
echo ESC[40;37m --40/37--ESC[0m  : --40/37--
echo ESC[41;30m --41/30--ESC[0m  : --41/30--
echo ESC[41;31m --41/31--ESC[0m  : --41/31--
echo ESC[41;32m --41/32--ESC[0m  : --41/32--
echo ESC[41;33m --41/33--ESC[0m  : --41/33--
echo ESC[41;34m --41/34--ESC[0m  : --41/34--
echo ESC[41;35m --41/35--ESC[0m  : --41/35--
echo ESC[41;36m --41/36--ESC[0m  : --41/36--
echo ESC[41;37m --41/37--ESC[0m  : --41/37--
echo ESC[42;30m --42/30--ESC[0m  : --42/30--
echo ESC[42;31m --42/31--ESC[0m  : --42/31--
echo ESC[42;32m --42/32--ESC[0m  : --42/32--
echo ESC[42;33m --42/33--ESC[0m  : --42/33--
echo ESC[42;34m --42/34--ESC[0m  : --42/34--
echo ESC[42;35m --42/35--ESC[0m  : --42/35--
echo ESC[42;36m --42/36--ESC[0m  : --42/36--
echo ESC[42;37m --42/37--ESC[0m  : --42/37--
echo ESC[43;30m --43/30--ESC[0m  : --43/30--
echo ESC[43;31m --43/31--ESC[0m  : --43/31--
echo ESC[43;32m --43/32--ESC[0m  : --43/32--
echo ESC[43;33m --43/33--ESC[0m  : --43/33--
echo ESC[43;34m --43/34--ESC[0m  : --43/34--
echo ESC[43;35m --43/35--ESC[0m  : --43/35--
echo ESC[43;36m --43/36--ESC[0m  : --43/36--
echo ESC[43;37m --43/37--ESC[0m  : --43/37--
echo ESC[44;30m --44/30--ESC[0m  : --44/30--
echo ESC[44;31m --44/31--ESC[0m  : --44/31--
echo ESC[44;32m --44/32--ESC[0m  : --44/32--
echo ESC[44;33m --44/33--ESC[0m  : --44/33--
echo ESC[44;34m --44/34--ESC[0m  : --44/34--
echo ESC[44;35m --44/35--ESC[0m  : --44/35--
echo ESC[44;36m --44/36--ESC[0m  : --44/36--
echo ESC[44;37m --44/37--ESC[0m  : --44/37--
echo ESC[45;30m --45/30--ESC[0m  : --45/30--
echo ESC[45;31m --45/31--ESC[0m  : --45/31--
echo ESC[45;32m --45/32--ESC[0m  : --45/32--
echo ESC[45;33m --45/33--ESC[0m  : --45/33--
echo ESC[45;34m --45/34--ESC[0m  : --45/34--
echo ESC[45;35m --45/35--ESC[0m  : --45/35--
echo ESC[45;36m --45/36--ESC[0m  : --45/36--
echo ESC[45;37m --45/37--ESC[0m  : --45/37--
echo ESC[46;30m --46/30--ESC[0m  : --46/30--
echo ESC[46;31m --46/31--ESC[0m  : --46/31--
echo ESC[46;32m --46/32--ESC[0m  : --46/32--
echo ESC[46;33m --46/33--ESC[0m  : --46/33--
echo ESC[46;34m --46/34--ESC[0m  : --46/34--
echo ESC[46;35m --46/35--ESC[0m  : --46/35--
echo ESC[46;36m --46/36--ESC[0m  : --46/36--
echo ESC[46;37m --46/37--ESC[0m  : --46/37--
echo ESC[47;30m --47/30--ESC[0m  : --47/30--
echo ESC[47;31m --47/31--ESC[0m  : --47/31--
echo ESC[47;32m --47/32--ESC[0m  : --47/32--
echo ESC[47;33m --47/33--ESC[0m  : --47/33--
echo ESC[47;34m --47/34--ESC[0m  : --47/34--
echo ESC[47;35m --47/35--ESC[0m  : --47/35--
echo ESC[47;36m --47/36--ESC[0m  : --47/36--
echo ESC[47;37m --47/37--ESC[0m  : --47/37--

截屏:

后记

写这条BLOG3小时多点,太费时了,不容易啊。

展开阅读全文
打赏
1
2 收藏
分享
加载中
SamXIAO博主
\33[ +   效果
nA
nB
nC
nD   光标向上n行
光标向下n行
光标向右n列
光标向左n列
n;mH
n;mf   光标定位至n行m列,默认1;1H,即
\33[H = \33[1H = \33[;1H = \33[1;1H
nJ   清屏
n = 0(默认,光标至屏末)
n = 1(光标至屏首)
n = 2(全屏,光标置于左上,测试时没动来着)
n = 3(已滚的屏的缓存)
nK   清行
n = 0(默认,光标至行末)
n = 1(光标至行首)
n = 2(整行,光标位置不动)
2019/10/04 16:05
回复
举报
SamXIAO博主
Windows中用ConEmu这个软件中的cmd可以更好地支持C语言等printf中使用ANSI转义
2019/02/18 14:11
回复
举报
SamXIAO博主
Linux终端或控制台cat也可以彩色显示ANSI转义颜色,但加了 | MORE后就没有彩色了。
2018/12/01 11:32
回复
举报
SamXIAO博主

引用来自“SamXIAO”的评论

win10/2016的CMD命令窗口用TYPE 命令也可以显示文本文件中的ANSI彩色了
用 | more 后彩色会消失
2018/11/30 08:39
回复
举报
SamXIAO博主
win10/2016的CMD命令窗口用TYPE 命令也可以显示文本文件中的ANSI彩色了
2018/11/29 21:29
回复
举报
更多评论
打赏
5 评论
2 收藏
1
分享
返回顶部
顶部