找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 20394|回复: 3

[文本处理] Call和延迟变量

[复制链接]
发表于 2009-2-3 16:02:51 | 显示全部楼层 |阅读模式
  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循环的所有执行过程”
我对这点感到比较迷惑,请大家帮忙解释一下。
发表于 2009-2-3 19:10:13 | 显示全部楼层
什么是延迟环境变量扩展?
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
发表于 2009-2-3 19:19:25 | 显示全部楼层
这个跟预处理有关。。。

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

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

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

那么我们现在看一下call echo %%var%%这个语句:
执行call这个语句前,要先预处理一次,变成了call echo %var%
到了实际执行完call的时候,call要求执行一个echo %var%命令,那么执行echo %var%就会预处理,变成了echo 123
发表于 2009-2-3 19:20:22 | 显示全部楼层
很好很强大,下次我也直接给链接好了。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 07:48 , Processed in 0.017978 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表