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

批处理读书笔记

最近我对批处理的学习有点感兴趣了,学到了不少东西,以前我以为批处理就是一个单调的黑白世界,但是,当我看到了一些精彩的程序后,才知道原来批处理可以这样,原来黑白世界也精彩。

     精彩实例1--- 弹动的小球:
  1. @echo off&mode con cols=20 lines=29&color 2c
  2. setlocal enabledelayedexpansion
  3. title 弹球-zw19750516
  4. set a=●&set "b= "
  5. :begin
  6. cls&set n=0
  7. set /a lm=%random%%%19,lr=%random%%%2
  8. if %lm% equ 0 (
  9. set z=+
  10. ) else (
  11. if %lm% equ 17 (
  12. set z=-
  13. ) else (
  14. if %lr% equ 0 (
  15. set z=-
  16. ) else (
  17. set z=+
  18. )
  19. )
  20. )
  21. :contin
  22. set "kong="
  23. set /a n+=1,lm%z%=1
  24. for /l %%i in (1,1,%lm%) do set kong=!kong!%b%
  25. set str%n%=%kong%%a%
  26. if %n% equ 30 goto begin
  27. if %lm% equ 0 set z=+
  28. if %lm% equ 17 set z=-
  29. set /p=!str%n%!nul
  30. for /l %%i in (1,1,20) do set /p= <NUL
  31. echo.
  32. goto contin
复制代码
精彩实例2---跳动的小球
  1. @echo off&setlocal enabledelayedexpansion
  2. mode con: cols=81 lines=30&color 1f
  3. :: code by 随风@bbs.bathome.net 2008/01/03
  4. :loop
  5. for /l %%a in (1 1 40) do (
  6.   if defined sang (
  7.   cls&set /a di-=1
  8.   for /l %%i in (1 1 !di!) do echo.
  9. ) else (echo.&set /a di+=1)
  10.   if defined zuo (set ko=!ko:~1!) else set ko= !ko!
  11.   set /p=!ko!●<nul
  12.   for /l %%i in (1 1 80) do ver>nul
  13.   set /p=  <nul
  14.   if not "!ko:~38,1!"=="" set zuo=ok
  15.   if "!ko!"=="" set zuo=&set "ko= "
  16.   if !di! lss 0 set sang=&goto loop
  17.   if !di! geq 29 set sang=ok&goto loop
  18. )
复制代码
精彩实例3----五彩的世界
  1. @echo off
  2. ::输出彩色字符
  3. mode con lines=24 cols=69
  4. set "a= One World !"
  5. set "b= one Dream !"
  6. set "c= 让我们大家一起说"
  7. set "d=︱ bbs.cn-dos.net is our common home!"
  8. set "e= {Author∶jvive︱08-03-31︱Thanks to∶9527}"
  9. set "x= ︱"
  10. set "p=★★★★★★★★★★★★★★★"
  11. set "k="
  12. pushd %tmp%
  13. del/q "%a%?" "%b%?" "%c%?" "%d%?" "%e%?" "%x%?" "%p%?" 2>nul
  14. call:enter 3
  15. call:JV a "%a%" 0
  16. call:JV b "%b%" 0
  17. call:JV c "%c%" 0
  18. call:enter 5
  19. call:JV 0100 0 0
  20. call:JV 040a "%d%" 0
  21. call:JV 040a "%x%" 0
  22. call:JV 0100 000 0
  23. call:JV 040b "%d%" 0
  24. call:JV 040b "%x%" 0
  25. call:JV 0100 000 0
  26. call:JV 0400 "%d%" 0
  27. call:JV 0400 "%x%" 0
  28. call:JV 0100 0 1
  29. call:enter 3
  30. call:JV e "%e%" 0
  31. call:JV 0100 0 1
  32. echo.
  33. call:color
  34. pause>nul&exit/b
  35. rem ---------subprocess--------
  36. :color|一二层第一个色调混合为主色调,最后一个为闪烁停留色调.
  37. for %%a in (0 e)do (
  38. for %%b in (a 1 2 3 4 5 6 7 8 0 c b d f e)do (
  39. call set "k=%%k%%"
  40. call:bak %%a%%b "%p%" 0
  41. ))
  42. goto :eof
  43. :JV
  44. :bak
  45. if %3 neq 1 (set/p=%k%"%~2") else echo.>"%~2"
  46. if %0 neq :bak (set k=) else set "k=%k%"
  47. findstr /a:%1 .* "%~2?"
  48. del "%~2?"
  49. goto :eof
  50. :enter
  51. for /l %%a in (1 1 %1)do echo.
复制代码
看了这些精彩的实例,这个黑白世界变的有点可爱了。然该死的微软,关于批处理的资料说的是那样的含糊,
把批处理弄的象一个黑色的暗箱。让人学习批处理的难度,远远大于学习其它高级语言,正是上贼船容易,熟悉贼性难于上青天,所以高手的经验,就显得特别的重要。

     在这里我将把我看到的一些好的东西记录下来。这样可以防此遗忘。我以后在要找这些东西,我以有个查阅的地方。

------------------NOTE-----------------
---停此shift创建的循环----
  1. @echo off
  2. 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
  3. goto:eof
  4. :one
  5. echo %5
  6. if %5a==a goto:eof
  7. shift
  8. goto one
复制代码
---------
今天读书时看到了,如何停此由shift构造的循环。以前我还真的不知道,长知识了。
if %5a==a goto:eof

if %3a==a goto:eof

if %8a==a goto:eof

if %5#==# goto:eof
原来是这样停下来的。呵呵

----让变量名动态的变化


[/code]
  1. @echo off
  2. rem 让变量名字动态的变化
  3. set tt=123
  4. for /l %%i in (0 1 10) do (
  5. set tt%%i=%tt%
  6. set tt%%i
  7. set tt%%i=
  8. )
  9. echo ------
  10. set var=123
  11. setlocal enabledelayedexpansion
  12. for /l %%i in (0 1 10) do (
  13.    set /a n+=1
  14.    set var!n!=%var%
  15.    set var!n!
  16. )
  17. echo ------
  18. set tt=123
  19. call:one 1 2 3 4 5 6 7 8 9 10
  20. goto:eof
  21. :one
  22. set tt%1=%tt%
  23. set tt%1
  24. shift
  25. if %1a==a goto:eof
  26. goto one
  27. echo ------
  28. rem 追加值
  29. setlocal enabledelayedexpansion
  30. for /l %%i in (0 1 10) do (
  31. set tt=!tt! %%i
  32. set tt
  33. )
  34. echo ------------------
  35. call:one 1 2 3 4 5 6 7 8 9 10
  36. goto:eof
  37. :one
  38. set tt=%tt% %1
  39. set tt
  40. shift
  41. if %1a==a goto:eof
  42. goto one
复制代码
  1. @echo off
  2. rem 看到两种去掉左面0的方法
  3. set tt=001234
  4. for /f "delims=0" %%i in ("%tt%") do (
  5. echo %%i
  6. )
  7. echo ----
  8. set /a "tt=1001234 %%1000000"
  9. set tt
  10. rem  (1000000+1234)/1000000=1234
复制代码
精彩实例4----变动的方框
  1. ::这一版本的编辑---if exist    Q523066680
  2. @echo off&mode con cols=60 lines=30 &color 0a
  3. setlocal enabledelayedexpansion
  4. set omax=oooooooooooooooooooooooooooooooooooooooo
  5. set kmax=%omax:o= %
  6. set n=4
  7. :a
  8. set /a n+=4
  9. set /a upkh=15-%n%/4,kleft=30-%n%/2,zk=%n%-4,zkh=%n%/2-2
  10. set leftk=!kmax:~0,%kleft%!
  11. set zk=oo!kmax:~0,%zk%!oo
  12. set hang=!omax:~0,%n%!
  13. for /l %%a in (1,1,%upkh%) do echo.
  14. echo.%leftk%%hang%
  15. for /l %%a in (1,1,%zkh%) do echo.%leftk%%zk%
  16. echo.%leftk%%hang%
  17. echo.%n%
  18. for /l %%a in (1,1,2) do ping -n>nul
  19. cls
  20. if %n%==40 set /a n=4
  21. goto a
复制代码

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

评分人数

都是一些高手啊……!!!

TOP

难怪学起来那么难啦!!!

TOP

难怪学起来那么难啦!!!

TOP

学习了。原来HTML件可以这么和P结合,但是有没有更好的方法呢?
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

看了上面的东西长进不少。多希望高手多分享自己的学习心得。

TOP

好多地方都不是很懂,要好好学习了

TOP

回复 32楼 的帖子

是这样的?我从没试过。谢谢。我有长进了。呵呵。

[ 本帖最后由 myzwd 于 2009-4-13 20:18 编辑 ]

TOP

回复 31楼 的帖子

这个取决于系统文件关联
跟start命令本身没有什么关系
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

start 的2个例子

  1. rem 这是用windows图片查看器打开图片
  2. start  e:\test\a.jpg
复制代码
  1. rem 这是在网页中打开图片,vb中就常用这句话
  2. start explorer e:\test\a.jpg
复制代码
系统在默认状态下打开文件是按上述方法打开。请看31楼batcher的说明。

如在vb中(不是vbs),要打开网页就可以用下面的代码:
shell "explorer http:\\www.hao123.com"
vbs是vb的简化版(轻量级别)的vb
在dos中插上两句vbs效果挺不错的。
vbs中常用的两句话是
msgbox 和inputbox
  1. x=msgbox ("提示信息",48,"窗口标题")
复制代码
x是运行函数msgbo的返回值,为1-7的值。这个返回值可以用于编程时的条件判断语句。
48是提示框样式(style)数字,可以查表查找比如说可以输入0,1,2,4,32,等等
如果只需要提示信息,代码可以按如下的方法写
  1. msgbox “提示"&"自己想添加的字符串"
复制代码
inputbox函数就的用法是
  1. y=inputbox ("提示信息","","默认值")
复制代码
同常了解这两句就够了。

[ 本帖最后由 myzwd 于 2009-4-13 20:36 编辑 ]

TOP

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

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

利用注册表修改cmd的属性

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

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

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

回复 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

返回列表