[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[特效代码] ANSI的esc转义序列功能强大,有网友有兴趣研究研究吗

本帖最后由 hnfeng 于 2024-7-15 22:58 编辑

从Win10开始,你可以用ANSI的esc转义序列在CMD、批处理等里面使用更多的功能,例如:
可以指定光标移动,以便在特定行列位置显示字符,这可以用于以前无法实现的功能,例如批处理运行中的显示信息、进度条等等;
可以指定信息滚动的区域,得到特殊的输出效果,例如CMD中1-5行显示一些固定信息,6-15行滚动显示批处理运行中的信息;
可以针对已经显示的信息进行插入行、删除行、插入字、删除字等操作,这在以前是不可想象的;
可以使用更多的字符和背景颜色,也可以参见我的另一个帖子:http://bbs.bathome.net/thread-69258-1-1.html
还有其他功能等着你发现

如果你想试验,我提醒一下:
ESC转义,是以ESC开始的一些控制符,
ESC在CMD里面,是 Ctrl+[ 输入
在一些编辑软件中例如Notpad2,3,4 里面,ESC可以 Alt+27 输入
在某些编辑软件中例如UltraEdit里面,需要在菜单 编辑-插入项目-文字字符,按ESC键输入
在批处理里面,也可以使用下面两种纯文字方法设置一个变量来使用
  1. for /f "delims=#" %%i in ('prompt #$E#^&echo on^&for %%a in ^(1^) do rem') do set EscK=%%i
复制代码
  1. for /F %%a in ('echo prompt $E ^| cmd') do set "EscK=%%a"
复制代码
还有:使用 echo 的方法,默认是会换行的,使用 set /p  的方法,默认不换行,当然,使用 echo 的方法时,可以加入 nA 就能让光标返回,相当于不换行
你在 CMD 窗口中试试:(里面的 ^[ 实际是 Ctrl+[
  1. for /L %a in (1,1,10) do (@echo ^[[3A^[[36m%a_%a_%a^[[m&ping -n 2 127.1>nul)
复制代码
批处理:
  1. @echo off
  2. for /F %%a in ('echo prompt $E ^| cmd') do set "EscK=%%a"
  3. echo;&echo;&echo;&echo;
  4. for /L %%a in (1,1,10) do (
  5.   echo %EscK%[1A%EscK%[36m%%a_%%a_%%a%EscK%[0m
  6.   ping -n 2 127.1>nul)
  7. )
  8. pause
复制代码
===============================
下面列出部分转义功能

%EscK%[nA  光标向上移动n行
%EscK%[nB  光标向下移动n行
%EscK%[nC  光标向右移动n个位
%EscK%[nD  光标向左移动n个位
%EscK%[nE  光标移到下面第n行的开头
%EscK%[nF  光标移到上面第n行的开头
%EscK%[nG  光标移到第n列
%EscK%[nd  光标移到第n行 ?
%EscK%[n;mH  光标移到第n行第m列(1为左上角)。如果省略默认为1,即 %EscK%[;2H = %EscK%[1;2H,即 %EscK%[3;1H = %EscK%[3;H = %EscK%[3H
  %EscK%[n;mf  与 %EscK%[n;mH 相同
%EscK%[nJ  清除屏幕的部分区域。
             如果n是0(或缺失),则清除从光标位置到屏幕末尾的部分。
             如果n是1,则清除从光标位置到屏幕开头的部分。
             如果n是2,则清除整个屏幕。
             如果n是3,则清除整个屏幕,并删除回滚缓存区中的所有行。
%EscK%[nK  清除行内的部分区域。
             如果n是0(或缺失),清除从光标位置到该行末尾的部分。
             如果n是1,清除从光标位置到该行开头的部分。
             如果n是2,清除整行。光标位置不变。
            
%EscK%[6n  以ESC[n;mR(就像在键盘上输入)向应用程序报告光标位置(CPR),其中n是行,m是列。
%EscK%[s   保存光标的当前位置。
%EscK%[u   恢复保存的光标位置。

%EscK%[nS  整页向上滚动n(默认1)行。新行添加到底部。
%EscK%[nT  整页向下滚动n(默认1)行。新行添加到顶部。
%EscK%[n;mr  设置滚动区域
%EscK%[nS  向上滚动滚动区域
%EscK%[nT  向下滚动滚动区域

%EscK%[nX  擦除字符
%EscK%[nL  插入行
%EscK%[nM  删除行
%EscK%[n@  插入字符
%EscK%[nP  删除字符

%EscK%[8;n;mt  调整CMD窗口为n行m列

%EscK%[nm  设置SGR参数,包括文字颜色(8/16色,256色,24位色). 如果没有参数,则视为 %EscK%[0m(重置/默认/常规)


<ForegroundColor> 前景色,[BackgroundColor] 背景色
  1. 3/4位色(8/16色):
    前景色 30-黑,31-红,32-绿,33-黄,34-蓝,35-品红,36-青,37-白
      16色就是加上高亮的8色
          开始高亮前景  [1;
          关闭高亮前景  [22;
       90-灰,91-亮红,92-亮绿,93-亮黄,94-亮蓝,95-亮品红,96-亮青,97-亮白
    背景色     40-黑,41-红,42-绿,43-黄,44-蓝,45-品红,46-青,47-白
    高亮背景色 100-灰,101-亮红,102-亮绿,103-亮黄,104-亮蓝,105-亮品红,106-亮青,107-亮白
  2. 8位色(256色):
    256色前景色及引导 [38;5;n
    256色背景色及引导 [48;5;n
      n为颜色值:
        0-黑,1-红,  2-绿,  3-黄,  4-蓝,  5-品红,  6-青,  7-白
        8-灰, 9-亮红,10-亮绿,11-亮黄,12-亮蓝,13-亮品红,14-亮青,15-亮白
        16 至 231 :多种颜色
        232 至 255:灰度,从较黑到较白(0最黑,15最白)
  3. 24位色(RGB):
    24位色前景色及引导 [38;2;R;G;B
    24位色背景色及引导 [48;2;R;G;B
      0 <= R,G,B <=255

  30-37:3/4位色前景色; 38;5;n:设置前景色(8位);38;2;r;g;b:设置前景色(24位)
  40-47:3/4位色背景色; 48;5;n:设置背景色(8位);48;2;r;g;b:设置背景色(24位)

恢复默认:[0m/[m ;高亮开关:[1m/22m ;下划线开关:[4m/[24m ;反显开关:[7m/[27m

未试验出来:闪烁开关:[5m/[25m ;隐藏(前景背景色一样)开关:[8m/[28m ;
             划掉开关:[9m/[29m;上划线开关:[53m/[55m
3

评分人数

厉害厉害,感谢分享

QQ 20147578

TOP

本帖最后由 hnfeng 于 2024-7-16 08:11 编辑

一个简单的进度条,抛砖引玉啦
仅仅是示例。只能在 需要处理的条数(sum)比 进度条长度(ProgBarL)少的情况下:

哪位高手精于算法,写一个较通用的进度条函数?
定义进度条的长度(例如70个字符位),条目数变量可不限制,都能正常显示进度条及百分率
进度条可以单色,甚至过度色……
  1. @echo off
  2. for /F %%a in ('echo prompt $E ^| cmd') do set "EscK=%%a"
  3. setlocal EnableDelayedExpansion&cd /d "%~dp0"&title %~nx0&color 07
  4. set sum=48
  5. echo;
  6. set F=1
  7. set p=0
  8. set ProgBarL=60
  9. set /a Cell=%ProgBarL%/%sum%
  10. set "CellBar="
  11. for /L %%a in (1, 1, %Cell%) do set "CellBar=!CellBar! "
  12. for /L %%a in (1, 1, %sum%) do (
  13.   if !F! NEQ 1 set /p "str=%EscK%[3F%EscK%[0K"<nul
  14.   echo %EscK%[36m正在…………: %EscK%[32m%%a_%%a_%%a_%%a%EscK%[0m
  15.   echo;
  16.   set /a p+=1
  17.   set /a pp=p*100/%sum%
  18.   echo %EscK%[1;36;40m!pp! %%%EscK%[0m
  19.   if !F! NEQ 1 set /p "str=%EscK%[u"<nul
  20.   set /p "str=%EscK%[7;33m%CellBar%%EscK%[0m"<nul
  21.   set /p "str=%EscK%[s"<nul
  22.   pathping -n -h 1 -q 1 -p 200 127.0.0.1 >nul
  23.   set F=2
  24. )
  25. echo;&echo;
  26. echo %EscK%[0m
  27. pause
  28. exit /b
复制代码

TOP

改一下进度条的写法。这次可以任意的“条目总数”和“进度条长度”
  1. @echo off
  2. for /F %%a in ('echo prompt $E ^| cmd') do set "EscK=%%a"
  3. setlocal EnableDelayedExpansion&cd /d "%~dp0"&title %~nx0&color 07
  4. ::总条目数量
  5. set sum=80
  6. ::进度条的总长度
  7. set ProgBarL=60
  8. ::提示信息所在行
  9. set NoteRow=3
  10. ::百分数所在行
  11. set PercentRow=5
  12. ::进度条所在行
  13. set ProgBarRow=6
  14. ::进度条颜色(示例随便选了256色的第155号色)
  15. set ProgBarColor=38;5;155
  16. set p=0
  17. for /L %%a in (1, 1, %sum%) do (
  18.   set /p "str=%EscK%[%NoteRow%;1H%EscK%[36m正在…………: %EscK%[32m%%a_%%a_%%a_%%a%EscK%[0m"<nul
  19.   set /a p+=1
  20.   set /a pp=100*p/%sum%
  21.   set /p "str=%EscK%[%PercentRow%;1H%EscK%[1;36;40m!pp! %%%EscK%[0m"<nul
  22.   set /a ProgBarNum=p*%ProgBarL%/%sum%
  23.   set "ProgBar="
  24.   for /L %%n in (1, 1, !ProgBarNum!) do set "ProgBar=!ProgBar! "
  25.   set /p "str=%EscK%[%ProgBarRow%;1H%EscK%[7;%ProgBarColor%m!ProgBar!%EscK%[0m"<nul
  26.   pathping -n -h 1 -q 1 -p 100 127.0.0.1 >nul
  27. )
  28. echo;&echo;
  29. pause
  30. echo %EscK%[m
  31. exit /b
复制代码

TOP

又写了过渡色进度条
(老了老了,简单算术问题居然想得头疼)
  1. @echo off
  2. for /F %%a in ('echo prompt $E ^| cmd') do set "EscK=%%a"
  3. setlocal EnableDelayedExpansion&cd /d "%~dp0"&title %~nx0&color 07
  4. ::总条目数量
  5. set sum=80
  6. ::进度条的总长度
  7. set ProgBarL=60
  8. ::提示信息所在行
  9. set NoteRow=5
  10. ::百分数所在行
  11. set PercentRow=7
  12. ::进度条所在行
  13. set ProgBarRow=8
  14. ::进度条颜色
  15. ::r;g;b  255;0;0 - 255;255;0
  16. set p=0
  17. for /L %%a in (1, 1, %sum%) do (
  18.   set /p "str=%EscK%[%NoteRow%;1H%EscK%[36m正在…………: %EscK%[32m%%a_%%a_%%a_%%a%EscK%[0m"<nul
  19.   set /a p+=1
  20.   set /a pp=100*p/%sum%
  21.   set /p "str=%EscK%[%PercentRow%;1H%EscK%[1;36;40m!pp! %%%EscK%[0m"<nul
  22.   set /a ProgBarNum=p*%ProgBarL%/%sum%
  23.   set /p "str=%EscK%[%ProgBarRow%;1H"<nul
  24.   set /a Bar_temp=256/%ProgBarL%
  25.   set /a Bar_temp2=256*pp/100
  26.   for /L %%g in (0,!Bar_temp!,!Bar_temp2!) do (
  27.     set /p "str=%EscK%[7;38;2;255;%%g;0m %EscK%[0m"<nul
  28.   )
  29.   pathping -n -h 1 -q 1 -p 100 127.0.0.1 >nul
  30. )
  31. echo;&echo;
  32. pause
  33. echo %EscK%[m
  34. exit /b
复制代码

TOP

本帖最后由 hnfeng 于 2024-7-16 13:45 编辑

最后改一下:百分数引导进度条
  1. @echo off
  2. for /F %%a in ('echo prompt $E ^| cmd') do set "EscK=%%a"
  3. setlocal EnableDelayedExpansion&cd /d "%~dp0"&title %~nx0&color 07
  4. ::总条目数量
  5. set sum=80
  6. ::进度条的总长度
  7. set ProgBarL=60
  8. ::提示信息所在行
  9. set NoteRow=5
  10. ::进度条所在行
  11. set ProgBarRow=8
  12. ::进度条颜色
  13. ::r;g;b  255;0;0 - 255;255;0
  14. set p=0
  15. for /L %%a in (1, 1, %sum%) do (
  16.   set /p "str=%EscK%[%NoteRow%;1H%EscK%[36m正在…………: %EscK%[32m%%a_%%a_%%a_%%a%EscK%[0m"<nul
  17.   set /a p+=1
  18.   set /a pp=100*p/%sum%
  19.   set /a ProgBarNum=p*%ProgBarL%/%sum%
  20.   set /p "str=%EscK%[%ProgBarRow%;1H"<nul
  21.   set /a Bar_temp=256/%ProgBarL%
  22.   set /a Bar_temp2=256*pp/100
  23.   for /L %%g in (0,!Bar_temp!,!Bar_temp2!) do (
  24.     set /p "str=%EscK%[7;38;2;255;%%g;0m %EscK%[0m"<nul
  25.   )
  26.   set /p "str=%EscK%[1;36;40m !pp!%%%EscK%[0m"<nul
  27.   pathping -n -h 1 -q 1 -p 100 127.0.0.1 >nul
  28. )
  29. echo;&echo;
  30. pause
  31. echo %EscK%[m
  32. exit /b
复制代码

TOP

Why join the navy, if you can be a pirate? - Steve Jobs

TOP

回复  hnfeng
功能很多,真的很多

这是微软的实例:
这是 VT100 转义的程序员手册:

我们论坛的实 ...
HOPE2021 发表于 2024-7-16 15:11



    谢谢分享

TOP

本帖最后由 HOPE2021 于 2024-7-16 16:18 编辑

回复 1# hnfeng
闪烁开关 [5m 是可以使用的,只不过必须在 Windows 终端里
其他您未实现的开关都必须在 Windows 终端中使用
Why join the navy, if you can be a pirate? - Steve Jobs

TOP

回复  hnfeng
闪烁开关 [5m 是可以使用的,只不过必须在 Windows 终端里
其他您未实现的开关都必须在 Wi ...
HOPE2021 发表于 2024-7-16 16:16



    确实如此,终端里可以。谢谢指教

TOP

感觉实际用途也没啥,除了弄那些花里胡哨的东西外

TOP

回复 11# Five66
不一定,在显示大量数据时对关键项进行高亮可以大大提高工作效率。
Why join the navy, if you can be a pirate? - Steve Jobs

TOP

返回列表