中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
<<   [1] [2] [3] [4]  >>   >
作者:
标题: [分享]批处理编程的异类 上一主题 | 下一主题
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『楼 主』:  [分享]批处理编程的异类

  学过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,对本帖某些程序有任何疑问和建议的朋友,请访问下面的主题     www.cn-dos.net/forum ...   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表达式计算批处理” [ Last edited by willsort on 2005-9-11 at 13:35 ]




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-1-11 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 2 楼』:  批处理编程异类——游戏(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 正文:
@echo off mode con cols=40 lines=25 cls echo. echo TicTacToe (a.k.a. Noughts''''''''n''''''''Crosses) echo BATch Version 1.1 echo (c)2002 M0eRtH echo. echo Updates and more free stuff at echo http://m0erth.cjb.net echo. echo The keys: echo. echo - X - - O - echo. echo 7 ?8 ?9 Q ?W ?E echo 哪呐哪呐哪? 哪呐哪呐哪? echo 4 ?5 ?6 A ?S ?D echo 哪呐哪呐哪? 哪呐哪呐哪? echo 1 ?2 ?3 Z/Y?X ?C echo. echo Ctrl+R = Reset game Ctrl+Q = Quit echo. echo Note: echo X, make sure the NumLock is ON. ;-) echo. pause set a1=- set a2=- set a3=- set b1=- set b2=- set b3=- set c1=- set c2=- set c3=- set turn=X set win=- set result=- set scoreX=- set scoreO=- set games=- set maxgames=-++++++++++++++++++++ :draw cls echo. echo TicTacToe (a.k.a. Noughts''''''''n''''''''Crosses) echo BATch Version 1.1 echo (c)2002 M0eRtH echo. echo Score echo X:%scoreX% echo O:%scoreO% echo. echo %a1% ?%a2% ?%a3% echo 哪呐哪呐哪? echo %b1% ?%b2% ?%b3% echo 哪呐哪呐哪? echo %c1% ?%c2% ?%c3% echo. :chkWin set result=%a1%%a2%%a3% if %result%==XXX goto XWon if %result%==OOO goto OWon set result=%b1%%b2%%b3% if %result%==XXX goto XWon if %result%==OOO goto OWon set result=%c1%%c2%%c3% if %result%==XXX goto XWon if %result%==OOO goto OWon set result=%a1%%b1%%c1% if %result%==XXX goto XWon if %result%==OOO goto OWon set result=%a2%%b2%%c2% if %result%==XXX goto XWon if %result%==OOO goto OWon set result=%a3%%b3%%c3% if %result%==XXX goto XWon if %result%==OOO goto OWon set result=%a1%%b2%%c3% if %result%==XXX goto XWon if %result%==OOO goto OWon set result=%c1%%b2%%a3% if %result%==XXX goto XWon if %result%==OOO goto OWon :getKeys echo %turn%''''''''s turn choice /c:789456123qweasdzyxc /n : if errorlevel 21 goto reset if errorlevel 20 goto quit if errorlevel 19 goto setOC3 if errorlevel 18 goto setOC2 if errorlevel 17 goto setOC1 if errorlevel 16 goto setOC1 if errorlevel 15 goto setOB3 if errorlevel 14 goto setOB2 if errorlevel 13 goto setOB1 if errorlevel 12 goto setOA3 if errorlevel 11 goto setOA2 if errorlevel 10 goto setOA1 if errorlevel 9 goto setXC3 if errorlevel 8 goto setXC2 if errorlevel 7 goto setXC1 if errorlevel 6 goto setXB3 if errorlevel 5 goto setXB2 if errorlevel 4 goto setXB1 if errorlevel 3 goto setXA3 if errorlevel 2 goto setXA2 if errorlevel 1 goto setXA1 goto draw :reset set a1=- set a2=- set a3=- set b1=- set b2=- set b3=- set c1=- set c2=- set c3=- goto draw :setXA1 if not %a1%==- goto draw if %turn%==O goto draw set a1=X goto changeTurn :setXA2 if not %a2%==- goto draw if %turn%==O goto draw set a2=X goto changeTurn :setXA3 if not %a3%==- goto draw if %turn%==O goto draw set a3=X goto changeTurn :setXB1 if not %b1%==- goto draw if %turn%==O goto draw set b1=X goto changeTurn :setXB2 if not %b2%==- goto draw if %turn%==O goto draw set b2=X goto changeTurn :setXB3 if not %b3%==- goto draw if %turn%==O goto draw set b3=X goto changeTurn :setXC1 if not %c1%==- goto draw if %turn%==O goto draw set c1=X goto changeTurn :setXC2 if not %c2%==- goto draw if %turn%==O goto draw set c2=X goto changeTurn :setXC3 if not %c3%==- goto draw if %turn%==O goto draw set c3=X goto changeTurn :setOA1 if not %a1%==- goto draw if %turn%==X goto draw set a1=O goto changeTurn :setOA2 if not %a2%==- goto draw if %turn%==X goto draw set a2=O goto changeTurn :setOA3 if not %a3%==- goto draw if %turn%==X goto draw set a3=O goto changeTurn :setOB1 if not %b1%==- goto draw if %turn%==X goto draw set b1=O goto changeTurn :setOB2 if not %b2%==- goto draw if %turn%==X goto draw set b2=O goto changeTurn :setOB3 if not %b3%==- goto draw if %turn%==X goto draw set b3=O goto changeTurn :setOC1 if not %c1%==- goto draw if %turn%==X goto draw set c1=O goto changeTurn :setOC2 if not %c2%==- goto draw if %turn%==X goto draw set c2=O goto changeTurn :setOC3 if not %c3%==- goto draw if %turn%==X goto draw set c3=O goto changeTurn :changeTurn if %turn%==X goto setTurnO set turn=X goto draw :setTurnO set turn=O goto draw :XWon echo. echo - X won! - pause set scoreX=%scoreX%+ set games=%games%+ if %games%==%maxgames% goto quit goto reset :OWon echo. echo - O won! - pause set scoreO=%scoreO%+ set games=%games%+ if %games%==%maxgames% goto quit goto reset :quit mode con cols=80 lines=25 echo. echo TicTacToe (a.k.a. Noughts''''''''n''''''''Crosses) echo BATch Version 1.1 echo (c)2002 M0eRtH echo. echo Updates and more free stuff at echo http://m0erth.cjb.net echo. echo. echo X scored: %scoreX% echo O scored: %scoreO% echo. set a1= set a2= set a3= set b1= set b2= set b3= set c1= set c2= set c3= set turn= set win= set result= set scoreX= set scoreO= set games= set maxgames= pause

[此贴子已经被作者于2004-6-20 下午 05:42:48编辑过]





※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-1-11 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 3 楼』:  批处理编程的异类——数学(Math)

1、数学——随机 1)随机数发生器:运行后可产生一个00~99的随机整数,并保存于环境变量 %_random% 中。 如果要产生更复杂的随机数,也可以利用这个程序进行修改来得到,比如两次产生的随机数组合,即可得到0000~9999的随机数;在随机数前加上小数点,即可得到0.00-0.99的随机小数;将 prompt _$T$_:: 中的第一个下划线去除,可以得到0~9的随机数;用debug可以去除某些随机数的前缀0。根据以上方法,即可组合得到任意形式的随机数了。
:: GenARnd.Bat - Generate a random integer (00~99)
:: Will Sort - 12:06 2005-8-18 - V2 - MSDOS7.10/CMD@WinXP/MSDOS6.22
@echo off
echo exit|%comspec% /k prompt _$T$_::> _GenARnd.bat
echo e 100 "set _random=">_GenARnd.asd
for %%s in (w q) do echo %%s>>_GenARnd.asd
debug _GenARnd.bat < _GenARnd.asd > nul
call _GenARnd.bat
for %%f in (_GenARnd*.*) do del %%f
if not "%_random%"=="" if not [%1]==[@] echo Random number : %_random%
:End
2)随机阵列发生器:运行后将生成一张随机概率分布矩阵图。 此图24行63列,由字符“-”(假)和“o”(真)组成,从上到下每三行为一组,呈现出o的分布概率依次降低。其中矩阵中的左图为真假序列分布,右图为真假数目对比。
:: RndArray.bat - Generate a serial of random numbers(- or o)
:: Will Sort - 2004/11/24
@echo off
if "%1"==":" goto %2

set no=
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

:loop
set no=I%no%
set line=
set -=
set o=
for %%c in (%num%) do call %0 : random %no%
echo %line% : %-%%o%
set line=
set -=
set o=
for %%c in (%num%) do call %0 : random %no%
echo %line% : %-%%o%
set line=
set -=
set o=
for %%c in (%num%) do call %0 : random %no%
echo %line% : %-%%o%
if not [%no%]==[IIIIIIII] goto loop

:quit
del _Random.tmp
for %%e in (- o no num line) do set %%e=
goto end

:random
echo. | time > _Random.tmp
::echo exit | %comspec% /k prompt $T>_Random.tmp
goto %3

find ".0"<_Random.tmp>nul
if not errorlevel 1 goto true
:I
find ".3"<_Random.tmp>nul
if not errorlevel 1 goto true
:II
find ".6"<_Random.tmp>nul
if not errorlevel 1 goto true
:III
find ".9"<_Random.tmp>nul
if not errorlevel 1 goto true
:IIII
find ".2"<_Random.tmp>nul
if not errorlevel 1 goto true
:IIIII
find ".5"<_Random.tmp>nul
if not errorlevel 1 goto true
:IIIIII
find ".8"<_Random.tmp>nul
if not errorlevel 1 goto true
:IIIIIII
find ".1"<_Random.tmp>nul
if not errorlevel 1 goto true
:IIIIIIII
find ".4"<_Random.tmp>nul
if not errorlevel 1 goto true
find ".7"<_Random.tmp>nul
if not errorlevel 1 goto true
::del _Random.tmp

:false
set line=%line%-
set -=-%-%
goto end

:true
set line=%line%o
set o=o%o%
goto end

:end
2、数学——表达式 1)2K/XP表达式计算批处理,由 Brglng 原创并维护。转帖时精简了程序中的文档部分,可以通过以下链接查阅完整的代码和文档。 {16534}2K/XP表达式计算批处理 www.cn-dos.net/forum ...
:: Eval.cmd - 2K/XP表达式计算批处理
:: Brglng - 2005.8.31
@echo off
setlocal
if /i "%1"=="/A" if "%2"=="" echo 必须指定文件路径!& goto end
if /i not "%1"=="/A" if /i not "%1"=="/N" if not "%1"=="" goto EvalArgument

echo 请输入表达式(输入"Q"退出) & goto inputExpr

:EvalArgument
set /a EvalExpr="%1"
if "%EvalExpr%"=="" echo 表达式输入错误! & goto end
echo %1=%EvalExpr%
if "%2"=="" goto end
echo %1=%EvalExpr% >>"%2"
echo 算式和计算结果已存入"%2"!
goto end

:inputExpr
set Expr=
set EvalExpr=
set /p Expr=^>
if "%Expr%"=="" goto inputExpr
if /i "%Expr%"=="Q" goto end
set /a EvalExpr="%Expr%"
if "%EvalExpr%"=="" echo 输入错误! & goto inputExpr
echo 计算结果为:%EvalExpr%
if /i "%1"=="/A" goto autosave
if /i "%1"=="/N" goto inputExpr

:if_save
set SaveEval=
set /p SaveEval=是否将表达式和计算结果存入文件[Y/N]?
if /i "%SaveEval%"=="Y" goto save
if /i "%SaveEval%"=="N" goto inputExpr
goto if_save

:save
set /p SaveEvalPath=请输入文件路径及文件名(如C:\Windows\file.txt。若只输入文件名则自动存入当前文件夹,留空则为上一次输入的路径):
echo "%Expr%"=%EvalExpr% >>"%SaveEvalPath%"
echo 表达式以及计算结果已存入"%SaveEvalPath%"!
goto inputExpr

:autosave
echo "%Expr%"=%EvalExpr% >>"%2"
goto inputExpr

:end
[ Last edited by willsort on 2005-9-11 at 13:37 ]




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-1-12 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 4 楼』:  批处理编程的异类——时钟(Clock)

1、暂停(Pause)、延迟(Delay)、等待(Wait)、睡眠(Sleep) 1)for+set+if,时间精度为0.01秒,适用平台为WinNT/2K/XP/2003。 利用for解析变量%time%并存为两个时间点%start%和%now%,再利用set /a计算两个时间点的时间差,最后用if判断时间差是否达到设定的暂停时间。
  @echo off
  setlocal enableextensions
  echo %time%
  call :ProcDelay 200
  echo %time%
  goto :EOF

  :ProcDelay delayMSec_
  setlocal enableextensions
  for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k
    :_procwaitloop
    for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set now_=%%h%%i%%j%%k
    set /a diff_=%now_%-%start_%
  if %diff_% LSS %1 goto _procwaitloop
  endlocal & goto :EOF
