Board logo

标题: CMD/bat里使用彩色(示例+函数) [打印本页]

作者: hnfeng    时间: 2024-6-21 21:41     标题: CMD/bat里使用彩色(示例+函数)

本帖最后由 hnfeng 于 2024-6-21 21:45 编辑

批处理使用彩色字符和背景,我知道的有三种:
1、使用第三方工具,例如 syba.exe,  CoColor.exe 等等,目前知道的只支持16色
2、使用 findstr,优点是可以在win10(不含)之前的系统中使用,缺点是可能有点字符会有问题。也是只支持16色
3、使用转义,优点是支持16色、256色、真彩色,缺点是只支持win10(含)以后的系统

这几天研究了下转义方式,在cmd/bat里面使用彩色,写了个函数方便自己使用,分享出来
批处理里面的演示部分,有的并没有使用函数,而是直接输出,你比较一下就知道怎么用,很简单的
  1. @echo off
  2. for /f "delims=#" %%i in ('prompt #$E#^&echo on^&for %%a in ^(1^) do rem') do set EscK=%%i
  3. setlocal EnableDelayedExpansion&cd /d "%~dp0"&title %~nx0  [hnfeng]&color 07
  4. mode con lines=40 cols=182
  5. for /l %%i in (1,1,40) do set bar=!bar!=
  6. :: 3/4位(8色/16色):
  7. echo 3/4位(8色/16色):
  8. echo %bar%
  9. for /l %%i in (30,1,37) do set /p "str=%EscK%[%%i;40m %%i %EscK%[m"<nul
  10. for /l %%i in (30,1,37) do set /p "str=%EscK%[1;%%i;40m %%i %EscK%[m"<nul
  11. for /l %%i in (90,1,97) do set /p "str=%EscK%[%%i;40m %%i %EscK%[m"<nul
  12. echo;
  13. for /l %%i in (30,1,37) do set /p "str=%EscK%[7;%%i;40m %%i %EscK%[m"<nul
  14. for /l %%i in (30,1,37) do set /p "str=%EscK%[7;1;%%i;40m %%i %EscK%[m"<nul
  15. for /l %%i in (90,1,97) do set /p "str=%EscK%[7;%%i;40m %%i %EscK%[m"<nul
  16. echo;&echo;
  17. :: 8位(256色):
  18. echo 8位(256色):
  19. echo %bar%
  20. set Invert=
  21. call :DoDisp %Invert%
  22. echo;&echo;
  23. ::(8位)256色背景(使用反显的方法)
  24. set Invert=i
  25. call :DoDisp %Invert%
  26. echo;&echo;&echo;
  27. :: 24位(RGB真彩色):
  28. echo 24位(RGB真彩色):
  29. echo %bar%
  30. for /L %%r in (64,2,255) do (call :EchoC " " "38;2;%%r;0;0" x 40 i
  31.   ping -n 1 127.1>nul)
  32. echo;
  33. for /L %%g in (64,2,255) do (call :EchoC " " "38;2;0;%%g;0" x 40 i
  34.   ping -n 1 127.1>nul)
  35. echo;
  36. for /L %%b in (64,2,255) do (call :EchoC " " "38;2;0;0;%%b" x 40 i
  37.   ping -n 1 127.1>nul)
  38. echo;&echo;
  39. for /L %%g in (0,8,255) do (
  40.   set /p "str=%EscK%[30;48;2;255;%%g;0m %EscK%[m"<nul
  41.   ping -n 1 127.1>nul)
  42. for /L %%r in (255,-8,0) do (
  43.   set /p "str=%EscK%[30;48;2;%%r;255;0m %EscK%[m"<nul
  44.   ping -n 1 127.1>nul)
  45. for /L %%b in (0,8,255) do (
  46.   set /p "str=%EscK%[30;48;2;0;255;%%bm %EscK%[m"<nul
  47.   ping -n 1 127.1>nul)
  48. for /L %%g in (255,-8,0) do (
  49.   set /p "str=%EscK%[30;48;2;0;%%g;255m %EscK%[m"<nul
  50.   ping -n 1 127.1>nul)
  51. echo;&echo;&echo;
  52. endlocal
  53. pause
  54. exit /b
  55. :DoDisp %Invert%
  56. for /l %%i in (0,1,15) do (
  57.     set /a text=1000+%%i
  58.     rem call :EchoC " !text:~-3! " "38;5;%%i" x 40 %1
  59.     call :EchoC " !text:~-3! " "38;5;%%i" x "48;5;0" %1
  60. )
  61. echo;
  62. set /a N=36
  63. set /a L=0
  64. for /l %%i in (16,1,231) do (
  65.     set /a text=1000+%%i
  66.     call :EchoC " !text:~-3! " "38;5;%%i" x 40 %1
  67.     rem call :EchoC " !text:~-3! " "38;5;%%i" x "48;5;0" %1
  68.     set /a L+=1
  69.     if !L! GEQ %N% (
  70.       set /a L=0
  71.       echo;
  72.     )
  73. )
  74. for /l %%i in (232,1,255) do (
  75.     set /a text=1000+%%i
  76.     call :EchoC " !text:~-3! " "38;5;%%i" x 40 %1
  77.     rem call :EchoC " !text:~-3! " "38;5;%%i" x "48;5;0" %1
  78. )
  79. goto :EOF
  80. ::===============================================================
  81. :EchoC
  82. ::EchoC  <text> <ForegroundColor> [Return] [BackgroundColor] [Invert]
  83. :: <text> ---- 字符
  84. ::  <ForegroundColor> 前景色
  85. ::    3/4位色-前景色      31                  范围 30-37
  86. ::    3/4位色-高亮前景色  "1;36"              范围 30-37
  87. ::                    或  91                  范围 90-97
  88. ::    8位(256色)          "38;5;100"          范围 0-255
  89. ::    24位(RGB色)         "38;2;255;128;128"  RGB 范围 0-255
  90. ::  <ForegroundColor> 背景色
  91. ::    3/4位色-背景色      41                  范围 40-47
  92. ::    3/4位色-高亮背景色  103                 范围 100-107
  93. ::    8位(256色)          "48;5;100"          范围 0-255
  94. ::    24位(RGB色)         "48;2;255;128;128"  RGB 范围 0-255
  95. :: [Invert] 是否反显:I-反显,其他-不反显
  96. :: [Return] 显示字符后是否换行:R-换行,其他-不换行
  97. ::
  98. :: 例子:call :EchoC "Text 文字" 31
  99. ::       call :EchoC "Text 文字" "1;36" x 40 i
  100. ::       call :EchoC "Text 文字" "38;5;99" r
  101. ::       call :EchoC "Text 文字" "38;2;255;255;16" R "48;2;0;94;94"
  102. ::       call :EchoC "Text 文字" "38;2;255;128;64" R 46
  103. ::CMD中可使用下列命令显示全部256色("^["是"Ctrl+["):
  104. ::for /l %i in (0,1,255) do @echo ^[[38;5;%im_%i_%i_%i_%i_%i_%i_%i_%i_%i_%i^[[m
  105. ::for /l %i in (0,1,255) do @echo ^[[7;38;5;%im_%i_%i_%i_%i_%i_%i_%i_%i_%i_%i^[[m
  106. setlocal EnableDelayedExpansion
  107. if /i %5_ EQU I_ (
  108.   set /p "str=%EscK%[7;%~2;%~4m%~1%EscK%[m"<nul
  109. ) else (
  110.   if %4_ EQU _ (set /p "str=%EscK%[%~2;40m%~1%EscK%[m"<nul
  111.   ) else (set /p "str=%EscK%[%~2;%~4m%~1%EscK%[m"<nul)
  112. )
  113. if /i %3_ EQU R_ echo;
  114. endlocal&goto :EOF
  115. ::<ForegroundColor> 前景色
  116. ::[BackgroundColor] 背景色
  117. ::  1. 3/4位色(8/16色):
  118. ::    前景色 30-黑,31-红,32-绿,33-黄,34-蓝,35-品红,36-青,37-白
  119. ::      16色就是加上高亮的8色
  120. ::          开始高亮前景  [1;
  121. ::          关闭高亮前景  [22;
  122. ::       90-灰,91-亮红,92-亮绿,93-亮黄,94-亮蓝,95-亮品红,96-亮青,97-亮白
  123. ::    背景色     40-黑,41-红,42-绿,43-黄,44-蓝,45-品红,46-青,47-白
  124. ::    高亮背景色 100-灰,101-亮红,102-亮绿,103-亮黄,104-亮蓝,105-亮品红,106-亮青,107-亮白
  125. ::  2. 8位色(256色):
  126. ::    256色前景色及引导 [38;5;n
  127. ::    256色背景色及引导 [48;5;n
  128. ::      n为颜色值:
  129. ::        0-黑,1-红,  2-绿,  3-黄,  4-蓝,  5-品红,  6-青,  7-白
  130. ::        8-灰, 9-亮红,10-亮绿,11-亮黄,12-亮蓝,13-亮品红,14-亮青,15-亮白
  131. ::        16 至 231 :多种颜色
  132. ::        232 至 255:灰度,从较黑到较白(0最黑,15最白)
  133. ::  3. 24位色(RGB):
  134. ::    24位色前景色及引导 [38;2;R;G;B
  135. ::    24位色背景色及引导 [48;2;R;G;B
  136. ::      0 <= R,G,B <=255
  137. ::  4. 反显:
  138. ::    开启  [7;
  139. ::    关闭  [27;
  140. ::  5. 下划线:
  141. ::    开启  [4;
  142. ::    关闭  [24;
  143. ::
  144. :: 下面内容有部分试验不出来
  145. ::  恢复默认:[0m/[m ;粗体(高亮?):[1m ;亮度减半开关:[2m/[22m ;下划线开关:[4m/[24m ;闪烁开关:[5m/[25m
  146. ::  反显开关:[7m/[27m ;隐藏(前景背景色一样)开关:[8m/[28m ;划掉开关:[9m/[29m;上划线开关:[53m/[55m
  147. ::  30-37:3/4位色前景色; 38;5:设置前景色(8位);38;2:设置前景色(24位)
  148. ::  40-47:3/4位色背景色; 48;5:设置背景色(8位);48;2:设置背景色(24位)
复制代码

作者: hnfeng    时间: 2024-6-22 13:21

本帖最后由 hnfeng 于 2024-6-22 13:23 编辑

再给个例子
  1. @echo off
  2. for /f "delims=#" %%i in ('prompt #$E#^&echo on^&for %%a in ^(1^) do rem') do set EscK=%%i
  3. setlocal EnableDelayedExpansion&cd /d "%~dp0"&title %~nx0&color 07
  4. for /l %%v in (1,1,50) do (set bar=!bar!=)
  5. echo;&echo;&call :EchoC "%Bar%" "38;5;33" r&echo;
  6. For /f "tokens=2* delims==" %%s in ('wmic OS get Caption /value ^| findstr /i "Caption"') do set OS=%%s
  7. call :EchoC "当前系统是:" "38;5;37"
  8. call :EchoC "%OS%" "38;5;120" r
  9. echo;&call :EchoC "%Bar%" "38;5;33" r&echo;&echo;
  10. for /f "tokens=2 delims==" %%i in ('wmic path win32_operatingsystem get LocalDateTime /value ^| findstr "="') do (set "strDate=%%i")
  11. echo;&echo 使用ECHO的方法
  12. echo %EscK%[38;5;208m现在时间是:%EscK%[38;5;196m%strDate:~0,4%%EscK%[38;5;135m年%EscK%[38;5;202m%strDate:~4,2%%EscK%[38;5;135m月%EscK%[38;5;208m%strDate:~6,2%%EscK%[38;5;135m日%EscK%[38;5;214m%strDate:~8,2%%EscK%[38;5;135m点%EscK%[38;5;220m%strDate:~10,2%%EscK%[38;5;135m分%EscK%[38;5;226m%strDate:~12,2%%EscK%[38;5;135m秒%EscK%[m
  13. echo;&echo 使用函数的方法
  14. call :EchoC "现在时间是:" "38;5;208"
  15. call :EchoC "%strDate:~0,4%" "38;5;196"
  16. call :EchoC "年" "38;5;135"
  17. call :EchoC "%strDate:~4,2%"  "38;5;202"
  18. call :EchoC "月" "38;5;135"
  19. call :EchoC "%strDate:~6,2%"  "38;5;208"
  20. call :EchoC "日" "38;5;135"
  21. call :EchoC "%strDate:~8,2%" "38;5;214"
  22. call :EchoC "点" "38;5;135"
  23. call :EchoC "%strDate:~10,2%" "38;5;220"
  24. call :EchoC "分" "38;5;135"
  25. call :EchoC "%strDate:~12,2%" "38;5;226"
  26. call :EchoC "秒" "38;5;135" R
  27. echo;&echo;
  28. pause
  29. exit /b
  30. ::===============================================================
  31. :EchoC
  32. setlocal EnableDelayedExpansion
  33. if /i %5_ EQU I_ (set /p "str=%EscK%[7;%~2;%~4m%~1%EscK%[m"<nul
  34. ) else (if %4_ EQU _ (set /p "str=%EscK%[%~2;40m%~1%EscK%[m"<nul
  35.   ) else (set /p "str=%EscK%[%~2;%~4m%~1%EscK%[m"<nul))
  36. if /i %3_ EQU R_ echo;
  37. endlocal&goto :EOF
复制代码

作者: semiuel    时间: 2024-6-23 19:51

这是逼着我用WIN10啊!
WIN7系统不支持转义符,但我有第三方工具echox,能实现简单的彩色字符。
作者: hnfeng    时间: 2024-6-25 08:00

这是逼着我用WIN10啊!
WIN7系统不支持转义符,但我有第三方工具echox,能实现简单的彩色字符。
semiuel 发表于 2024-6-23 19:51



    echox 确实也不错。
syba.exe 是最好的一类,可以指定坐标
echox.exe 是第二类,可以保留光标不换行
Cocoloer.exe 是第三类,总是换行光标下移




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2