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

[特效代码] 批处理光标定位/光标回退或光标回走

光标定位/光标回退或光标回走

如果觉得原理很无聊,可以先看二楼演示。

===============================================================
//说明下,是先看到 batman 的帖子,后来看 趣味东 的(一开始还找不到,原来帐户名是 qwd)
//没什么特别的,只是总结一下前人的经验

多行回退
http://www.cn-dos.net/forum/viewthread.php?tid=50206

将光标退回原点
http://www.bathome.net/thread-7137-2-1.html

如何退回到上一行的行首                //同下
http://www.cn-dos.net/forum/viewthread.php?tid=42513
批处理能实让光标停在屏幕任意位置吗?        //先人提出问题
http://www.cn-dos.net/forum/viewthread.php?tid=49591

将光标移动到指定位置 xy.com        //三方
http://bbs.bathome.net/viewthread.php?tid=21398

多行回退(规律讨论篇)
http://bbs.bathome.net/viewthread.php?tid=11266
===============================================================

相关变量说明:

先导变量:
T TAB 制表符    *JS生成,写程序时可直接定义
B BACKSPACE 退格符
SP SPACES 空格串
K BS 退格串

ROW 总行数
COL 总列数

STP STEP 回走步长
PRE PREFIX 前置空格
SUF SUFFIX 后置空格
LEN STRING_LENGTH 回退前的字符字节数

传递参数:
X 指定行
Y 指定列

回走程序变量:
UP 回走一行的退格数(配合TAB)
SAPF 指定行的下一行到具体坐标的退格数(配合TAB)
SPN 到指定坐标的空格数  *用退格不能到达的位置用空格,当然会改写原内容*
BKN 到指定坐标的退格数  *步长超过1时,不在步长整数倍处的位置逐个退*

光标回走规律 基本公式:
步长 STP=LEN%%8
前缀 SUF=(COL-1)%%8   **
后缀 PRE=(COL-SUF)%%STP
  *特别*:当 "(COL-1)%%8=0" 时公式略有差别,具体见程序。

有了规律就有了思路,程序就简单了。下面是验证规律公式一个程序:
  1. ::光标回退/回走规律查看
  2. ::CODE BY cutebe AT BBS.BATHOME.NET
  3. @ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION
  4. SET/a"COL=42,LEN=33"  //可更改值,这里取COL大于LEN
  5. SET/aROW=26,CO7=COL-7,CO=(COL-7)/10+1
  6. MODE CON COLS=%COL% LINES=%ROW%
  7. SET JSF="%TMP%\TAB.JS"
  8. IF NOT EXIST %JSF% ECHO=WScript.echo(String.fromCharCode(9));>%JSF%
  9. FOR /F "DELIMS=" %%T IN ('CSCRIPT //NOLOGO %JSF%')DO SET T=%%T&SET "B="
  10. FOR /L %%C IN (1 1 %CO%)DO SET "TEXT=789|123456!TEXT!"
  11. :LOOP
  12. FOR /L %%I IN (1,1,189)DO (
  13.  CLS
  14.  FOR /L %%L IN (2 2 23)DO (
  15.   SET LI=0%%L
  16.   ECHO,&ECHO,第!LI:~-2!行!TEXT:~,%CO7%!
  17.  )
  18.  PAUSE
  19.  SET/p=         当<NUL
  20.  SET/p=%%I个<NUL
  21.  ECHO=
  22.  SET/p=!TEXT:~4,%LEN%!<NUL
  23.  SET K=
  24.  FOR /L %%A in (1,1,%%I) DO SET "K=%B%!K!"
  25.  SET/p=%T%!K!<NUL
  26.  SET/p=ABCDEFGH<NUL
  27.  PAUSE>NUL
  28. )
  29. GOTO :LOOP
复制代码
运行说明:
1、先按一下空格键,再按方向键对比变化;
2、更改 COL 与 LEN 值再运行对比。

以上程序验证了一般情况下的光标规律,具体程序加入对特殊情况的判断就可以了。
定位行列只要将光标先回到原点 (1,1) 再定位到指定行 X,再加一些空格 Y 就可以定位了。
为了不修改原屏内容,则定位到指定行下一行 X+1,再回走到上一行 Y 列。
当然到这里还没有完美,将验证程序 ROW 设为足够大(如:25),再运行程序会发现光标处字符串到了某一行后步长变为了1,最后停在了这一行。即无法再穿越回上一行了。根据验证程序,步长未变前最多能退 159 次(当然 qwd 和 batman 帖子中的退格数量上千的情况没有研究,不明所以),有兴趣可运行看看。
程序再次修改,回原点时每次退一行,因为即使是步长只有1也足够退一行。

最后程序有一些限制,具体如下:
1、前8列定被改写
2、SUFFIX (后置空格)部分除最后一列外定位相应位置时被改写,当然不定位这里时不变
3、最后一行会被改动
4、当 "(COL-1)%%8=0" 时全屏修改,因为这时 LEN 必需等于 COL-1
  *如果你把以上限制当作小毛病的话,应用时避开就好了。
  *在足够小的区域内将步长设为8就可以基本上不修改,当然最后一两行作为交换区域还是会改的。

可以利用的:
1、当步长为1时,可以只修改最后一行和头7列;
2、当 "(COL-1)%%8=0" 且窗口足够小时,可只改写最后两行。
3、其他

光标定位_初版_示例
  1. ::光标定位_初版
  2. ::CODE BY cutebe AT BBS.BATHOME.NET
  3. ::SETXY X Y
  4. ::X行,Y列
  5. ::这里将LEN固定为7,这样STP=1。可以看出后面的公式与代码都非常简单。
  6. @ECHO OFF
  7. TITLE 光标定位A
  8. SETLOCAL ENABLEDELAYEDEXPANSION
  9. MODE CON LINES=26 COLS=68
  10. :PREVAR
  11. SET JSF="%TMP%\TAB.JS"
  12. IF NOT EXIST %JSF% ECHO=WScript.echo(String.fromCharCode(9));>%JSF%
  13. FOR /F "DELIMS=" %%T IN ('CSCRIPT //NOLOGO %JSF%')DO SET "T=%%T"
  14. SET "B="
  15. FOR /F "SKIP=3 TOKENS=2" %%V IN ('MODE CON')DO (
  16.  SET/aN+=1
  17.  SET VAR!N!=%%V
  18. )
  19. SET/aROW=VAR1,COL=VAR2
  20. SET/aSUF=(COL-1)%%8,F=COL-SUF+9,CO=COL/10+1,CO7=COL-7
  21. FOR /L %%B IN (-30,1,%COL%)DO (
  22.  SET "K=!K!"&SET "TEXT=123456789|!TEXT!"
  23. )
  24. FOR /L %%L IN (2 3 25)DO (
  25.  SET LI=0%%L
  26.  ECHO,&ECHO,!TEXT:~,%CO7%!第!LI:~-2!行&ECHO,
  27. )
  28. CALL :SETXY 1 9
  29. SET/P= 按任意键继续 %K:~,14%<NUL
  30. PAUSE>NUL
  31. SET/P=<NUL
  32. CALL :SETXY ROW-1 COL-20
  33. SET/P= 按任意键继续 %K:~,14%<NUL
  34. PAUSE>NUL
  35. SET/P=<NUL
  36. CALL :SETXY (1+ROW)/2 (1+COL)/2
  37. SET/P= 按任意键继续 %K:~,14%<NUL
  38. PAUSE>NUL
  39. SET/P=<NUL
  40. CALL :SETXY 8 45
  41. SET/P= 按任意键继续 %K:~,14%<NUL
  42. PAUSE>NUL
  43. SET/P=<NUL
  44. CALL :SETXY 10 20
  45. SET/P= 演示结束 %K:~,10%<NUL
  46. PAUSE>NUL
  47. GOTO :EOF
  48. ::结束
  49. :SETXY X Y
  50. SET/aX=%1,Y=%2
  51. SET/aX2=X+2,Y1=COL-SUF+10-Y
  52. SET/P=%K%<NUL
  53. FOR /L %%T IN (2,1,%ROW%)DO (%原点%
  54.  SET/P=       <NUL
  55.  SET/P=%T%!K:~,%F%!<NUL
  56. )
  57. FOR /L %%B IN (3,1,%ROW%)DO ECHO,%末行首%
  58. ECHO,会消失的(%X%,%Y%)←光标位置
  59. FOR /L %%S IN (%X2%,1,%ROW%)DO (%指定行列%
  60.  SET/P=       <NUL
  61.  SET/P=%T%!K:~,%F%!<NUL
  62. )
  63. SET/P=       <NUL
  64. SET/P=%T%!K:~,%Y1%!<NUL
  65. GOTO :EOF
