标题: [特效代码] ANSI的esc转义序列功能强大,有网友有兴趣研究研究吗 [打印本页]
作者: hnfeng 时间: 2024-7-15 22:29 标题: 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键输入
在批处理里面,也可以使用下面两种纯文字方法设置一个变量来使用- for /f "delims=#" %%i in ('prompt #$E#^&echo on^&for %%a in ^(1^) do rem') do set EscK=%%i
复制代码
或- for /F %%a in ('echo prompt $E ^| cmd') do set "EscK=%%a"
复制代码
还有:使用 echo 的方法,默认是会换行的,使用 set /p 的方法,默认不换行,当然,使用 echo 的方法时,可以加入 nA 就能让光标返回,相当于不换行
你在 CMD 窗口中试试:(里面的 ^[ 实际是 Ctrl+[ )- for /L %a in (1,1,10) do (@echo ^[[3A^[[36m%a_%a_%a^[[m&ping -n 2 127.1>nul)
复制代码
批处理:- @echo off
- for /F %%a in ('echo prompt $E ^| cmd') do set "EscK=%%a"
- echo;&echo;&echo;&echo;
- for /L %%a in (1,1,10) do (
- echo %EscK%[1A%EscK%[36m%%a_%%a_%%a%EscK%[0m
- ping -n 2 127.1>nul)
- )
- 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
作者: czjt1234 时间: 2024-7-16 05:53
厉害厉害,感谢分享
作者: hnfeng 时间: 2024-7-16 08:03
本帖最后由 hnfeng 于 2024-7-16 08:11 编辑
一个简单的进度条,抛砖引玉啦
仅仅是示例。只能在 需要处理的条数(sum)比 进度条长度(ProgBarL)少的情况下:
哪位高手精于算法,写一个较通用的进度条函数?
定义进度条的长度(例如70个字符位),条目数变量可不限制,都能正常显示进度条及百分率
进度条可以单色,甚至过度色……- @echo off
- for /F %%a in ('echo prompt $E ^| cmd') do set "EscK=%%a"
- setlocal EnableDelayedExpansion&cd /d "%~dp0"&title %~nx0&color 07
-
- set sum=48
-
- echo;
- set F=1
- set p=0
- set ProgBarL=60
- set /a Cell=%ProgBarL%/%sum%
- set "CellBar="
- for /L %%a in (1, 1, %Cell%) do set "CellBar=!CellBar! "
- for /L %%a in (1, 1, %sum%) do (
- if !F! NEQ 1 set /p "str=%EscK%[3F%EscK%[0K"<nul
- echo %EscK%[36m正在…………: %EscK%[32m%%a_%%a_%%a_%%a%EscK%[0m
- echo;
- set /a p+=1
- set /a pp=p*100/%sum%
- echo %EscK%[1;36;40m!pp! %%%EscK%[0m
- if !F! NEQ 1 set /p "str=%EscK%[u"<nul
- set /p "str=%EscK%[7;33m%CellBar%%EscK%[0m"<nul
- set /p "str=%EscK%[s"<nul
- pathping -n -h 1 -q 1 -p 200 127.0.0.1 >nul
- set F=2
- )
-
- echo;&echo;
- echo %EscK%[0m
- pause
- exit /b
复制代码
作者: hnfeng 时间: 2024-7-16 10:29
改一下进度条的写法。这次可以任意的“条目总数”和“进度条长度”- @echo off
- for /F %%a in ('echo prompt $E ^| cmd') do set "EscK=%%a"
- setlocal EnableDelayedExpansion&cd /d "%~dp0"&title %~nx0&color 07
-
- ::总条目数量
- set sum=80
-
- ::进度条的总长度
- set ProgBarL=60
- ::提示信息所在行
- set NoteRow=3
- ::百分数所在行
- set PercentRow=5
- ::进度条所在行
- set ProgBarRow=6
- ::进度条颜色(示例随便选了256色的第155号色)
- set ProgBarColor=38;5;155
-
- set p=0
- for /L %%a in (1, 1, %sum%) do (
- set /p "str=%EscK%[%NoteRow%;1H%EscK%[36m正在…………: %EscK%[32m%%a_%%a_%%a_%%a%EscK%[0m"<nul
- set /a p+=1
- set /a pp=100*p/%sum%
- set /p "str=%EscK%[%PercentRow%;1H%EscK%[1;36;40m!pp! %%%EscK%[0m"<nul
- set /a ProgBarNum=p*%ProgBarL%/%sum%
- set "ProgBar="
- for /L %%n in (1, 1, !ProgBarNum!) do set "ProgBar=!ProgBar! "
- set /p "str=%EscK%[%ProgBarRow%;1H%EscK%[7;%ProgBarColor%m!ProgBar!%EscK%[0m"<nul
- pathping -n -h 1 -q 1 -p 100 127.0.0.1 >nul
- )
-
- echo;&echo;
- pause
- echo %EscK%[m
- exit /b
复制代码
作者: hnfeng 时间: 2024-7-16 11:29
又写了过渡色进度条
(老了老了,简单算术问题居然想得头疼)- @echo off
- for /F %%a in ('echo prompt $E ^| cmd') do set "EscK=%%a"
- setlocal EnableDelayedExpansion&cd /d "%~dp0"&title %~nx0&color 07
-
- ::总条目数量
- set sum=80
-
- ::进度条的总长度
- set ProgBarL=60
- ::提示信息所在行
- set NoteRow=5
- ::百分数所在行
- set PercentRow=7
- ::进度条所在行
- set ProgBarRow=8
- ::进度条颜色
- ::r;g;b 255;0;0 - 255;255;0
-
- set p=0
- for /L %%a in (1, 1, %sum%) do (
- set /p "str=%EscK%[%NoteRow%;1H%EscK%[36m正在…………: %EscK%[32m%%a_%%a_%%a_%%a%EscK%[0m"<nul
- set /a p+=1
- set /a pp=100*p/%sum%
- set /p "str=%EscK%[%PercentRow%;1H%EscK%[1;36;40m!pp! %%%EscK%[0m"<nul
- set /a ProgBarNum=p*%ProgBarL%/%sum%
- set /p "str=%EscK%[%ProgBarRow%;1H"<nul
- set /a Bar_temp=256/%ProgBarL%
- set /a Bar_temp2=256*pp/100
- for /L %%g in (0,!Bar_temp!,!Bar_temp2!) do (
- set /p "str=%EscK%[7;38;2;255;%%g;0m %EscK%[0m"<nul
- )
- pathping -n -h 1 -q 1 -p 100 127.0.0.1 >nul
- )
-
- echo;&echo;
- pause
- echo %EscK%[m
- exit /b
复制代码
作者: hnfeng 时间: 2024-7-16 13:43
本帖最后由 hnfeng 于 2024-7-16 13:45 编辑
最后改一下:百分数引导进度条- @echo off
- for /F %%a in ('echo prompt $E ^| cmd') do set "EscK=%%a"
- setlocal EnableDelayedExpansion&cd /d "%~dp0"&title %~nx0&color 07
-
- ::总条目数量
- set sum=80
-
- ::进度条的总长度
- set ProgBarL=60
- ::提示信息所在行
- set NoteRow=5
- ::进度条所在行
- set ProgBarRow=8
- ::进度条颜色
- ::r;g;b 255;0;0 - 255;255;0
-
- set p=0
- for /L %%a in (1, 1, %sum%) do (
- set /p "str=%EscK%[%NoteRow%;1H%EscK%[36m正在…………: %EscK%[32m%%a_%%a_%%a_%%a%EscK%[0m"<nul
- set /a p+=1
- set /a pp=100*p/%sum%
- set /a ProgBarNum=p*%ProgBarL%/%sum%
- set /p "str=%EscK%[%ProgBarRow%;1H"<nul
- set /a Bar_temp=256/%ProgBarL%
- set /a Bar_temp2=256*pp/100
- for /L %%g in (0,!Bar_temp!,!Bar_temp2!) do (
- set /p "str=%EscK%[7;38;2;255;%%g;0m %EscK%[0m"<nul
- )
- set /p "str=%EscK%[1;36;40m !pp!%%%EscK%[0m"<nul
- pathping -n -h 1 -q 1 -p 100 127.0.0.1 >nul
- )
-
- echo;&echo;
- pause
- echo %EscK%[m
- exit /b
复制代码
作者: HOPE2021 时间: 2024-7-16 15:11
本帖最后由 HOPE2021 于 2024-7-16 15:17 编辑
回复 1# hnfeng
功能很多,真的很多
这是微软的实例:https://learn.microsoft.com/zh-cn/windows/console/console-virtual-terminal-sequences
这是 VT100 转义的程序员手册:https://vt100.net/docs/vt100-ug/contents.html
我们论坛的实例其实也很多:
http://www.bathome.net/viewthread.php?tid=60616
http://www.bathome.net/viewthread.php?tid=62306
Dostips 的实例更是令人大开眼界:
https://www.dostips.com/forum/viewtopic.php?f=3&t=9869
https://www.dostips.com/forum/viewtopic.php?f=3&t=10217&sid=a6788632111aade8b047a1ac67513896
https://www.dostips.com/forum/viewtopic.php?f=3&t=11308
https://www.dostips.com/forum/viewtopic.php?f=3&t=11251
https://www.dostips.com/forum/viewtopic.php?f=3&t=9824
https://www.dostips.com/forum/viewtopic.php?f=3&t=9222
作者: hnfeng 时间: 2024-7-16 15:24
回复 hnfeng
功能很多,真的很多
这是微软的实例:
这是 VT100 转义的程序员手册:
我们论坛的实 ...
HOPE2021 发表于 2024-7-16 15:11
谢谢分享
作者: HOPE2021 时间: 2024-7-16 16:16
本帖最后由 HOPE2021 于 2024-7-16 16:18 编辑
回复 1# hnfeng
闪烁开关 [5m 是可以使用的,只不过必须在 Windows 终端里
其他您未实现的开关都必须在 Windows 终端中使用
作者: hnfeng 时间: 2024-7-19 14:05
回复 hnfeng
闪烁开关 [5m 是可以使用的,只不过必须在 Windows 终端里
其他您未实现的开关都必须在 Wi ...
HOPE2021 发表于 2024-7-16 16:16
确实如此,终端里可以。谢谢指教
作者: Five66 时间: 2024-7-19 22:09
感觉实际用途也没啥,除了弄那些花里胡哨的东西外
作者: HOPE2021 时间: 2024-7-20 12:34
回复 11# Five66
不一定,在显示大量数据时对关键项进行高亮可以大大提高工作效率。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |