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

动画实例

从实验来看 ,把退格符后面的内容理解为车。把退格符号理解为车走的路程。而原来的字符理解为路,车过了,路还是路。我是这样认为的。
  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

回复 15楼 的帖子

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

TOP

回复 16楼 的帖子

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

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

退格符的作用是,将光标位置退回到前一个字符,但不会删除光标位置的字符。如果后边有新的字符,从光标位置继续。在屏幕上显示时,由于显示机制,新的字符会覆盖原来的字符;但如果是输出到打印机,原来的字符已经被打印,新的字符会与之重叠。
命令行参考: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

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

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

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

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

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

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

动画总结

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

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

答案 -------显示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楼 的帖子---老老实实的学习一门语言---随笔。

记得读书时我的电脑老师告诉我们,所有的语言都包含4种结构
1---顺序结构
2--转子结构
3--循环结构
4--分支结构
从这个角度讲,我应该老老实实的学习bat。只有这样学习才是最经济的。只有这样才可以触类旁通。
还有就是网上的那些黑客的这样攻击那样攻击,我都去试过,不过只是在虚拟机上试的
,因为真的电脑上根本没办法成功。我学习bat只是想让我的电脑能更好的工作。我不再象刚开始学习电脑时,那样幼稚了。老想用bat调用这样那样去攻击别人。那曾经浪费了
我不少的时间,因为你根本不会有成功的机会。除非别人有意等着你杀。
黑客的教程之所以讲攻击,那为了吸引眼球。比如说什么telnet登陆,说的是那么美好,那么诱惑人,但是我禁用我的tennet服务,你就只有干瞪眼!
  还有一个网络中老讲的例子,利用软件x-scan扫描,最后建立空链接,然后就可以去获得adminstrator的密码,然后如何如何的攻击别人。我就明说我的电脑就开了空连接,我还想看看别人是如何攻击我的呢?
  我讲这些东西就是要说明一个问题,学习bat,思路要端正,不要老想着学了可以攻击别人。高级语言都有共性,老老实实的学习一门语言才是最经济的方法。
2

评分人数

    • namejm: 这才是学bat的正确心态!赞一个。PB + 5
    • Batcher: Good!PB + 2

TOP

n的阶乘计算 ---本页最终完成√k的编程

  1. echo 阶乘计算
  2. set /p n=输入n值---
  3. set r=1
  4. for /l %%i in (1 1 !n!) do (
  5.         set /a "r=!r!*%%i"
  6. )
  7. echo !n!的阶乘=!r!
  8. pause>nul
复制代码
sin(x)=1-(1/3!)x^3+(1/5!)x^5-......
编出sinx的计算程序要分离1/3!的整数部分和小数部分。有意思那天试试看能不能成功。
我猜应要用到bat的 运算---“/和%%”

求平方根的递推公式
  1. f(n)={f(n-1)+k/f(n-1)}/2  ,其中n=1 ,2 ,3.。。
  2. 这是k的平方根公式
复制代码
  1. @echo off &setlocal enabledelayedexpansion &cls &color 1a
  2. echo -----判断小数位数----
  3. :00
  4. set /p x=输入数字--
  5. set x1=a%x%
  6. :01
  7. set /a bit+=1
  8. set num=!x1:~-1!
  9. set x1=!x1:~,-1!
  10. if !num! equ a (set bit=1 &goto end)
  11. if !num! neq . goto 01
  12. :end
  13. call set v=%%x:~-!bit!%%
  14. call set u=%%x:~0,-!bit!%%
  15. if %bit%==1 (set "v=0" &set "u=%x%")
  16. set /a bit=%bit%-1
  17. echo ┌─────────────┐
  18. echo     小数位数=%bit% 整数部分=%u% 小数部分=%v%
  19. echo └─────────────┘
  20. set /p choice=输入r--从新开始,输入其它字符--结束--?
  21. set bit=0
  22. if %choice%==r goto 00
  23. pause
复制代码
分数化小数方法
http://bbs.bathome.net/thread-3832-1-1.html



两个正小数相加
  1. @echo off &setlocal enabledelayedexpansion &cls &color 1a
  2. echo  ~~~~~~~~~~~~~小数加法~~~~~~~~~~~~~~~~~by myzwd 2009 3 23
  3. echo  ──────────────────────────────────
  4. :main
  5. set /p a=输入第一个小数---
  6. set /p b=输入第二个小数---
  7. rem 可以使用参数%1 %2 调用
  8. call:sub %a%
  9. set "a.bit=%bit%" &set "a.x=%v%" &set "a.z=%u%"
  10. call:sub %b%
  11. set "b.bit=%bit%" &set "b.x=%v%" &set "b.z=%u%"  
  12. set /a "t=%a.bit%-%b.bit%"
  13. if %t% geq 0 ( for /l %%i in (1 1 %t%) do (set b.x=!b.x!0)
  14. ) else (set /a t=-%t%
  15.           for /l %%i in (1,1,!t!) do (set a.x=!a.x!0)
  16.           set "a.x=!a.x: =!"
  17.        )
  18. :end
  19. set /a "sumazbz=%a.z%+%b.z%"
  20. set a.x=%a.x:.=1% &set b.x=%b.x:.=1%
  21. set /a "sum=%a.x%+%b.x%"
  22. set /a "sum.z=%sum:~0,1%-2" &set "sum.x=%sum:~1%"
  23. set /a "sum.z=%sumazbz%+%sum.z%"
  24. set sum=%sum.z%.%sum.x%
  25. echo 结果是----%a%+%b%=%sum%
  26. set /p choice=输入r重新开始,输入其它字符结束--?
  27. if %choice%==r goto main
  28. exit /b
  29. --------- 程序结束-----------------
  30. ------z符号代表整数部分,x符号代码小数部分
  31. :sub
  32. :00
  33. set x=%1
  34. set x1=a%x%
  35. set bit=0
  36. :01
  37. set /a bit+=1
  38. set num=!x1:~-1!
  39. set x1=!x1:~,-1!
  40. if !num! equ a (set bit=1 &goto end)
  41. if !num! neq . goto 01
  42. :end
  43. call set v=%%x:~-!bit!%%
  44. call set u=%%x:~0,-!bit!%%
  45. if %bit%==1 (set "v=0" &set "u=%x%")
  46. set /a bit=%bit%-1
  47. echo ┌─────────────────────┐
  48. echo     小数位数=%bit% 整数部分=%u% 小数部分=%v%
  49. echo └─────────────────────┘
  50. goto:eof
复制代码
利用递推数列开方,本来收敛速度是最快的了,一般迭代4,5次就有很高的精度了。但是关键的一点是要解决两个有理数的除法运算如2.5/1.23 ,这最终又归结到小数点的移动上去。看来得多弄几个子程序。工作量有点大。有时间再说吧。我真不明白微软的bat在设计上为什么不直接设计来可以进行小数运算呢?

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

TOP

利用注册表修改cmd的属性

cmd的属性可以利用注册表修改
hkcu\console -----cmd的属性都记录在这个键下
添加值名windowposition 再添加 d_word值可以改变cmd在屏幕中的位置。如(十进制)10551000,10551048  .把值设置为0就是恢复默认。

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

TOP

vbscript脚本实例

  1. msgbox("Hello from VBScript!")
  2. msgbox "123456789"
复制代码
  1. dim name
  2. name="Jan Egil"
  3. msgbox(name)
复制代码
  1. dim name
  2. name="Jan Egil"
  3. msgbox("My name is: " & name)
复制代码
  1. dim fname(5)
  2. fname(0) = "George"
  3. fname(1) = "John"
  4. fname(2) = "Thomas"
  5. fname(3) = "James"
  6. fname(4) = "Adrew"
  7. fname(5) = "Martin"
  8. for i=0 to 5
  9.   msgbox(fname(i) & " 123")
  10. next
复制代码
  1. sub mySub()
  2.   msgbox("This is a sub procedure")
  3. end sub
  4. call mySub()
复制代码
  1. function myFunction()
  2. myFunction = "BLUE"
  3. end function
  4. msgbox("My favorite color is " & myFunction())
复制代码
  1. function greeting()
  2. i=hour(time)
  3. if i < 10 then
  4. msgbox("Good morning!")
  5. else
  6. msgbox("Have a nice day!")
  7. end if
  8. end function
  9. call greeting()
复制代码
  1. function greeting()
  2. i=hour(time)
  3. If i = 10 then
  4.         msgbox("Just started...!")
  5. elseif i = 11 then
  6.         msgbox("Hungry!")
  7. elseif i = 12 then
  8.         msgbox("Ah, lunch-time!")
  9. elseif i = 16 then
  10.         msgbox("Time to go home!")
  11. else
  12.         msgbox("Unknown")
  13. end if
  14. end function
  15. greeting()
  16. rem elseif 不是else if
  17. '注释
复制代码
  1. d=weekday(date)
  2. select case d
  3.   case 1
  4.     msgbox("Sleepy Sunday")
  5.   case 2
  6.      msgbox("Monday again!")
  7.   case 3
  8.      msgbox("Just Tuesday!")
  9.   case 4
  10.      msgbox("Wednesday!")
  11.   case 5
  12.      msgbox("Thursday...")
  13.   case 6
  14.      msgbox("Finally Friday!")
  15.   case else
  16.      msgbox("Super Saturday!!!!")
  17. end select
  18. rem 这是select 语句
复制代码
  1. for i = 0 to 5
  2. msgbox("The number is " & i & "
  3. ")
  4. next
复制代码
  1. dim names(2)
  2. names(0) = "George"
  3. names(1) = "John"
  4. names(2) = "Thomas"
  5. for each x in names
  6.   msgbox(x & "这句相当于bat的for in语句")
  7. next
复制代码
  1. i=0
  2. do while i < 10
  3.   msgbox(i & "     ")
  4.   i=i+1
  5. loop
复制代码
  1. i=0
  2. do
  3.   msgbox(i & "     ")
  4.   i=i+1
  5. loop  while i < 10
复制代码
  1. do
  2.   msgbox("123456")
  3.   i=i+1
  4. loop until i > 5
复制代码
  1. msgbox("Today's date is " & date())
  2. msgbox("The time is " & time())
  3. rem  也可以这样,这是调用函数的一种方法
  4. msgbox "今天的时间是" & time()
  5. '日期和时间
复制代码
  1. msgbox(WeekDayName(1))
  2. msgbox(WeekDayName(2))
  3. msgbox("Get the abbreviated name of a weekday:")
  4. msgbox(WeekDayName(1,true))
  5. msgbox(WeekDayName(2,true))
  6. msgbox("Get the current weekday:")
  7. msgbox(WeekdayName(weekday(date)))
  8. msgbox(WeekdayName(weekday(date), true))
复制代码
出于易读和一致性的目的,请在 VBScript 代码中使用以下变量命名约定:
子类型 前缀 示例
Boolean bln blnFound
Byte byt bytRasterData
Date (Time) dtm dtmStart
Double dbl dblTolerance
Error err errOrderNum
Integer int intQuantity
Long lng lngDistance
Object obj objCurrent
Single sng sngAverage
String str strFirstName

变量应定义在尽量小的作用域中。VBScript 变量的作用域如下所示:
作用域 声明变量处 可见性
过程级 事件、函数或子过程 在声明变量的过程中可见
Script 级 HTML 页面的 HEAD 部分,任何过程之外 在 Script 的所有过程中可见


变量作用域前缀
随着 Script 代码长度的增加,有必要快速区分变量的作用域。在类型前缀前面添加一个单字符前缀可以实现这一点,而不致使变量名过长。
作用域 前缀 示例
过程级 无 dblVelocity
Script 级 s sblnCalcInProgress

对象命名约定
下表列出了 VBScript 中可能用到的对象命名约定(推荐):
对象类型 前缀 示例
3D 面板 pnl pnlGroup
动画按钮 ani aniMailBox
复选框 chk chkReadOnly
组合框、下拉列表框 cbo cboEnglish
命令按钮 cmd cmdExit
公共对话框 dlg dlgFileOpen
框架 fra fraLanguage
水平滚动条 hsb hsbVolume
图像 img imgIcon
标签 lbl lblHelpMessage
直线 lin linVertical
列表框 lst lstPolicyCodes
旋钮 spn spnPages
文本框 txt txtLastName
垂直滚动条 vsb vsbRate
滑块 sld sldScale

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

TOP

我完全是一个新手,看不懂代码。。顶

TOP

返回列表