复制代码
光标定位_示例
  1. ::SETXY 光标定位
  2. ::CODE BY cutebe AT BBS.BATHOME.NET
  3. ::用法 CALL :SETXY X Y
  4. ::回退步骤:1 逐行回退到原点(因为一般情况下有回走159步的限制)
  5. ::     2 通过ECHO空行到指定行下一行(此命令不改写原内容)
  6. ::     3 最后回退到上一行指定坐标
  7. ::这里考虑了以下特殊情况
  8. ::COL-1能被8整除时/整除时25行用空格/26行加空格/后置区加空格定位
  9. @ECHO OFF
  10. SETLOCAL ENABLEDELAYEDEXPANSION
  11. SET/aCOLS=!RANDOM!%%61+42,LINES=!RANDOM!%%25+4
  12. MODE CON LINES=%LINES% COLS=%COLS%
  13. TITLE 光标定位   总行列:%LINES% %COLS%
  14. CALL :PREVAR 先导标签,即调用SETXY前先调用一次,且只需要一次。
  15. :LP 输入坐标演示
  16. CALL :SETXY ROW-2 1
  17. SET/pXY=请输入坐标(行,列)(如:5 11):%SP:~,9%%K:~,9%
  18. CALL :SETXY %XY%
  19. TITLE 光标定位 (%XY: =,%) (总行列:%ROW%,%COL%)
  20. SET "TXT=(%X%,%Y%)%SP:~,8%"
  21. SET/p=%TXT:~,9%%K:~,10%<NUL
  22. PAUSE>NUL
  23. GOTO :LP
  24. ::结束
  25. :PREVAR 先导变量,占用名:T B ROW COL FS FF SUF LEN STP PRE SAP SEG ONE CUR UP
  26. SET JSF="%TMP%\TAB.JS"
  27. IF NOT EXIST %JSF% ECHO=WScript.echo(String.fromCharCode(9));>%JSF%
  28. FOR /F "DELIMS=" %%T IN ('CSCRIPT //NOLOGO %JSF%')DO SET "T=%%T"
  29. SET "B="
  30. FOR /F "SKIP=3 TOKENS=2" %%V IN ('MODE CON')DO (
  31.  SET/aN+=1
  32.  SET VAR!N!=%%V
  33. )
  34. SET/aROW=VAR1,COL=VAR2,COL2=COL*2
  35. FOR /L %%I IN (0,1,%COL2%)DO SET "K=%B%!K!"&SET "SP= !SP!"
  36. SET/a"FUL=COL-1,AFT=FUL%%8,FS=(AFT-1)>>3,FF=FS&1,SUF=(FUL+FF)%%8"
  37. SET/aLEN=%RANDOM%%%8*(FS+1)+FF*FUL
  38. SET/aSTP=8-LEN%%8,PRP=(COL-SUF)%%STP,PRE=PRP-8*FS
  39. SET/aSAP=COL-SUF,SEG=SAP-PRE,ONE=SEG/STP+1,LDP=LEN-PRE
  40. SET/aCUR=LDP/STP+(LDP%%STP+PRP)/STP+1,UP=ONE+CUR
  41. GOTO :EOF
  42. :SETXY X Y 跳到指定坐标
  43. SET/aX=%1,Y=%2
  44. SET/a"TL=ROW-X-1,FW=TL>>7,FR=FW&1,FW2=(TL-1)>>7"
  45. SET/a"F2=TL*FR+FF*FW2*(FW+1),FK=F2>>7,FE=FK+1,FL=FK&1,LE2=LEN*FE,X2=X+F2"
  46. SET/a"TC=SAP-Y+1,FC=TC>>9,FX=FC+1,FM=FC&1,FP=Y-2>>9&1"
  47. SET/aTD=TC/STP*FX,TM=TC%%STP*FX-TC*FM
  48. SET/a"SAPF=CUR+1+TD-FF*FP,SPN=TC*FC*FE+FL*(Y-1),BKN=(TM+8*FF*FP)*(FX&FE)"
  49. SET/P=!K:~-%COL%,-1!<NUL
  50. FOR /L %%T IN (1,1,%ROW%)DO (%原点%
  51.  SET/P=!SP:~,%LEN%!<NUL
  52.  SET/P=%T%!K:~,%UP%!<NUL
  53.  SET/P=!K:~,%PRE%!<NUL
  54. )
  55. FOR /L %%B IN (1,1,%X2%)DO ECHO,%指定行或下一行%
  56. SET/P=!SP:~,%LE2%!<NUL%指定行列%
  57. SET/P=!T:~,%FE%!!K:~,%SAPF%!<NUL
  58. SET/P=!SP:~,%SPN%!!K:~,%BKN%!<NUL
  59. GOTO :EOF
复制代码
本人水平有限,错误再所难免。欢迎指正!谢谢!
如果觉得看不懂没兴趣,也可以先看二楼演示。
1

评分人数

    • Batcher: 感谢分享PB + 10 技术 + 1
如无特别说明,代码测试环境均为 XP SP3

应用
利用UNICODE头隐藏代码时,会输出错误信息。可用光标回退消除
条件:没有使用MODE命令更改CMD列宽;调用前使用过@ECHO OFF或命令提示符长度加首行输出信息合起来不超过一行(即79字节)

附件为头文件。
功能感觉有点鸡肋了,但还是放这儿吧。

代码如下(末尾有一空行,开关用编辑器插入FFFE):
  1.   2>NUL
  2. @SETLOCAL ENABLEDELAYEDEXPANSION
  3. @FOR /L %%I IN (2,1,80)DO @SET "K= !K!"&@SET "SP= !SP!"
  4. @SET/P= <NUL
  5. @SET/P= %K:~,11%<NUL
  6. @SET/P= %SP%%K%<NUL
  7. @SET/P= %K:~,11%<NUL
  8. @ENDLOCAL
复制代码
如无特别说明,代码测试环境均为 XP SP3

TOP

Windows 7下似乎是悲剧

TOP

回复 11# tmplinshi


    哈,我以前模仿寒夜的特效动画,是这样写的,只顾着简短了:
  1. @echo off&setlocal enabledelayedexpansion&title 跑圈特效 内敛函数+退行
  2. mode con: cols=61 lines=15&color 1f
  3. set "f=for /l %%a in (1 1 14)do "
  4. set "c=(%f:14=100%cd>nul)&"
  5. set "s=&set/p=#"
  6. %f:14=59%set t=!t!&set k= !k!
  7. (%f:1=0%(
  8. %f:14=58%%c%%s:#=  *%
  9. %f%%c%echo; &%s:#=!k!*%
  10. %f:14=59%%c%%s:#=* %
  11. %f%%c%echo !t:~,12!%s:#=*%
  12. ))<nul 2>nul
复制代码

TOP

谢谢版主提供示例动画。           2楼后一个代码实现的就是11楼的效果。
如无特别说明,代码测试环境均为 XP SP3

TOP

恩,切换成英文输入法后是这样了:
[attach]6362[/attach]

TOP

本帖最后由 cutebe 于 2013-5-14 12:54 编辑

再发一个应用效果演示代码,应该不会出现8楼情况了。
加了两行走字
  1. ::花边中走滚动字
  2. ::CODE BY cutebe AT BBS.BATHOME.NET
  3. @ECHO OFF
  4. SETLOCAL ENABLEDELAYEDEXPANSION
  5. SET/aCOLS=50,LINES=20
  6. MODE CON LINES=%LINES% COLS=%COLS%
  7. TITLE 光标定位 效果演示
  8. CALL :PREVAR
  9. ::开始
  10. SET STR= ☆◎◇□
  11. SET WLC=WELCOME TO%SP:~,9%
  12. SET WEB=BBS.BATHOME.NET%SP:~,17%
  13. SET/aXA=5,YA=9,XB=16,YB=47,XR=XA,YR=YA,LONG=(XB-XA+YB/2-YA/2)*2
  14. FOR /L %%I IN (1 1 7)DO (
  15.  FOR /L %%J IN (1 1 %LONG%)DO (
  16.   CALL :SETXY XR YR
  17.   SET/a"MOD=%%I%%2*(%%I/2+1)"
  18.   FOR %%K IN (!MOD!)DO SET/p=!STR:~%%K,1!<NUL
  19.   SET/a"FX1=XR-XB>>7,FX2=XA-XR>>7,FY1=YR-YB>>7,FY2=YA-YR>>7"
  20.   SET/a"XR+=-(FY1+1)*FX1+(FY2+1)*FX2,YR+=2*(-(FX2+1)*FY1+(FX1+1)*FY2)"
  21.   SET/aM+=1,N=M%%61
  22.   FOR %%N IN (!N!)DO SET W1=!WEB:~%%N!!WEB:~,%%N!
  23.   CALL :SETXY 12 13
  24.   SET/p=!SP:~,32!!K:~,32!!W1!<NUL
  25.   FOR %%N IN (!N!)DO SET W2=!WLC:~-%%N!!WLC:~,-%%N!
  26.   CALL :SETXY 10 13
  27.   SET/p=!SP:~,32!!K:~,32!!W2!<NUL
  28.  )
  29. )
  30. CALL :SETXY 7 20
  31. PAUSE
  32. GOTO :EOF
  33. ::结束
  34. :PREVAR 先导变量,占用名:T B ROW COL FS FF SUF LEN STP PRE SAP SEG ONE CUR UP
  35. SET JSF="%TMP%\TAB.JS"
  36. IF NOT EXIST %JSF% ECHO=WScript.echo(String.fromCharCode(9));>%JSF%
  37. FOR /F "DELIMS=" %%T IN ('CSCRIPT //NOLOGO %JSF%')DO SET "T=%%T"
  38. SET "B="
  39. FOR /F "SKIP=3 TOKENS=2" %%V IN ('MODE CON')DO (
  40.  SET/aN+=1
  41.  SET VAR!N!=%%V
  42. )
  43. SET/aROW=VAR1,COL=VAR2,COL2=COL*2
  44. FOR /L %%I IN (0,1,%COL2%)DO SET "K=%B%!K!"&SET "SP= !SP!"
  45. SET/a"FUL=COL-1,AFT=FUL%%8,FS=(AFT-1)>>3,FF=FS&1,SUF=(FUL+FF)%%8"
  46. SET/aLEN=%RANDOM%%%8*(FS+1)+FF*FUL
  47. SET/aSTP=8-LEN%%8,PRP=(COL-SUF)%%STP,PRE=PRP-8*FS
  48. SET/aSAP=COL-SUF,SEG=SAP-PRE,ONE=SEG/STP+1,LDP=LEN-PRE
  49. SET/aCUR=LDP/STP+(LDP%%STP+PRP)/STP+1,UP=ONE+CUR
  50. GOTO :EOF
  51. :SETXY X Y 跳到指定坐标
  52. SET/aX=%1,Y=%2
  53. SET/a"TL=ROW-X-1,FW=TL>>7,FR=FW&1,FW2=(TL-1)>>7"
  54. SET/a"F2=TL*FR+FF*FW2*(FW+1),FK=F2>>7,FE=FK+1,FL=FK&1,LE2=LEN*FE,X2=X+F2"
  55. SET/a"TC=SAP-Y+1,FC=TC>>9,FX=FC+1,FM=FC&1,FP=Y-2>>9&1"
  56. SET/aTD=TC/STP*FX,TM=TC%%STP*FX-TC*FM
  57. SET/a"SAPF=CUR+1+TD-FF*FP,SPN=TC*FC*FE+FL*(Y-1),BKN=(TM+8*FF*FP)*(FX&FE)"
  58. SET/P=!K:~-%COL%,-1!<NUL
  59. FOR /L %%T IN (1,1,%ROW%)DO (%原点%
  60.  SET/P=!SP:~,%LEN%!<NUL
  61.  SET/P=%T%!K:~,%UP%!<NUL
  62.  SET/P=!K:~,%PRE%!<NUL
  63. )
  64. FOR /L %%B IN (1,1,%X2%)DO ECHO,%指定行或下一行%
  65. SET/P=!SP:~,%LE2%!<NUL%指定行列%
  66. SET/P=!T:~,%FE%!!K:~,%SAPF%!<NUL
  67. SET/P=!SP:~,%SPN%!!K:~,%BKN%!<NUL
  68. GOTO :EOF
复制代码
如无特别说明,代码测试环境均为 XP SP3

TOP

应该不是这样的
你把输入法切成英文或是CMD窗口加一行试下。
如无特别说明,代码测试环境均为 XP SP3

TOP

[attach]6361[/attach]

TOP

这个还真没有。不会做动画图片阿
如无特别说明,代码测试环境均为 XP SP3

TOP

回复 5# cutebe


    哦,我还以为有图片演示呢

TOP

帖子有在2楼阿,刷新一下。
如无特别说明,代码测试环境均为 XP SP3

TOP

演示在哪里?2楼没看到

TOP

不错

TOP

本帖最后由 cutebe 于 2013-5-13 23:23 编辑

变量说明,有兴趣的朋友可以深入看下
FUL 用于公式:SUF=(COL-1)%%8,这里公式略有变形
AFT 接上,公式变形后作为计算SUF的中间变量
FS  满足条件:"(COL-1)%%8=0" 的标识(FLAG),满足条件时为-1,否则为0
FF  同上标识,结果不同(1,0)
PRP 计算前置空格数量公式变化后的中间变量
SAP 一列除去后置空格后的长度
SEG 前、后置空格将去掉后的长度
ONE 回到上一行相同位置退了几步
LDP 字符串长度与前置空格的差,计算CUR的中间变量
CUR 当前行回走到上一行前退的步数

TL  标记行是否等于ROW-1的中间变量
FW  标识ROW-1(-1,0),是不是最后一行
FR  标识ROW-1(1,0),同上
FW2 标识ROW-2(-1,0),用于"(COL-1)%%8=0"时的判断,是不是倒数第二行
F2  联合标记(ROW-1)(ROW-2)中间变量(-N)
FK  联合标识(-1,0),是不是最后两行,用于计算空格数
FE  联合标识(0,1),用于取消回走前的字符串输出
FL  联合标识(1,0),同FK
LE2 取消空格时,此变量为0
X2  回到原点后,向下走的行数,走到指定行下一行或同一行
TC  具体回走时,指定行回走的总长,同时用于判断Y坐标是否在后置空格SUF范围内
FC  列坐标Y在后置空格SUF内的标识(-1,0)
FX  同上(0,1)
FM  同上(1,0)
FP  用于"(COL-1)%%8=0"时的判断
TD  指定行回走的步数,配合TAB
TM  指定行单独回走的格数

