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

答案 -------显示5个A

  1. @echo off &setlocal enabledelayedexpansion&cls&color 1a
  2. set "space=  "
  3. call:y 2
  4. for /l %%i in (1 1 3) do (
  5. set/p=A<nul
  6. for /l %%1 in (1 1 300) do call echo.>nul
  7. )
  8. for /l %%i in (1 1 2) do (
  9.   cls
  10.   set /a t=2-%%i
  11.   call:y !t!
  12.   for /l %%i in (1 1 %%i) do echo !space!A
  13.   for /l %%i in (1 1 3) do set /p=A<nul
  14.   for /l %%1 in (1 1 300) do call echo.>nul
  15. )
  16. echo.
  17. pause
  18. exit /b
  19. :Y
  20. for /l %%i in (1 1 %1) do (echo.)
  21. goto:eof
复制代码

TOP

动画总结

     *************************我对动画学习的总结*******************  

1---为什么会看到动?
这是因为图象在大脑里面的短暂停留
  2---如何让图像动起来?
让一幅又一幅图像在你的眼前快速的显示,就实现了动起来的效果。
  3--帧的概念是怎么回事?
动画就是一幅又一幅的画面的连续,这中间的每一幅画面就可以叫帧。这个概念来自flash。
4--单屏动画是怎么回事?
     我们知道cmd默认的分辨率是300x80byte,但是这300行,被分成了12屏,每屏25行。可以用mode con命令查看和设置当前分辨率。所谓单屏动画,就是只使用前1---25行,显示1帧,这帧显示完了后,比如说再用cls清掉,接着,还是在前1--25行显示第二帧,如此往复,直到动画完成,单屏动画的优点是比较精准。但设置的难道较大。
5--多屏动画(刷屏动画)又是怎么回事情?
我们知道cmd有每屏有25行,我们一屏显示一帧,完了后刷屏,就进入了下一屏,不过
数下来应该是第26--50行了。我们在这一屏显示第二帧,这相当于除去了第一屏,以此类推,直到动画完成。记住刷屏动画最后要加上一句 pause 为什么?秘密,呵呵!什么秘密哦,动了手就知道了。刷屏动画的缺点是精确度差一些。
6---单屏动画和刷屏动画有差别吗?
  有!最明显的差别是单屏动画的默认光标在左上角,这样你使用的坐标系是x轴向右,y轴向下的坐标系。
   但是刷屏动画的默认光标是在右下角,你使用的坐标系是x轴向右,y轴向上的坐标系。
7---如何刷屏?
  分辨率是25行时,刷屏语句为for /l %%1 in (1 1 25) do echo.
25可以换成25的倍数。
  分辨率是40时,刷屏语句为for /l %%1 in (1 1 40)  do echo.
40同样可以 换成40的倍数。
8--如何更改分辨率?
用命令   mode con cols=50  lines=42
如果设置lines=足够大,将出现最大显示。
ok。

9---单屏动画和刷屏动画能否混用?
下面的例子说明了可以混合使用。
      
  1. @echo off &setlocal enabledelayedexpansion &cls &color 1a
  2. mode con cols=80 lines=25
  3. :one
  4. for /l %%1 in (1 1 80) do set "space= !space!"
  5. for /l %%i in (1 1 12) do (
  6.         for /l %%1 in (1 1 25) do echo.
  7.         set "u=%%i"
  8.         echo !space:~-%%i!→
  9.         for /l %%j in (1 1 !u!) do echo.
  10.         for /l %%1 in (1 1 30) do call echo.>nul
  11. )
  12. rem  这段程序是刷屏,把坐标原点定在左下角 for /l %%1 in (1 1 25) do echo.
  13. :two
  14. for /l %%i in (13 1 25) do (
  15.       cls
  16.       for /l %%j in (1 1 %%i) do echo.
  17.       echo !space:~-%%i!→
  18.       for /l %%1 in (1 1 30) do call echo.>nul
  19. )
  20. rem 这段程序是单屏幕动画,把坐标原点定在了左上角。cls的作用。
  21. pause>nul
复制代码
cmd中显示的是箭头从下到上运动,接着又从上到下。这中间坐标原点做了两次选择。

10---动画的大致分类拖尾动画与丢掉动画(不拖尾)
      
       通常丢掉动画要容易做的多,拖尾动画通常比不拖尾动画麻烦。
       拖尾即是指留下了运动轨迹的动画,丢掉就是不见运动轨迹的动画。
       拖尾动画还得看看高手们是怎么做的。
    我还得好好的吸取他们的经验。
    如果有人愿意介绍他的动画经验那是最好不过的了。
    我和其他初学者一样非常想听听其它爱好者的经验。
