Board logo

标题: [文本处理] Call和延迟变量 [打印本页]

作者: zcy85611    时间: 2009-2-3 16:02     标题: Call和延迟变量

  1. @echo off
  2. set var=12345
  3. for /l %%a in (1 1 3) do (
  4. set var=%%a
  5. echo %var%
  6. call echo %%var%%
  7. )
  8. pause
复制代码
这两天做了wxcute新手习题,发现自己经常用错延迟变量。原来以为只有do后面的()里才需要用到延迟变量,现在才发现,只要是复合语句里面就都要用到延迟变量。不过同时也对call这个命令产生了一些疑问。

在上面这段代码里面,我使用call以后可以达到跟延迟变量相同的效果,我想知道为什么call可以到达这样的效果。

另外为什么call echo %%var%%一定要用双%号
我看过这个帖子http://bbs.bathome.net/thread-502-1-1.html
里面提到“在do中使用命令行参数变量和环境变量时,不需要双%,那是因为,这些变量在经过第一级转义后,被替换成特定的不变的字符串常量,参与for循环的所有执行过程”
我对这点感到比较迷惑,请大家帮忙解释一下。
作者: Batcher    时间: 2009-2-3 19:10

什么是延迟环境变量扩展?
http://bbs.bathome.net/thread-3083-1-1.html

变量延迟详解
http://bbs.bathome.net/thread-2898-1-1.html

什么情况下该使用变量延迟
http://bbs.bathome.net/thread-2899-1-1.html

一个变量嵌套变量的问题
http://bbs.bathome.net/thread-2900-1-1.html

什么时候使用延迟变量?为什么要使用?
http://bbs.bathome.net/viewthread.php?tid=112

延迟变量通俗解释
http://bbs.bathome.net/viewthread.php?tid=354
作者: defanive    时间: 2009-2-3 19:19

这个跟预处理有关。。。

我们知道,在批处理执行命令之前,会先进行一次预处理。。。

例如执行echo %var%命令,执行前会先预处理成echo 123,然后就执行echo 123

对于%号来说,预处理就是把偶数个替换成奇数个,例如:%%会变成%
奇数个百分号则成对替换成变量(变量未定义则不替换),例如%var%会变成123

那么我们现在看一下call echo %%var%%这个语句:
执行call这个语句前,要先预处理一次,变成了call echo %var%
到了实际执行完call的时候,call要求执行一个echo %var%命令,那么执行echo %var%就会预处理,变成了echo 123
作者: defanive    时间: 2009-2-3 19:20

很好很强大,下次我也直接给链接好了。。。




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