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

批处理编程的异类:游戏、数学、时钟(延时)等

  学过DOS的人,或多或少都听过批处理。它小巧轻便,而且是系统级源代码解释,不用编译和连接而直接运行,曾经吸引了不少DOS的爱好者和编程者。众多人士的参与,无数奇思妙想的涌现,构成了批处理编程中的"异类"。它们并不是单纯为解决某些"成批处理的问题"而设计,而是真正将批处理做为一种语言,来体现它无限的创造力。

  下面是我搜集的一些批处理程序,他们或许并非是技术上的精品,但绝对是构思上的突破。我会不断的更新和完善这个主题,也希望大家同我一道努力,完成这个"异类"收藏。

  索引
======
1楼:本主题
2楼:游戏(Game):
    1、三子棋(TicTacToe)
3楼:数学(Math):
    1、随机数(Random)生成、随机矩阵生成,共2个
    2、2K/XP表达式计算
4楼:时钟(Clock):
    1、暂停(Pause)、延迟(Delay)、等待(Wait)或睡眠(Sleep),共5个

  声明
======

  1,为保持本帖的结构,仅为赞美和支持的同志请尽量不要在此回帖;
  2,对本帖某些程序有任何疑问和建议的朋友,请访问下面的主题
    http://www.cn-dos.net/forum/viewthread.php?tid=12388
  3,有意推荐程序的朋友,请注意以下的选择标准:
   (1),程序实现的功能具有一定的通用性和创新性;
   (2),程序不依赖于任何特殊或定制的本地环境(比如程序的路径);
   (3),程序未使用任何第三方工具或者软件;
   (4),程序最好适用于所有的 Windows 和 DOS 平台,如有特殊要求请注明;
  4,本主题采用淘汰制,即完成相同或相似功能的代码将采用编写质量最优秀者,无法区分优劣时,或者同时在一帖内列出,或者融合二者的优秀之处改遍成新的代码;被淘汰者或者单独发表主题列出,或者列出可引用的链接。

 更新记录
======
2004.06.20: 发出"[讨论]批处理编程的异类"主题,并与"[分享]批处理编程的异类"互相链接
2005.07.16: 更新7楼的 prompt 变量获取程序
2005.08.18: 修改3楼为数学(Math)主题,并增加随机数和随机阵列生成程序
2005.08.19: 修改4楼为时钟(Clock)主题,增加“暂停”程序5个
2005.09.11: 3楼数学(Math)主题增加“2K/XP表达式计算批处理”
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

    下面是一个获取errorlevel值到环境变量的程序,原文来自本站开发室:
    http://model.chinajewelry.net/do ... ardID=6&ID=9358
  1. @echo off
  2. set el=0
  3. if errorlevel 1 set el=1
  4. if not errorlevel 2 goto end
  5. :partbydec
  6. for %%h in (1 2) do if errorlevel %%h00 set elh=%%h
  7. if [%elh%]==[1] for %%t in (0 1 2 3 4 5 6 7 8 9) do if errorlevel %elh%%%t0 set elt=%elh%%%t
  8. if [%elh%]==[2] for %%t in (0 1 2 3 4 5) do if errorlevel %elh%%%t0 set elt=%elh%%%t
  9. if not [%elt%]==[25] for %%o in (0 1 2 3 4 5 6 7 8 9) do if errorlevel %elt%%%o set el=%elt%%%o
  10. if [%elt%]==[25] for %%o in (0 1 2 3 4 5) do if errorlevel %elt%%%o set el=%elt%%%o
  11. set elh=
  12. set elt=
  13. :end
  14. if not [%1]==[@] echo current errolevel is %el%
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