不会写特效,见笑了。
  1. @ECHO OFF
  2. MODE CON COLS=48 LINES=10
  3. SETLOCAL ENABLEDELAYEDEXPANSION
  4. CALL :PREVAR 先导标签,即调用SETXY前先调用一次,且只需要一次。
  5. SET/aRO1=ROW-1,CO8=COL-8
  6. :LP 输入坐标演示
  7. SET/aRAN=!RANDOM!%%RO1+1,RA2=!RANDOM!%%CO8+9,RS=!RANDOM!%%9
  8. CALL :SETXY RAN RA2
  9. SET STR=     
  10. SET/p=!STR:~%RS%,1!<NUL
  11. TITLE 光标定位 (%RAN%,%RA2%) (总行列:%ROW%,%COL%)
  12. SET "TXT=(%X%,%Y%)%SP:~,8%"
  13. SET/p=<NUL
  14. GOTO :LP
  15. ::结束
  16. :PREVAR 先导变量,占用名:T B ROW COL FS FF SUF LEN STP PRE SAP SEG ONE CUR UP
  17. SET JSF="%TMP%\TAB.JS"
  18. IF NOT EXIST %JSF% ECHO=WScript.echo(String.fromCharCode(9));>%JSF%
  19. FOR /F "DELIMS=" %%T IN ('CSCRIPT //NOLOGO %JSF%')DO SET "T=%%T"
  20. SET "B="
  21. FOR /F "SKIP=3 TOKENS=2" %%V IN ('MODE CON')DO (
  22.  SET/aN+=1
  23.  SET VAR!N!=%%V
  24. )
  25. SET/aROW=VAR1,COL=VAR2,COL2=COL*2
  26. FOR /L %%I IN (0,1,%COL2%)DO SET "K=%B%!K!"&SET "SP= !SP!"
  27. SET/a"FUL=COL-1,AFT=FUL%%8,FS=(AFT-1)>>3,FF=FS&1,SUF=(FUL+FF)%%8"
  28. SET/aLEN=%RANDOM%%%8*(FS+1)+FF*FUL
  29. SET/aSTP=8-LEN%%8,PRP=(COL-SUF)%%STP,PRE=PRP-8*FS
  30. SET/aSAP=COL-SUF,SEG=SAP-PRE,ONE=SEG/STP+1,LDP=LEN-PRE
  31. SET/aCUR=LDP/STP+(LDP%%STP+PRP)/STP+1,UP=ONE+CUR
  32. GOTO :EOF
  33. :SETXY X Y 跳到指定坐标
  34. SET/aX=%1,Y=%2
  35. SET/a"TL=ROW-X-1,FW=TL>>7,FR=FW&1,FW2=(TL-1)>>7"
  36. SET/a"F2=TL*FR+FF*FW2*(FW+1),FK=F2>>7,FE=FK+1,FL=FK&1,LE2=LEN*FE,X2=X+F2"
  37. SET/a"TC=SAP-Y+1,FC=TC>>9,FX=FC+1,FM=FC&1,FP=Y-2>>9&1"
  38. SET/aTD=TC/STP*FX,TM=TC%%STP*FX-TC*FM
  39. SET/a"SAPF=CUR+1+TD-FF*FP,SPN=TC*FC*FE+FL*(Y-1),BKN=(TM+8*FF*FP)*(FX&FE)"
  40. SET/P=!K:~-%COL%,-1!<NUL
  41. FOR /L %%T IN (1,1,%ROW%)DO (%原点%
  42.  SET/P=!SP:~,%LEN%!<NUL
  43.  SET/P=%T%!K:~,%UP%!<NUL
  44.  SET/P=!K:~,%PRE%!<NUL
  45. )
  46. FOR /L %%B IN (1,1,%X2%)DO ECHO,%指定行或下一行%
  47. SET/P=!SP:~,%LE2%!<NUL%指定行列%
  48. SET/P=!T:~,%FE%!!K:~,%SAPF%!<NUL
  49. SET/P=!SP:~,%SPN%!!K:~,%BKN%!<NUL
  50. GOTO :EOF
复制代码
这个有点样子
  1. ::花边
  2. ::CODE BY cutebe AT BBS.BATHOME.NET
  3. @ECHO OFF
  4. SETLOCAL ENABLEDELAYEDEXPANSION
  5. SET/aCOLS=50,LINES=20
  6. MODE CON LINES=%LINES% COLS=%COLS%
  7. TITLE 光标定位 效果演示
  8. CALL :PREVAR
  9. ::开始
  10. SET STR= ☆★○●◎◇◆□■△▲
  11. SET/aXA=1,YA=9,XB=19,YB=49,XR=XA,YR=YA,LONG=(XB-XA+YB/2-YA/2)*2
  12. FOR /L %%I IN (1 1 21)DO (
  13.  FOR /L %%J IN (1 1 %LONG%)DO (
  14.   CALL :SETXY XR YR
  15.   SET/a"MOD=%%I%%2*(%%I/2+1)"
  16.   FOR %%K IN (!MOD!)DO SET/p=!STR:~%%K,1!<NUL
  17.   SET/a"FX1=XR-XB>>7,FX2=XA-XR>>7,FY1=YR-YB>>7,FY2=YA-YR>>7"
  18.   SET/a"XR+=(FY1+1)*FX2-(FY2+1)*FX1,YR+=2*((FX2+1)*FY2-(FX1+1)*FY1)"
  19.  )
  20. )
  21. CALL :SETXY 9 20
  22. PAUSE
  23. GOTO :EOF
  24. ::结束
  25. :PREVAR 先导变量,占用名:T B ROW COL FS FF SUF LEN STP PRE SAP SEG ONE CUR UP
  26. SET JSF="%TMP%\TAB.JS"
  27. IF NOT EXIST %JSF% ECHO=WScript.echo(String.fromCharCode(9));>%JSF%
  28. FOR /F "DELIMS=" %%T IN ('CSCRIPT //NOLOGO %JSF%')DO SET "T=%%T"
  29. SET "B="
  30. FOR /F "SKIP=3 TOKENS=2" %%V IN ('MODE CON')DO (
  31.  SET/aN+=1
  32.  SET VAR!N!=%%V
  33. )
  34. SET/aROW=VAR1,COL=VAR2,COL2=COL*2
  35. FOR /L %%I IN (0,1,%COL2%)DO SET "K=%B%!K!"&SET "SP= !SP!"
  36. SET/a"FUL=COL-1,AFT=FUL%%8,FS=(AFT-1)>>3,FF=FS&1,SUF=(FUL+FF)%%8"
  37. SET/aLEN=%RANDOM%%%8*(FS+1)+FF*FUL
  38. SET/aSTP=8-LEN%%8,PRP=(COL-SUF)%%STP,PRE=PRP-8*FS
  39. SET/aSAP=COL-SUF,SEG=SAP-PRE,ONE=SEG/STP+1,LDP=LEN-PRE
  40. SET/aCUR=LDP/STP+(LDP%%STP+PRP)/STP+1,UP=ONE+CUR
  41. GOTO :EOF
  42. :SETXY X Y 跳到指定坐标
  43. SET/aX=%1,Y=%2
  44. SET/a"TL=ROW-X-1,FW=TL>>7,FR=FW&1,FW2=(TL-1)>>7"
  45. SET/a"F2=TL*FR+FF*FW2*(FW+1),FK=F2>>7,FE=FK+1,FL=FK&1,LE2=LEN*FE,X2=X+F2"
  46. SET/a"TC=SAP-Y+1,FC=TC>>9,FX=FC+1,FM=FC&1,FP=Y-2>>9&1"
  47. SET/aTD=TC/STP*FX,TM=TC%%STP*FX-TC*FM
  48. SET/a"SAPF=CUR+1+TD-FF*FP,SPN=TC*FC*FE+FL*(Y-1),BKN=(TM+8*FF*FP)*(FX&FE)"
  49. SET/P=!K:~-%COL%,-1!<NUL
  50. FOR /L %%T IN (1,1,%ROW%)DO (%原点%
  51.  SET/P=!SP:~,%LEN%!<NUL
  52.  SET/P=%T%!K:~,%UP%!<NUL
  53.  SET/P=!K:~,%PRE%!<NUL
  54. )
  55. FOR /L %%B IN (1,1,%X2%)DO ECHO,%指定行或下一行%
  56. SET/P=!SP:~,%LE2%!<NUL%指定行列%
  57. SET/P=!T:~,%FE%!!K:~,%SAPF%!<NUL
  58. SET/P=!SP:~,%SPN%!!K:~,%BKN%!<NUL
  59. GOTO :EOF
复制代码
如无特别说明,代码测试环境均为 XP SP3

TOP

返回列表