前言
原理是使用 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/