前言
原理是使用 ANSI 转义序列(ANSI escape code) 来控制文本的颜色,在 Win10 系统的 命令提示符 / 命令行 / 控制台 / cmd 的窗口中仅使用 cmd.exe 内置的命令来实现彩色输出,无论是在 Command Prompt(命令提示符) 中还是 .bat / .cmd 批处理脚本中。
ANSI 转义序列 支持的颜色: 3/4 bit(8/16色)、8 bit(256色)、24 bit(RGB真彩色)
限制:Win10 较旧的版本可能不支持。
本文仅作分享,不保证准确性。
目录
简介
FAQ
- Q:Windows 从什么版本开始支持使用彩色化输出?
A:不知道。 - Q:命令提示符还支持其他
ANSI 转义序列吗?
A:支持不少,但不清楚支持多少。 - Q:内置命令是
cmd.exe提供的?
A:不清楚…… - Q:这有什么用吗?
A:鉴于cmd/bat脚本过于过时,以及不同版本的系统中兼容性的问题,大概没什么用。
原理与方法
通过 prompt 命令获得 ^[ / ESC ( 27 / 0x1b / 033 ) 字符后,直接用 echo 命令配合 ANSI 转义序列 来输出指定颜色的文本。
echo ^[[36mCyan^[[m
^[:ESC字符,而不是^[两个字符的组合,输入方法见下方。^[[36m:青色前景^[[m:默认颜色
ANSI 转义序列的格式与详细可以搜索或者阅读底部的参考链接,在此不再赘述。
ESC 字符的获取/输入方法
命令提示符中
Ctrl+[- 同时按下 Ctrl 和 [ 键。
Alt+2(小键盘)+7(小键盘)- 按住 Alt 键,依次输入小键盘的 2、7,松开 Alt 键。
输入命令:
1
@for /f "delims=#" %i in ('prompt #$E#^&echo on^&for %a in ^(1^) do rem') do set "ESC_CHAR=%%i"
或者直接输出 ANSI 转义序列:
1
@for /f "delims=#" %i in ('prompt #$E#^&echo on^&for %a in ^(1^) do rem') do @echo;%i[36mCyan%i[m
脚本中
命令:
1
for /f "delims=#" %%i in ('prompt #$E#^&echo on^&for %%a in ^(1^) do rem') do set "ESC_CHAR=%%i"
编辑器中输入
Alt+2(小键盘)+7(小键盘)(如支持)。使用编辑器提供的功能(如有)来输入特殊字符
ESC。
3/4 bit(8/16色)
^[[m/^[[0m:默认颜色(重置)^[[<n>m:指定前景色/背景色<n>:颜色代码,
30-37:指定前景色;
40-47:指定背景色。
^[[36m:青色前景^[[41m:红色背景^[[36;41m:青色前景+红色背景
^[[1m:开启高亮前景^[[22m:关闭高亮前景^[[1;36;41m:高亮青色前景+红色背景^[[22;36;41m:正常青色前景+红色背景
^[[7m:开启反显(交换前景和背景颜色)^[[27m:关闭反显^[[7;36;41m:红色前景+青色背景
8色
| 颜色 | 前景色代码 | 背景色代码 | R | G | B |
|---|---|---|---|---|---|
| 黑(K) | 30 | 40 | 0 | 0 | 0 |
| 红(R) | 31 | 41 | 128 | 0 | 0 |
| 绿(G) | 32 | 42 | 0 | 128 | 0 |
| 黄(Y) | 33 | 43 | 128 | 128 | 0 |
| 蓝(B) | 34 | 44 | 0 | 0 | 128 |
| 品红(M) | 35 | 45 | 128 | 0 | 128 |
| 青(C) | 36 | 46 | 0 | 128 | 128 |
| 白 | 37 | 47 | 128 | 128 | 128 |
来源:https://zh.wikipedia.org/zh-cn/ANSI%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97#3/4%E4%BD%8D
RGB + CMYK
注:16色就是加上高亮的颜色。
8 bit(256色)
^[[38;5;<n>m:指定前景色为代码n的颜色^[[48;5;<n>m:指定背景色为代码n的颜色<n>:颜色的代码,范围0-255。颜色代码的详情和换算不在此赘述。
^[[38;5;39m:指定前景色为代码39的“浅蓝”^[[48;5;219m:指定背景色为代码219的“浅粉”^[[38;5;39;48;5;219m:指定前景色为“浅蓝”,背景色为“浅粉”
bat 脚本列出 256 色:
输出 6 列
1 | @echo off |
输出 36 列
1 | @echo off |
输出 18 列
1 | @echo off |
24 bit(RGB真彩色)
^[[38;2;<r>;<g>;<b>m:指定前景色的RGB^[[48;2;<r>;<g>;<b>m:指定背景色的RGB<r>/<g>/<b>:
0 <= r, g, b <=255
bat 脚本简略显示 24 bit 颜色:
输出 108 列 18 行 1944(6*18*18) 色(可自定义)
1 | @echo off |
输出 16 列 256 行 4096(16*16*16) 色
1 | @echo off |
参考
- Wiki
https://zh.wikipedia.org/zh-cn/ANSI转义序列 - 相关讨论
- https://stackoverflow.com/questions/2048509/how-to-echo-with-different-colors-in-the-windows-command-line
- https://superuser.com/questions/413073/windows-console-with-ansi-colors-handling
- https://superuser.com/questions/1416402/can-we-use-more-colors-in-batch-script
- https://stackoverflow.com/questions/16755142/how-to-make-win32-console-recognize-ansi-vt100-escape-sequences
- 详细教程
- Windows 控制台官方资讯
- https://devblogs.microsoft.com/commandline/24-bit-color-in-the-windows-console/
- https://devblogs.microsoft.com/commandline/new-experimental-console-features/
- https://devblogs.microsoft.com/commandline/updating-the-windows-console-colors/
- https://devblogs.microsoft.com/commandline/introducing-the-windows-console-colortool/