[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 我也来说说变量延迟

我的理解是不应该叫变量延迟,应该叫变量提前.
1:    @echo off
set mm=girl&echo %mm%
pause

2:    @echo off
set mm=girl
echo %mm%
pause

3:   @echo off & setlocal EnableDelayedExpansion
set mm=girl&echo !mm!
pause
运行上面3个例子.例 1,得不到我们想要的,2和3的结果符合我们的要求

为什么呢?
我的理解是:批处理是按"行"执行的.请注意这个行字.

例子1之所以不行,是因为当运行到echo %mm%时,这一行还没有执行完,CMD把   set mm=girl&echo %mm%   看作是一个整体.  要等到这一行执行完后 set mm=girl 才会生效. mm 这个变量才有一个值: girl      例1 中set mm=girl 它还没生效,然后我们就强迫CMD显示mm的值,这当然行不通拉.

例2,按照前面的思路所以它是行的通的.

例3,我认为,呵呵,我认为哦,我也是猜的.  而例3之所以能行的通,  是因为加了setlocal EnableDelayedExpansion这个命令.我想这个命令的作用应该是告诉CMD:"大哥啊,别管什么行不行的拉,我现在就急着用啊!!".
当一"行"中有多个命令时,执行一个命令就让这命令马上生效,不要等到最后一起来弄.
呵,CMD真听话,照着setlocal EnableDelayedExpansion说的就做了.当CMD运行到
set mm=girl时,马上就把girl赋予给了mm这个变量.提前让set mm=girl生效.
所以echo !mm!就能得到我们想要的.

除了上面这三个例子外,你还可以运行下面这个例子:
@echo off
set mm=girl&echo %mm%
echo %mm%
pause

上面的一切都是我自己边实验边猜的.也不知道猜的对不对.如果有错误的地方请一定要指出来!
另外!mm!这里面两个!!就完全蒙了.哪位大哥,有时间的话,恳请指点指点.

说实话发这个帖子真有点害怕啊,这里高手这么多,万一猜错了,就出丑咯.不过学习嘛,就得要交流啊.

[ 本帖最后由 pengpangxiong 于 2009-1-1 20:18 编辑 ]

请问你的理论如何解释下面两段代码的区别?
  1. @echo off
  2. for /l %%a in (1,1,3) do (
  3.   set num=%%a
  4.   echo %num%
  5. )
  6. pause
复制代码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%a in (1,1,3) do (
  4.   set num=%%a
  5.   echo !num!
  6. )
  7. pause
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

@echo off
set mm=girl&call echo %%mm%%
pause


上面的这段代码,按照例一执行上面的set mm=girl&call echo %%mm%%看成整体,但是仍然可以取到值girl.按照你的意思应该仍然取不到值!所以这里不能用付值的快慢来形容!!!

TOP

@echo off
for /l %%a in (1,1,3) do (
  set num=%%a
  echo %num%
)
pause

这段代码其实num已经被付值了,,只不过在do循环里提取不到,如果想要提取到就应该启用延迟
或者加上call  当然了加了call就要把%号加倍


@echo off
for /l %%a in (1,1,3) do (
  set num=%%a
call echo %%num%%
)
pause
这充分说明不能用付值的快慢来形容!!!!!但是楼主只要能够分清楚怎么用不会出错就行了,至于怎么理解个人认为也没那么重要!!!

[ 本帖最后由 aabb 于 2009-1-1 21:04 编辑 ]

TOP

传说中的预处理机制。
for /f "delims=" %%a in ('%0') do (echo %%a)

TOP

一条完整的命令~ 这句话很重要。
心绪平和,眼藏静谧。

TOP

回复 4楼 的帖子

//这段代码其实num已经被付值了,,只不过在do循环里提取不到,如果想要提取到就应该启用延迟

你知道为什么不用变量延迟扩展的话取不到do循环里面的内容么?呵呵

//但是楼主只要能够分清楚怎么用不会出错就行了,至于怎么理解个人认为也没那么重要!!!

赞同!初学者确实不必钻那么深,知道怎么用就行了。好读书不求甚解。
但是,当自己具备一定基础以后,就该多想想为什么了。
如果你对这方面的知识感兴趣,建议搜索“变量延迟扩展”、“预处理”、“变量嵌套”等内容来深入学习。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表