2)VBS脚本中的sleep函数,时间精度为0.001秒,使用平台为Win9x/WinNT系列。 动态创建一个调用sleep()函数的VBS脚本,然后用Windows脚本宿主的命令行版本cscript调用它。
  @echo off & setlocal enableextensions enabledelayedexpansion
  echo WScript.Sleep 2000 > %temp%\tmp$$$.vbs
  echo %time%
  cscript //nologo %temp%\tmp$$$.vbs
  echo %time%
  for %%f in (%temp%\tmp$$$.vbs) do if exist %%f del %%f
  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秒的程序如下:
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或者其它键而被意外终止。
rem|choice /t:y,2 /n >nul
5)ASCII汇编代码,延迟精度为0.001秒,适用平台为MS-DOS/Win9x/WinNT。 德国人Herbert Kleebauer给出了一个通用方案,通过ASCII汇编器间接产生一个sleep.exe程序来实现延迟,这个程序分为DOS和Win两个模块,分别调用DOS系统中断服务和WindowsAPI。
:: Sleep.bat - Sleep/Delay/Wait n seconds
:: Herbert Kleebauer(Germany) - 2005/05/29
:: Modified by Will Sort - 2005/06/02, 07-25
@echo off 
echo q | debug>nul
echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=>sleep.com
echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU WwX0GwUY Wv;ovBX2Gv0ExGIuht6>>sleep.com
echo T}{z~~@GwkBG@OEKcUt`~}@MqqBsy?seHB~_Phxr?@zAB`LrPEyoDt@Cj?>>sleep.com
echo pky_jN@QEKpEt@ij?jySjN@REKpEt@jj?jyGjN@SEKkjtlGuNw?p@pjirz>>sleep.com
echo LFvAURQ?OYLTQ@@?~QCoOL~RDU@?aU?@{QOq?@}IKuNWpe~FpeQFwH?Vkk>>sleep.com
echo _GSqoCvH{OjeOSeIQRmA@KnEFB?p??mcjNne~B?M??QhetLBgBPHexh@e=>>sleep.com
echo EsOgwTLbLK?sFU`?LDOD@@K@xO?SUudA?_FKJ@N?KD@?UA??O}HCQOQ??R>>sleep.com
echo _OQOL?CLA?CEU?_FU?UAQ?UBD?LOC?ORO?UOL?UOD?OOI?UgL?LOR@YUO?>>sleep.com
echo dsmSQswDOR[BQAQ?LUA?_L_oUNUScLOOuLOODUO?UOE@OwH?UOQ?DJTSDM>>sleep.com
echo QTqrK@kcmSULkPcLOOuLOOFUO?hwDTqOsTdbnTQrrDsdFTlnBTm`lThKcT>>sleep.com
echo @dmTkRQSoddTT~?K?OCOQp?o??Gds?wOw?PGAtaCHQvNntQv_w?A?it\EH>>sleep.com
echo {zpQpKGk?Jbs?FqokOH{T?jPvP@IQBDFAN?OHROL?Kj??pd~aN?OHROd?G>>sleep.com
echo Q??PGT~B??OC~?ipO?T?~U?p~cUo0x>>sleep.com
sleep.com>sleep.exe
echo wait %1 seconds:
sleep.exe %1000
del sleep.com
del sleep.exe
[ Last edited by willsort on 2005-12-4 at 21:37 ]




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-1-12 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 5 楼』:  

以下是一个用字符方式画图的程序,原文来自网易广州站DOS版。 http://fe2.gz.163.com/cgi/readsrh?b=DOS&t=15763&i=15763&al=5&n=0&l=40&back=2&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  GOTO MAPEND :MAPSAVEPRE ECHO @ECHO OFF>>SAVEFILE.BAT IF [%3]==[] ECHO IF NOT [%%1]==[] %0 SAVE %%1 /G>>SAVEFILE.BAT IF [%3]==[/L] ECHO IF NOT [%%1]==[] %0 SAVE %%1 /G %2>>SAVEFILE.BAT ECHO ECHO Please input save path again:>>SAVEFILE.BAT ECHO Please save file and path with (SAVEFILE=path\file) style: PROMPT  GOTO MAPEND :MAPSAVE IF NOT EXIST %2.MAP GOTO MAPSSUF IF NOT [%4]==[] GOTO MAPSSUF CHOICE Map name exist, rename IF ERRORLEVEL 2 GOTO MAPSSUF ECHO Please input save path again: GOTO MAPEND :MAPSSUF PROMPT $P$G IF EXIST SAVEFILE.BAT DEL SAVEFILE.BAT IF [%2]==[%4] COPY %4.MAP %4.MBK /Y>NUL COPY %TEMP%\TEMP.MP$ %2.MAP /Y>NUL DEL %TEMP%\TEMP.MP$ GOTO MAPEND :MAPLOAD COPY %2.MAP %TEMP%\%2.BAT>NUL ECHO @ECHO OFF>PAINTER.BAT ECHO CLS>>PAINTER.BAT ECHO IF [%%1]==[] GOTO PEND>>PAINTER.BAT ECHO SET $F=%%1>>PAINTER.BAT ECHO CALL %0 KEYON # /G>>PAINTER.BAT ECHO CALL %TEMP%\%2.BAT>>PAINTER.BAT ECHO %0 START %2 /L>>PAINTER.BAT ECHO END>>PAINTER.BAT ECHO Please choose painter of character with style (PAINTER=char). PROMPT  GOTO MAPEND :MAPVIEW IF NOT EXIST %2.MAP GOTO MAPERR5 COPY %2.MAP %TEMP%\%2.BAT>NUL CLS CALL %TEMP%\%2.BAT ECHO  DEL %TEMP%\%2.BAT GOTO MAPEND :MAPMAKE IF NOT EXIST %2.MAP GOTO MAPERR5 IF EXIST %2.BAT CHOICE Modify existed selfexec map file IF ERRORLEVEL 2 GOTO MAPEND ECHO Making... ECHO @ECHO OFF>MAP.H ECHO MEM/C|FIND "ANSI">>MAP.H ECHO IF NOT ERRORLEVEL 1 GOTO MAPAINT>>MAP.H ECHO.>>MAP.H ECHO :MAPERROR>>MAP.H ECHO ECHO.>>MAP.H ECHO ECHO Error 1: Not load this map file for not load ANSI.>>MAP.H ECHO ECHO.>>MAP.H ECHO GOTO MAPEND>>MAP.H ECHO.>>MAP.H ECHO :MAPAINT>>MAP.H ECHO CLS>>MAP.H IF EXIST %2.BAT ATTRIB -R %2.BAT COPY /B MAP.H+%2.MAP %2.BAT>NUL ECHO.>>%2.BAT ECHO :MAPEND>>%2.BAT ATTRIB +R %2.BAT DEL MAP.H ECHO Made success. GOTO MAPEND :MAPRESTORE IF NOT EXIST %2.MBK GOTO MAPERR6 IF EXIST %2.MAP CHOICE Realy restore and overwrite map file IF ERRORLEVEL 2 GOTO MAPEND COPY %2.MBK %2.MAP /Y>NUL DEL %2.MBK ECHO Restored. %0 V: %2 GOTO MAPERR9 :MAPEXTRACT IF NOT EXIST %2.BAT GOTO MAPERR7 IF EXIST %2.MAP CHOICE Realy extract and overwrite map file FIND ":MAPAINT" %2.BAT>NUL IF ERRORLEVEL 1 GOTO MAPERR8 TYPE %2.BAT|FIND "[">%2.MAP CHOICE Extracted. Delete selfexec map file IF NOT ERRORLEVEL 1 DEL %2.BAT %0 V: %2 GOTO MAPERR9 :MAPTRYSAVE IF NOT EXIST %TEMP%\TEMP.MP$ GOTO MAPEND IF EXIST %2.MAP CHOICE Realy try to save and overwrite map file COPY %TEMP%\TEMP.MP$ %2.MAP /Y>NUL ECHO Try success. %0 V: %2 GOTO MAPERR9 :MAPKEYON ECHO ["7";"U"p ECHO ["8";"I"p ECHO ["9";"O"p ECHO ["4";"J"p ECHO ["5";"K"p ECHO ["6";"L"p ECHO ["1";"M"p ECHO ["2";","p ECHO ["3";"."p ECHO ["0";"Y"p ECHO [".";"N"p ECHO [0;71;"U"p ECHO [0;72;"I"p ECHO [0;73;"O"p ECHO [0;75;"J"p ECHO [0;76;"K"p ECHO [0;77;"L"p ECHO [0;79;"M"p ECHO [0;80;","p ECHO [0;81;"."p ECHO [0;82;"Y"p ECHO [0;83;"N"p GOTO MAPEND :MAPKEYOFF ECHO  ECHO  ECHO  ECHO  ECHO  ECHO  ECHO  ECHO  ECHO  ECHO  ECHO  ECHO ["7";"7"p ECHO ["8";"8"p ECHO ["9";"9"p ECHO ["4";"4"p ECHO ["5";"5"p ECHO ["6";"6"p ECHO ["1";"1"p ECHO ["2";"2"p ECHO ["3";"3"p ECHO ["0";"0"p ECHO [".";"."p GOTO MAPEND :MAPSTART IF EXIST PAINTER.BAT DEL PAINTER.BAT IF NOT [%3]==[/L] CALL %0 KEYON # /G IF [%2]==[/LINE] GOTO MAPEDIT IF [%2]==[/PIPE] GOTO MAPEDIT :MAPLENG SET $M= SET $CN=[1C SET $DN=[1D SET $LN= SET $A$=%$F% :MAPSET FOR %%A IN (/%$A$%) DO SET $B$=%%A IF [%$A$%]==[%$B$%] GOTO MAPEDIT SET $A$=%$B$% SET $DN=%$DN% SET $CN=%$CN% SET $LN=%$DN% SET $M=%$M% GOTO MAPSET :MAPCHANGE ECHO ? IF ERRORLEVEL 2 SET $F=? IF ERRORLEVEL 2 GOTO MAPPIPE SET $F=@ GOTO MAPLINE :MAPEDIT IF NOT [%3]==[/L] GOTO MAPNEW COPY %2.MAP %TEMP%\TEMP.MP$ /Y>NUL SET $SN=%$LN% SET $LN= SET $SF=%$F% SET $F= IF [%2]==[/LINE] GOTO MAPLINE IF [%2]==[/PIPE] GOTO MAPPIPE GOTO MAPCHAR :MAPNEW IF EXIST %TEMP%\TEMP.MP$ DEL %TEMP%\TEMP.MP$ ECHO  ECHO %$F% ECHO ECHO %$F%>>%TEMP%\TEMP.MP$ IF [%2]==[/LINE] GOTO MAPLINE IF [%2]==[/PIPE] GOTO MAPPIPE GOTO MAPCHAR :MAPCHAR ECHO %$F% CHOICE /C:QYNUOKM.IJ,L /N>NUL IF ERRORLEVEL 12 GOTO MAPCRIGHT IF ERRORLEVEL 11 GOTO MAPCDOWN IF ERRORLEVEL 10 GOTO MAPCLEFT IF ERRORLEVEL 9 GOTO MAPCUP IF ERRORLEVEL 8 GOTO MAPCRGDW IF ERRORLEVEL 7 GOTO MAPCLTDW IF ERRORLEVEL 6 GOTO MAPCTAB IF ERRORLEVEL 5 GOTO MAPCRGUP IF ERRORLEVEL 4 GOTO MAPCLTUP IF ERRORLEVEL 3 GOTO MAPCDEL IF ERRORLEVEL 2 GOTO MAPCINS GOTO MAPCLEAN :MAPCTAB REM ECHO %$F% IF NOT [%$F%]==[] GOTO MAPCOVER SET $LN=%$SN% SET $SN= SET $F=%$SF% SET $SF= GOTO MAPCHAR :MAPCOVER SET $SN=%$LN% SET $LN= SET $SF=%$F% SET $F= GOTO MAPCHAR :MAPCINS IF [%$F%]==[] GOTO MAPCOINS IF NOT [%$F%]==[%$M%] GOTO MAPCHAR SET $F=%$T% SET $T= GOTO MAPCHAR :MAPCOINS IF NOT [%$SF%]==[%$M%] GOTO MAPCHAR SET $SF=%$T% SET $T= GOTO MAPCHAR :MAPCDEL IF [%$F%]==[] GOTO MAPCODEL IF [%$F%]==[%$M%] GOTO MAPCHAR SET $T=%$F% SET $F=%$M% GOTO MAPCHAR :MAPCODEL IF [%$SF%]==[%$M%] GOTO MAPCHAR SET $T=%$SF% SET $SF=%$M% GOTO MAPCHAR :MAPCRGDW ECHO %$F% ECHO %$CN% ECHO ECHO %$CN%%$F%%$LN%>>%TEMP%\TEMP.MP$ GOTO MAPCHAR :MAPCLTDW ECHO %$F% ECHO %$DN% ECHO ECHO %$DN%%$F%%$LN%>>%TEMP%\TEMP.MP$ GOTO MAPCHAR :MAPCRGUP ECHO %$F% ECHO %$CN% ECHO ECHO %$CN%%$F%%$LN%>>%TEMP%\TEMP.MP$ GOTO MAPCHAR :MAPCLTUP ECHO %$F% ECHO %$DN% ECHO ECHO %$DN%%$F%%$LN%>>%TEMP%\TEMP.MP$ GOTO MAPCHAR :MAPCRIGHT ECHO %$F% ECHO %$CN% ECHO ECHO %$CN%%$F%%$LN%>>%TEMP%\TEMP.MP$ GOTO MAPCHAR :MAPCDOWN ECHO %$F% ECHO  ECHO ECHO %$F%%$LN%>>%TEMP%\TEMP.MP$ GOTO MAPCHAR :MAPCLEFT ECHO %$F% ECHO %$DN% ECHO ECHO %$DN%%$F%%$LN%>>%TEMP%\TEMP.MP$ GOTO MAPCHAR :MAPCUP ECHO %$F% ECHO  ECHO ECHO %$F%%$LN%>>%TEMP%\TEMP.MP$ GOTO MAPCHAR :MAPLINE ECHO %$F% CHOICE /C:ZAWRXVSEFCDYNIJ,LKQP /N>NUL IF ERRORLEVEL 20 GOTO MAPCHANGE IF ERRORLEVEL 19 GOTO MAPCLEAN IF ERRORLEVEL 18 GOTO MAPLTAB IF ERRORLEVEL 17 GOTO MAPLRIGHT IF ERRORLEVEL 16 GOTO MAPLDOWN IF ERRORLEVEL 15 GOTO MAPLLEFT IF ERRORLEVEL 14 GOTO MAPLUP IF ERRORLEVEL 13 GOTO MAPLDEL IF ERRORLEVEL 12 GOTO MAPLINS SET HPF=1 ECHO  FOR %%A IN (1 2 3 4 5 6 7 8 9 10 11) DO IF ERRORLEVEL %%A GOTO MAPLP%%A ECHO  GOTO MAPLINE :MAPLP1 ECHO ? SET $F=? GOTO MAPLINE :MAPLP2 ECHO ? SET $F=? GOTO MAPLINE :MAPLP3 ECHO ? SET $F=? GOTO MAPLINE :MAPLP4 ECHO ? SET $F=? GOTO MAPLINE :MAPLP5 ECHO ? SET $F=? GOTO MAPLINE :MAPLP6 ECHO ? SET $F=? GOTO MAPLINE :MAPLP7 ECHO ? SET $F=? GOTO MAPLINE :MAPLP8 ECHO ? SET $F=? GOTO MAPLINE :MAPLP9 ECHO ? SET $F=? GOTO MAPLINE :MAPLP10 ECHO ? SET $F=? GOTO MAPLINE :MAPLP11 ECHO ? SET $F=? GOTO MAPLINE :MAPLTAB REM ECHO %$F% IF NOT [%$F%]==[] GOTO MAPLOVER SET $F=%$SF% SET $SF= GOTO MAPLINE :MAPLOVER SET $SF=%$F% SET $F= GOTO MAPLINE :MAPLINS IF [%$F%]==[] GOTO MAPLOINS IF NOT [%$F%]==[%$M%] GOTO MAPLINE SET $F=%$T% SET $T= GOTO MAPLINE :MAPLOINS IF NOT [%$SF%]==[%$M%] GOTO MAPLINE SET $SF=%$T% SET $T= GOTO MAPLINE :MAPLDEL IF [%$F%]==[] GOTO MAPLODEL IF [%$F%]==[%$M%] GOTO MAPLINE SET $T=%$F% SET $F=%$M% GOTO MAPLINE :MAPLODEL IF [%$SF%]==[%$M%] GOTO MAPLINE SET $T=%$SF% SET $SF=%$M% GOTO MAPLINE :MAPLRIGHT SET $BF=? IF [%PRE%]==[A] SET $BF=? IF [%PRE%]==[B] SET $BF=? IF [%HPF%]==[] SET $F=%$BF% ECHO %$F% ECHO ECHO [1%PRE%%$F%>>%TEMP%\TEMP.MP$ SET HPF= SET $F=? ECHO  SET PRE=C GOTO MAPLINE :MAPLDOWN SET $BF=? IF [%PRE%]==[C] SET $BF=? IF [%PRE%]==[D] SET $BF=? IF [%HPF%]==[] SET $F=%$BF% ECHO %$F% ECHO ECHO [1%PRE%%$F%>>%TEMP%\TEMP.MP$ SET HPF= SET $F=? ECHO  SET PRE=B GOTO MAPLINE :MAPLLEFT SET $BF=? IF [%PRE%]==[A] SET $BF=? IF [%PRE%]==[B] SET $BF=? IF [%HPF%]==[] SET $F=%$BF% ECHO %$F% ECHO ECHO [1%PRE%%$F%>>%TEMP%\TEMP.MP$ SET HPF= SET $F=? ECHO  SET PRE=D GOTO MAPLINE :MAPLUP SET $BF=? IF [%PRE%]==[C] SET $BF=? IF [%PRE%]==[D] SET $BF=? IF [%HPF%]==[] SET $F=%$BF% ECHO %$F% ECHO ECHO [1%PRE%%$F%>>%TEMP%\TEMP.MP$ SET HPF= SET $F=? ECHO  SET PRE=A GOTO MAPLINE :MAPPIPE ECHO %$F% CHOICE /C:ZAWRXVSEFCDYNIJ,LKQP /N>NUL IF ERRORLEVEL 20 GOTO MAPCHANGE IF ERRORLEVEL 19 GOTO MAPCLEAN IF ERRORLEVEL 18 GOTO MAPPTAB IF ERRORLEVEL 17 GOTO MAPPRIGHT IF ERRORLEVEL 16 GOTO MAPPDOWN IF ERRORLEVEL 15 GOTO MAPPLEFT IF ERRORLEVEL 14 GOTO MAPPUP IF ERRORLEVEL 13 GOTO MAPPDEL IF ERRORLEVEL 12 GOTO MAPPINS SET HPF=1 ECHO  FOR %%A IN (1 2 3 4 5 6 7 8 9 10 11) DO IF ERRORLEVEL %%A GOTO MAPPP%%A ECHO  GOTO MAPPIPE :MAPPP1 ECHO ? SET $F=? GOTO MAPPIPE :MAPPP2 ECHO ? SET $F=? GOTO MAPPIPE :MAPPP3 ECHO ? SET $F=? GOTO MAPPIPE :MAPPP4 ECHO ? SET $F=? GOTO MAPPIPE :MAPPP5 ECHO ? SET $F=? GOTO MAPPIPE :MAPPP6 ECHO  SET $F= GOTO MAPPIPE :MAPPP7 ECHO ? SET $F=? GOTO MAPPIPE :MAPPP8 ECHO ? SET $F=? GOTO MAPPIPE :MAPPP9 ECHO ? SET $F=? GOTO MAPPIPE :MAPPP10 ECHO ? SET $F=? GOTO MAPPIPE :MAPPP11 ECHO ? SET $F=? GOTO MAPPIPE :MAPPTAB REM ECHO %$F% IF NOT [%$F%]==[] GOTO MAPPOVER SET $F=%$SF% SET $SF= GOTO MAPPIPE :MAPPOVER SET $SF=%$F% SET $F= GOTO MAPPIPE :MAPPINS IF [%$F%]==[] GOTO MAPPOINS IF NOT [%$F%]==[%$M%] GOTO MAPPIPE SET $F=%$T% SET $T= GOTO MAPPIPE :MAPPOINS IF NOT [%$SF%]==[%$M%] GOTO MAPPIPE SET $SF=%$T% SET $T= GOTO MAPPIPE :MAPPDEL IF [%$F%]==[] GOTO MAPPODEL IF [%$F%]==[%$M%] GOTO MAPPIPE SET $T=%$F% SET $F=%$M% GOTO MAPPIPE :MAPPODEL IF [%$SF%]==[%$M%] GOTO MAPPIPE SET $T=%$SF% SET $SF=%$M% GOTO MAPPIPE :MAPPRIGHT SET $BF=? IF [%PRE%]==[A] SET $BF=? IF [%PRE%]==[B] SET $BF=? IF [%HPF%]==[] SET $F=%$BF% ECHO %$F% ECHO ECHO [1%PRE%%$F%>>%TEMP%\TEMP.MP$ SET HPF= SET $F=? ECHO  SET PRE=C GOTO MAPPIPE :MAPPDOWN SET $BF=? IF [%PRE%]==[C] SET $BF=? IF [%PRE%]==[D] SET $BF=? IF [%HPF%]==[] SET $F=%$BF% ECHO %$F% ECHO ECHO [1%PRE%%$F%>>%TEMP%\TEMP.MP$ SET HPF= SET $F=? ECHO  SET PRE=B GOTO MAPPIPE :MAPPLEFT SET $BF=? IF [%PRE%]==[A] SET $BF=? IF [%PRE%]==[B] SET $BF=? IF [%HPF%]==[] SET $F=%$BF% ECHO %$F% ECHO ECHO [1%PRE%%$F%>>%TEMP%\TEMP.MP$ SET HPF= SET $F=? ECHO  SET PRE=D GOTO MAPPIPE :MAPPUP SET $BF=? IF [%PRE%]==[C] SET $BF=? IF [%PRE%]==[D] SET $BF=? IF [%HPF%]==[] SET $F=%$BF% ECHO %$F% ECHO ECHO [1%PRE%%$F%>>%TEMP%\TEMP.MP$ SET HPF= SET $F=? ECHO  SET PRE=A GOTO MAPPIPE :MAPCLEAN ECHO ::NEXT>>%TEMP%\TEMP.MP$ CLS CALL %0 KEYOFF # /G PROMPT $P$G ECHO  SET $F= SET $SF= SET $T= SET $N= SET $SN= SET $DN= SET $CN= SET $LN= SET $A$= SET $B$= SET $M= SET PRE= SET HPF= CLS CHOICE Save map to map file IF NOT ERRORLEVEL 2 GOTO MAPSAVEPRE :MAPEND

[此贴子已经被作者于2004-1-12 7:15:56编辑过]





※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-1-12 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 6 楼』:  

以下是个在命名行提示上画一只字符小狗的程序,原文来自网易北京站的DOS版。 http://fe4.bj.163.com/cgi/readsrh?b=DOS&t=38819&i=38819&al=5&n=0&l=40&back=2&st=0&kw=DOS%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




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-1-12 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 7 楼』:  

以下是一个获取PROMPT系统状态数据的程序,原文来自网易广州站的DOS版。 http://fe2.gz.163.com/cgi/readsrh?b=DOS&t=25501&i=25609&al=5&n=0&l=40&back=2&st=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 ------------------------------------
::getvar.bat 
@if [%1]==[invoke] prompt set %2=%3 
@if [%1]==[invoke] goto end 
@echo off 
%comspec% /c %0 invoke %1 %2>tt.bat 
call tt 

:end 
------------------------------------ 2005.07.16 更新:
:: GetVar.bat - Get from 'PROMPT' text to environment variable 
:: Will Sort - 10:29 2005-7-16 - CMD@XP/COMMAND@Win98/MSDOS6.22
@echo off
echo exit | %comspec% /k prompt set %1=%2$_:: > _GetVar.bat
call _GetVar.bat
for %%f in (_GetVar*.*) do del %%f

[此贴子已经被作者于2004-1-12 0:58:40编辑过]

[ Last edited by willsort on 2005-10-29 at 12:36 ]




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-1-12 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 8 楼』:  

以下是一个定时器程序,原文来自网易广州站的DOS版。 http://fe2.gz.163.com/cgi/readsrh?b=DOS&t=13486&i=15375&al=5&n=40&l=40&back=2&st=1&kw=willsort 程序中的 CURRENT.BAT 可以更换为自己需要执行的内容。FIND 一句的时间可以根据自己的需要设定,也可用参数%1代替。还可以改为 TIME 改为 DATE 以完成的定期执行的功能。 ------------------------------
::CURRENT.BAT @echo off echo Haha, it's the time to go!! ::TIMER.BAT @echo off :start echo.|time|find "10:30:00">run.bat choice /c:y /t:y,59 /n>nul call run.bat goto start




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-1-12 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 9 楼』:  批处理编程的异类——网络(Network)

1、共享 1)删除win2k/xp系统默认共享 原文来自《批处理简明教程》 http://www.realhack.org/article/articleshow.asp?ArticleID=954
@echo preparing to delete all the default shares. when ready press any key. 
@pause 
@echo off 
:Rem check parameters if null show usage. 
if {%1}=={} goto :Usage 
:Rem code start. 
echo. 
echo ------------------------------------------------------ 
echo. 
echo Now deleting all the default shares. 
echo. 
net share %1$ /delete 
net share %2$ /delete 
net share %3$ /delete 
net share %4$ /delete 
net share %5$ /delete 
net share %6$ /delete 
net share %7$ /delete 
net share %8$ /delete 
net share %9$ /delete 
net stop Server 
net start Server 
echo. 
echo All the shares have been deleteed 
echo. 
echo ------------------------------------------------------ 
echo. 
echo Now modify the registry to change the system default properties. 
echo. 
echo Now creating the registry file 
echo Windows Registry Editor Version 5.00> c:\delshare.reg 
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters]>> c:\delshare.reg 
echo "AutoShareWks"=dword:00000000>> c:\delshare.reg 
echo "AutoShareServer"=dword:00000000>> c:\delshare.reg 
echo Nowing using the registry file to chang the system default properties. 
regedit /s c:\delshare.reg 
echo Deleting the temprotarily files. 
del c:\delshare.reg 
goto :END 

:Usage 
echo. 
echo ------------------------------------------------------ 
echo. 
echo ☆ A example for batch file ☆ 
echo ☆ [Use batch file to change the sysytem share properties.] ☆ 
echo. 
echo Author:Ex4rch 
echo Mail:Ex4rch@hotmail.com QQ:1672602 
echo. 
echo Error:Not enough parameters 
echo. 
echo ☆ Please enter the share disk you wanna delete ☆ 
echo. 
echo For instance,to delete the default shares: 
echo delshare c d e ipc admin print 
echo. 
echo If the disklable is not as C: D: E: ,Please chang it youself. 
echo. 
echo example: 
echo If locak disklable are C: D: E: X: Y: Z: ,you should chang the command into : 
echo delshare c d e x y z ipc admin print 
echo. 
echo *** you can delete nine shares once in a useing *** 
echo. 
echo ------------------------------------------------------ 
goto :EOF
:END 
echo. 
echo ------------------------------------------------------ 
echo. 
echo OK,delshare.bat has deleted all the share you assigned. 
echo.Any questions ,feel free to mail to Ex4rch@hotmail.com. 
echo 
echo. 
echo ------------------------------------------------------ 
echo. 
:EOF 
echo end of the batch file 
2)PING某个区段内的所有IP的程序 原文来自网易北京站的DOS版。 http://fe4.bj.163.com/cgi/readsrh?b=DOS&t=94897&i=96159&al=5&n=0&l=40&back=2&st=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 语句是等待用户判断是否继续,可以删除,但这样中断程序比较麻烦。
@echo off 
:redo 
if "%1" == "" goto end 
for %%a in (0,1,2,3,4,5,6,7,8,9) do echo 192.168.1.%1%%a 
choice continue 
if errorlevel 2 goto end 
shift 
goto redo 
:end 
[ Last edited by willsort on 2005-8-19 at 17:17 ]




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-1-12 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 10 楼』:  

以下是一个修改文件的更新日期的程序,原文来自网易北京站的DOS版。 http://fe4.bj.163.com/cgi/readsrh?b=DOS&t=85861&i=85878&al=5&n=0&l=40&back=2&st=1&kw=willsort 原文代码中有若干错误,下为修正版。 --------------------------------------
@echo off rem 保存系统时间 echo.|date>sysdate.bat echo.|time>systime.bat rem 修改系统时间为指定时间,日期为参数一,时间为参数二,文件名为参数三 date %1 time %2 rem 修改文件的时间 copy %3+,,>nul rem 恢复系统时间 echo date %%4>current.bat call sysdate echo time %%3>current.bat call systime rem 程序执行完毕 echo Success. del systime.bat del sysdate.bat del current.bat echo on

[此贴子已经被作者于2004-1-12 1:41:05编辑过]





※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-1-12 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 11 楼』:  

以下是一个文件遍历程序,原文来自网易广州站的DOS版。 http://fe2.gz.163.com/cgi/readsrh?b=DOS&t=21718&i=21882&al=5&n=0&l=40&back=2&st=1&kw=willsort 原文中用到了两个外部程序,VARSET 和 LMOD,可能在本站或者新DOS时代就有下载。 ----------------------------------
@echo off rem ///////////////////搜索所有目录下的所有txt文件/////////////////// rem 找当前目录(根目录)的*.txt for %%a in (*.txt) do type %%a rem 以下为找当前目录(根目录)的所有子目录下的所有*.txt set i=1 set j=1 set filenum=0 set dirnum=0 varset root=FULL of . >temp.bat call temp.bat varset rootdir=string(3) %root% >temp.bat call temp.bat dir /ad /b /s >temp.txt varset dirnum=lines temp.txt >temp.bat call temp.bat :loop1 type %root%\temp.txt | %root%\LMOD /L%i% set curdir=[] >%root%\temp.bat call %root%\temp.bat varset curdir=string(3) %curdir% >%root%\temp.bat call %root%\temp.bat cd %curdir% echo %curdir% set j=1 :loop2 %root%\varset filenum=files *.txt >%root%\temp.bat call %root%\temp.bat if %filenum%==0 goto end2 dir *.txt /b | %root%\LMOD /L%j% set curfile=[] >%root%\temp.bat call %root%\temp.bat type %curfile% if %j%==%filenum% goto end2 %root%\varset j=%j%+1 >%root%\temp.bat call %root%\temp.bat goto loop2 :end2 cd %rootdir% if %i%==%dirnum% goto end1 %root%\varset i=%i%+1 >%root%\temp.bat call %root%\temp.bat goto loop1 :end1 del %root%\temp.bat del %root%\temp.txt set i= set j= set filenum= set dirnum= set root= set rootdir= set curdir= set curfile=




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-1-12 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 12 楼』:  

以下是一个接收键盘输入字符串的程序,原文来自本站教学室。 http://model.chinajewelry.net/dos/dosbbs/dispbbs.asp?boardID=12&replyID=34149&ID=5283&skin=1 此文的关键技巧在于 FC 和 DEBUG 的巧妙结合使用。%TEMP%.\filename.ext 的用法也很有技巧性。%%?的用法也很新鲜。 ---------------------------------------
:: Get user input - includes error check @echo off echo e102'set %%1='> %temp%.\t1.dat for %%? in (w q) do echo %%?>> %temp%.\t1.dat :input echo. echo Type input: FC con nul /lb1 /n |FIND "1:" > %temp%.\t2.bat :: Error checking begins here FIND "|" %temp%.\t2.bat > nul if not errorlevel=1 goto error FIND "=" %temp%.\t2.bat > nul if not errorlevel=1 goto error FIND " nul if not errorlevel=1 goto error FIND ">" %temp%.\t2.bat > nul if not errorlevel=1 goto error :: Error checking end DEBUG %temp%.\t2.bat nul call %temp%.\t2.bat 字符串 for %%? in (t1.dat t2.bat) do del %temp%.\%%? echo 字符串=%字符串% goto eof :error echo. echo @PROMPT Invalid input. Invalid characters: $Q $L $G $B$_> %temp%.\t2.bat %comspec% /c %temp%.\t2.bat |FIND ":" goto input :eof




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-1-12 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
pizigao
银牌会员

三生缘里笑红尘


积分 1063
发帖 292
注册 2003-3-9
状态 离线
『第 13 楼』:  

ding




2004-1-13 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
pizigao
银牌会员

三生缘里笑红尘


积分 1063
发帖 292
注册 2003-3-9
状态 离线
『第 14 楼』:  

willsort大哥,帮忙看看我的帖子 http://model.chinajewelry.net/dos/dosbbs/dispbbs.asp?boardID=9&ID=8920

[此贴子已经被作者于2004-1-13 10:38:37编辑过]





2004-1-13 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
zww3008
初级用户




积分 197
发帖 21
注册 2004-1-9
状态 离线
『第 15 楼』:  

这些都是很精典的批处理程序,很值得初学者学习参考体味,如果不希望贴子灌水的话,那就请版主置顶吧!不要让贴子沉了。


2004-1-14 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
<<   [1] [2] [3] [4]  >>   >
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: