标题: [特效代码] 批处理光标定位/光标回退或光标回走 [打印本页]
作者: cutebe 时间: 2013-5-13 23:11 标题: 批处理光标定位/光标回退或光标回走
光标定位/光标回退或光标回走
如果觉得原理很无聊,可以先看二楼演示。
===============================================================
//说明下,是先看到 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" 时公式略有差别,具体见程序。
有了规律就有了思路,程序就简单了。下面是验证规律公式一个程序:- ::光标回退/回走规律查看
- ::CODE BY cutebe AT BBS.BATHOME.NET
- @ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION
- SET/a"COL=42,LEN=33" //可更改值,这里取COL大于LEN
- SET/aROW=26,CO7=COL-7,CO=(COL-7)/10+1
- MODE CON COLS=%COL% LINES=%ROW%
- SET JSF="%TMP%\TAB.JS"
- IF NOT EXIST %JSF% ECHO=WScript.echo(String.fromCharCode(9));>%JSF%
- FOR /F "DELIMS=" %%T IN ('CSCRIPT //NOLOGO %JSF%')DO SET T=%%T&SET "B="
- FOR /L %%C IN (1 1 %CO%)DO SET "TEXT=789|123456!TEXT!"
- :LOOP
- FOR /L %%I IN (1,1,189)DO (
- CLS
- FOR /L %%L IN (2 2 23)DO (
- SET LI=0%%L
- ECHO,&ECHO,第!LI:~-2!行!TEXT:~,%CO7%!
- )
- PAUSE
- SET/p= 当<NUL
- SET/p=%%I个<NUL
- ECHO=
- SET/p=!TEXT:~4,%LEN%!<NUL
- SET K=
- FOR /L %%A in (1,1,%%I) DO SET "K=%B%!K!"
- SET/p=%T%!K!<NUL
- SET/p=ABCDEFGH<NUL
- PAUSE>NUL
- )
- 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、其他
光标定位_初版_示例- ::光标定位_初版
- ::CODE BY cutebe AT BBS.BATHOME.NET
- ::SETXY X Y
- ::X行,Y列
- ::这里将LEN固定为7,这样STP=1。可以看出后面的公式与代码都非常简单。
- @ECHO OFF
- TITLE 光标定位A
- SETLOCAL ENABLEDELAYEDEXPANSION
- MODE CON LINES=26 COLS=68
-
- :PREVAR
- SET JSF="%TMP%\TAB.JS"
- IF NOT EXIST %JSF% ECHO=WScript.echo(String.fromCharCode(9));>%JSF%
- FOR /F "DELIMS=" %%T IN ('CSCRIPT //NOLOGO %JSF%')DO SET "T=%%T"
- SET "B="
- FOR /F "SKIP=3 TOKENS=2" %%V IN ('MODE CON')DO (
- SET/aN+=1
- SET VAR!N!=%%V
- )
- SET/aROW=VAR1,COL=VAR2
- SET/aSUF=(COL-1)%%8,F=COL-SUF+9,CO=COL/10+1,CO7=COL-7
- FOR /L %%B IN (-30,1,%COL%)DO (
- SET "K=!K!"&SET "TEXT=123456789|!TEXT!"
- )
-
- FOR /L %%L IN (2 3 25)DO (
- SET LI=0%%L
- ECHO,&ECHO,!TEXT:~,%CO7%!第!LI:~-2!行&ECHO,
- )
- CALL :SETXY 1 9
- SET/P= 按任意键继续 %K:~,14%<NUL
- PAUSE>NUL
- SET/P=<NUL
- CALL :SETXY ROW-1 COL-20
- SET/P= 按任意键继续 %K:~,14%<NUL
- PAUSE>NUL
- SET/P=<NUL
- CALL :SETXY (1+ROW)/2 (1+COL)/2
- SET/P= 按任意键继续 %K:~,14%<NUL
- PAUSE>NUL
- SET/P=<NUL
- CALL :SETXY 8 45
- SET/P= 按任意键继续 %K:~,14%<NUL
- PAUSE>NUL
- SET/P=<NUL
- CALL :SETXY 10 20
- SET/P= 演示结束 %K:~,10%<NUL
- PAUSE>NUL
- GOTO :EOF
- ::结束
-
- :SETXY X Y
- SET/aX=%1,Y=%2
- SET/aX2=X+2,Y1=COL-SUF+10-Y
- SET/P=%K%<NUL
- FOR /L %%T IN (2,1,%ROW%)DO (%原点%
- SET/P= <NUL
- SET/P=%T%!K:~,%F%!<NUL
- )
- FOR /L %%B IN (3,1,%ROW%)DO ECHO,%末行首%
- ECHO,会消失的(%X%,%Y%)←光标位置
- FOR /L %%S IN (%X2%,1,%ROW%)DO (%指定行列%
- SET/P= <NUL
- SET/P=%T%!K:~,%F%!<NUL
- )
- SET/P= <NUL
- SET/P=%T%!K:~,%Y1%!<NUL
- GOTO :EOF
复制代码
光标定位_示例- ::SETXY 光标定位
- ::CODE BY cutebe AT BBS.BATHOME.NET
- ::用法 CALL :SETXY X Y
- ::回退步骤:1 逐行回退到原点(因为一般情况下有回走159步的限制)
- :: 2 通过ECHO空行到指定行下一行(此命令不改写原内容)
- :: 3 最后回退到上一行指定坐标
- ::这里考虑了以下特殊情况
- ::COL-1能被8整除时/整除时25行用空格/26行加空格/后置区加空格定位
- @ECHO OFF
- SETLOCAL ENABLEDELAYEDEXPANSION
- SET/aCOLS=!RANDOM!%%61+42,LINES=!RANDOM!%%25+4
- MODE CON LINES=%LINES% COLS=%COLS%
- TITLE 光标定位 总行列:%LINES% %COLS%
-
- CALL :PREVAR 先导标签,即调用SETXY前先调用一次,且只需要一次。
- :LP 输入坐标演示
- CALL :SETXY ROW-2 1
- SET/pXY=请输入坐标(行,列)(如:5 11):%SP:~,9%%K:~,9%
-
- CALL :SETXY %XY%
-
- TITLE 光标定位 (%XY: =,%) (总行列:%ROW%,%COL%)
- SET "TXT=(%X%,%Y%)%SP:~,8%"
- SET/p=%TXT:~,9%%K:~,10%<NUL
- PAUSE>NUL
- GOTO :LP
- ::结束
-
- :PREVAR 先导变量,占用名:T B ROW COL FS FF SUF LEN STP PRE SAP SEG ONE CUR UP
- SET JSF="%TMP%\TAB.JS"
- IF NOT EXIST %JSF% ECHO=WScript.echo(String.fromCharCode(9));>%JSF%
- FOR /F "DELIMS=" %%T IN ('CSCRIPT //NOLOGO %JSF%')DO SET "T=%%T"
- SET "B="
- FOR /F "SKIP=3 TOKENS=2" %%V IN ('MODE CON')DO (
- SET/aN+=1
- SET VAR!N!=%%V
- )
- SET/aROW=VAR1,COL=VAR2,COL2=COL*2
- FOR /L %%I IN (0,1,%COL2%)DO SET "K=%B%!K!"&SET "SP= !SP!"
- SET/a"FUL=COL-1,AFT=FUL%%8,FS=(AFT-1)>>3,FF=FS&1,SUF=(FUL+FF)%%8"
- SET/aLEN=%RANDOM%%%8*(FS+1)+FF*FUL
- SET/aSTP=8-LEN%%8,PRP=(COL-SUF)%%STP,PRE=PRP-8*FS
- SET/aSAP=COL-SUF,SEG=SAP-PRE,ONE=SEG/STP+1,LDP=LEN-PRE
- SET/aCUR=LDP/STP+(LDP%%STP+PRP)/STP+1,UP=ONE+CUR
- GOTO :EOF
-
- :SETXY X Y 跳到指定坐标
- SET/aX=%1,Y=%2
- SET/a"TL=ROW-X-1,FW=TL>>7,FR=FW&1,FW2=(TL-1)>>7"
- SET/a"F2=TL*FR+FF*FW2*(FW+1),FK=F2>>7,FE=FK+1,FL=FK&1,LE2=LEN*FE,X2=X+F2"
- SET/a"TC=SAP-Y+1,FC=TC>>9,FX=FC+1,FM=FC&1,FP=Y-2>>9&1"
- SET/aTD=TC/STP*FX,TM=TC%%STP*FX-TC*FM
- SET/a"SAPF=CUR+1+TD-FF*FP,SPN=TC*FC*FE+FL*(Y-1),BKN=(TM+8*FF*FP)*(FX&FE)"
- SET/P=!K:~-%COL%,-1!<NUL
- FOR /L %%T IN (1,1,%ROW%)DO (%原点%
- SET/P=!SP:~,%LEN%!<NUL
- SET/P=%T%!K:~,%UP%!<NUL
- SET/P=!K:~,%PRE%!<NUL
- )
- FOR /L %%B IN (1,1,%X2%)DO ECHO,%指定行或下一行%
- SET/P=!SP:~,%LE2%!<NUL%指定行列%
- SET/P=!T:~,%FE%!!K:~,%SAPF%!<NUL
- SET/P=!SP:~,%SPN%!!K:~,%BKN%!<NUL
- GOTO :EOF
复制代码
本人水平有限,错误再所难免。欢迎指正!谢谢!
如果觉得看不懂没兴趣,也可以先看二楼演示。
作者: cutebe 时间: 2013-5-13 23:13
本帖最后由 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 指定行单独回走的格数
不会写特效,见笑了。- @ECHO OFF
- MODE CON COLS=48 LINES=10
- SETLOCAL ENABLEDELAYEDEXPANSION
- CALL :PREVAR 先导标签,即调用SETXY前先调用一次,且只需要一次。
- SET/aRO1=ROW-1,CO8=COL-8
- :LP 输入坐标演示
- SET/aRAN=!RANDOM!%%RO1+1,RA2=!RANDOM!%%CO8+9,RS=!RANDOM!%%9
- CALL :SETXY RAN RA2
- SET STR=
- SET/p=!STR:~%RS%,1!<NUL
-
- TITLE 光标定位 (%RAN%,%RA2%) (总行列:%ROW%,%COL%)
- SET "TXT=(%X%,%Y%)%SP:~,8%"
- SET/p=<NUL
- GOTO :LP
- ::结束
-
-
- :PREVAR 先导变量,占用名:T B ROW COL FS FF SUF LEN STP PRE SAP SEG ONE CUR UP
- SET JSF="%TMP%\TAB.JS"
- IF NOT EXIST %JSF% ECHO=WScript.echo(String.fromCharCode(9));>%JSF%
- FOR /F "DELIMS=" %%T IN ('CSCRIPT //NOLOGO %JSF%')DO SET "T=%%T"
- SET "B="
- FOR /F "SKIP=3 TOKENS=2" %%V IN ('MODE CON')DO (
- SET/aN+=1
- SET VAR!N!=%%V
- )
- SET/aROW=VAR1,COL=VAR2,COL2=COL*2
- FOR /L %%I IN (0,1,%COL2%)DO SET "K=%B%!K!"&SET "SP= !SP!"
- SET/a"FUL=COL-1,AFT=FUL%%8,FS=(AFT-1)>>3,FF=FS&1,SUF=(FUL+FF)%%8"
- SET/aLEN=%RANDOM%%%8*(FS+1)+FF*FUL
- SET/aSTP=8-LEN%%8,PRP=(COL-SUF)%%STP,PRE=PRP-8*FS
- SET/aSAP=COL-SUF,SEG=SAP-PRE,ONE=SEG/STP+1,LDP=LEN-PRE
- SET/aCUR=LDP/STP+(LDP%%STP+PRP)/STP+1,UP=ONE+CUR
- GOTO :EOF
-
- :SETXY X Y 跳到指定坐标
- SET/aX=%1,Y=%2
- SET/a"TL=ROW-X-1,FW=TL>>7,FR=FW&1,FW2=(TL-1)>>7"
- SET/a"F2=TL*FR+FF*FW2*(FW+1),FK=F2>>7,FE=FK+1,FL=FK&1,LE2=LEN*FE,X2=X+F2"
- SET/a"TC=SAP-Y+1,FC=TC>>9,FX=FC+1,FM=FC&1,FP=Y-2>>9&1"
- SET/aTD=TC/STP*FX,TM=TC%%STP*FX-TC*FM
- SET/a"SAPF=CUR+1+TD-FF*FP,SPN=TC*FC*FE+FL*(Y-1),BKN=(TM+8*FF*FP)*(FX&FE)"
- SET/P=!K:~-%COL%,-1!<NUL
- FOR /L %%T IN (1,1,%ROW%)DO (%原点%
- SET/P=!SP:~,%LEN%!<NUL
- SET/P=%T%!K:~,%UP%!<NUL
- SET/P=!K:~,%PRE%!<NUL
- )
- FOR /L %%B IN (1,1,%X2%)DO ECHO,%指定行或下一行%
- SET/P=!SP:~,%LE2%!<NUL%指定行列%
- SET/P=!T:~,%FE%!!K:~,%SAPF%!<NUL
- SET/P=!SP:~,%SPN%!!K:~,%BKN%!<NUL
- GOTO :EOF
复制代码
这个有点样子- ::花边
- ::CODE BY cutebe AT BBS.BATHOME.NET
- @ECHO OFF
- SETLOCAL ENABLEDELAYEDEXPANSION
- SET/aCOLS=50,LINES=20
- MODE CON LINES=%LINES% COLS=%COLS%
- TITLE 光标定位 效果演示
- CALL :PREVAR
-
- ::开始
- SET STR= ☆★○●◎◇◆□■△▲
- SET/aXA=1,YA=9,XB=19,YB=49,XR=XA,YR=YA,LONG=(XB-XA+YB/2-YA/2)*2
-
- FOR /L %%I IN (1 1 21)DO (
- FOR /L %%J IN (1 1 %LONG%)DO (
- CALL :SETXY XR YR
- SET/a"MOD=%%I%%2*(%%I/2+1)"
- FOR %%K IN (!MOD!)DO SET/p=!STR:~%%K,1!<NUL
- SET/a"FX1=XR-XB>>7,FX2=XA-XR>>7,FY1=YR-YB>>7,FY2=YA-YR>>7"
- SET/a"XR+=(FY1+1)*FX2-(FY2+1)*FX1,YR+=2*((FX2+1)*FY2-(FX1+1)*FY1)"
- )
- )
- CALL :SETXY 9 20
- PAUSE
- GOTO :EOF
- ::结束
-
- :PREVAR 先导变量,占用名:T B ROW COL FS FF SUF LEN STP PRE SAP SEG ONE CUR UP
- SET JSF="%TMP%\TAB.JS"
- IF NOT EXIST %JSF% ECHO=WScript.echo(String.fromCharCode(9));>%JSF%
- FOR /F "DELIMS=" %%T IN ('CSCRIPT //NOLOGO %JSF%')DO SET "T=%%T"
- SET "B="
- FOR /F "SKIP=3 TOKENS=2" %%V IN ('MODE CON')DO (
- SET/aN+=1
- SET VAR!N!=%%V
- )
- SET/aROW=VAR1,COL=VAR2,COL2=COL*2
- FOR /L %%I IN (0,1,%COL2%)DO SET "K=%B%!K!"&SET "SP= !SP!"
- SET/a"FUL=COL-1,AFT=FUL%%8,FS=(AFT-1)>>3,FF=FS&1,SUF=(FUL+FF)%%8"
- SET/aLEN=%RANDOM%%%8*(FS+1)+FF*FUL
- SET/aSTP=8-LEN%%8,PRP=(COL-SUF)%%STP,PRE=PRP-8*FS
- SET/aSAP=COL-SUF,SEG=SAP-PRE,ONE=SEG/STP+1,LDP=LEN-PRE
- SET/aCUR=LDP/STP+(LDP%%STP+PRP)/STP+1,UP=ONE+CUR
- GOTO :EOF
-
- :SETXY X Y 跳到指定坐标
- SET/aX=%1,Y=%2
- SET/a"TL=ROW-X-1,FW=TL>>7,FR=FW&1,FW2=(TL-1)>>7"
- SET/a"F2=TL*FR+FF*FW2*(FW+1),FK=F2>>7,FE=FK+1,FL=FK&1,LE2=LEN*FE,X2=X+F2"
- SET/a"TC=SAP-Y+1,FC=TC>>9,FX=FC+1,FM=FC&1,FP=Y-2>>9&1"
- SET/aTD=TC/STP*FX,TM=TC%%STP*FX-TC*FM
- SET/a"SAPF=CUR+1+TD-FF*FP,SPN=TC*FC*FE+FL*(Y-1),BKN=(TM+8*FF*FP)*(FX&FE)"
- SET/P=!K:~-%COL%,-1!<NUL
- FOR /L %%T IN (1,1,%ROW%)DO (%原点%
- SET/P=!SP:~,%LEN%!<NUL
- SET/P=%T%!K:~,%UP%!<NUL
- SET/P=!K:~,%PRE%!<NUL
- )
- FOR /L %%B IN (1,1,%X2%)DO ECHO,%指定行或下一行%
- SET/P=!SP:~,%LE2%!<NUL%指定行列%
- SET/P=!T:~,%FE%!!K:~,%SAPF%!<NUL
- SET/P=!SP:~,%SPN%!!K:~,%BKN%!<NUL
- GOTO :EOF
复制代码
作者: tmplinshi 时间: 2013-5-14 08:28
不错
作者: BAT-VBS 时间: 2013-5-14 08:31
演示在哪里?2楼没看到
作者: cutebe 时间: 2013-5-14 08:47
帖子有在2楼阿,刷新一下。
作者: BAT-VBS 时间: 2013-5-14 09:12
回复 5# cutebe
哦,我还以为有图片演示呢
作者: cutebe 时间: 2013-5-14 09:30
这个还真没有。不会做动画图片阿
作者: tmplinshi 时间: 2013-5-14 10:42
[attach]6361[/attach]
作者: cutebe 时间: 2013-5-14 11:22
应该不是这样的
你把输入法切成英文或是CMD窗口加一行试下。
作者: cutebe 时间: 2013-5-14 11:25
本帖最后由 cutebe 于 2013-5-14 12:54 编辑
再发一个应用效果演示代码,应该不会出现8楼情况了。
加了两行走字- ::花边中走滚动字
- ::CODE BY cutebe AT BBS.BATHOME.NET
- @ECHO OFF
- SETLOCAL ENABLEDELAYEDEXPANSION
- SET/aCOLS=50,LINES=20
- MODE CON LINES=%LINES% COLS=%COLS%
- TITLE 光标定位 效果演示
- CALL :PREVAR
-
- ::开始
- SET STR= ☆◎◇□
- SET WLC=WELCOME TO%SP:~,9%
- SET WEB=BBS.BATHOME.NET%SP:~,17%
- SET/aXA=5,YA=9,XB=16,YB=47,XR=XA,YR=YA,LONG=(XB-XA+YB/2-YA/2)*2
-
- FOR /L %%I IN (1 1 7)DO (
- FOR /L %%J IN (1 1 %LONG%)DO (
- CALL :SETXY XR YR
- SET/a"MOD=%%I%%2*(%%I/2+1)"
- FOR %%K IN (!MOD!)DO SET/p=!STR:~%%K,1!<NUL
- SET/a"FX1=XR-XB>>7,FX2=XA-XR>>7,FY1=YR-YB>>7,FY2=YA-YR>>7"
- SET/a"XR+=-(FY1+1)*FX1+(FY2+1)*FX2,YR+=2*(-(FX2+1)*FY1+(FX1+1)*FY2)"
-
- SET/aM+=1,N=M%%61
- FOR %%N IN (!N!)DO SET W1=!WEB:~%%N!!WEB:~,%%N!
- CALL :SETXY 12 13
- SET/p=!SP:~,32!!K:~,32!!W1!<NUL
- FOR %%N IN (!N!)DO SET W2=!WLC:~-%%N!!WLC:~,-%%N!
- CALL :SETXY 10 13
- SET/p=!SP:~,32!!K:~,32!!W2!<NUL
- )
- )
- CALL :SETXY 7 20
- PAUSE
- GOTO :EOF
- ::结束
-
- :PREVAR 先导变量,占用名:T B ROW COL FS FF SUF LEN STP PRE SAP SEG ONE CUR UP
- SET JSF="%TMP%\TAB.JS"
- IF NOT EXIST %JSF% ECHO=WScript.echo(String.fromCharCode(9));>%JSF%
- FOR /F "DELIMS=" %%T IN ('CSCRIPT //NOLOGO %JSF%')DO SET "T=%%T"
- SET "B="
- FOR /F "SKIP=3 TOKENS=2" %%V IN ('MODE CON')DO (
- SET/aN+=1
- SET VAR!N!=%%V
- )
- SET/aROW=VAR1,COL=VAR2,COL2=COL*2
- FOR /L %%I IN (0,1,%COL2%)DO SET "K=%B%!K!"&SET "SP= !SP!"
- SET/a"FUL=COL-1,AFT=FUL%%8,FS=(AFT-1)>>3,FF=FS&1,SUF=(FUL+FF)%%8"
- SET/aLEN=%RANDOM%%%8*(FS+1)+FF*FUL
- SET/aSTP=8-LEN%%8,PRP=(COL-SUF)%%STP,PRE=PRP-8*FS
- SET/aSAP=COL-SUF,SEG=SAP-PRE,ONE=SEG/STP+1,LDP=LEN-PRE
- SET/aCUR=LDP/STP+(LDP%%STP+PRP)/STP+1,UP=ONE+CUR
- GOTO :EOF
-
- :SETXY X Y 跳到指定坐标
- SET/aX=%1,Y=%2
- SET/a"TL=ROW-X-1,FW=TL>>7,FR=FW&1,FW2=(TL-1)>>7"
- SET/a"F2=TL*FR+FF*FW2*(FW+1),FK=F2>>7,FE=FK+1,FL=FK&1,LE2=LEN*FE,X2=X+F2"
- SET/a"TC=SAP-Y+1,FC=TC>>9,FX=FC+1,FM=FC&1,FP=Y-2>>9&1"
- SET/aTD=TC/STP*FX,TM=TC%%STP*FX-TC*FM
- SET/a"SAPF=CUR+1+TD-FF*FP,SPN=TC*FC*FE+FL*(Y-1),BKN=(TM+8*FF*FP)*(FX&FE)"
- SET/P=!K:~-%COL%,-1!<NUL
- FOR /L %%T IN (1,1,%ROW%)DO (%原点%
- SET/P=!SP:~,%LEN%!<NUL
- SET/P=%T%!K:~,%UP%!<NUL
- SET/P=!K:~,%PRE%!<NUL
- )
- FOR /L %%B IN (1,1,%X2%)DO ECHO,%指定行或下一行%
- SET/P=!SP:~,%LE2%!<NUL%指定行列%
- SET/P=!T:~,%FE%!!K:~,%SAPF%!<NUL
- SET/P=!SP:~,%SPN%!!K:~,%BKN%!<NUL
- GOTO :EOF
复制代码
作者: tmplinshi 时间: 2013-5-14 11:43
恩,切换成英文输入法后是这样了:
[attach]6362[/attach]
作者: cutebe 时间: 2013-5-14 12:46
谢谢版主提供示例动画。 2楼后一个代码实现的就是11楼的效果。
作者: CrLf 时间: 2013-5-14 18:31
回复 11# tmplinshi
哈,我以前模仿寒夜的特效动画,是这样写的,只顾着简短了:- @echo off&setlocal enabledelayedexpansion&title 跑圈特效 内敛函数+退行
- mode con: cols=61 lines=15&color 1f
- set "f=for /l %%a in (1 1 14)do "
- set "c=(%f:14=100%cd>nul)&"
- set "s=&set/p=#"
- %f:14=59%set t=!t!&set k= !k!
- (%f:1=0%(
- %f:14=58%%c%%s:#= *%
- %f%%c%echo; &%s:#=!k!*%
- %f:14=59%%c%%s:#=* %
- %f%%c%echo !t:~,12!%s:#=*%
- ))<nul 2>nul
复制代码
作者: Demon 时间: 2013-5-14 19:03
Windows 7下似乎是悲剧
作者: cutebe 时间: 2013-5-19 20:33
应用
利用UNICODE头隐藏代码时,会输出错误信息。可用光标回退消除
条件:没有使用MODE命令更改CMD列宽;调用前使用过@ECHO OFF或命令提示符长度加首行输出信息合起来不超过一行(即79字节)
附件为头文件。
功能感觉有点鸡肋了,但还是放这儿吧。
代码如下(末尾有一空行,开关用编辑器插入FFFE):- 2>NUL
- @SETLOCAL ENABLEDELAYEDEXPANSION
- @FOR /L %%I IN (2,1,80)DO @SET "K= !K!"&@SET "SP= !SP!"
- @SET/P= <NUL
- @SET/P= %K:~,11%<NUL
- @SET/P= %SP%%K%<NUL
- @SET/P= %K:~,11%<NUL
- @ENDLOCAL
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |