标题: [特效代码] 求详解这段批处理代码 [打印本页]
作者: TAT 时间: 2022-2-19 23:15 标题: 求详解这段批处理代码
- for /F "tokens=1 delims=#" %%a in ('"prompt #$E# & echo on & for %%b in (1) do rem"') do set "ESC=%%a"
复制代码
如题,我知道功能是把ESC键用变量表示了,but这个in实在看不懂。。
作者: Echo11 时间: 2022-2-23 22:42
本帖最后由 Echo11 于 2022-2-23 23:14 编辑
一、具体也不懂。但是测试了一些数据。我直接在cmd窗口跑的。
1、win7
获得了一个“向左的箭头”符号,不知道如何判断是否是 ESC。如下图:
2、win 11
获得了一个效果是删除右边字符值。如下图:
二、也许问题出在prompt #$E#,不同系统版本这个$E含义有所不同,先看看帮助信息。
1、下面是Win7下的prompt /?- C:\Users\Cat>prompt /?
- 更改 cmd.exe 命令提示符。
-
- PROMPT [text]
-
- text 指定新的命令提示符。
-
- 提示符可以由普通字符及下列特定代码组成:
-
- $E Escape 码(ASCII 码 27)
- $$ $ (货币符号)
复制代码
2、下面是Win 11下的prompt /?- C:\Users\Administrator>prompt /?
- 更改 cmd.exe 命令提示符。
-
- PROMPT [text]
-
- text 指定新的命令提示符。
-
- 提示符可以由普通字符及下列特殊代码组成:
-
- $E 转义码(ASCII 码 27)
- $$ $ (美元符号)
复制代码
三、总结、猜想与疑问:
1、win7 和 win11下的prompt 命令扩展中, $E 和 $$,虽然说明被更改了,但是其实还是一样。都是 ASCII 码 27,即 Escape
2、相同命令,显示输出不同,也许是不同Windows的解释器不同的原因?
3、后面半段语句"echo on & for %b in (9999) do rem",这段“没有意义”的代码其实是为了回显 “命令提示符”和“REM”,以供给外层For /F语句去提取这个特殊的“命令提示符”——$E。
作者: TAT 时间: 2022-2-28 20:16
回复 2# Echo11
首先,非常感谢你的回答,有讨论才有进步。
附上代码出处- https://c1ino.github.io/c1ino/2019/08-03-colored-echo-in-win10-command-prompt
复制代码
据网上资料,开头那段灵魂代码是个德国大佬写的。
附上我基于上述链接中的代码修改而成的学习代码- @echo off
- title 我的彩虹色阶- 8bit 256色输出.bat
- mode con: cols=40 lines=42
- ::设置窗口大小高40,宽33
- setlocal enabledelayedexpansion
- @for /f "delims=#" %%i in ('prompt #$E#^&echo on^&for %%a in ^(1^) do rem') do set ESC_CHAR=%%i
-
- set /a nlcnt=8
- rem 在这定义了一行有八列
- for /L %%i in (0,1,15) do (
- set /a clrstr=1000+%%i
- set /p "str=%ESC_CHAR%[7;40;38;5;%%im !clrstr:~-3! %ESC_CHAR%[m"<nul
- set /a "newline=(%%i+1)%%nlcnt"
- if "!newline!" equ "0" echo.
- )
- set /a nlcnt=6
- for /L %%i in (16,1,231) do (
- set /a clrstr=1000+%%i
- set /p "str=%ESC_CHAR%[7;40;38;5;%%im !clrstr:~-3! %ESC_CHAR%[m"<nul
- set /a "newline=(%%i+3)%%nlcnt"
- if "!newline!" equ "0" echo.
- )
- set /a nlcnt=8
- for /L %%i in (232,1,255) do (
- set /a clrstr=1000+%%i
- set /p "str=%ESC_CHAR%[7;40;38;5;%%im !clrstr:~-3! %ESC_CHAR%[m"<nul
- set /a "newline=(%%i+1)%%nlcnt"
- if "!newline!" equ "0" echo.
- )
- endlocal
- pause>nul
复制代码
近来事务繁多暂缓此帖学习进度。
最后,再次感谢热心回答。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |