标题: 批处理读书笔记 [打印本页]
作者: myzwd 时间: 2009-3-4 13:26 标题: 批处理读书笔记
最近我对批处理的学习有点感兴趣了,学到了不少东西,以前我以为批处理就是一个单调的黑白世界,但是,当我看到了一些精彩的程序后,才知道原来批处理可以这样,原来黑白世界也精彩。
精彩实例1--- 弹动的小球:- @echo off&mode con cols=20 lines=29&color 2c
- setlocal enabledelayedexpansion
- title 弹球-zw19750516
- set a=●&set "b= "
- :begin
- cls&set n=0
- set /a lm=%random%%%19,lr=%random%%%2
- if %lm% equ 0 (
- set z=+
- ) else (
- if %lm% equ 17 (
- set z=-
- ) else (
- if %lr% equ 0 (
- set z=-
- ) else (
- set z=+
- )
- )
- )
- :contin
- set "kong="
- set /a n+=1,lm%z%=1
- for /l %%i in (1,1,%lm%) do set kong=!kong!%b%
- set str%n%=%kong%%a%
- if %n% equ 30 goto begin
- if %lm% equ 0 set z=+
- if %lm% equ 17 set z=-
- set /p=!str%n%!nul
- for /l %%i in (1,1,20) do set /p= <NUL
- echo.
- goto contin
复制代码
精彩实例2---跳动的小球- @echo off&setlocal enabledelayedexpansion
- mode con: cols=81 lines=30&color 1f
- :: code by 随风@bbs.bathome.net 2008/01/03
- :loop
- for /l %%a in (1 1 40) do (
- if defined sang (
- cls&set /a di-=1
- for /l %%i in (1 1 !di!) do echo.
- ) else (echo.&set /a di+=1)
- if defined zuo (set ko=!ko:~1!) else set ko= !ko!
- set /p=!ko!●<nul
- for /l %%i in (1 1 80) do ver>nul
- set /p= <nul
- if not "!ko:~38,1!"=="" set zuo=ok
- if "!ko!"=="" set zuo=&set "ko= "
- if !di! lss 0 set sang=&goto loop
- if !di! geq 29 set sang=ok&goto loop
- )
复制代码
精彩实例3----五彩的世界- @echo off
- ::输出彩色字符
- mode con lines=24 cols=69
- set "a= One World !"
- set "b= one Dream !"
- set "c= 让我们大家一起说"
- set "d=︱ bbs.cn-dos.net is our common home!"
- set "e= {Author∶jvive︱08-03-31︱Thanks to∶9527}"
- set "x= ︱"
- set "p=★★★★★★★★★★★★★★★"
- set "k="
- pushd %tmp%
- del/q "%a%?" "%b%?" "%c%?" "%d%?" "%e%?" "%x%?" "%p%?" 2>nul
- call:enter 3
- call:JV a "%a%" 0
- call:JV b "%b%" 0
- call:JV c "%c%" 0
- call:enter 5
- call:JV 0100 0 0
- call:JV 040a "%d%" 0
- call:JV 040a "%x%" 0
- call:JV 0100 000 0
- call:JV 040b "%d%" 0
- call:JV 040b "%x%" 0
- call:JV 0100 000 0
- call:JV 0400 "%d%" 0
- call:JV 0400 "%x%" 0
- call:JV 0100 0 1
- call:enter 3
- call:JV e "%e%" 0
- call:JV 0100 0 1
- echo.
- call:color
- pause>nul&exit/b
- rem ---------subprocess--------
- :color|一二层第一个色调混合为主色调,最后一个为闪烁停留色调.
- for %%a in (0 e)do (
- for %%b in (a 1 2 3 4 5 6 7 8 0 c b d f e)do (
- call set "k=%%k%%"
- call:bak %%a%%b "%p%" 0
- ))
- goto :eof
- :JV
- :bak
- if %3 neq 1 (set/p=%k%"%~2") else echo.>"%~2"
- if %0 neq :bak (set k=) else set "k=%k%"
- findstr /a:%1 .* "%~2?"
- del "%~2?"
- goto :eof
- :enter
- for /l %%a in (1 1 %1)do echo.
复制代码
看了这些精彩的实例,这个黑白世界变的有点可爱了。然该死的微软,关于批处理的资料说的是那样的含糊,
把批处理弄的象一个黑色的暗箱。让人学习批处理的难度,远远大于学习其它高级语言,正是上贼船容易,熟悉贼性难于上青天,所以高手的经验,就显得特别的重要。
在这里我将把我看到的一些好的东西记录下来。这样可以防此遗忘。我以后在要找这些东西,我以有个查阅的地方。
------------------NOTE-----------------
---停此shift创建的循环-----
- @echo off
- call:one 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
- goto:eof
- :one
- echo %5
- if %5a==a goto:eof
- shift
- goto one
复制代码
---------
今天读书时看到了,如何停此由shift构造的循环。以前我还真的不知道,长知识了。
if %5a==a goto:eof
if %3a==a goto:eof
if %8a==a goto:eof
if %5#==# goto:eof
原来是这样停下来的。呵呵
----让变量名动态的变化
[/code]- @echo off
- rem 让变量名字动态的变化
- set tt=123
- for /l %%i in (0 1 10) do (
- set tt%%i=%tt%
- set tt%%i
- set tt%%i=
- )
- echo ------
-
- set var=123
- setlocal enabledelayedexpansion
- for /l %%i in (0 1 10) do (
- set /a n+=1
- set var!n!=%var%
- set var!n!
- )
- echo ------
-
- set tt=123
- call:one 1 2 3 4 5 6 7 8 9 10
- goto:eof
- :one
- set tt%1=%tt%
- set tt%1
- shift
- if %1a==a goto:eof
- goto one
-
- echo ------
- rem 追加值
- setlocal enabledelayedexpansion
- for /l %%i in (0 1 10) do (
- set tt=!tt! %%i
- set tt
- )
- echo ------------------
- call:one 1 2 3 4 5 6 7 8 9 10
- goto:eof
- :one
- set tt=%tt% %1
- set tt
- shift
- if %1a==a goto:eof
- goto one
复制代码
- @echo off
- rem 看到两种去掉左面0的方法
- set tt=001234
- for /f "delims=0" %%i in ("%tt%") do (
- echo %%i
- )
- echo ----
- set /a "tt=1001234 %%1000000"
- set tt
- rem (1000000+1234)/1000000=1234
复制代码
精彩实例4----变动的方框- ::这一版本的编辑---if exist Q523066680
-
- @echo off&mode con cols=60 lines=30 &color 0a
- setlocal enabledelayedexpansion
- set omax=oooooooooooooooooooooooooooooooooooooooo
- set kmax=%omax:o= %
- set n=4
-
- :a
- set /a n+=4
- set /a upkh=15-%n%/4,kleft=30-%n%/2,zk=%n%-4,zkh=%n%/2-2
- set leftk=!kmax:~0,%kleft%!
- set zk=oo!kmax:~0,%zk%!oo
- set hang=!omax:~0,%n%!
- for /l %%a in (1,1,%upkh%) do echo.
- echo.%leftk%%hang%
- for /l %%a in (1,1,%zkh%) do echo.%leftk%%zk%
- echo.%leftk%%hang%
- echo.%n%
- for /l %%a in (1,1,2) do ping -n>nul
- cls
- if %n%==40 set /a n=4
- goto a
复制代码
[ 本帖最后由 myzwd 于 2009-3-20 19:13 编辑 ]
作者: myzwd 时间: 2009-3-4 20:24 标题: set /p 与nul的配合
dos中常用的显示命令是echo,我看到别人用set /p来显示数据,于是就跟着学,特别是把set/p 和nul配合使用-
- @echo off
- set /p=a123a <nul
- echo b123b
复制代码
结果会显示---a123a b123b
这相当于把前后连了起来。-
- @echo off
- echo a123a111111 & dir^
- d:
复制代码
这于字符连字号 ^ 的效果一样。
这个符号 ^ 是dos里面的多义词复制代码
echo后面加一点 可以屏蔽错误信息。- @echo off
- rem 3x4矩阵的转置,看了几个帖子,于是我也有了一种冲动,就编写了这个矩阵转置的程序
- setlocal enabledelayedexpansion
- for /f "tokens=1-4" %%1 in ('more +14 %~s0') do (
- set tt=!tt! %%1 %%2 %%3 %%4
- )
- call:one %tt%
- goto:eof
- :one
- echo %1 %5 %9
- shift
- if %9.==. goto :eof
- goto one
- goto:eof
- 11 12 13 14
- 21 22 23 24
- 31 32 33 34
复制代码
------如何利用findstr把输入的字变为彩色的字----函数应用-
-
- @echo off
- rem 2009-3-5---findstr让输入的字成为彩色字体的方案
- set tt="I LOVE HOME OF BATCH"
- call:one %tt%
- goto:eof
- :one
- set /p= <nul>%1
- rem 生存类文本,无扩展名,nul让字符串提前的性质
- findstr /a:24 .* "%~n1?"
- rem 这里加载类文本 这里的%1指向call:one后的%tt%,代表文件名
- rem 利用findstr对于非内容的特定字符会显示彩色的特性,最后显示彩色文本
- del %1
- rem 删除生存的类文本
- set tt=
- rem 整体构思是利用了批函数 ,具有参数的要点来设置程序的
-
-
-
- echo.
- echo.
- echo ----下面是对比程序--
- set tt="I LOVE HOME OF BATCH"
- call:two %tt%
- goto:eof
- :two
- findstr /a:24 .* "%~n1?"
- set tt=
-
-
- rem 上面的代码可以简化如下,这样更能看出本质来
- @echo off
- call:one 我来了 你好 啊
- goto:eof
- :one
- set /p=>%1
- findstr /a:24 .* "%1*"
- rem %1始终指向 call:one 后面的字符常量,"%~1*"这里是生存的文件,引号很重要。
- rem 没有用nul 就要回车才可以看到文字 冒号可以用这个字符,退格符号删去
复制代码
-
- @echo off
- echo ------采用2,3,4为16进制数显示彩色字体 实验程序---
- findstr /n /a:12 .* %~s0
- findstr /n /a:c24 .* %~s0
- findstr /n /a:24 .* %~s0
- findstr /n /a:120c .* %~s0
- echo -----退格符号,删去显示-------
- findstr /n /a:12 .* %~s0
- findstr /n /a:c24 .* %~s0
- findstr /n /a:24 .* %~s0
- findstr /n /a:120c .* %~s0
- rem 在阴影上3位数,画格子,4位数画竖线,也就是说3位以上的数字就产生花纹。
- goto:eof
- 仗剑江湖 仗剑江湖 仗剑江湖a
- 仗剑江湖 仗剑江湖 仗剑江湖b
- 仗剑江湖 仗剑江湖 仗剑江湖c
复制代码
最后 color 与findstr可以配合使用
数学计算:findstr的阴影部分是2位hex,共能产生16*16=256种色彩,花纹部分也是2bit的hex 这也有256种。
色彩就这么多,多一种都不可能有。
下面的说明了符号 是如何产生的。
*******************************************************************
1----进入edit
2----按下 ctrl+p ,松开,要松开!这时在edit中什么都看不到
3---接着按下backspace退格键,此时就看到了这个符号
4--保存到记事本中就可以了。
==========================================================
全屏cmd ---- 修改注册表 路径:HKCU\CONSOLe\ FULLSCREEN VALUE=1(全屏),0(非全屏)
-
- @echo off
- echo 让findstr只显示标签,实现输入彩色字
- echo.>中国足球是笑话
- findstr /a:0c z* 中国足球是笑话*
- del /q 中国足球是笑话
- rem cmd将显示的是---红色的--- “中国足球是笑话:”
复制代码
[ 本帖最后由 myzwd 于 2009-3-19 09:43 编辑 ]
作者: zhouzc88 时间: 2009-3-4 21:56
与楼主有同感!想进一步,可批处理比较全面系统的教程都不知在那里有,看高手的代码,大部分看不懂,又没有解释,批处理想提高真的比学高级语言还难!
作者: Batcher 时间: 2009-3-4 23:10 标题: 回复 3楼 的帖子
本版有很多教程,不知你看过了哪些?
高手的代码看不懂没关系,哪行不懂就发帖问哪行,自然有热心人给你解释。
作者: myzwd 时间: 2009-3-6 13:31 标题: 如何插入html代码?
-
- @echo off
- ::我一直在想如果用dos调用html代码,今天我算是找到方法了2007-3-6 by myzwd。
- call:one my.htm
- goto:eof
- :one
- more +9 %~s0>my.htm
- start %1
- del my.htm
- goto:eof
- <html >
- <head>
- <title>myzwd123456</title>
- </head>
- <body>
- <u>中国</u>
- <font color=red><marquee>myzwd </marquee></font>
- <table width="200" border="1">
- <tr>
- <td>myzwd</td>
- <td bgcolor="#FF00FF">看</td>
- <td bgcolor="#99CC00">看</td>
- <td bgcolor="#9933FF">插</td>
- </tr>
- <tr>
- <td>myzwd</td>
- <td bgcolor="#FF00FF">入</td>
- <td bgcolor="#99CC00">表</td>
- <td bgcolor="#9933FF">格</td>
- </tr>
- <tr>
- <td>myzwd</td>
- <td bgcolor="#FF00FF">行</td>
- <td bgcolor="#99CC00">不</td>
- <td bgcolor="#9933FF">行</td>
- </tr>
- </body>
- </html>
复制代码
-
- @echo off
- :<!--
- rem 我一直在想如果用dos调用html代码,今天我算是找到方法了2007-3-6 by myzwd。
- call:one my.htm
- goto:eof
- :one
- more +1 %~s0>my.htm
- start %1
- del my.htm
- goto:eof
- -->
- <html >
- <font color=red><marquee>myzwd </marquee></font>
- </html>
复制代码
其实可以把bat放到html的注释里面,html的注释符号是<!-- 啊啊啊啊-->,dos 的标准注释是rem,顺便指出,符号“::”人们也常拿来注释,但是你试一下,在for里面用会报错的其实"::"这种符号与 ":a 123jk" 是一回事,它应该是子程序的记号。我觉得bat里面还是要尽量用标准的写法l。反过来也可以把html代码放到bat的注释里面。
但这种做法完全是多余的。比如上面这中写法在网页上就多出一个:号。正规的网页多一个冒号也是不可以的。
还有就是html代码码很长,以我编辑网页的经验的话,乱放是很麻烦的事情。加载代码和加载js,vb脚本是一回事情,因为这只不过是在<html>...</html>间再插入代码吧了。
问题:我一直没找到 %~s1 和%~f1的差别在那里,我每次混用给我的感觉都一样,差别在那呢?- @echo off
- echo 另类循环 骗骗你让你最后成为死循环 你运行3次试一试
- :one
- echo I LOVE YOU HOME OF BATCH
- set /a n+=1
- if %n%==20 goto end
- if errorlevel 10 goto one
- exit /b 10
- :end
- echo 循环次数%n%次
复制代码
[ 本帖最后由 myzwd 于 2009-3-12 23:10 编辑 ]
作者: BBCC 时间: 2009-3-7 12:12
问题:说真的我根本不知道这个符号是怎么打出来的---退格符号
edit==><ctrl>+p==>退格符
作者: Batcher 时间: 2009-3-7 12:42 标题: 回复 6楼 的帖子
http://bbs.bathome.net/thread-3626-1-1.html
作者: myzwd 时间: 2009-3-7 12:48 标题: call控制时间做动画,比较好
-
- @echo off
- rem call 运行比for慢,控制时间 动画
- color 0c
- for /l %%1 in (1 1 5) do (
- for /l %%2 in (1 1 100) do (call echo %time%>nul )
- call set tt= ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
- call echo %%tt%%
- )
-
- for /l %%1 in (1 1 5) do (
- for /l %%2 in (1 1 100) do (call echo %time%>nul )
- call set tt= ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
- call set tt= %%tt:~2%%
- echo.
- call echo %%tt%%
- )
-
- for /l %%1 in (1 1 5) do (
- for /l %%2 in (1 1 100) do (call echo %time%>nul )
- call set tt= ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
- call set tt= %%tt:~7%%
- echo.
- call echo %%tt%%
- )
复制代码
call比for慢 这个特性刚好可以做动画的时间控制-
- @echo off
- color 0c
- echo ---call和ping控制时间的动画效果对比
- echo ----ping
- for /l %%i in (1 1 5) do (
- set tt=■■■■■■■■■■
- ping -n 2 localhost >nul
- echo %tt%
- )
-
- echo ---call
- for /l %%i in (1 1 5) do (
- set tt=■■■■■■■■■■
- for /l %%1 in (1 1 100) do (call echo %time%>nul)
- echo %tt%
- )
- echo ---显见call控制时间具有更大的自由度,特别是ping闪烁的光标要处理
复制代码
call取值100大概等于ping取2的速度
[ 本帖最后由 myzwd 于 2009-3-7 19:57 编辑 ]
作者: myzwd 时间: 2009-3-7 13:21 标题: 回复 6楼 的帖子
谢谢 我按你的方法成功了。非常谢谢。
作者: myzwd 时间: 2009-3-7 19:11 标题: dos里面居然可以有遮罩---妙
-
- @echo off
- echo ---认识退格键 ""
- echo 中国人民解放军WS
- echo 中国人民解放军WS
- echo 中国人民解放军WS
- echo 中国人民解放军WS
- echo 中国人民解放军WS
- echo 中国人民解放军WS
- echo 中国人民解放军WS
- echo 中国人民解放军WS
- echo 中国人民解放军WS
- echo 中国人民解放军WS
- echo 中国人民解放军WS
- echo ---退格符就是一辆车走的路程,原有的字符就是一条路,
- echo 退格符后面的字符就是车,车过了,路还是路。
- echo 有的高手把退格符叫---挖土机,形象吧。
- echo ********************************
- echo ---动画演示退格符-■---
- echo *********************************
- for /l %%j in (1 1 100) do (call echo %time%>nul)
- color 0c
- set bs=
- for /l %%i in (1 1 10) do (
- for /l %%j in (1 1 200) do (call echo %time%>nul)
- call set bb=%%bs:~%%i%%
- call set tt= 中国人民解放军万岁%%bb%%■人民英雄永锤不朽
- call echo %%tt%%
- )
- echo 多象flash的遮罩,不过遮罩是遮住的显示,没遮住的不显示,
- echo 这里刚好与flash的遮罩功能相反
复制代码
-
- @echo off
- echo ----退格符应用动画---逐渐显示小方块
- color 0c
- set bs=
- for /l %%i in (1 1 120) do (
- set bs=■%bs%■
- for /l %%1 in (1 1 100) do (call echo %time%>nul)
- call set /p=%%bs%%<nul
- )
- echo --------------
- set bs=
- for /l %%i in (1 1 200) do (
- set bs=%bs%■
- for /l %%1 in (1 1 100) do (call echo %time%>nul)
- call set /p=%%bs%%<nul
- )
复制代码
上述两段程序只有一字之差,确显示出完全不同的效果。“set bs=■%bs%■ 和set bs=%bs%■”-
- @echo off
- color 0c
- set bs=
- for /l %%i in (1 1 10) do (
- set bs=%bs%■
- for /l %%1 in (1 1 100) do (call echo %time%>nul)
- call echo %%bs%%
- )
复制代码
程序分析:一切都是nul再作怪。把前面的程序最后一句改成这样:call echo %%bs%%,将得到靠左面的一列
小方块。因为迭代变量是 “bs=方块 退格 方块”,退格后bs的值就只能是 永远是一个方块。
----------------两个迭代变量------------------------------
tt=%tt%123 --------结果是:123,123123,123123123.。。。。。。
tt=%tt%123 --------123,12123,1212123,121212123......
--------------两个迭代显示--------------------------------
echo %tt%123
set/p=%tt%123<nul
----------------------------迭代当然离不开循环了。
-------------------------------------如何在左面插入空格- @echo off
- echo 在■ 的左面插入10个空格
- cls
- setlocal enabledelayedexpansion
- color 0c
- for /l %%i in (1 1 10) do (
- set tt=0!tt!
- )
- set tt=%tt%■
- set tt=%tt:0= %
- echo !tt!
复制代码
其实插入空格最好的办法是利用set变量
set space= ----这样是不行的
set space=“ ” 这样还是不行的
要这样:
set "space= "
要10个空格就循环吧- for /l %%1 in (1 1 10) do (call set "space= %%space%%")
复制代码
- @echo off
- echo ---匀速向左运动,显示2个整行
- set tt=
- color 1d
- for /l %%i in (1 1 78) do (
- for /l %%1 in (1 1 100) do (call echo %time%>nul)
- set tt=■■
- call set/p=%%tt%%<nul
- )
- echo.
-
-
- echo ---匀速向左运动,显示2个整行 英文
- set tt=
- color 1d
- set tt=
- for /l %%i in (1 1 158) do (
- for /l %%1 in (1 1 50) do (call echo %time%>nul)
- set tt=AA
- call set/p=%%tt%%<nul
- )
- echo.
-
-
- echo ---匀速向左运动,显示2个整行 中英文混合
- set tt=
- color 1d
- set tt=
- for /l %%i in (1 1 156) do (
- for /l %%1 in (1 1 50) do (call echo %time%>nul)
- set tt=A■
- call set/p=%%tt%%<nul
- )
- echo.
复制代码
- @echo off
- echo ---迷失的A
- set tt=
- color 1d
- set tt=
- for /l %%i in (1 1 115) do (
- for /l %%1 in (1 1 50) do (call echo %time%>nul)
- set tt=■A
- call set/p=%%tt%%<NUL
- )
- echo.
- echo ----
- set tt=
- color 1d
- set tt=
- for /l %%i in (1 1 120) do (
- for /l %%1 in (1 1 50) do (call echo %time%>nul)
- set tt=■A
- call set/p=%%tt%%<NUL
- )
复制代码
这的放法是个细节,要想成为整行,就在这里下功夫。循环终值=(40-1)*行数,英文 循环终值=(80-1)*行数
混合 循环终值=(80-2)*行数 迷失的A例外--循环终值=40*行数 或 循环终值=40*行数-1(显示A)-
- @echo off
- echo ---居中显示
- color 1d
- set tt=
- set ss=
- for /l %%i in (1 1 16) do (
- call set ss=%%ss%%0
- )
- call set ss=%%ss:0= %%
- call set /p=%%ss%%<nul
- for /l %%i in (1 1 21) do (
- for /l %%1 in (1 1 50) do (call echo %time%>nul)
- call set tt=■■
- call set /p=%%tt%%<nul
- )
- echo.
复制代码
-
- @echo off
- echo ---退格符完成简易向右运动
- cls
- echo.&echo.&echo.
- color 1d
- set tt=
- set ss=
- set bs=
- for /l %%i in (1 1 78) do (
- call set ss=%%ss%%0
- )
- set ss=%ss:0= %
- set /p=%ss%<nul
- for /l %%i in (1 1 15) do (
- for /l %%1 in (1 1 100) do (call echo %time%>nul)
- call set bs=%%bs%%
- call set tt=%%bs%%■
- call set /p=%%tt%%<nul
- )
- echo.
- echo 原理是利用78个空格基本铺满第一行,给小方块留下2byte的位置,
- echo 利用退格符相当于是它后面字符走的路程的原里,让退格符逐渐增加,即字符的路程加大
- echo 这样就实现了反方向运动,为了好记忆我自己把退格符的这种性质叫退格符的--------
- echo 路程原理 ,如果退格符后面没字符,这个路程也就不起作用了
复制代码
[ 本帖最后由 myzwd 于 2009-3-9 16:19 编辑 ]
作者: irresolute 时间: 2009-3-7 20:56 标题: 退格符
二点体会:
退格之后,处于改写状态,二个英文字符相当一个汉字。
在复合句中,call有延迟变量的功能。
作者: skyinheaven 时间: 2009-3-7 20:57
很好的笔记,学习了!
作者: myzwd 时间: 2009-3-7 21:09 标题: 回复 11楼 的帖子
一个汉字=2个英文字,但是从上面的实例可以看出,退一格就是一遮住一个字符,不管它是中文还是英文。
另外 关于call 的延迟性的理解,我个人认为可以理解得简单点,就是cmd在解释语句时,遇到call就会对程序再解释,以补充不足的数据,以完成数据匹配,最后实现对程序的执行,最终以,这样就实现了数据的动态变化。微软的bat是一个黑箱,想多了反而自找麻烦。呵呵
今天研究了本论坛两大高手的代码,觉得高手的代码就是不一样。长知识了。
-
- @echo off
- rem ----向右运动
- setlocal enabledelayedexpansion&color 1d
- for /l %%i in (40 -1 1) do (
- for /l %%1 in (%%i ,-1,1) do (
- set /p= <nul
- )
-
- set /p=■<nul
- for /l %%1 in (1 1 50) do (echo.>nul)
- cls
- )
复制代码
[ 本帖最后由 myzwd 于 2009-3-9 15:37 编辑 ]
作者: irresolute 时间: 2009-3-8 15:13 标题: 回ls
一个格退格符就向后退一个字符的位置,退格符后面的内容就从这个位置开始输出,并改写此位置后面的原有内容,二个英文字母改写一个汉字,没被改写的原样输出。难道你不认为是这样么?
作者: irresolute 时间: 2009-3-8 15:15
只有二种方法能实现变量的延迟
1、setlocal enabledelayed
2、call
难道你不认为这样么?
作者: myzwd 时间: 2009-3-8 16:27 标题: 动画实例
从实验来看 ,把退格符后面的内容理解为车。把退格符号理解为车走的路程。而原来的字符理解为路,车过了,路还是路。我是这样认为的。-
-
- @echo off&setlocal enabledelayedexpansion&cls&color 0a
- echo 居中显示70个小方块
- for /l %%1 in (1 1 80) do (set "space= !space!")
- for /l %%2 in (1 1 10 ) do echo.
- set /p=!space:~,-54!<nul
- rem 实现向右平移26byte,注释掉就将从最左面开始
- for /l %%i in (1 1 70) do (
- set /a "mod=%%i%%14"
- set /a n=n+1
- set /p=■<nul
- if !mod!==0 (set /p=!space:~,-28!<nul)
- for /l %%1 in (1 1 50) do (call echo.>nul)
- )
- exit /b
复制代码
一个显而易见的原理------
cmd一行可以显示80个byte,如果这一行已经填满,这时如果你插入x<80个字符,这时此行就会有x个字符被挤出来,插如多少就挤出多少,挤出的字符就自动到了第二行。根据这个原理,利用语句set /p=!space:~,-54!<nul就轻松的实现了平移。
----------求余运算与周期性运动
求余运算可以很好的刻画周期性运动,这个实例保持了总行高不变。改动一下就可以模仿自由落体运动。
- @echo off&setlocal enabledelayedexpansion&cls&color 1a
- rem 反复向上爬升
- for /l %%1 in (1 1 80) do (set "space= !space!")
- for /l %%i in (1 1 100) do (
- cls
-
- set /a "mod=%%i%%23"
- for /l %%j in (!mod! 1 23) do echo.
- for /l %%k in (1 1 !mod!) do echo !space:~70!■
- set /a n+=1
- for /l %%1 in (1 1 50) do (call echo.>nul)
- )
- :end
- echo %n%
- exit /b
复制代码
- rem 居中显示到三角
- @echo off&setlocal enabledelayedexpansion&cls&color 1a
- for /l %%1 in (1 1 80) do (set "space= !space!")
- for /l %%i in (1 1 9) do echo.
- for /l %%i in (1 1 5) do (
- set /p=!space:~-30!<nul
- for /l %%i in (1 1 !mod!) do set /p=!space:~-2!<nul
- set /a "t=12-2*%%i"
- set /a "mod=%%i%%5"
- for /l %%i in (1 1 !t!) do (
- set /p=■<nul
- )
- for /l %%1 in (1 1 50) do (call echo.>nul)
- echo.
- )
- pause >nul
复制代码
记得读大学时,我们的计算机进行抽签考试,我就抽到了这个到三角,要求在5分钟内编程显示,我在机房里
半天也没编出程序来,眼看时间就要到了,在最后的一分钟我来了灵感才编出程序来。当时考试差点没过关,今天我试着用bat编写了一个,算是对自己读书时代的怀念。我习惯于定义空格,好象这样做规范一点,因为我常拿到
其它的bat,稍微动了一书写个格式,程序就报错,其根本就是没定义空格。
创意----刷屏语句-不用cls也可以实现从下到上运动,因为cmd默认显示300行,利用这点就可以实现从下到上的运动。每屏应该是25行。- rem 刷屏语句 for /l %%j in (1 1 300) do (echo.)
-
- for /l %%i in (1 1 20) do (
- for /l %%j in (1 1 300) do (echo.)
- for /l %%j in (1 1 %%i) do (echo ■ )
- echo.&echo.&echo.
- for /l %%1 in (1 1 100) do call echo.>nul
-
- )
复制代码
- @echo off&setlocal enabledelayedexpansion&cls&color 0a
- rem 利用刷屏,实现向右运动,不过要用pause才好
- for /l %%1 in (1 1 80) do set "space= !space!"
- for /l %%i in (1 1 20) do (
- for /l %%j in (1 1 25) do (echo.)
- set tt=!space:~-%%i!■
- echo !tt!
- for /l %%k in (1 1 13) do echo.
- for /l %%1 in (1 1 50) do call echo.>nul
- )
-
- pause>nul
复制代码
-
- @echo off&setlocal enabledelayedexpansion&cls&color 0a
- rem 利用刷屏,实现向左运动,不过要用pause才好
- for /l %%1 in (1 1 80) do set "space= !space!"
- for /l %%i in (1 1 70) do (
- for /l %%j in (1 1 25) do (echo.)
- set /a n=78-%%i
- call set sp=%%space:~-!n!%%
- echo !sp!●
- for /l %%k in (1 1 13) do echo.
- for /l %%1 in (1 1 50) do call echo.>nul
- )
- pause>nul
复制代码
-
- @echo off&setlocal enabledelayedexpansion&cls&color 0a
- rem 利用刷屏,实现向下运动,不过要用pause才好
- for /l %%1 in (1 1 80) do set "space= !space!"
- for /l %%i in (1 1 25) do (
- for /l %%j in (1 1 25) do (echo.)
- set /a h=25-%%i
-
- echo !space:~-39!●
- for /l %%k in (1 1 !h!) do echo.
- for /l %%1 in (1 1 50) do call echo.>nul
- )
- pause>nul
复制代码
- @echo off &setlocal enabledelayedexpansion
- rem 转载 by 523066680 这段代码很简洁,值得学习。
-
-
- for /l %%a in (1,1,79) do (set "space= !space!")
- for /l %%a in (1,1,23) do (set h%%a=%space%)
-
- set /p input="输入高[2-23]: "
- set /a c=0,h=1,i2=input*2,na=40-input
- set stra=!space:~-%na%!
-
- for %%a in ("c + %i2%" "h + %input%" "c - 1" "h - 1") do (call :func %%~a)
-
- pause>nul
- exit /b
-
- :func
- set /a %1 %2 = 1,cf=c-1
- set h%h%=!h%h%:~0,%cf%!.!h%h%:~%c%!
- ping -n 1 127.1>nul &cls
- for /l %%a in (1,1,%input%) do (echo,%stra%!h%%a:~0,-%na%!)
- if !%1! neq %3 goto :func
复制代码
- @echo off &setlocal enabledelayedexpansion&cls&color 1a
- rem 抛物线x=y*y与y=x*x
- for /l %%1 in (1 1 80) do set "space= !space!"
- mode con cols=80 lines=50
- for /l %%i in (0 1 5) do (
- set y=%%i
- set /a "x=y*y"
- call echo %%space:~-!x!%%●
- )
- echo --------
- for /l %%i in (0 1 4) do (
- set x=%%i
- set /a "x2=12*x"
- rem 这句话是把x轴的单位换成y轴的单位的12倍,是为了美观。即两轴的单位不等。
- rem 在数学上这是容许的
- set /a "y.increase=2*x+1"
- for /l %%j in (1 1 !y.increase!) do echo.
- call echo %%space:~-!x2!%%●
- )
- goto:eof
复制代码
- @echo off &setlocal enabledelayedexpansion&cls&color 1a
- rem 逐渐显示与删除文字
- set char=我写的这个有点烂,管它的这只是我的一次作业。
- for /l %%i in (1 1 21) do (
- set /p=!char:~,%%i!<nul
- ping -n 2 localhost >nul
- cls
- )
- for /l %%i in (1 1 21) do (
- set /p=!char:~,-%%i!<nul
- ping -n 2 localhost >nul
- cls
- )
- for /l %%i in (1 1 21) do (
- set /a "s=%%i-1"
- call echo %%char:~!s!,1%%<nul
- ping -n 2 localhost >nul
- cls
- )
复制代码
- @echo off &setlocal enabledelayedexpansion&cls&color 1a
- rem 设置环境变量char
- for /f %%i in ('more +6 %~f0') do set char=%%i
- echo ~~~~~%char%~~~~~
- pause
- exit /b
- 1这样也可以设置环境变量 这样也可以设置环境变量
- 2这样也可以设置环境变量 这样也可以设置环境变量
复制代码
- @echo off &setlocal enabledelayedexpansion &cls &color 1a
- for /l %%1 in (1 1 80) do set "space= !space!"
- more /s +14 %~f0>rr.txt
- for /l %%i in (1 1 50) do (
- for /f "eol=e tokens=* " %%i in (rr.txt) do echo %%i
- for /l %%1 in (1 1 100) do call echo.>nul
- cls
- for /f "eol=m tokens=* " %%i in (rr.txt) do echo %%i
- for /l %%1 in (1 1 100) do call echo.>nul
- cls
- )
- del rr.txt
- pause
- exit /b
- e _,._
- e __.' _)
- e <_,)'.-"a\
- e /' ( \
- e _.-----..,-' (`"--^
- e // |
- e (| `; , |
- e \ ;.----/ ,/
- e ) // / | |\ \
- e \ \\`\ | |/ /
- e \ \\ \ | |\/
- e `" `" `"`
-
- m _,._
- m __.' _)
- m <_,)'.-"a\
- m /' ( \
- m _.-----..,-' (`"--^
- m // |
- m (| `; , |
- m \ ;.----/ ,/
- m ) // / \ \ |
- m | |\ \ / / |
- m | | \/ \/| |
- m `"` `"`
- ──────────────────────────────
复制代码
[ 本帖最后由 myzwd 于 2009-3-22 12:31 编辑 ]
作者: myzwd 时间: 2009-3-8 16:29 标题: 回复 15楼 的帖子
是这样的。我同意你的说法啊
作者: zqz0012005 时间: 2009-3-8 19:10 标题: 回复 16楼 的帖子
退格符,应该是计算机基础的范畴,参见:ASCII码
注意退格符不是键盘上的退格键Backspace,它们不是一个概念。
退格符的作用是,将光标位置退回到前一个字符,但不会删除光标位置的字符。如果后边有新的字符,从光标位置继续。在屏幕上显示时,由于显示机制,新的字符会覆盖原来的字符;但如果是输出到打印机,原来的字符已经被打印,新的字符会与之重叠。
作者: myzwd 时间: 2009-3-9 17:27 标题: 对退格符的性质认识
我利用退格符,编写小方块从右向左运动时,小方块不是等距离倒退,如下面的程序所示:- @echo off&color 1c
- set sp=
- for /l %%1 in (1 1 50) do ( set /p "sp=0"<NUL)
- for /l %%i in (1 1 40) do (
- for /l %%1 in (1 1 100) do (echo.>nul)
- for /l %%j in (1 1 %%i) do (set /p=<NUL)
- set /p=■<NUL
- )
- ECHO.
复制代码
找来找去也没找到原因,最后只好去从新研究退格符的性质,原来是退格符的一条隐藏的性质我没发现,
先将实验整里如下----------------
- @echo off
- echo 实验1
-
- for /l %%1 in (1 1 10) 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 显示0000000000E
复制代码
-
- @echo off
- echo 实验2
-
- set sp=
- for /l %%1 in (1 1 10) 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 显示00000EDCBA
复制代码
-
- @echo off
- echo 实验3
- 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
复制代码
显见要实现等距离倒退,应采用实验2的结果。
到此已经可以利用这些实验结果编制正方形逆时针显示的三边程序了。
对了还差由下到上显示的方法。- @echo off&color 1c
- echo 原来这样就可以实现等距离拖尾倒退
- echo 实验4
- set sp=
- for /l %%1 in (1 1 50) do ( set /p "sp=0"<nul)
- set /p=■<nul
- for /l %%i in (1 1 40) do (
- for /l %%1 in (1 1 100) do (echo.>nul)
- set /p=■<nul
- )
- 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...)的方式添加退格符的个数。其余情况以次类推。
就如上面的实验四演示的那样。
以前 我平空想象,以为退格符的光标总是从一个固定的起点开始计算的。做了实验已算是自我纠正了错误。
复制代码
不知怎么回事 我总觉得使用退格符号,不是标准的bat,有种不正统的感觉。呵呵。
[ 本帖最后由 myzwd 于 2009-3-14 17:21 编辑 ]
作者: zqz0012005 时间: 2009-3-9 18:35
你总结的“122性质”是什么样的?怎么不表达出来?
这也叫“隐藏的性质”?这是它本来的性质好不好。
另外,这个帖子成了专门谈退格符的了,如有必要请修改标题。
作者: myzwd 时间: 2009-3-10 17:53 标题: 回复 1楼 的帖子
dos中的逐帧动画原理
我在一直在想如何让小方块,从下到上堆放,想来想起也没想出个头绪了来,因为dos的
显示机制,是先显示的在上面,后显示的在下面。跟要命的是显示时行高还在不停的变化。我们可以容易的让小方块从左向右运动,也可以让小方块从右向左运动,或从上到下运动,这只要利用退格符就可以办到。
让小方块从下到上堆放,就不太好办了。于是我想到了flash的逐帧动画,我动手一试
发现效果相当不错。利用帧可以自由的控制行高,控制小方块的走向。
在此我把它记录下来,奉献给网友。复制代码
说几个相关问题,我认为比较重要。
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
............
- @echo off&setlocal enabledelayedexpansion&color 0A &cls
- rem by myzwd 2009 -3 -10
- :main
- call:1
- goto:eof
- :1
- for /l %%i in (1 1 8) do (
- set /a n+=1
- set /a m=8-!n!
- for /l %%i in (!m! -1 1) do (echo.)
- for /l %%i in (1 1 !n!) do (echo aaa)
- echo ----------------------------
- for /l %%1 in (1 1 200) do (call echo.>nul)
- cls
- )
- :end
- for /l %%i in (1 1 8) do (echo aaa)
- echo ----------------------------
- echo 此为上述代码整理
- goto:eof
复制代码
set /a m=8-!n! 这句话就是数学中的m+n=8帧的高度为8。帧的高度就是用的这个数字8
逐帧动画的程序编制起来,有种结构化的感觉。
-
-
- 我的动画学习心的
-
- for /l %%i in (1 1 20) do ( ---------定义帧循环次数
- for /l %%j in (1 1 %%i) do ( --------定义一帧的开始语句
- set "sp1= !sp1!" -----中间这些语句用来描述帧的特征
- set /p=!sp1!■<nul
- for /l %%1 in (1 1 100) do (call echo.>nul) --动画速度控制语句
- cls ----换帧语句
- ) ----定义一帧的结束
- ) ---------定义帧循环次数
-
-
复制代码
- @echo off&setlocal enabledelayedexpansion&cls&color 0a
- rem 小方块反复从右开始运动--求余运算"%%"
- rem 数据指针嵌套方法"%%...!..!%%"
- for /l %%1 in (1 1 79) do (set space= !space!)
- for /l %%j in (1 1 100) do (
- set /a "mod=%%j%%20"
- if !mod!==0 (set /a "t=%%j/20" &set n=0)
- for /l %%1 in (1 1 !t!) do (echo.)
- set /a n+=1
- call set sp=%%space:~0,-!n!%%
- set /p=!sp!■<nul
-
- for /l %%1 in (1 1 50) do (call echo.>nul)
- cls
- )
复制代码
题外话,记得以前,我开始做网页的时候,不知道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 编辑 ]
作者: fsh6666 时间: 2009-3-11 12:58
先收藏了 以后慢慢学 慢慢看
作者: myzwd 时间: 2009-3-15 18:20 标题: findstr简单实例---输入彩色标签
----1- @echo off
- rem findstr让输入的字成为彩色字体的方案
- set tt="I LOVE HOME OF BATCH"
- set /p= <nul>%tt%
- findstr /a:24 z* %tt%*
- echo.
- del %tt%
复制代码
---2- @echo off
- rem findstr让输入的字成为彩色字体的方案
- set tt="I LOVE HOME OF BATCH"
- echo >%tt%
- findstr /a:24 z* %tt%*
- del %tt%
复制代码
--3- echo.>rr
- findstr /a:0c 1* rr*
- del /q rr
复制代码
作者: myzwd 时间: 2009-3-16 18:06 标题: 动画总结
*************************我对动画学习的总结*******************
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---单屏动画和刷屏动画能否混用?
下面的例子说明了可以混合使用。
- @echo off &setlocal enabledelayedexpansion &cls &color 1a
- mode con cols=80 lines=25
- :one
- for /l %%1 in (1 1 80) do set "space= !space!"
- for /l %%i in (1 1 12) do (
- for /l %%1 in (1 1 25) do echo.
- set "u=%%i"
- echo !space:~-%%i!→
- for /l %%j in (1 1 !u!) do echo.
- for /l %%1 in (1 1 30) do call echo.>nul
- )
-
- rem 这段程序是刷屏,把坐标原点定在左下角 for /l %%1 in (1 1 25) do echo.
- :two
- for /l %%i in (13 1 25) do (
- cls
- for /l %%j in (1 1 %%i) do echo.
- echo !space:~-%%i!→
- for /l %%1 in (1 1 30) do call echo.>nul
- )
- rem 这段程序是单屏幕动画,把坐标原点定在了左上角。cls的作用。
- pause>nul
复制代码
cmd中显示的是箭头从下到上运动,接着又从上到下。这中间坐标原点做了两次选择。
10---动画的大致分类拖尾动画与丢掉动画(不拖尾)
通常丢掉动画要容易做的多,拖尾动画通常比不拖尾动画麻烦。
拖尾即是指留下了运动轨迹的动画,丢掉就是不见运动轨迹的动画。
拖尾动画还得看看高手们是怎么做的。
我还得好好的吸取他们的经验。
如果有人愿意介绍他的动画经验那是最好不过的了。
我和其他初学者一样非常想听听其它爱好者的经验。
11--我想学习动画的第一步是要学会控制小方块向各个方向(拖尾于丢掉)运动吧
12--cmd中的动画其实是在作假,比如说从下倒上运动不是真的是那样运动的。因为cmd的显示总是先显示的在上面后显示的在下面,这点我们无法改变的。我们看到字符从下到上运动,其实是假的。是在欺骗我们的眼睛。cmd的动画,到有点象魔术。只有你欺骗得了眼睛就行。
[ 本帖最后由 myzwd 于 2009-3-20 19:19 编辑 ]
作者: myzwd 时间: 2009-3-19 12:34 标题: 答案 -------显示5个A
- @echo off &setlocal enabledelayedexpansion&cls&color 1a
- set "space= "
- call:y 2
- for /l %%i in (1 1 3) do (
- set/p=A<nul
- for /l %%1 in (1 1 300) do call echo.>nul
- )
- for /l %%i in (1 1 2) do (
- cls
- set /a t=2-%%i
- call:y !t!
- for /l %%i in (1 1 %%i) do echo !space!A
- for /l %%i in (1 1 3) do set /p=A<nul
- for /l %%1 in (1 1 300) do call echo.>nul
- )
- echo.
- pause
- exit /b
- :Y
- for /l %%i in (1 1 %1) do (echo.)
- goto:eof
复制代码
作者: myzwd 时间: 2009-3-20 11:22 标题: 回复 1楼 的帖子---老老实实的学习一门语言---随笔。
记得读书时我的电脑老师告诉我们,所有的语言都包含4种结构
1---顺序结构
2--转子结构
3--循环结构
4--分支结构
从这个角度讲,我应该老老实实的学习bat。只有这样学习才是最经济的。只有这样才可以触类旁通。
还有就是网上的那些黑客的这样攻击那样攻击,我都去试过,不过只是在虚拟机上试的
,因为真的电脑上根本没办法成功。我学习bat只是想让我的电脑能更好的工作。我不再象刚开始学习电脑时,那样幼稚了。老想用bat调用这样那样去攻击别人。那曾经浪费了
我不少的时间,因为你根本不会有成功的机会。除非别人有意等着你杀。
黑客的教程之所以讲攻击,那为了吸引眼球。比如说什么telnet登陆,说的是那么美好,那么诱惑人,但是我禁用我的tennet服务,你就只有干瞪眼!
还有一个网络中老讲的例子,利用软件x-scan扫描,最后建立空链接,然后就可以去获得adminstrator的密码,然后如何如何的攻击别人。我就明说我的电脑就开了空连接,我还想看看别人是如何攻击我的呢?
我讲这些东西就是要说明一个问题,学习bat,思路要端正,不要老想着学了可以攻击别人。高级语言都有共性,老老实实的学习一门语言才是最经济的方法。
作者: myzwd 时间: 2009-3-20 17:22 标题: n的阶乘计算 ---本页最终完成√k的编程
- echo 阶乘计算
- set /p n=输入n值---
- set r=1
- for /l %%i in (1 1 !n!) do (
- set /a "r=!r!*%%i"
- )
- echo !n!的阶乘=!r!
- pause>nul
复制代码
sin(x)=1-(1/3!)x^3+(1/5!)x^5-......
编出sinx的计算程序要分离1/3!的整数部分和小数部分。有意思那天试试看能不能成功。
我猜应要用到bat的 运算---“/和%%”
求平方根的递推公式-
-
- f(n)={f(n-1)+k/f(n-1)}/2 ,其中n=1 ,2 ,3.。。
- 这是k的平方根公式
复制代码
- @echo off &setlocal enabledelayedexpansion &cls &color 1a
- echo -----判断小数位数----
- :00
- set /p x=输入数字--
- set x1=a%x%
- :01
- set /a bit+=1
- set num=!x1:~-1!
- set x1=!x1:~,-1!
- if !num! equ a (set bit=1 &goto end)
- if !num! neq . goto 01
- :end
- call set v=%%x:~-!bit!%%
- call set u=%%x:~0,-!bit!%%
- if %bit%==1 (set "v=0" &set "u=%x%")
- set /a bit=%bit%-1
- echo ┌─────────────┐
- echo 小数位数=%bit% 整数部分=%u% 小数部分=%v%
- echo └─────────────┘
- set /p choice=输入r--从新开始,输入其它字符--结束--?
- set bit=0
- if %choice%==r goto 00
- pause
复制代码
分数化小数方法
http://bbs.bathome.net/thread-3832-1-1.html
两个正小数相加- @echo off &setlocal enabledelayedexpansion &cls &color 1a
- echo ~~~~~~~~~~~~~小数加法~~~~~~~~~~~~~~~~~by myzwd 2009 3 23
- echo ──────────────────────────────────
- :main
- set /p a=输入第一个小数---
- set /p b=输入第二个小数---
- rem 可以使用参数%1 %2 调用
- call:sub %a%
- set "a.bit=%bit%" &set "a.x=%v%" &set "a.z=%u%"
- call:sub %b%
- set "b.bit=%bit%" &set "b.x=%v%" &set "b.z=%u%"
-
- set /a "t=%a.bit%-%b.bit%"
- if %t% geq 0 ( for /l %%i in (1 1 %t%) do (set b.x=!b.x!0)
- ) else (set /a t=-%t%
- for /l %%i in (1,1,!t!) do (set a.x=!a.x!0)
- set "a.x=!a.x: =!"
- )
-
- :end
- set /a "sumazbz=%a.z%+%b.z%"
- set a.x=%a.x:.=1% &set b.x=%b.x:.=1%
- set /a "sum=%a.x%+%b.x%"
- set /a "sum.z=%sum:~0,1%-2" &set "sum.x=%sum:~1%"
- set /a "sum.z=%sumazbz%+%sum.z%"
- set sum=%sum.z%.%sum.x%
- echo 结果是----%a%+%b%=%sum%
- set /p choice=输入r重新开始,输入其它字符结束--?
- if %choice%==r goto main
- exit /b
- --------- 程序结束-----------------
- ------z符号代表整数部分,x符号代码小数部分
- :sub
- :00
- set x=%1
- set x1=a%x%
- set bit=0
- :01
- set /a bit+=1
- set num=!x1:~-1!
- set x1=!x1:~,-1!
- if !num! equ a (set bit=1 &goto end)
- if !num! neq . goto 01
- :end
- call set v=%%x:~-!bit!%%
- call set u=%%x:~0,-!bit!%%
- if %bit%==1 (set "v=0" &set "u=%x%")
- set /a bit=%bit%-1
- echo ┌─────────────────────┐
- echo 小数位数=%bit% 整数部分=%u% 小数部分=%v%
- echo └─────────────────────┘
- goto:eof
复制代码
利用递推数列开方,本来收敛速度是最快的了,一般迭代4,5次就有很高的精度了。但是关键的一点是要解决两个有理数的除法运算如2.5/1.23 ,这最终又归结到小数点的移动上去。看来得多弄几个子程序。工作量有点大。有时间再说吧。我真不明白微软的bat在设计上为什么不直接设计来可以进行小数运算呢?
[ 本帖最后由 myzwd 于 2009-3-23 20:58 编辑 ]
作者: myzwd 时间: 2009-3-22 12:54 标题: 利用注册表修改cmd的属性
cmd的属性可以利用注册表修改
hkcu\console -----cmd的属性都记录在这个键下
添加值名windowposition 再添加 d_word值可以改变cmd在屏幕中的位置。如(十进制)10551000,10551048 .把值设置为0就是恢复默认。
[ 本帖最后由 myzwd 于 2009-3-22 13:09 编辑 ]
作者: myzwd 时间: 2009-3-24 13:11 标题: vbscript脚本实例
- msgbox("Hello from VBScript!")
- msgbox "123456789"
复制代码
- dim name
- name="Jan Egil"
- msgbox(name)
复制代码
- dim name
- name="Jan Egil"
- msgbox("My name is: " & name)
复制代码
- dim fname(5)
- fname(0) = "George"
- fname(1) = "John"
- fname(2) = "Thomas"
- fname(3) = "James"
- fname(4) = "Adrew"
- fname(5) = "Martin"
-
- for i=0 to 5
- msgbox(fname(i) & " 123")
- next
复制代码
- sub mySub()
- msgbox("This is a sub procedure")
- end sub
- call mySub()
复制代码
- function myFunction()
- myFunction = "BLUE"
- end function
- msgbox("My favorite color is " & myFunction())
复制代码
- function greeting()
- i=hour(time)
- if i < 10 then
- msgbox("Good morning!")
- else
- msgbox("Have a nice day!")
- end if
- end function
- call greeting()
复制代码
- function greeting()
- i=hour(time)
- If i = 10 then
- msgbox("Just started...!")
- elseif i = 11 then
- msgbox("Hungry!")
- elseif i = 12 then
- msgbox("Ah, lunch-time!")
- elseif i = 16 then
- msgbox("Time to go home!")
- else
- msgbox("Unknown")
- end if
- end function
- greeting()
- rem elseif 不是else if
- '注释
复制代码
- d=weekday(date)
-
- select case d
- case 1
- msgbox("Sleepy Sunday")
- case 2
- msgbox("Monday again!")
- case 3
- msgbox("Just Tuesday!")
- case 4
- msgbox("Wednesday!")
- case 5
- msgbox("Thursday...")
- case 6
- msgbox("Finally Friday!")
- case else
- msgbox("Super Saturday!!!!")
- end select
- rem 这是select 语句
复制代码
- for i = 0 to 5
- msgbox("The number is " & i & "
- ")
- next
复制代码
- dim names(2)
- names(0) = "George"
- names(1) = "John"
- names(2) = "Thomas"
-
- for each x in names
- msgbox(x & "这句相当于bat的for in语句")
- next
复制代码
- i=0
- do while i < 10
- msgbox(i & " ")
- i=i+1
- loop
复制代码
- i=0
- do
- msgbox(i & " ")
- i=i+1
- loop while i < 10
复制代码
- do
- msgbox("123456")
- i=i+1
- loop until i > 5
复制代码
- msgbox("Today's date is " & date())
- msgbox("The time is " & time())
- rem 也可以这样,这是调用函数的一种方法
- msgbox "今天的时间是" & time()
- '日期和时间
复制代码
- msgbox(WeekDayName(1))
-
- msgbox(WeekDayName(2))
-
- msgbox("Get the abbreviated name of a weekday:")
-
- msgbox(WeekDayName(1,true))
-
- msgbox(WeekDayName(2,true))
-
- msgbox("Get the current weekday:")
-
- msgbox(WeekdayName(weekday(date)))
-
- 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 编辑 ]
作者: guao_jie 时间: 2009-3-26 20:57 标题: 。
我完全是一个新手,看不懂代码。。顶
作者: myzwd 时间: 2009-4-13 19:55 标题: start 的2个例子
- rem 这是用windows图片查看器打开图片
- start e:\test\a.jpg
复制代码
- rem 这是在网页中打开图片,vb中就常用这句话
- start explorer e:\test\a.jpg
复制代码
系统在默认状态下打开文件是按上述方法打开。请看31楼batcher的说明。
如在vb中(不是vbs),要打开网页就可以用下面的代码:
shell "explorer http:\\www.hao123.com"
vbs是vb的简化版(轻量级别)的vb
在dos中插上两句vbs效果挺不错的。
vbs中常用的两句话是
msgbox 和inputbox-
- x=msgbox ("提示信息",48,"窗口标题")
复制代码
x是运行函数msgbo的返回值,为1-7的值。这个返回值可以用于编程时的条件判断语句。
48是提示框样式(style)数字,可以查表查找比如说可以输入0,1,2,4,32,等等
如果只需要提示信息,代码可以按如下的方法写复制代码
inputbox函数就的用法是- y=inputbox ("提示信息","","默认值")
复制代码
同常了解这两句就够了。
[ 本帖最后由 myzwd 于 2009-4-13 20:36 编辑 ]
作者: Batcher 时间: 2009-4-13 20:07 标题: 回复 31楼 的帖子
这个取决于系统文件关联
跟start命令本身没有什么关系
作者: myzwd 时间: 2009-4-13 20:15 标题: 回复 32楼 的帖子
是这样的?我从没试过。谢谢。我有长进了。呵呵。
[ 本帖最后由 myzwd 于 2009-4-13 20:18 编辑 ]
作者: peterwang 时间: 2009-4-14 13:07
好多地方都不是很懂,要好好学习了
作者: freeback 时间: 2009-5-11 01:12
看了上面的东西长进不少。多希望高手多分享自己的学习心得。
作者: wc726842270 时间: 2011-2-28 19:01
学习了。原来HTML件可以这么和P结合,但是有没有更好的方法呢?
作者: lanshao 时间: 2013-6-2 13:14
难怪学起来那么难啦!!!
作者: lanshao 时间: 2013-6-2 13:14
难怪学起来那么难啦!!!
作者: hongkong 时间: 2013-7-25 19:20
都是一些高手啊……!!!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |