Board logo

标题: [分享]批处理中变量%var%代替语句执行 [打印本页]

作者: 523066680    时间: 2009-1-21 13:25     标题: [分享]批处理中变量%var%代替语句执行

文/523066680
发表于:http://www.cn-dos.net/forum/viewthread.php?tid=45240&fpage=1
    首先,声明的是这个用法并不是我发明的,我只是也想到了同样的方法而已,为了发扬这个方法,所以
发表文章.
    第一次想到这样玩是在做贪吃蛇的时候,相关分析:http://www.cn-dos.net/forum/view ... hlight=%2B523066680  23楼
这里是相关部分:
  1.     关于记录某个"编号"的点的坐标:
  2.     set cut%i%="set /a a=%line%,b=%col%,c=%C2%" 这整个定义三个变量的语句都放在一个
  3.     编号变量里面了,嘿嘿,利用批处理的性质,之后要用到这三个变量时,一句 !cut%i%:"=! 就相当于执行
  4.     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楼
  1. @echo off &setlocal enabledelayedexpansion
  2. set /p "n=输入位数,最大为9: "
  3. for /l %%x in (1,1,%n%) do (
  4.   set fo="for %%%%x in (0 1 2 3 4 5 6 7 8 9) do (!fo!"
  5.   set end="!end!)"
  6.   set echo=!echo! %%%%x
  7. )
  8. %fo:"=%
  9.           echo %echo%
  10. %end:"=%
  11. 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 来判断是否显示,估计代码....
作者: defanive    时间: 2009-1-21 16:05

老东西,自开始学P的时候就会了。。。

批处理就是无“型”化的处理,“echo 1”可以作为字串也可以作为命令,“1”可以作为字串也可以作为数字。批处理实在是不规范的,所以批处理才有过滤字符等那么多麻烦的东西。。。
作者: yslyxqysl    时间: 2009-1-21 16:14

原帖由 defanive 于 2009-1-21 16:05 发表
批处理实在是不规范的,所以批处理才有过滤字符等那么多麻烦的东西 ...

其它的就不麻烦了吗?
作者: 523066680    时间: 2009-1-21 16:44

给像我这样的菜菜看的啦~
作者: 523066680    时间: 2009-3-28 16:21     标题: 回复 2楼 的帖子

话说我可没见过别人用  【%str% 代替括号  并控制for的循环的层次】 怎么算是老东西?
作者: caimingbing    时间: 2009-12-21 15:31

对于新手来说,真是有点难啊
作者: tms2010    时间: 2012-2-18 02:42

回复 1# 523066680


    ping次数更改这个理论上不可行吧。。。把2换成3不就ping 137.0.0.1了么。。。
作者: Perl    时间: 2012-2-18 08:43

回复 7# tms2010


2两边有空格,不会匹配的到127里面的2
作者: changedirectory    时间: 2014-5-29 14:05

回复 1# 523066680


    看不懂代码,能给详细的解释下吗?谢谢!
作者: cjiabing    时间: 2014-6-10 20:44

回复 9# changedirectory

  1. @echo off
  2. set /a str=2+1
  3. echo %str%
  4. set /a str=2+2
  5. echo %str%
  6. set /a str=2+3
  7. echo %str%
  8. pause
复制代码

以上代码看得懂吧?
其实它和以下代码应该一样
  1. set var=set /a str=2+
  2. %var%1
  3. echo %str%
  4. %var%2
  5. echo %str%
  6. %var%3
  7. echo %str%
  8. pause
复制代码

和数学里的代数式差不多。用%var%替代set /a str=2+
作者: zh_1452    时间: 2014-6-21 10:37

  1. @echo off
  2. set /a str=2+1
  3. echo %str%
  4. set /a str=2+2
  5. echo %str%
  6. set /a str=2+3
  7. echo %str%
  8. pause
  9. set var=set /a str=2+
  10. %var%1
  11. echo %str%
  12. %var%2
  13. echo %str%
  14. %var%3
  15. echo %str%
  16. pause
  17. @echo off
  18. set /a str=79+21
  19. echo %str%
  20. pause
  21. set /a str=72/9
  22. echo %str%
  23. pause
  24. set /a str=72/8
  25. echo %str%
  26. pause
  27. set /a str=8*9
  28. echo %str%
  29. pause
  30. set /a str=9*8
  31. echo %str%
  32. pause
  33. set var=set /a str=79+
  34. %var%21
  35. echo %str%
  36. set var=set /a str=72/
  37. %var%9
  38. echo %str%
  39. set var=set /a str=72/
  40. %var%8
  41. echo %str%
  42. pause
复制代码
照楼上的来一下
不过还是不太理解
希望多多指点




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2