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

[游戏娱乐] 批处理将光标退回原点

  1. @echo off&setlocal enabledelayedexpansion
  2. :: 灵感来源于cn-dos趣味东的多行回退
  3. :: 趣味东发现用set /p输出一个tab+n个退格就将光标回退多行,但并不好控制
  4. :: 于是本人就想到是不是能将光标回退到原点(屏幕左上角)
  5. :: 结果发现用echo输出一个tab+n个退格就能将光标退回到原点过一格的位置,但有错误信息输出
  6. :: 于是,用2>nul屏蔽错误信息,并再加一个退格将光标退回原点
  7. :: 下面通过代码进行简单演示,至于原因本人暂未搞明白
  8. :: 因论坛处理不了tab,请将代码中的tab字符替换为实际的tab
  9. title 神奇的回退
  10. set "t=tab"
  11. for /l %%a in (1,1,1000) do set "k=!k!"
  12. for /l %%a in (1,1,10) do echo ○○○○○○○○○○
  13. ping /n 2 127.1>nul
  14. :: 这里将光标退回原点处,请仔细注意光标的位置
  15. echo %t%%k% 2>nul&set /p=<nul
  16. pause>nul
  17. :: 请注意6-10行第6-10个字符的输出是没有改变的
  18. for /l %%a in (1,1,5) do echo ●●●●●¤¤¤¤¤
  19. for /l %%a in (1,1,5) do echo ⊙⊙⊙⊙⊙
  20. pause>nul
复制代码
延伸:当我们实现了将光标退回原点后,那么就能随意控制光标退回到设定的位置了,再以代码示之:
  1. @echo off&setlocal enabledelayedexpansion
  2. :: 请同样将tab字符换成tab
  3. title 光标回退7行
  4. set "t=tab"
  5. for /l %%a in (1,1,1000) do set "k=!k!"
  6. for /l %%a in (1,1,20) do echo %%a%t%bathome
  7. ping /n 2 127.1>nul
  8. set /a n=20-7
  9. echo %t%%k% 2>nul&set /p=<nul
  10. for /l %%a in (1,1,%n%) do echo.
  11. set /p=现在光标回退到这里了<nul
  12. pause>nul
复制代码
4

评分人数

***共同提高***

win10好像失效了~有什么办法吗

TOP

本帖最后由 ShenMian 于 2018-2-3 22:00 编辑

回复 15# batman
我不是很在意可读性...
for /l %%a in (-1,1,%10) do set "k=!k!"

回复 19# idos
TEST...

TOP

回复 14# batman


    1.用echo+空格+tab+n*10+2个退格来实现回退N行,在14楼的例子中最外层循环执行到第二次的时候,数字向上跑了一行,而此时的退格键为两个,这是怎么一回事?
    2.用set /p输出一个tab+n个退格就将光标回退多行,实例中是用的echo输出,效果一样啊?

新手,求解答

TOP

2>nul是亮点,不过set /p可以省掉的,只需要任意字符打断tab与退格的关联即可:echo tab@

TOP

好强大,受益匪浅....

TOP

补充一点:
为确保退回到原点并重新输出字符时前面不会多出空格,建议将2>nul echo tab!k!改成2>nul echo tab!k!&set /p=<nul
***共同提高***

TOP

现给个直接点的测试代码:

一样将tab换成实际tab
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p h=请输入总行数:
  3. set /p t=请输入回退行数,请不要大于总行数:
  4. for /l %%a in (1,1,%h%) do echo 第%%a行:www.bathome.net is my home
  5. set /a t=t*10+2
  6. for /l %%a in (1,1,%t%) do set "k=!k!"
  7. 2>nul echo tab!k!
  8. pause>nul
复制代码

[ 本帖最后由 batman 于 2011-2-26 12:23 编辑 ]
***共同提高***

TOP

在思考一位朋友的问题时,又想到了光标回退,结果发现光标回退其实是有着规律可循的,经本人测试,如果想回退n行的话,就可以用echo+空格+tab+n*10+2个退格来实现,那么想要保证回到原点,必须知道当前输出了多少行(空行也算一行),测试代码如下(请将字符改为实际的tab):
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1,1,202) do (
  3.     set "k=!k!"&cls
  4.     for /l %%b in (1,1,20) do (
  5.         for /l %%c in (1,1,20) do set "str=!str!■"
  6.         echo !str!&set "str="
  7.     )
  8.     2>nul echo tab!k!
  9.  if %%a equ 202 set /p=<nul
  10.     echo %%a
  11.     for /l %%b in (1,1,1000) do echo>nul
  12. )
  13. pause>nul
复制代码

[ 本帖最后由 batman 于 2011-2-26 12:37 编辑 ]
***共同提高***

TOP

定位到指定列还是有问题,会修改后面的东西

TOP

哇,重大发现。真是太好了。

TOP

回复 10楼 的帖子

本帖最后由 523066680 于 2016-9-21 17:17 编辑

[ 本帖最后由 523066680 于 2010-2-11 08:59 编辑 ]

TOP

是否可以考虑写个函数,将光标退回到指定的行和例。
技术问题请到论坛发帖求助!

TOP

此法用在动画显示上真的超爽,即不用三方,速度也是嘎嘎的

在俄罗斯方块中引入后,不但不闪了,速度有所提升!

TOP

回复 6楼 的帖子

欢迎兄弟回家!
***共同提高***

TOP

返回列表