下面是一个按表顺序转换字符串的程序,原文来自本站开发室:
   http://model.chinajewelry.net/do ... ardID=6&ID=9250

    此程序为批处理中字符串值的顺序转换而编写,一般作为子程序被其他程序调用,也可以将此程序稍做修改,添加入特定批处理程序中作为子模块调用。
  1. @echo off
  2. if [%1]==[$] goto %2
  3. if [%1]==[] goto nullargu
  4. :main 主模块: count, match 句参数列表可以根据需要重新设定和增减
  5. set factor=%1
  6. call %0 $ count 1 2 3 4 5 7 8 9
  7. call %0 $ match c d e f g h i j
  8. goto display
  9. :count 计数模块: 根据指定参数 factor 设置变量值 #a1, #a2
  10. if [%3]==[] goto overflow
  11. set #a1=%#a1%-
  12. if not [%#a1%]==[----------] goto count_2
  13. set #a1=
  14. set #a2=%#a2%+
  15. if [%#a2%]==[++++++++++] goto overflow
  16. :count_2
  17. if [%3]==[%factor%] goto end
  18. shift
  19. goto count
  20. :match 匹配模块: 循环递增变量 #b1, #b2, 若分别与 #a1, #a2 相等, 则指定结果值为当前循环的参数 3.
  21. if [%3]==[] goto overflow
  22. set #b1=%#b1%-
  23. if not [%#b1%]==[----------] goto match_2
  24. set #b1=
  25. set #b2=%#b2%+
  26. if [%#b2%]==[++++++++++] goto overflow
  27. :match_2
  28. if [%#a1%]==[%#b1%] if [%#a2%]==[%#b2%] set result=%3
  29. if not [%result%]==[] goto end
  30. shift
  31. goto match
  32. :display 显示模块: 显示赋值结果
  33. if [%error%]==[] echo %factor% convert %result%
  34. set result=
  35. set factor=
  36. set error=
  37. set #a1=
  38. set #a2=
  39. set #b1=
  40. set #b2=
  41. goto end
  42. :nullargu
  43. echo.
  44. echo Error: argument 1 not specified.
  45. echo.
  46. goto end
  47. :overflow
  48. echo.
  49. echo Error: number is overflow.
  50. set error=overflow
  51. echo.
  52. goto end
  53. :end
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

    以下是一个接收键盘输入字符串的程序,原文来自本站教学室。
    http://model.chinajewelry.net/do ... ;ID=5283&skin=1

    此文的关键技巧在于 FC 和 DEBUG 的巧妙结合使用。%TEMP%.\filename.ext 的用法也很有技巧性。%%?的用法也很新鲜。
  1. :: Get user input - includes error check
  2. @echo off
  3. echo e102'set %%1='> %temp%.\t1.dat
  4. for %%? in (w q) do echo %%?>> %temp%.\t1.dat
  5. :input
  6. echo.
  7. echo Type input:
  8. FC con nul /lb1 /n |FIND "1:" > %temp%.\t2.bat
  9. :: Error checking begins here
  10. FIND "|" %temp%.\t2.bat > nul
  11. if not errorlevel=1 goto error
  12. FIND "=" %temp%.\t2.bat > nul
  13. if not errorlevel=1 goto error
  14. FIND " nul
  15. if not errorlevel=1 goto error
  16. FIND ">" %temp%.\t2.bat > nul
  17. if not errorlevel=1 goto error
  18. :: Error checking end
  19. DEBUG %temp%.\t2.bat  nul
  20. call %temp%.\t2.bat 字符串
  21. for %%? in (t1.dat t2.bat) do del %temp%.\%%?
  22. echo 字符串=%字符串%
  23. goto eof
  24. :error
  25. echo.
  26. echo @PROMPT Invalid input. Invalid characters: $Q $L $G $B$_> %temp%.\t2.bat
  27. %comspec% /c %temp%.\t2.bat |FIND ":"
  28. goto input
  29. :eof
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

    以下是一个文件遍历程序,原文来自网易广州站的DOS版。
    http://fe2.gz.163.com/cgi/readsr ... t=1&kw=willsort

    原文中用到了两个外部程序,VARSET 和 LMOD,可能在本站或者新DOS时代就有下载。
  1. @echo off
  2. rem ///////////////////搜索所有目录下的所有txt文件///////////////////
  3. rem 找当前目录(根目录)的*.txt
  4. for %%a in (*.txt) do type %%a
  5. rem 以下为找当前目录(根目录)的所有子目录下的所有*.txt
  6. set i=1
  7. set j=1
  8. set filenum=0
  9. set dirnum=0
  10. varset root=FULL of . >temp.bat
  11. call temp.bat
  12. varset rootdir=string(3) %root% >temp.bat
  13. call temp.bat
  14. dir /ad /b /s >temp.txt
  15. varset dirnum=lines temp.txt >temp.bat
  16. call temp.bat
  17. :loop1
  18. type %root%\temp.txt | %root%\LMOD /L%i% set curdir=[] >%root%\temp.bat
  19. call %root%\temp.bat
  20. varset curdir=string(3) %curdir% >%root%\temp.bat
  21. call %root%\temp.bat
  22. cd %curdir%
  23. echo %curdir%
  24. set j=1
  25. :loop2
  26.      %root%\varset filenum=files *.txt >%root%\temp.bat
  27.      call %root%\temp.bat
  28.      if %filenum%==0 goto end2
  29.      dir *.txt /b | %root%\LMOD /L%j% set curfile=[] >%root%\temp.bat
  30.      call %root%\temp.bat
  31.      type %curfile%
  32.      if %j%==%filenum% goto end2
  33.      %root%\varset j=%j%+1 >%root%\temp.bat
  34.      call %root%\temp.bat
  35.      goto loop2
  36. :end2
  37. cd %rootdir%
  38. if %i%==%dirnum% goto end1
  39. %root%\varset i=%i%+1 >%root%\temp.bat
  40. call %root%\temp.bat
  41. goto loop1
  42. :end1
  43. del %root%\temp.bat
  44. del %root%\temp.txt
  45. set i=
  46. set j=
  47. set filenum=
  48. set dirnum=
  49. set root=
  50. set rootdir=
  51. set curdir=
  52. set curfile=
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

    以下是一个修改文件的更新日期的程序,原文来自网易北京站的DOS版。   
    http://fe4.bj.163.com/cgi/readsr ... t=1&kw=willsort

    原文代码中有若干错误,下为修正版。
  1. @echo off
  2. rem 保存系统时间
  3. echo.|date>sysdate.bat
  4. echo.|time>systime.bat
  5. rem 修改系统时间为指定时间,日期为参数一,时间为参数二,文件名为参数三
  6. date %1
  7. time %2
  8. rem 修改文件的时间
  9. copy %3+,,>nul
  10. rem 恢复系统时间
  11. echo date %%4>current.bat
  12. call sysdate
  13. echo time %%3>current.bat
  14. call systime
  15. rem 程序执行完毕
  16. echo Success.
  17. del systime.bat
  18. del sysdate.bat
  19. del current.bat
  20. echo on
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

批处理编程的异类——网络(Network)

1、共享
    1)删除win2k/xp系统默认共享

      原文来自《批处理简明教程》
      http://www.realhack.org/article/articleshow.asp?ArticleID=954
  1. @echo preparing to delete all the default shares. when ready press any key.
  2. @pause
  3. @echo off
  4. :Rem check parameters if null show usage.
  5. if {%1}=={} goto :Usage
  6. :Rem code start.
  7. echo.
  8. echo ------------------------------------------------------
  9. echo.
  10. echo Now deleting all the default shares.
  11. echo.
  12. net share %1$ /delete
  13. net share %2$ /delete
  14. net share %3$ /delete
  15. net share %4$ /delete
  16. net share %5$ /delete
  17. net share %6$ /delete
  18. net share %7$ /delete
  19. net share %8$ /delete
  20. net share %9$ /delete
  21. net stop Server
  22. net start Server
  23. echo.
  24. echo All the shares have been deleteed
  25. echo.
  26. echo ------------------------------------------------------
  27. echo.
  28. echo Now modify the registry to change the system default properties.
  29. echo.
  30. echo Now creating the registry file
  31. echo Windows Registry Editor Version 5.00> c:\delshare.reg
  32. echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters]>> c:\delshare.reg
  33. echo "AutoShareWks"=dword:00000000>> c:\delshare.reg
  34. echo "AutoShareServer"=dword:00000000>> c:\delshare.reg
  35. echo Nowing using the registry file to chang the system default properties.
  36. regedit /s c:\delshare.reg
  37. echo Deleting the temprotarily files.
  38. del c:\delshare.reg
  39. goto :END
  40. :Usage
  41. echo.
  42. echo ------------------------------------------------------
  43. echo.
  44. echo ☆ A example for batch file ☆
  45. echo ☆ [Use batch file to change the sysytem share properties.] ☆
  46. echo.
  47. echo Author:Ex4rch
  48. echo Mail:Ex4rch@hotmail.com QQ:1672602
  49. echo.
  50. echo Error:Not enough parameters
  51. echo.
  52. echo ☆ Please enter the share disk you wanna delete ☆
  53. echo.
  54. echo For instance,to delete the default shares:
  55. echo delshare c d e ipc admin print
  56. echo.
  57. echo If the disklable is not as C: D: E: ,Please chang it youself.
  58. echo.
  59. echo example:
  60. echo If locak disklable are C: D: E: X: Y: Z: ,you should chang the command into :
  61. echo delshare c d e x y z ipc admin print
  62. echo.
  63. echo *** you can delete nine shares once in a useing ***
  64. echo.
  65. echo ------------------------------------------------------
  66. goto :EOF
  67. :END
  68. echo.
  69. echo ------------------------------------------------------
  70. echo.
  71. echo OK,delshare.bat has deleted all the share you assigned.
  72. echo.Any questions ,feel free to mail to Ex4rch@hotmail.com.
  73. echo
  74. echo.
  75. echo ------------------------------------------------------
  76. echo.
  77. :EOF
  78. echo end of the batch file
复制代码
2)PING某个区段内的所有IP的程序

      原文来自网易北京站的DOS版。
      http://fe4.bj.163.com/cgi/readsr ... t=1&kw=willsort

      在命令行输入 a.bat 0 1 2 3 4 5 6 7 8 9 ,就能显示某区段的所有 IP 地址 192.168.1.0 - 192.168.1.99 ,将其中的 echo 改成 ping 就行,其中的 choice 和 if 语句是等待用户判断是否继续,可以删除,但这样中断程序比较麻烦。
  1. @echo off
  2. :redo
  3. if "%1" == "" goto end
  4. for %%a in (0,1,2,3,4,5,6,7,8,9) do echo 192.168.1.%1%%a
  5. choice continue
  6. if errorlevel 2 goto end
  7. shift
  8. goto redo
  9. :end
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

    以下是一个定时器程序,原文来自网易广州站的DOS版。
    http://fe2.gz.163.com/cgi/readsr ... t=1&kw=willsort

    程序中的 CURRENT.BAT 可以更换为自己需要执行的内容。FIND 一句的时间可以根据自己的需要设定,也可用参数%1代替。还可以改为 TIME 改为 DATE 以完成的定期执行的功能。
  1. ::CURRENT.BAT
  2. @echo off
  3. echo Haha, it's the time to go!!
  4. ::TIMER.BAT
  5. @echo off
  6. :start
  7. echo.|time|find "10:30:00">run.bat
  8. choice /c:y /t:y,59 /n>nul
  9. call run.bat
  10. goto start
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

以下是一个获取PROMPT系统状态数据的程序,原文来自网易广州站的DOS版。
    http://fe2.gz.163.com/cgi/readsr ... t=1&kw=willsort
   
    运行时,加上存放数据的变量名和prompt对应变量名即可,如:
       getvar curver $v   
    可以提取的系统状态数据有:

      $T   Current time
      $D   Current date
      $P   Current drive and path
      $V   System version number
      $N   Current drive
  1. :: GetVar.bat - Get from 'PROMPT' text to environment variable
  2. :: Will Sort - 10:29 2005-7-16 - CMD@XP/COMMAND@Win98/MSDOS6.22
  3. @echo off
  4. echo exit | %comspec% /k prompt set %1=%2$_:: > _GetVar.bat
  5. call _GetVar.bat
  6. for %%f in (_GetVar*.*) do del %%f
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

    以下是个在命名行提示上画一只字符小狗的程序,原文来自网易北京站的DOS版。
    http://fe4.bj.163.com/cgi/readsr ... S%B5%C4%CD%BC%D0%CE

    程序需ANSI支持。其中存在缺陷,解决的方法请查询原网址。
@PROMPT   {             (\__           }
ECHO 
@PROMPT   {            (\   `\__       }
ECHO 
@PROMPT   {(`, .------.,-'   b  $B    }
ECHO 
@PROMPT   {`-/            ',__,-"`     }
ECHO 
@PROMPT   {  $B   `;      ,  $B          }
ECHO 
@PROMPT   {   \   ;.----/ ,/           }
ECHO 
@PROMPT   {    ) // /  ( ( \           }
ECHO 
@PROMPT   {    \ \`.`\  \ \ \          }
ECHO 
@PROMPT   {     `-` `"   `-`"          }
ECHO 
@PORMPT $P$G
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

    以下是一个用字符方式画图的程序,原文来自网易广州站DOS版。
    http://fe2.gz.163.com/cgi/readsr ... amp;st=0&kw=MAP

    这个程序的工作方式很简陋,不过已经具备了一些基本的功能,比如画,擦,更换画笔字符,保存和提取字符画,备份和恢复字符画,使字符画可执行化等。程序用到了ANSI.SYS 的支持功能,所以 ECHO 后的方框字符实际上是 ASCII 码为27的符号,可在DOS下的 EDIT 中按 CTRL+P 然后按 ESC 输入此字符。
@ECHO OFF
:START
IF NOT [%3]==[] GOTO MAP%1
IF [%1]==[/?] GOTO MAPHELP
CHOICE Initizing, Please waiting../C:. /T:.,1 /N
IF [%1]==[R:] GOTO MAPRESTORE
IF [%1]==[E:] GOTO MAPEXTRACT
IF [%1]==[T:] GOTO MAPTRYSAVE

MEM /C|FIND "ANSI">NUL
IF ERRORLEVEL 1 GOTO MAPERR1

IF [%1]==[] GOTO MAPINIT
IF [%2]==[] GOTO MAPERR2
IF [%1]==[C:] IF NOT [%2]==[/LINE] IF NOT [%2]==[/PIPE] SET $F=%2
IF [%1]==[C:] GOTO MAPSTART

IF NOT EXIST %2.MAP GOTO MAPERR5
FIND "" %2.MAP>NUL
IF ERRORLEVEL 1 GOTO MAPERR3
REM FIND "" %2.MAP>NUL
REM IF ERRORLEVEL 1 GOTO MAPERR4

IF [%1]==[V:] GOTO MAPVIEW
IF [%1]==[L:] GOTO MAPLOAD
IF [%1]==[M:] GOTO MAPMAKE
:MAPINIT
CLS
SET $F=?
SET PRE=C
GOTO MAPSTART

:MAPHELP
ECHO.
ECHO Use: Draw a map with painter of characterS, and save to map file.
ECHO Usage: %0 option: parameter
ECHO Option:
ECHO            L       Load map file from the specified location.
ECHO            M       Make map file to selfexec map program.
ECHO            E       Extract selfexec map to map file.
ECHO            T       Try save map file from temporary location.
ECHO            R       Restore the map backuped map file.
ECHO            V       View the map file parameter specifle.
ECHO            C       define painter with Character parameter specifle.
ECHO.
CHOICE View guide of draw:
IF ERRORLEVEL 2 GOTO MAPEND
ECHO.
ECHO All operation control by keyboard keys.
ECHO.
ECHO Key:       Use:
ECHO 1          Left and down ----)
ECHO 2          Down              )
ECHO 3          Right and down    )
ECHO 4          Left              )---Painter Move keys
ECHO 6          Right             )
ECHO 7          Left and up       )
ECHO 8          Up                )
ECHO 9          Right and up------)
ECHO 5          painter
ECHO 0(Ins)     change to draw state
ECHO .(Del)     change to delete state
ECHO.
GOTO MAPEND

:MAPERR1
ECHO.
ECHO Error 1 in %0: Not continue for not load ANSI.
ECHO.
GOTO MAPEND
:MAPERR2
ECHO.
ECHO Error 2 in %0: Not specified second parameter.
ECHO.
GOTO MAPEND
:MAPERR3
ECHO.
ECHO Error 3 in %0: False map file.
ECHO.
GOTO MAPEND
:MAPERR4
ECHO.
ECHO Error 4 in %0: Not accomplish map file.
ECHO.
GOTO MAPEND
:MAPERR5
ECHO.
ECHO Error 5 in %0: Not exist map file.
ECHO.
GOTO MAPEND
:MAPERR6
ECHO.
ECHO Error 6 in %0: Not backup map file.
ECHO.
GOTO MAPEND
:MAPERR7
ECHO.
ECHO Error 7 in %0: Not make selfexec map program.
ECHO.
GOTO MAPEND
:MAPERR8
ECHO.
ECHO Error 8 in %0: Not correctly pattern selfexec map program.
ECHO.
GOTO MAPEND
:MAPERR9
ECHO.
ECHO Error 9 in %0: Can''''t view map file.
ECHO.
GOTO MAPEND
:MAPERR10
ECHO.
ECHO Error 10 in %0: enviroment parameter PRE is null.

::MAPPICK
IF EXIST %2.MAP CHOICE Modify this map file
IF ERRORLEVEL 2 GOTO MAPEND
ECHO @CLS>PAINTER.BAT
ECHO @SET $F=%%1>>PAINTER.BAT
ECHO @%0 START %2 /S>>PAINTER.BAT
ECHO Please choose painter of character with style (PAINTER=char).
PROMPT

[ 本帖最后由 Batcher 于 2009-3-12 19:55 编辑 ]
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

批处理编程的异类——时钟(Clock)

1、暂停(Pause)、延迟(Delay)、等待(Wait)、睡眠(Sleep)

0) Win7 / Win10 等系统自带的 timeout 命令
  1. @echo off
  2. echo %date% %time%
  3. timeout /nobreak /t 3 >nul
  4. echo %date% %time%
  5. pause
复制代码
1)for+set+if,时间精度为0.01秒,适用平台为WinNT/2K/XP/2003。

  利用for解析变量%time%并存为两个时间点%start%和%now%,再利用set /a计算两个时间点的时间差,最后用if判断时间差是否达到设定的暂停时间。
  1. @echo off
  2. setlocal enableextensions
  3. echo %time%
  4. call :ProcDelay 200
  5. echo %time%
  6. goto :EOF
  7. :ProcDelay delayMSec_
  8. setlocal enableextensions
  9. for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k
  10.   :_procwaitloop
  11.   for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set now_=%%h%%i%%j%%k
  12.   set /a diff_=%now_%-%start_%
  13. if %diff_% LSS %1 goto _procwaitloop
  14. endlocal & goto :EOF
复制代码
2)VBS脚本中的sleep函数,时间精度为0.001秒,使用平台为Win9x/WinNT系列。

   动态创建一个调用sleep()函数的VBS脚本,然后用Windows脚本宿主的命令行版本cscript调用它。
  1. @echo off & setlocal enableextensions enabledelayedexpansion
  2. echo WScript.Sleep 2000 > %temp%\tmp$$$.vbs
  3. echo %time%
  4. cscript //nologo %temp%\tmp$$$.vbs
  5. echo %time%
  6. for %%f in (%temp%\tmp$$$.vbs) do if exist %%f del %%f
  7. endlocal & goto :EOF
复制代码
3)ping的消息发送间隔,时间精度为1秒,使用平台为Win9x/WinNT系列。

   需要你的Windows系统中正常安装了网卡的TCP/IP协议,有两种方案,方案二不建议采用,见主题 [讨论]批处理编程的异类 12、13楼:

(1) 利用ping两次发送消息之间的间隔时间。ping在发送多个消息时,在得到上一次消息的回应后,它会再等待1秒的时间才发送下一次消息,而这个回应时间因机型、系统和网络配置而不同,其中IP地址尤其关键,只有本地的回送地址 127.0.0.1 因为是立即回应所以才是相对恒定的,其他地址大多会产生显著的差异。此种方法要等待更大的时间,是指定发送的消息数为等待的时间加一,因为第一个消息是不等待的,IP 地址必须是 127.0.0.1 。其等待2秒的程序如下:

::根据植树原则,n后的数字为暂停秒数加一
ping -n 3 127.0.0.1>nul
(2) 利用ping的最大等待时间。ping向0.0.0.1发送一次“网际消息控制协议 (ICMP)”回响请求消息,因为 0.0.0.1 是个无法响应 ping 请求的IP地址,所以默认情况下,ping会等待一定的最大响应时间——4秒后便停止等待,而-w可以改变这个每发送一次消息所等待的最大响应时间。而如果将 IP 地址改为立即响应的127.0.0.1或其他响应时间很短的IP ,那 -w 便失去了作用,因为每次发送等待时间都不会达到最大的响应时间,此时延时会缩短。此种方法要等待更大的时间,可以直接使用 -w 指定,但是需要减去一定的发送延时,这个延时需要自己事先测定一下,否则会有不到1秒的误差;而且 IP 地址必须是不响应请求的地址。其等待2秒的程序如下:
  1. ping -n 2 -w 500 0.0.0.1>nul
复制代码
4)choice的缺省选择等待功能,时间精度为1秒,适用平台为MS-DOS/Win9x/WinNT系列。

  /t:y,2 将缺省选择字符设置为y,等待时间是2秒,/n禁止[y,n]提示出现在命令行上,“rem|”的作用是禁止choice从键盘接受按键,从而暂停不会因为按下y或者其它键而被意外终止。
  1. rem|choice /t:y,2 /n >nul
复制代码
5)ASCII汇编代码,延迟精度为0.001秒,适用平台为MS-DOS/Win9x/WinNT。

  德国人Herbert Kleebauer给出了一个通用方案,通过ASCII汇编器间接产生一个sleep.exe程序来实现延迟,这个程序分为DOS和Win两个模块,分别调用DOS系统中断服务和WindowsAPI。
  1. :: Sleep.bat - Sleep/Delay/Wait n seconds
  2. :: Herbert Kleebauer(Germany) - 2005/05/29
  3. :: Modified by Will Sort - 2005/06/02, 07-25
  4. @echo off
  5. echo q | debug>nul
  6. echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=>sleep.com
  7. echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU WwX0GwUY Wv;ovBX2Gv0ExGIuht6>>sleep.com
  8. echo T}{z~~@GwkBG@OEKcUt`~}@MqqBsy?seHB~_Phxr?@zAB`LrPEyoDt@Cj?>>sleep.com
  9. echo pky_jN@QEKpEt@ij?jySjN@REKpEt@jj?jyGjN@SEKkjtlGuNw?p@pjirz>>sleep.com
  10. echo LFvAURQ?OYLTQ@@?~QCoOL~RDU@?aU?@{QOq?@}IKuNWpe~FpeQFwH?Vkk>>sleep.com
  11. echo _GSqoCvH{OjeOSeIQRmA@KnEFB?p??mcjNne~B?M??QhetLBgBPHexh@e=>>sleep.com
  12. echo EsOgwTLbLK?sFU`?LDOD@@K@xO?SUudA?_FKJ@N?KD@?UA??O}HCQOQ??R>>sleep.com
  13. echo _OQOL?CLA?CEU?_FU?UAQ?UBD?LOC?ORO?UOL?UOD?OOI?UgL?LOR@YUO?>>sleep.com
  14. echo dsmSQswDOR[BQAQ?LUA?_L_oUNUScLOOuLOODUO?UOE@OwH?UOQ?DJTSDM>>sleep.com
  15. echo QTqrK@kcmSULkPcLOOuLOOFUO?hwDTqOsTdbnTQrrDsdFTlnBTm`lThKcT>>sleep.com
  16. echo @dmTkRQSoddTT~?K?OCOQp?o??Gds?wOw?PGAtaCHQvNntQv_w?A?it\EH>>sleep.com
  17. echo {zpQpKGk?Jbs?FqokOH{T?jPvP@IQBDFAN?OHROL?Kj??pd~aN?OHROd?G>>sleep.com
  18. echo Q??PGT~B??OC~?ipO?T?~U?p~cUo0x>>sleep.com
  19. sleep.com>sleep.exe
  20. echo wait %1 seconds:
  21. sleep.exe %1000
  22. del sleep.com
  23. del sleep.exe
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

批处理编程的异类——数学(Math)

1、数学——随机

    1)随机数发生器:运行后可产生一个00~99的随机整数,并保存于环境变量 %_random% 中。

      如果要产生更复杂的随机数,也可以利用这个程序进行修改来得到,比如两次产生的随机数组合,即可得到0000~9999的随机数;在随机数前加上小数点,即可得到0.00-0.99的随机小数;将 prompt _$T$_:: 中的第一个下划线去除,可以得到0~9的随机数;用debug可以去除某些随机数的前缀0。根据以上方法,即可组合得到任意形式的随机数了。
  1. :: GenARnd.Bat - Generate a random integer (00~99)
  2. :: Will Sort - 12:06 2005-8-18 - V2 - MSDOS7.10/CMD@WinXP/MSDOS6.22
  3. @echo off
  4. echo exit|%comspec% /k prompt _$T$_::> _GenARnd.bat
  5. echo e 100 "set _random=">_GenARnd.asd
  6. for %%s in (w q) do echo %%s>>_GenARnd.asd
  7. debug _GenARnd.bat < _GenARnd.asd > nul
  8. call _GenARnd.bat
  9. for %%f in (_GenARnd*.*) do del %%f
  10. if not "%_random%"=="" if not [%1]==[@] echo Random number : %_random%
  11. :End
复制代码
2)随机阵列发生器:运行后将生成一张随机概率分布矩阵图。

      此图24行63列,由字符“-”(假)和“o”(真)组成,从上到下每三行为一组,呈现出o的分布概率依次降低。其中矩阵中的左图为真假序列分布,右图为真假数目对比。
  1. :: RndArray.bat - Generate a serial of random numbers(- or o)
  2. :: Will Sort - 2004/11/24
  3. @echo off
  4. if "%1"==":" goto %2
  5. set no=
  6. set num=0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
  7. :loop
  8. set no=I%no%
  9. set line=
  10. set -=
  11. set o=
  12. for %%c in (%num%) do call %0 : random %no%
  13. echo %line% : %-%%o%
  14. set line=
  15. set -=
  16. set o=
  17. for %%c in (%num%) do call %0 : random %no%
  18. echo %line% : %-%%o%
  19. set line=
  20. set -=
  21. set o=
  22. for %%c in (%num%) do call %0 : random %no%
  23. echo %line% : %-%%o%
  24. if not [%no%]==[IIIIIIII] goto loop
  25. :quit
  26. del _Random.tmp
  27. for %%e in (- o no num line) do set %%e=
  28. goto end
  29. :random
  30. echo. | time > _Random.tmp
  31. ::echo exit | %comspec% /k prompt $T>_Random.tmp
  32. goto %3
  33. find ".0"<_Random.tmp>nul
  34. if not errorlevel 1 goto true
  35. :I
  36. find ".3"<_Random.tmp>nul
  37. if not errorlevel 1 goto true
  38. :II
  39. find ".6"<_Random.tmp>nul
  40. if not errorlevel 1 goto true
  41. :III
  42. find ".9"<_Random.tmp>nul
  43. if not errorlevel 1 goto true
  44. :IIII
  45. find ".2"<_Random.tmp>nul
  46. if not errorlevel 1 goto true
  47. :IIIII
  48. find ".5"<_Random.tmp>nul
  49. if not errorlevel 1 goto true
  50. :IIIIII
  51. find ".8"<_Random.tmp>nul
  52. if not errorlevel 1 goto true
  53. :IIIIIII
  54. find ".1"<_Random.tmp>nul
  55. if not errorlevel 1 goto true
  56. :IIIIIIII
  57. find ".4"<_Random.tmp>nul
  58. if not errorlevel 1 goto true
  59. find ".7"<_Random.tmp>nul
  60. if not errorlevel 1 goto true
  61. ::del _Random.tmp
  62. :false
  63. set line=%line%-
  64. set -=-%-%
  65. goto end
  66. :true
  67. set line=%line%o
  68. set o=o%o%
  69. goto end
  70. :end
复制代码
2、数学——表达式

    1)2K/XP表达式计算批处理,由 Brglng 原创并维护。转帖时精简了程序中的文档部分,可以通过以下链接查阅完整的代码和文档。

{16534}2K/XP表达式计算批处理
http://www.cn-dos.net/forum/viewthread.php?tid=16534
  1. :: Eval.cmd - 2K/XP表达式计算批处理
  2. :: Brglng - 2005.8.31
  3. @echo off
  4. setlocal
  5. if /i "%1"=="/A" if "%2"=="" echo 必须指定文件路径!& goto end
  6. if /i not "%1"=="/A" if /i not "%1"=="/N" if not "%1"=="" goto EvalArgument
  7. echo 请输入表达式(输入"Q"退出) & goto inputExpr
  8. :EvalArgument
  9. set /a EvalExpr="%1"
  10. if "%EvalExpr%"=="" echo 表达式输入错误! & goto end
  11. echo %1=%EvalExpr%
  12. if "%2"=="" goto end
  13. echo %1=%EvalExpr% >>"%2"
  14. echo 算式和计算结果已存入"%2"!
  15. goto end
  16. :inputExpr
  17. set Expr=
  18. set EvalExpr=
  19. set /p Expr=^>
  20. if "%Expr%"=="" goto inputExpr
  21. if /i "%Expr%"=="Q" goto end
  22. set /a EvalExpr="%Expr%"
  23. if "%EvalExpr%"=="" echo 输入错误! & goto inputExpr
  24. echo 计算结果为:%EvalExpr%
  25. if /i "%1"=="/A" goto autosave
  26. if /i "%1"=="/N" goto inputExpr
  27. :if_save
  28. set SaveEval=
  29. set /p SaveEval=是否将表达式和计算结果存入文件[Y/N]?
  30. if /i "%SaveEval%"=="Y" goto save
  31. if /i "%SaveEval%"=="N" goto inputExpr
  32. goto if_save
  33. :save
  34. set /p SaveEvalPath=请输入文件路径及文件名(如C:\Windows\file.txt。若只输入文件名则自动存入当前文件夹,留空则为上一次输入的路径):
  35. echo "%Expr%"=%EvalExpr% >>"%SaveEvalPath%"
  36. echo 表达式以及计算结果已存入"%SaveEvalPath%"!
  37. goto inputExpr
  38. :autosave
  39. echo "%Expr%"=%EvalExpr% >>"%2"
  40. goto inputExpr
  41. :end
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

批处理编程异类——游戏(Game)

程序:TicTacToe(三子棋、井字棋、打井、提担挑)
作者:M0eRtH
原文:TicTacToe (a.k.a. Noughts''''''''n''''''''Crosses) BATch version 1.1
   http://users.volja.net/sarcasmus/M0/tictactoe/tttbat.html
下载:http://users.volja.net/sarcasmus/M0/tictactoe/tictactoebat.zip
环境:1,程序应该在英文的命令行环境下运行;
   2,程序使用了大量的环境变量,应该修改程序运行时环境空间的大小;
   3,程序在WIN2K/XP运行需要CHOICE的支持;
备注:
  这是我见到第一个用批处理编写的真正具有游戏性的程序,虽然程序并不提供AI对手,但是其优美的结构仍然值得称道。正文中出现的乱码字是因为作者使用了ANSI的表格字符。
同类:
  福尔摩斯问答:http://dos.e-stone.cn/dosbbs/dispbbs.asp?boardID=6&ID=8272
  ZD庄园的迷魂阵:http://zdland.xiloo.com/planets/psa.html

正文:
  1. @echo off
  2. mode con cols=40 lines=25
  3. cls
  4. echo.
  5. echo   TicTacToe (a.k.a. Noughts''''''''n''''''''Crosses)
  6. echo            BATch Version 1.1
  7. echo             (c)2002 M0eRtH
  8. echo.
  9. echo      Updates and more free stuff at
  10. echo          http://m0erth.cjb.net
  11. echo.
  12. echo The keys:
  13. echo.
  14. echo          - X -            - O -
  15. echo.
  16. echo        7 ?8 ?9        Q ?W ?E
  17. echo       哪呐哪呐哪?     哪呐哪呐哪?
  18. echo        4 ?5 ?6        A ?S ?D
  19. echo       哪呐哪呐哪?     哪呐哪呐哪?
  20. echo        1 ?2 ?3       Z/Y?X ?C
  21. echo.
  22. echo   Ctrl+R = Reset game   Ctrl+Q = Quit
  23. echo.
  24. echo Note:
  25. echo   X, make sure the NumLock is ON. ;-)
  26. echo.
  27. pause
  28. set a1=-
  29. set a2=-
  30. set a3=-
  31. set b1=-
  32. set b2=-
  33. set b3=-
  34. set c1=-
  35. set c2=-
  36. set c3=-
  37. set turn=X
  38. set win=-
  39. set result=-
  40. set scoreX=-
  41. set scoreO=-
  42. set games=-
  43. set maxgames=-++++++++++++++++++++
  44. :draw
  45. cls
  46. echo.
  47. echo   TicTacToe (a.k.a. Noughts''''''''n''''''''Crosses)
  48. echo            BATch Version 1.1
  49. echo             (c)2002 M0eRtH
  50. echo.
  51. echo Score
  52. echo  X:%scoreX%
  53. echo  O:%scoreO%
  54. echo.
  55. echo                %a1% ?%a2% ?%a3%
  56. echo               哪呐哪呐哪?
  57. echo                %b1% ?%b2% ?%b3%
  58. echo               哪呐哪呐哪?
  59. echo                %c1% ?%c2% ?%c3%
  60. echo.
  61. :chkWin
  62. set result=%a1%%a2%%a3%
  63. if %result%==XXX goto XWon
  64. if %result%==OOO goto OWon
  65. set result=%b1%%b2%%b3%
  66. if %result%==XXX goto XWon
  67. if %result%==OOO goto OWon
  68. set result=%c1%%c2%%c3%
  69. if %result%==XXX goto XWon
  70. if %result%==OOO goto OWon
  71. set result=%a1%%b1%%c1%
  72. if %result%==XXX goto XWon
  73. if %result%==OOO goto OWon
  74. set result=%a2%%b2%%c2%
  75. if %result%==XXX goto XWon
  76. if %result%==OOO goto OWon
  77. set result=%a3%%b3%%c3%
  78. if %result%==XXX goto XWon
  79. if %result%==OOO goto OWon
  80. set result=%a1%%b2%%c3%
  81. if %result%==XXX goto XWon
  82. if %result%==OOO goto OWon
  83. set result=%c1%%b2%%a3%
  84. if %result%==XXX goto XWon
  85. if %result%==OOO goto OWon
  86. :getKeys
  87. echo                %turn%''''''''s turn
  88. choice /c:789456123qweasdzyxc /n :
  89. if errorlevel 21 goto reset
  90. if errorlevel 20 goto quit
  91. if errorlevel 19 goto setOC3
  92. if errorlevel 18 goto setOC2
  93. if errorlevel 17 goto setOC1
  94. if errorlevel 16 goto setOC1
  95. if errorlevel 15 goto setOB3
  96. if errorlevel 14 goto setOB2
  97. if errorlevel 13 goto setOB1
  98. if errorlevel 12 goto setOA3
  99. if errorlevel 11 goto setOA2
  100. if errorlevel 10 goto setOA1
  101. if errorlevel 9 goto setXC3
  102. if errorlevel 8 goto setXC2
  103. if errorlevel 7 goto setXC1
  104. if errorlevel 6 goto setXB3
  105. if errorlevel 5 goto setXB2
  106. if errorlevel 4 goto setXB1
  107. if errorlevel 3 goto setXA3
  108. if errorlevel 2 goto setXA2
  109. if errorlevel 1 goto setXA1
  110. goto draw
  111. :reset
  112. set a1=-
  113. set a2=-
  114. set a3=-
  115. set b1=-
  116. set b2=-
  117. set b3=-
  118. set c1=-
  119. set c2=-
  120. set c3=-
  121. goto draw
  122. :setXA1
  123. if not %a1%==- goto draw
  124. if %turn%==O goto draw
  125. set a1=X
  126. goto changeTurn
  127. :setXA2
  128. if not %a2%==- goto draw
  129. if %turn%==O goto draw
  130. set a2=X
  131. goto changeTurn
  132. :setXA3
  133. if not %a3%==- goto draw
  134. if %turn%==O goto draw
  135. set a3=X
  136. goto changeTurn
  137. :setXB1
  138. if not %b1%==- goto draw
  139. if %turn%==O goto draw
  140. set b1=X
  141. goto changeTurn
  142. :setXB2
  143. if not %b2%==- goto draw
  144. if %turn%==O goto draw
  145. set b2=X
  146. goto changeTurn
  147. :setXB3
  148. if not %b3%==- goto draw
  149. if %turn%==O goto draw
  150. set b3=X
  151. goto changeTurn
  152. :setXC1
  153. if not %c1%==- goto draw
  154. if %turn%==O goto draw
  155. set c1=X
  156. goto changeTurn
  157. :setXC2
  158. if not %c2%==- goto draw
  159. if %turn%==O goto draw
  160. set c2=X
  161. goto changeTurn
  162. :setXC3
  163. if not %c3%==- goto draw
  164. if %turn%==O goto draw
  165. set c3=X
  166. goto changeTurn
  167. :setOA1
  168. if not %a1%==- goto draw
  169. if %turn%==X goto draw
  170. set a1=O
  171. goto changeTurn
  172. :setOA2
  173. if not %a2%==- goto draw
  174. if %turn%==X goto draw
  175. set a2=O
  176. goto changeTurn
  177. :setOA3
  178. if not %a3%==- goto draw
  179. if %turn%==X goto draw
  180. set a3=O
  181. goto changeTurn
  182. :setOB1
  183. if not %b1%==- goto draw
  184. if %turn%==X goto draw
  185. set b1=O
  186. goto changeTurn
  187. :setOB2
  188. if not %b2%==- goto draw
  189. if %turn%==X goto draw
  190. set b2=O
  191. goto changeTurn
  192. :setOB3
  193. if not %b3%==- goto draw
  194. if %turn%==X goto draw
  195. set b3=O
  196. goto changeTurn
  197. :setOC1
  198. if not %c1%==- goto draw
  199. if %turn%==X goto draw
  200. set c1=O
  201. goto changeTurn
  202. :setOC2
  203. if not %c2%==- goto draw
  204. if %turn%==X goto draw
  205. set c2=O
  206. goto changeTurn
  207. :setOC3
  208. if not %c3%==- goto draw
  209. if %turn%==X goto draw
  210. set c3=O
  211. goto changeTurn
  212. :changeTurn
  213. if %turn%==X goto setTurnO
  214. set turn=X
  215. goto draw
  216. :setTurnO
  217. set turn=O
  218. goto draw
  219. :XWon
  220. echo.
  221. echo - X won! -
  222. pause
  223. set scoreX=%scoreX%+
  224. set games=%games%+
  225. if %games%==%maxgames% goto quit
  226. goto reset
  227. :OWon
  228. echo.
  229. echo - O won! -
  230. pause
  231. set scoreO=%scoreO%+
  232. set games=%games%+
  233. if %games%==%maxgames% goto quit
  234. goto reset
  235. :quit
  236. mode con cols=80 lines=25
  237. echo.
  238. echo   TicTacToe (a.k.a. Noughts''''''''n''''''''Crosses)
  239. echo            BATch Version 1.1
  240. echo             (c)2002 M0eRtH
  241. echo.
  242. echo      Updates and more free stuff at
  243. echo          http://m0erth.cjb.net
  244. echo.
  245. echo.
  246. echo  X scored: %scoreX%
  247. echo  O scored: %scoreO%
  248. echo.
  249. set a1=
  250. set a2=
  251. set a3=
  252. set b1=
  253. set b2=
  254. set b3=
  255. set c1=
  256. set c2=
  257. set c3=
  258. set turn=
  259. set win=
  260. set result=
  261. set scoreX=
  262. set scoreO=
  263. set games=
  264. set maxgames=
  265. pause
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表