11--我想学习动画的第一步是要学会控制小方块向各个方向(拖尾于丢掉)运动吧
12--cmd中的动画其实是在作假,比如说从下倒上运动不是真的是那样运动的。因为cmd的显示总是先显示的在上面后显示的在下面,这点我们无法改变的。我们看到字符从下到上运动,其实是假的。是在欺骗我们的眼睛。cmd的动画,到有点象魔术。只有你欺骗得了眼睛就行。


[ 本帖最后由 myzwd 于 2009-3-20 19:19 编辑 ]

TOP

findstr简单实例---输入彩色标签

----1
  1. @echo off
  2. rem findstr让输入的字成为彩色字体的方案
  3. set tt="I LOVE HOME OF BATCH"
  4. set /p= <nul>%tt%
  5. findstr /a:24 z* %tt%*
  6. echo.
  7. del %tt%
复制代码
---2
  1. @echo off
  2. rem findstr让输入的字成为彩色字体的方案
  3. set tt="I LOVE HOME OF BATCH"
  4. echo  >%tt%
  5. findstr /a:24 z* %tt%*
  6. del %tt%
复制代码
--3
  1. echo.>rr
  2. findstr /a:0c 1* rr*
  3. del /q rr
复制代码

TOP

先收藏了   以后慢慢学  慢慢看

TOP

回复 1楼 的帖子

    dos中的逐帧动画原理
  我在一直在想如何让小方块,从下到上堆放,想来想起也没想出个头绪了来,因为dos的
显示机制,是先显示的在上面,后显示的在下面。跟要命的是显示时行高还在不停的变化。我们可以容易的让小方块从左向右运动,也可以让小方块从右向左运动,或从上到下运动,这只要利用退格符就可以办到。
    让小方块从下到上堆放,就不太好办了。于是我想到了flash的逐帧动画,我动手一试
发现效果相当不错。利用帧可以自由的控制行高,控制小方块的走向。
    在此我把它记录下来,奉献给网友。
  1. @echo off&setlocal enabledelayedexpansion&color 0A &cls
  2. rem  by myzwd 2009 -3 -10
  3. :1
  4. echo.&echo.&echo.&echo.&echo.&echo.&echo.&echo.
  5. echo          aaa
  6. echo ----------------------------
  7. for /l %%1 in (1 1 200) do (call echo.>nul)
  8. cls
  9. :2
  10. echo.&echo.&echo.&echo.&echo.&echo.&echo.
  11. echo          222
  12. echo          aaa
  13. echo ----------------------------
  14. for /l %%1 in (1 1 200) do (call echo.>nul)
  15. cls
  16. :3
  17. echo.&echo.&echo.&echo.&echo.&echo.
  18. echo          333
  19. echo          222
  20. echo          aaa
  21. echo ----------------------------
  22. for /l %%1 in (1 1 200) do (call echo.>nul)
  23. cls
  24. :4
  25. echo.&echo.&echo.&echo.&echo.
  26. echo          444
  27. echo          333
  28. echo          222
  29. echo          aaa
  30. echo ----------------------------
  31. for /l %%1 in (1 1 200) do (call echo.>nul)
  32. cls
  33. :5
  34. echo.&echo.&echo.&echo.
  35. echo          555
  36. echo          444
  37. echo          333
  38. echo          222
  39. echo          aaa
  40. echo ----------------------------
  41. for /l %%1 in (1 1 200) do (call echo.>nul)
  42. cls
  43. :6
  44. echo.&echo.&echo.
  45. echo          666
  46. echo          555
  47. echo          444
  48. echo          333
  49. echo          222
  50. echo          aaa
  51. echo ----------------------------
  52. for /l %%1 in (1 1 200) do (call echo.>nul)
  53. cls
  54. :7
  55. echo.&echo.
  56. echo          777
  57. echo          666
  58. echo          555
  59. echo          444
  60. echo          333
  61. echo          222
  62. echo          aaa
  63. echo ----------------------------
  64. for /l %%1 in (1 1 200) do (call echo.>nul)
  65. cls
  66. :8
  67. echo.
  68. echo          888
  69. echo          777
  70. echo          666
  71. echo          555
  72. echo          444
  73. echo          333
  74. echo          222
  75. echo          aaa
  76. echo ----------------------------
  77. for /l %%1 in (1 1 200) do (call echo.>nul)
  78. cls
  79. :9
  80. echo          999
  81. echo          888
  82. echo          777
  83. echo          666
  84. echo          555
  85. echo          444
  86. echo          333
  87. echo          222
  88. echo          aaa
  89. echo ----------------------------
  90. for /l %%1 in (1 1 200) do (call echo.>nul)
  91. echo 谢谢观看  本人借鉴了flash的帧的概念,做了这个动画演示
  92. echo 以上是一个保持10行不变的动画演示。
  93. echo 从此以后,动画不在是高手的专利
  94. goto:eof
  95. dos动画难,但是利用flash的帧的概念,确很容易创建动画。上面的没个子程序就是一帧
  96. 上面的程序只是演示动画原理。我坚信从此以后,动画不在是高手的专利了。利用帧的概念做动画要比
  97. 用其它方法简单的多,易学易用。
  98. 有兴趣的朋友,可以试试。你5分钟就会做动画。
  99.    详细内容整理中。
复制代码
说几个相关问题,我认为比较重要。

1----1帧可以理解为一幅固定的画面,我们的动画要求在cmd窗口保持画面的大小始终不变,动画就是有一帧一帧的
      不断被替换的画面组成。那么如何确定帧的高度呢?
2---dos中的x,y坐标的概念
     例子:
    @echo off
    set  “space=         ”  
    rem  有10个空格
    echo.&echo.&echo.
    echo %space%A
    ----------------------将在cmd窗口 y坐标=10,x坐标=4的地方显示A.
   这个例子就是说明dos中的坐标可以用echo和空格去确定。
  空格--坐标 这个概念及其重要!如何生成空格重要,bat里面输入空格其方法要特别注意。
3---动画速度控制语句,这是动画必不可少的。
   有两种语句
   ping -n 2 hostlocal     ----ping语句的缺陷是会留下闪烁的光标。
   for  /l %%i in (1 1 100)  echo.>nul   ----如果你觉得显示过快,那就用下面的控制语句
   for  /l %%i in (1 1 100)  (call echo.>nul ) ----call 的速度是比较慢的。
4---显示语句,这也是动画必备的语句
   echo 和set /p
   关于set /p有几种写法,效果一样。
   set /p=123<nul
   set /p "=123"<nul
   set /p "tt=123"<nul
   nul的作用是把下一行的显示拉到上一行去。
   如:
        @echo off
         set /p=123>nul
         set /p=abc>nul
   ---------回显 123abc
   又如:
       @echo off
    set /p=123>nul
     echo  abc
-------显示 123abc
  注意nul 对echo 没作用,你加上也没有用。
   echo.   这是回显一个空行,作用是y坐标加1.
----退格符号
   让光标前移一个字节,注意是一个字节。即1byte 。光标是动态的计算的。
---列表循环(list)语句
    for /l  %%i  in (oringalvalue step  endvalue) do command
   for等起循环作用的语句,可以用来设置帧的重复。
---cls语句,用来清出上一帧留下的画面。
---帧的设置应该争守的原则:保持行高为一常数。
   
    帧的结构模样可以是这样
    :1   ----这里定义帧号
    echo --------------定义帧的开始
    这中间由echo定义行数n,这样总的行高=n+2
    echo--------------  定义帧的结束
    cls
    for /l %%i in (1 1 100) (call echo>nul)
    帧可以放到主程序的后面,大致可以这样放
    :main   ---这是主程序
    call:1
   .call;2
     ......
    echo 谢谢观看
    goto:eof
    :1
    ...............
    :2
    ...........
    :3
    ............
   
  1. @echo off&setlocal enabledelayedexpansion&color 0A &cls
  2. rem by myzwd 2009 -3 -10
  3. :main
  4. call:1
  5. goto:eof
  6. :1
  7. for /l %%i in (1 1 8) do (
  8. set /a n+=1
  9. set /a m=8-!n!
  10. for /l %%i in (!m! -1 1) do (echo.)
  11. for /l %%i in (1 1 !n!) do (echo aaa)
  12. echo ----------------------------
  13. for /l %%1 in (1 1 200) do (call echo.>nul)
  14. cls
  15. )
  16. :end
  17. for /l %%i in (1 1 8) do (echo aaa)
  18. echo ----------------------------
  19. echo 此为上述代码整理
  20. goto:eof
复制代码
   
   
set /a m=8-!n! 这句话就是数学中的m+n=8帧的高度为8。帧的高度就是用的这个数字8
逐帧动画的程序编制起来,有种结构化的感觉。





  1. 我的动画学习心的
  2. for /l %%i in (1 1 20) do (  ---------定义帧循环次数
  3.     for /l %%j in (1 1 %%i) do (   --------定义一帧的开始语句
  4.      set "sp1= !sp1!"                    -----中间这些语句用来描述帧的特征
  5.      set /p=!sp1!■<nul
  6.      for /l %%1 in (1 1 100) do (call echo.>nul)  --动画速度控制语句
  7.      cls                                    ----换帧语句
  8.     )                                           ----定义一帧的结束
  9. )   ---------定义帧循环次数
  10.                   
复制代码

  1. @echo off&setlocal enabledelayedexpansion&cls&color 0a
  2. rem 小方块反复从右开始运动--求余运算"%%"
  3. rem 数据指针嵌套方法"%%...!..!%%"
  4. for /l %%1 in (1 1 79) do (set space= !space!)
  5. for /l %%j in (1 1 100) do (
  6.      set /a "mod=%%j%%20"
  7.      if !mod!==0  (set /a "t=%%j/20" &set n=0)
  8.      for /l %%1 in (1 1 !t!) do (echo.)
  9.      set /a n+=1
  10.      call set sp=%%space:~0,-!n!%%
  11.      set /p=!sp!■<nul
  12.      
  13.      for /l %%1 in (1 1 50) do (call echo.>nul)
  14.      cls
  15. )
复制代码



  题外话,记得以前,我开始做网页的时候,不知道html是什么东西,于是就在网上找,后来我就找到了一个学习的地方,一个非常好的地方,我的html 就是在那里学习的。对vbs   js脚本有兴趣的朋友,请收藏这个网此吧。相信是
你最好去处。w3school  我想你在学vbs不可能不知道w3c吧。
http://www.w3school.com.cn/vbscript/index.asp

【sed 命令解答】
http://www.ringkee.com/note/opensource/sed.htm

[ 本帖最后由 myzwd 于 2009-3-20 11:38 编辑 ]

TOP

你总结的“122性质”是什么样的?怎么不表达出来?

这也叫“隐藏的性质”?这是它本来的性质好不好。

另外,这个帖子成了专门谈退格符的了,如有必要请修改标题。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

对退格符的性质认识

我利用退格符,编写小方块从右向左运动时,小方块不是等距离倒退,如下面的程序所示:
  1. @echo off&color 1c
  2. set sp=
  3. for /l %%1 in (1 1 50) do ( set /p "sp=0"<NUL)
  4. for /l %%i in (1 1 40) do (
  5. for /l %%1 in (1 1 100) do (echo.>nul)
  6. for /l %%j in (1 1 %%i) do (set /p=<NUL)
  7. set /p=■<NUL
  8. )
  9. ECHO.
复制代码
找来找去也没找到原因,最后只好去从新研究退格符的性质,原来是退格符的一条隐藏的性质我没发现,
先将实验整里如下---------------
  1.   
  2. @echo off
  3. echo 实验1
  4. for /l %%1 in (1 1 10) do ( set /p "sp=0"<nul)
  5. set /p=A<nul
  6. set /p=B<nul
  7. set /p=C<nul
  8. set /p=D<nul
  9. set /p=E<nul
  10. echo.
  11. rem  显示0000000000E
复制代码
  1.   
  2. @echo off
  3. echo 实验2
  4. set sp=
  5. for /l %%1 in (1 1 10) do ( set /p "sp=0"<nul)
  6. set /p=A<nul
  7. set /p=B<nul
  8. set /p=C<nul
  9. set /p=D<nul
  10. set /p=E<nul
  11. echo.
  12. rem  显示00000EDCBA
复制代码
  1.   
  2. @echo off
  3. echo 实验3
  4. set sp=
  5. for /l %%1 in (1 1 12) do ( set /p "sp=0"<nul)
  6. set /p=A<nul
  7. set /p=B<nul
  8. set /p=C<nul
  9. set /p=D<nul
  10. set /p=E<nul
  11. echo.
  12. REM  显示 00E000D00C0BA
复制代码
显见要实现等距离倒退,应采用实验2的结果。
到此已经可以利用这些实验结果编制正方形逆时针显示的三边程序了。
对了还差由下到上显示的方法。
  1. @echo off&color 1c
  2. echo 原来这样就可以实现等距离拖尾倒退
  3. echo  实验4
  4. set sp=
  5. for /l %%1 in (1 1 50) do ( set /p "sp=0"<nul)
  6. set /p=■<nul
  7. for /l %%i in (1 1 40) do (
  8.    for /l %%1 in (1 1 100) do (echo.>nul)
  9.    set /p=■<nul
  10. )
  11. ECHO.
复制代码
看来要注意一下退格符号的实验2性质,它不是想象中的那样。通常把实现等距离倒退想象成实验3的样子,但那是错误的。


该方法我把它叫做----122方法,这样好记忆。


下面分析实验:
退格符号的光标位置从什么地方开始计算?
@echo off
set sp=
for /l %%1 in (1 1 12) do ( set /p "sp=0"<nul)
set /p=A<nul
set /p=B<nul
set /p=C<nul
set /p=D<nul
set /p=E<nul
echo.
REM  显示 00E000D00C0BA
   
  上面的程序运行后,为什么不是显示0000000EDCBA?
这是因为退格符的光标计算不是想象中的总是从第一个字母A开始计算的,
而是要从上一次结果开始计算光标位置的。分析如下:符号“|”表示当前光标位置
初始显示状态12个0:000000000000
1---运行set /p=A<nul后
运行前:000000000000| A-----》运行后:000000000000A |   
2---运行set /p=B<nul后
运行前:00000000000A| B-----》运行后:00000000000B| A  
3---set /p=C<nul
运行前:00000000000B| AC-----》运行后:000000000C| 0BA   
4---set /p=C<nul
运行前:000000000C| 0BAD-----》运行后:000000D| 00C0BA   
5---set /p=C<nul
运行前:000000D| 00C0BAE-----》运行后:00E| 000D00C0BA   
重要性质: 1---退格符号的光标要变动的计算!!!!。
                    2---退格后光标总是留在字母的右面。
                    3--退格符只具有覆盖原字符的作用,不删除原字符。


122方法--利用退格符构造反向拖尾等距离运动
  由于退格符号的光标计算是变动的计算的,所以要利用退格符构造向右的(反向)匀速等距离运动,添加退格符的个数不得按等差数列添加,而是要按数列1 2 2 ......(2 2 2..或3 2 2....或4 2 2...)的方式添加退格符的个数。其余情况以次类推。
就如上面的实验四演示的那样
                 以前 我平空想象,以为退格符的光标总是从一个固定的起点开始计算的。做了实验已算是自我纠正了错误。

  1.   rem  我的动画基本代码 by myzwd
  2. rem   ----拖尾向右移动
  3. @echo off
  4. setlocal enabledelayedexpansion&color 1d
  5. for /l %%i in (1 1 80) do (
  6.     set /p=■<nul
  7.     for /l %%1 in (1 1 100) do (echo.>nul)
  8. )
  9. set sp=
  10. rem  -----无拖尾向右移动,堆放在右面
  11. @echo off
  12. setlocal enabledelayedexpansion&color 1d
  13. for /l %%i in (1 1 80) do (
  14.        set /p=  <nul
  15.        for /l %%1 in (1 1 100) do (echo.>nul)
  16.        set /p=■<nul
  17. )
  18. set sp=
  19. rem   -----无拖尾向右移动,右面无堆放
  20. @echo off
  21. setlocal enabledelayedexpansion&color 1d
  22. for /l %%i in (1 1 80) do (
  23.        set /p "tt=■ "<nul
  24.        for /l %%1 in (1 1 100) do (echo.>nul)
  25.        set /p "ss=   "<nul
  26. )
  27. set sp=
  28. rem  -----拖尾逆向运动
  29. @echo off
  30. setlocal enabledelayedexpansion&color 1d
  31. for /l %%i in (1 1 78) do (set /p "=0"<nul)
  32. for /l %%i in (1 1 80) do (
  33.        set /p "=■"<nul
  34.        for /l %%1 in (1 1 100) do (echo.>nul)
  35.        set /p "=■"<nul
  36. )
  37. set sp=
  38. rem   -----拖尾逆向运动
  39. @echo off
  40. setlocal enabledelayedexpansion&color 1d
  41. for /l %%i in (1 1 70) do (set /p "=0"<nul)
  42. set /p "=■"<nul
  43. for /l %%i in (1 1 80) do (
  44.       
  45.        for /l %%1 in (1 1 100) do (echo.>nul)
  46.        set /p "=■"<nul
  47. )
  48. set sp=
  49. -rem   ----跳过右面4个方块的位置拖尾逆向运动
  50. @echo off
  51. setlocal enabledelayedexpansion&color 1d
  52. for /l %%i in (1 1 70) do (set /p "=0"<nul)
  53. set /p "=■"<nul
  54. rem 这里的作用是用来来跳过右面的0
  55. for /l %%i in (1 50) do (
  56.        for /l %%1 in (1 1 100) do (echo.>nul)
  57.        set /p "=■"<nul
  58. )
  59. set sp=
  60. rem   -------两头有0的拖尾逆向运动
  61. @echo off
  62. setlocal enabledelayedexpansion&color 1d
  63. for /l %%i in (1 1 70) do (set /p "=0"<nul)
  64. set /p "=■"<nul
  65. for /l %%i in (1 1 25) do (
  66.       
  67.        for /l %%1 in (1 1 100) do (echo.>nul)
  68.        set /p "=■"<nul
  69. )
  70. set sp=
  71. -rem    ------看不见小方块的逆向清0
  72. @echo off
  73. setlocal enabledelayedexpansion&color 1d
  74. for /l %%i in (1 1 70) do (set /p "=0"<nul)
  75. for /l %%i in (1 1 25) do (
  76.        set /p "=  "<nul
  77.        for /l %%1 in (1 1 100) do (echo.>nul)
  78.        set /p "=■"<nul
  79. )
  80. set sp=
  81. rem  -------看见小方块逆向清0
  82. @echo off
  83. setlocal enabledelayedexpansion&color 1d
  84. for /l %%i in (1 1 70) do (set /p "=0"<nul)
  85. for /l %%i in (1 1 25) do (
  86.        set /p "=■"<nul
  87.        for /l %%1 in (1 1 100) do (echo.>nul)
  88.        set /p "= "<nul
  89. )
  90. set sp=
  91. rem     ---------逆向清去中间的0,留下两头的0
  92. @echo off
  93. setlocal enabledelayedexpansion&color 1d
  94. for /l %%i in (1 1 70) do (set /p "=0"<nul)
  95. set /p "=■"<nul
  96. for /l %%i in (1 1 50) do (
  97.        set /p "=■"<nul
  98.        for /l %%1 in (1 1 100) do (echo.>nul)
  99.        set /p "= "<nul
  100. )
  101. set sp=
复制代码



    不知怎么回事 我总觉得使用退格符号,不是标准的bat,有种不正统的感觉。呵呵。

[ 本帖最后由 myzwd 于 2009-3-14 17:21 编辑 ]

TOP

回复 16楼 的帖子

退格符,应该是计算机基础的范畴,参见:ASCII码

注意退格符不是键盘上的退格键Backspace,它们不是一个概念。

退格符的作用是,将光标位置退回到前一个字符,但不会删除光标位置的字符。如果后边有新的字符,从光标位置继续。在屏幕上显示时,由于显示机制,新的字符会覆盖原来的字符;但如果是输出到打印机,原来的字符已经被打印,新的字符会与之重叠。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 15楼 的帖子

是这样的。我同意你的说法啊

TOP

动画实例

从实验来看 ,把退格符后面的内容理解为车。把退格符号理解为车走的路程。而原来的字符理解为路,车过了,路还是路。我是这样认为的。
  1. @echo off&setlocal enabledelayedexpansion&cls&color 0a
  2. echo  居中显示70个小方块
  3. for /l %%1 in (1 1 80) do (set "space= !space!")
  4. for /l %%2 in (1 1 10 ) do echo.
  5. set /p=!space:~,-54!<nul
  6. rem 实现向右平移26byte,注释掉就将从最左面开始
  7. for /l %%i in (1 1 70) do (
  8.     set /a "mod=%%i%%14"
  9.     set /a n=n+1
  10.     set /p=■<nul
  11.     if !mod!==0 (set /p=!space:~,-28!<nul)
  12.     for /l %%1 in (1 1 50) do (call echo.>nul)
  13. )
  14. exit /b
复制代码
一个显而易见的原理------
cmd一行可以显示80个byte,如果这一行已经填满,这时如果你插入x<80个字符,这时此行就会有x个字符被挤出来,插如多少就挤出多少,挤出的字符就自动到了第二行。根据这个原理,利用语句set /p=!space:~,-54!<nul就轻松的实现了平移。
----------求余运算与周期性运动
    求余运算可以很好的刻画周期性运动,这个实例保持了总行高不变。改动一下就可以模仿自由落体运动。
  1. @echo off&setlocal enabledelayedexpansion&cls&color 1a
  2. rem 反复向上爬升
  3. for /l %%1 in (1 1 80) do (set "space= !space!")
  4. for /l %%i in (1 1 100) do (
  5. cls
  6. set /a "mod=%%i%%23"
  7. for /l %%j in (!mod! 1 23) do echo.
  8. for /l %%k in (1 1 !mod!) do echo !space:~70!■
  9. set /a n+=1
  10. for /l %%1 in (1 1 50) do (call echo.>nul)
  11. )
  12. :end
  13. echo %n%
  14. exit /b
复制代码


  1. rem 居中显示到三角
  2. @echo off&setlocal enabledelayedexpansion&cls&color 1a
  3. for /l %%1 in (1 1 80) do (set "space= !space!")
  4. for /l %%i in (1 1 9) do echo.
  5. for /l %%i in (1 1 5) do (
  6.   set /p=!space:~-30!<nul
  7.   for /l %%i in (1 1 !mod!) do set /p=!space:~-2!<nul
  8.   set /a "t=12-2*%%i"
  9.   set /a  "mod=%%i%%5"
  10.   for /l %%i in (1 1 !t!) do (
  11.     set /p=■<nul
  12.   )
  13.   for /l %%1 in (1 1 50) do (call echo.>nul)
  14.   echo.
  15. )
  16. pause >nul
复制代码

         记得读大学时,我们的计算机进行抽签考试,我就抽到了这个到三角,要求在5分钟内编程显示,我在机房里
半天也没编出程序来,眼看时间就要到了,在最后的一分钟我来了灵感才编出程序来。当时考试差点没过关,今天我试着用bat编写了一个,算是对自己读书时代的怀念。我习惯于定义空格,好象这样做规范一点,因为我常拿到
其它的bat,稍微动了一书写个格式,程序就报错,其根本就是没定义空格。

创意----刷屏语句-不用cls也可以实现从下到上运动,因为cmd默认显示300行,利用这点就可以实现从下到上的运动。每屏应该是25行。
  1. rem 刷屏语句 for /l %%j in (1 1 300) do (echo.)
  2. for /l %%i in (1 1 20) do (
  3.   for /l %%j in (1 1 300) do (echo.)
  4.   for /l %%j in (1 1 %%i) do (echo ■ )
  5.   echo.&echo.&echo.
  6.   for /l %%1 in (1 1 100) do call echo.>nul
  7.   
  8. )
复制代码
  1. @echo off&setlocal enabledelayedexpansion&cls&color 0a
  2. rem 利用刷屏,实现向右运动,不过要用pause才好
  3. for /l %%1 in (1 1 80) do set "space= !space!"
  4. for /l %%i in (1 1 20) do (
  5.    for /l %%j in (1 1 25) do (echo.)
  6.    set tt=!space:~-%%i!■
  7.    echo !tt!
  8.    for /l %%k in (1 1 13) do echo.
  9.    for /l %%1 in (1 1 50) do call echo.>nul
  10. )
  11. pause>nul
复制代码
  1. @echo off&setlocal enabledelayedexpansion&cls&color 0a
  2. rem 利用刷屏,实现向左运动,不过要用pause才好
  3. for /l %%1 in (1 1 80) do set "space= !space!"
  4. for /l %%i in (1 1 70) do (
  5.    for /l %%j in (1 1 25) do (echo.)
  6.    set /a n=78-%%i
  7.    call set sp=%%space:~-!n!%%
  8.    echo !sp!●
  9.    for /l %%k in (1 1 13) do echo.
  10.    for /l %%1 in (1 1 50) do call echo.>nul
  11. )
  12. pause>nul
复制代码
  1. @echo off&setlocal enabledelayedexpansion&cls&color 0a
  2. rem 利用刷屏,实现向下运动,不过要用pause才好
  3. for /l %%1 in (1 1 80) do set "space= !space!"
  4. for /l %%i in (1 1 25) do (
  5.    for /l %%j in (1 1 25) do (echo.)
  6.    set /a h=25-%%i
  7.    
  8.    echo !space:~-39!●
  9.    for /l %%k in (1 1 !h!) do echo.
  10.    for /l %%1 in (1 1 50) do call echo.>nul
  11. )
  12. pause>nul
复制代码
  1. @echo off &setlocal enabledelayedexpansion
  2. rem  转载 by 523066680 这段代码很简洁,值得学习。
  3. for /l %%a in (1,1,79) do (set "space= !space!")
  4. for /l %%a in (1,1,23) do (set h%%a=%space%)
  5. set /p input="输入高[2-23]: "
  6. set /a c=0,h=1,i2=input*2,na=40-input
  7. set stra=!space:~-%na%!
  8. for %%a in ("c + %i2%" "h + %input%" "c - 1" "h - 1") do (call :func %%~a)
  9. pause>nul
  10. exit /b
  11. :func
  12. set /a %1 %2 = 1,cf=c-1
  13. set h%h%=!h%h%:~0,%cf%!.!h%h%:~%c%!
  14. ping -n 1 127.1>nul &cls
  15. for /l %%a in (1,1,%input%) do (echo,%stra%!h%%a:~0,-%na%!)
  16. if !%1! neq %3 goto :func
复制代码



  1. @echo off &setlocal enabledelayedexpansion&cls&color 1a
  2. rem 抛物线x=y*y与y=x*x
  3. for /l %%1 in (1 1 80) do set "space= !space!"
  4. mode con cols=80 lines=50
  5. for /l %%i in (0 1 5) do (
  6.   set y=%%i
  7.   set /a "x=y*y"
  8.   call echo %%space:~-!x!%%●
  9. )
  10. echo --------
  11. for /l %%i in (0 1 4) do (
  12.   set x=%%i
  13.   set /a "x2=12*x"
  14. rem 这句话是把x轴的单位换成y轴的单位的12倍,是为了美观。即两轴的单位不等。
  15. rem  在数学上这是容许的
  16.   set /a "y.increase=2*x+1"
  17.   for /l %%j in (1 1 !y.increase!) do echo.
  18.   call echo %%space:~-!x2!%%●
  19. )
  20. goto:eof
复制代码
  1. @echo off &setlocal enabledelayedexpansion&cls&color 1a
  2. rem 逐渐显示与删除文字
  3. set char=我写的这个有点烂,管它的这只是我的一次作业。
  4. for /l %%i in (1 1 21) do (
  5.      set /p=!char:~,%%i!<nul
  6.      ping -n 2 localhost >nul
  7.      cls
  8. )
  9. for /l %%i in (1 1 21) do (
  10.      set /p=!char:~,-%%i!<nul
  11.      ping -n 2 localhost >nul
  12.      cls
  13. )
  14. for /l %%i in (1 1 21) do (
  15.      set /a "s=%%i-1"
  16.      call echo %%char:~!s!,1%%<nul
  17.      ping -n 2 localhost >nul
  18.      cls
  19. )
复制代码
  1. @echo off &setlocal enabledelayedexpansion&cls&color 1a
  2. rem 设置环境变量char
  3. for /f %%i in ('more +6 %~f0') do set char=%%i
  4. echo ~~~~~%char%~~~~~
  5. pause
  6. exit /b
  7. 1这样也可以设置环境变量 这样也可以设置环境变量
  8. 2这样也可以设置环境变量 这样也可以设置环境变量
复制代码
  1. @echo off &setlocal enabledelayedexpansion &cls &color 1a
  2. for /l %%1 in (1 1 80)  do set "space= !space!"
  3. more /s +14 %~f0>rr.txt
  4. for /l %%i in (1 1 50) do (
  5.     for /f "eol=e tokens=* " %%i in (rr.txt) do echo %%i
  6.     for /l %%1 in (1 1 100) do call echo.>nul
  7.     cls
  8.     for /f "eol=m tokens=* " %%i in (rr.txt) do echo %%i
  9.     for /l %%1 in (1 1 100) do call echo.>nul
  10.     cls
  11. )
  12. del rr.txt
  13. pause
  14. exit /b
  15. e                    _,._
  16. e                __.'   _)
  17. e               <_,)'.-"a\
  18. e                 /' (    \
  19. e     _.-----..,-'   (`"--^
  20. e    //              |
  21. e   (|   `;      ,   |
  22. e     \   ;.----/  ,/
  23. e     ) // /   | |\ \
  24. e      \ \\`\   | |/ /
  25. e       \ \\ \  | |\/
  26. e        `" `"  `"`
  27. m                    _,._
  28. m                __.'   _)
  29. m               <_,)'.-"a\
  30. m                 /' (    \
  31. m     _.-----..,-'   (`"--^
  32. m    //              |
  33. m   (|   `;      ,   |
  34. m     \   ;.----/  ,/
  35. m     ) // /    \ \ |
  36. m     | |\ \    / / |   
  37. m     | | \/    \/| |
  38. m     `"`         `"`
  39. ──────────────────────────────
复制代码

[ 本帖最后由 myzwd 于 2009-3-22 12:31 编辑 ]

TOP

只有二种方法能实现变量的延迟
1、setlocal enabledelayed
2、call
难道你不认为这样么?

TOP

回ls

一个格退格符就向后退一个字符的位置,退格符后面的内容就从这个位置开始输出,并改写此位置后面的原有内容,二个英文字母改写一个汉字,没被改写的原样输出。难道你不认为是这样么?

TOP

回复 11楼 的帖子

一个汉字=2个英文字,但是从上面的实例可以看出,退一格就是一遮住一个字符,不管它是中文还是英文。
另外 关于call 的延迟性的理解,我个人认为可以理解得简单点,就是cmd在解释语句时,遇到call就会对程序再解释,以补充不足的数据,以完成数据匹配,最后实现对程序的执行,最终以,这样就实现了数据的动态变化。微软的bat是一个黑箱,想多了反而自找麻烦。呵呵

今天研究了本论坛两大高手的代码,觉得高手的代码就是不一样。长知识了。
  1. @echo off
  2. rem ----向右运动
  3. setlocal enabledelayedexpansion&color 1d
  4. for /l %%i in (40 -1 1) do (
  5.     for /l %%1 in (%%i ,-1,1) do (
  6.       set /p= <nul
  7.     )
  8.    
  9.     set /p=■<nul
  10.     for /l %%1 in (1 1 50) do (echo.>nul)
  11.     cls
  12. )
复制代码

[ 本帖最后由 myzwd 于 2009-3-9 15:37 编辑 ]

TOP

很好的笔记,学习了!

TOP

退格符

二点体会:
退格之后,处于改写状态,二个英文字符相当一个汉字。
在复合句中,call有延迟变量的功能。

TOP

返回列表