Board logo

标题: [特效代码] 求详解这段批处理代码 [打印本页]

作者: TAT    时间: 2022-2-19 23:15     标题: 求详解这段批处理代码

  1. 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 /?
  1. C:\Users\Cat>prompt /?
  2. 更改 cmd.exe 命令提示符。
  3. PROMPT [text]
  4.   text    指定新的命令提示符。
  5. 提示符可以由普通字符及下列特定代码组成:
  6.   $E   Escape 码(ASCII 码 27)
  7.   $$   $ (货币符号)
复制代码
2、下面是Win 11下的prompt /?
  1. C:\Users\Administrator>prompt /?
  2. 更改 cmd.exe 命令提示符。
  3. PROMPT [text]
  4.   text    指定新的命令提示符。
  5. 提示符可以由普通字符及下列特殊代码组成:
  6.   $E   转义码(ASCII 码 27)
  7.   $$   $ (美元符号)
复制代码
三、总结、猜想与疑问:
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


    首先,非常感谢你的回答,有讨论才有进步。
    附上代码出处
  1. https://c1ino.github.io/c1ino/2019/08-03-colored-echo-in-win10-command-prompt
复制代码
据网上资料,开头那段灵魂代码是个德国大佬写的。
    附上我基于上述链接中的代码修改而成的学习代码
  1. @echo off
  2. title 我的彩虹色阶- 8bit 256色输出.bat
  3. mode con: cols=40 lines=42
  4. ::设置窗口大小高40,宽33
  5. setlocal enabledelayedexpansion
  6. @for /f "delims=#" %%i in ('prompt #$E#^&echo on^&for %%a in ^(1^) do rem') do set ESC_CHAR=%%i
  7. set /a nlcnt=8
  8. rem 在这定义了一行有八列
  9. for /L %%i in (0,1,15) do (
  10.     set /a clrstr=1000+%%i
  11.     set /p "str=%ESC_CHAR%[7;40;38;5;%%im !clrstr:~-3! %ESC_CHAR%[m"<nul
  12.     set /a "newline=(%%i+1)%%nlcnt"
  13.     if "!newline!" equ "0" echo.
  14. )
  15. set /a nlcnt=6
  16. for /L %%i in (16,1,231) do (
  17.     set /a clrstr=1000+%%i
  18.     set /p "str=%ESC_CHAR%[7;40;38;5;%%im !clrstr:~-3! %ESC_CHAR%[m"<nul
  19.     set /a "newline=(%%i+3)%%nlcnt"
  20.     if "!newline!" equ "0" echo.
  21. )
  22. set /a nlcnt=8
  23. for /L %%i in (232,1,255) do (
  24.     set /a clrstr=1000+%%i
  25.     set /p "str=%ESC_CHAR%[7;40;38;5;%%im !clrstr:~-3! %ESC_CHAR%[m"<nul
  26.     set /a "newline=(%%i+1)%%nlcnt"
  27.     if "!newline!" equ "0" echo.
  28. )
  29. endlocal
  30. pause>nul
复制代码
近来事务繁多暂缓此帖学习进度。
    最后,再次感谢热心回答。




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