中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: [分享]%var%代替语句执行 上一主题 | 下一主题
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『楼 主』:  [分享]%var%代替语句执行

文/523066680
发表于:http://www.cn-dos.net/forum/viewthread.php?tid=45240&fpage=1

    首先,声明的是这个用法并不是我发明的,我只是也想到了同样的方法而已,为了发扬这个方法,所以
发表文章.

    第一次想到这样玩是在做贪吃蛇的时候,相关分析:http://www.cn-dos.net/forum/view ... hlight=%2B523066680  23楼
这里是相关部分:
    关于记录某个"编号"的点的坐标:
    set cut%i%="set /a a=%line%,b=%col%,c=%C2%" 这整个定义三个变量的语句都放在一个
    编号变量里面了,嘿嘿,利用批处理的性质,之后要用到这三个变量时,一句 !cut%i%:"=! 就相当于执行
    set /a a=%line%,b=%col%,c=%C2% 接下来就直接%a% %b% %c%表示,而非!var%num%!或者%%var%num%%%.
可见适当的利用这个性质可以省很多事儿的.
举个简单的例子吧,ping,一般的延迟都是用ping(尤其是特效) 经常会看到一些脚本多处使用到ping
假如够懒,就可以用 %变量% 取代ping 像这样:

set "ping=ping -n 2 127.1>nul"
%ping%
pause

    改变ping 的时间,可以用 %ping: 2 = 3 %
接下来的多出ping 就直接%ping%了 呵呵
不过感觉也太懒了点. 这只是一个示范,感觉是长一点的句子的话比较体现优势.当然特殊字符也是一个问题.
(这里不讨论)

    我们还可以用 %var% 执行 for 语句,还可以是多重镶套,我发现的有趣的是for 的结尾处的括号用
%var2% 表示仍然可行,所以 还可以用另一个 for 语句 给这个%var% 设定多重镶套, 然后设定结尾括号个数...
应用例子可以见: http://www.cn-dos.net/forum/view ... id=8HBO3h#pid317040  27楼
以及 [已结]怎样生成一个纯数字的密码字典  
http://www.cn-dos.net/forum/view ... id=8HBO3h#pid317042 6楼
@echo off &setlocal enabledelayedexpansion
set /p "n=输入位数,最大为9: "

for /l %%x in (1,1,%n%) do (
  set fo="for %%%%x in (0 1 2 3 4 5 6 7 8 9) do (!fo!"
  set end="!end!)"
  set echo=!echo! %%%%x
)

%fo:"=%
          echo %echo%
%end:"=%
pause
我说过了,这个方法不是我发明的,我只是发现并且作为一个提倡者,我查了一下系统自带的批处理
其中一个名为 msdtcvtr.bat  (纯英文的...汗)
里面的一个例子也很好的, 这里是开头部分

@echo off

rem *************** start of 'main'

set DEBUG=0
if "%DEBUG%"=="1" (set TRACE=echo) else (set TRACE=rem)

rem Note that right now there is a bug in tracerpt.exe cause of which you might want to use tracefmt.exe instead.
rem set the value 1 if you want to use tracefmt.exe instead
set USE_TRACE_FMT=1
%TRACE% The value of variable USE_TRACE_FMT is %USE_TRACE_FMT%
  :
  :

大家看到 TRACE 这个变量了吧,他决定了是否向用户显示一句话呢,我觉得这是个特别号的例子.
因为后面有多处
%TRACE% "可能要显示的信息"

假如这些全都用if 来判断是否显示,估计代码....

[ Last edited by 523066680 on 2008-12-19 at 10:52 ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 HAT 分数: +2  时间:2008-12-20 16:55




综合型编程论坛

我的作品索引
  
2008-12-19 10:46
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
wxcute
中级用户





积分 458
发帖 211
注册 2006-7-26
状态 离线
『第 2 楼』:  

还是你用得比较好。
我在修改你的贪吃蛇的时候也用了一个,不过我的就有点儿画蛇添足的味道了。



┌───────┐
├→学习→实践→┤
└───────┘
2008-12-19 11:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 3 楼』:  

居然没人看......  哎   我太小白 了
尽做些吃力不讨好的事



综合型编程论坛

我的作品索引
  
2008-12-20 16:52
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
zjw767676
新手上路





积分 15
发帖 8
注册 2009-1-12
状态 离线
『第 4 楼』:  

酒香不怕巷子深!我从bathome赶来顶你了!!O(∩_∩)O~

2009-4-17 11:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 5 楼』:  

学了就要用
::BAT 代码效率测试程序,Made by Benton 2009-04-14
::测试单行BAT命令的用时,并可以把测试结果存入文件
::
@echo off&setlocal enabledelayedexpansion
set 次=1000
:rep
set 命=
echo.&echo.&echo.&echo.
echo. 测试代码运行时间
echo.
set /p 命=输入要测试的代码行:
if "!命!"=="" goto :eof
set 止=%起%
set 叠加=0

(echo set 起=%%time%%
for /l %%a in (1,1,%次%) do echo !命!
echo set 止=%%time%%
echo :sub)>temp.bat

:lp
call temp.bat

echo.&echo.
set "起=%起: =0%"
set "止=%止: =0%"
set/a #起=^(1%起:~0,2%-100^)*60*60*100+^(1%起:~3,2%-100^)*60*100+^(1%起:~6,2%-100^)*100+1%起:~9%-100
set/a #止=^(1%止:~0,2%-100^)*60*60*100+^(1%止:~3,2%-100^)*60*100+^(1%止:~6,2%-100^)*100+1%止:~9%-100

set/a 用时=#止-#起
echo.!命!
echo.运行%次%次用时                %用时%毫秒
echo.&echo.
set/a 重复+=1,叠加+=用时

set/p 止=是否保存记录[Y][R]:
if /i "!止!"=="R" goto :lp
set /a 用时=叠加/重复,重复=0
echo.
if /i "!止!"=="Y" (echo.!命!>>test_comm.txt&echo.===                        %次%                %用时% >>test_comm.txt&echo.已经存入...)
goto :rep




精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-4-17 12:20
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 6 楼』:  

网吧匆匆之间,我的大脑嗡的一下,愣是没看出来怎么用。

[ Last edited by 523066680 on 2009-4-18 at 05:57 ]



综合型编程论坛

我的作品索引
  
2009-4-18 05:55
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 7 楼』:  

运行后要求输入一行批处理命令,
输入命令回车后,(直接回车为退出)
即测试出该命令运行1000次所用时间(毫秒)

然后出现的提示符:

是否保存记录[Y][R]:

输入y把刚测试的结果存入到文档,
输入r则重测试一次,多次测试后存入时,会取平均结果
输入其它则又回到重新输入命令行状态。

=================

该工具可测度对比出用什么命令更高效
但是有些命令是测不了的,如:exit,会直接退出了。



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-4-18 06:15
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 8 楼』:  

哦,明白了,发此贴做个回复。



综合型编程论坛

我的作品索引
  
2009-4-18 21:02
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
hugreen
初级用户





积分 23
发帖 15
注册 2008-3-26
状态 离线
『第 9 楼』:  

谢谢分享
收藏了
TRACE那个例子很不错,令人联想到C++对应的TRACE功能,算法写得越好,批处理和高级语言靠得越近

2009-4-18 22:28
查看资料  发短消息 网志   编辑帖子  回复  引用回复
yishanju
银牌会员

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 10 楼』:  

初学批处理写的是命令,后写的是命令集合,再往下精通了就会当成一们编程语言来写了




有问题请发论坛或者自行搜索,再短消息问我的统统是SB
2009-4-18 23:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: