http://www.jb51.net/article/29323.htm

例1: 代码如下:

@echo off 
set a=4 
set a=5&echo %a% 
pause 

结果:4 
解说:为什么是4而不是5呢?在echo之前明明已经把变量a的值改成5了?让我们先了解一下批处理运行命令的机制:批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。我们现在分析一下例1,批处理在运行到这句“set a=5&echo %a%”之前,先把这一句整句读取并做了预处理——对变量a赋了值,那么%a%当然就是4了!(没有为什么,批处理就是这样做的。)而为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。那么如何开启变量延迟呢?变量延迟又需要注意什么呢? 
举个例子说明一下: 
例2: 代码如下:

@echo off 
setlocalenabledelayedexpansion 
set a=4 
set a=5&echo !a! 
pause 

结果:5 
解说:由于启动了变量延迟,得到了正确答案。变量延迟的启动语句是“setlocalenabledelayedexpansion”,并且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。分析一下例2,首先“setlocalenabledelayedexpansion”开启变量延迟,然后“set a=4”先给变量a赋值为4,“set a=5&echo !a!”这句是给变量a赋值为5并输出(由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时a的值就是5了)。再举一个例子巩固一下。 
例3: 代码如下:

@echo off 
setlocalenabledelayedexpansion 
for /l %%i in (1,1,5) do ( set a=%%i echo !a! ) 
pause 

结果:12345 
解说:本例开启了变量延迟并用“!!”将变量扩起来,因此得到我们预期的结果。如果不用变量延迟会出现什么结果呢?结果是这样的:ECHO 处于关闭状态。ECHO 处于关闭状态。ECHO 处于关闭状态。ECHO 处于关闭状态。ECHO 处于关闭状态。即没有感知到for语句中的动态变化。 
batman的说明 
我来简要说一下吧: 
set:设置 
local:本地(环境变量) 
enable:能够 
delayed:延迟 
expansion:扩展 
setlocal enabledelayedexpansion就是扩展本地环境变量延迟, 
比较下面两段代码:

@echo off 
for /l %%i in (1,1,10) do ( 
set "str=%%i" 
echo %str% 

pause>nul 

代码如下:

@echo off&setlocal enabledelayedexpansion 
for /l %%i in (1,1,10) do ( 
set "str=%%i" 
echo !str! 

pause>nul 

第一段代码只会显示10行“ECHO 处于关闭状态。”,而第二段代码则会正确显示1-10的10行数字。这是为什么呢?因为在两段代码的for循环前str都是没有被定义的,而由于第一段代码没有开启变量延迟,所以str值一直是没有定义,因而显示出了10行报 
错信息;而第二段代码开启了变量延迟,在for循环中每次赋予str的值被传递下去,因而会正确显示10行数字,但这里的str变量符必须要写成!str!,这是没有道理可讲的,只要记住就好了。

setlocal enabledelayedexpansion 是什么意思?

是:设置本地为延迟扩展。其实也就是:延迟变量,全称"延迟环境变量扩展", 
在cmd执行命令前会对脚本进行预处理,其中有一个过程是变量识别过程,在这个过程中,如果有两个%括起来的如%value%类似这样的变量,就会对其进行识别,并且查找这个变量对应的值,再而将值替换掉这个变量,这个替换值的过程,就叫做变量扩展,然后再执行命令。 
在解释之前,先看几个例子的区别: 
例一: 
set value=kkkkkkk 
echo %value% 
将这段代码保存到一个后缀为bat的文本文件中。然后打开dos,进到对应目录下,执行这个文件,结果如下: 
C:\Documents and Settings\Administrator\桌面\ln\temp\bat>set value=kkkkkkk 
C:\Documents and Settings\Administrator\桌面\ln\temp\bat>echo kkkkkkk 
kkkkkkk 
最后一行是结果,但是在结果之前,还有两句,set value=kkkkkkk 和 echo kkkkkkk,但是在语句中,我们并没有写echo kkkkkkk的语句,这表明至少在执行到echo %value% 这句时,对变量进行的值的替换。这就是变量的扩展。 
那么什么是变量的延迟扩展呢? 
如果大家知道C++的“静态变量”概念,那就应该知道,c++编译的时候,会对静态变量进行值的替换,但这个替换是基于静态的前提下,那么进行变量扩展时,也是这样,但如果出现动态的情况会怎样?在cmd执行中,发生动态的一种情况是在 for语句中进行变量赋值,例如: 
例二: 代码如下:

@echo off 
for /l %%i in (1,1,3) do ( 
set k=%%i ::对k进行循环赋值 
echo %k% %%i 

执行这样的脚本,出现如下结果: 
_1 
_2 
_3 
结果出现这三句话。_ 表示空格 
注:k没有赋初值,则替换为空。

例三: 代码如下:

@echo off 
set k=yyy 
for /l %%i in (1,1,3) do ( 
set k= %%i ::对k进行循环赋值 
echo %k% %%i 

结果: 
yyy 1 
yyy 2 
yyy 3 
注:k有赋初值,则都替换为yyy。、 
实例四: 代码如下:

@echo off 
setlocal enabledelayedexpansion 
set k= 3 
for /l %%i in (1,1,3) do ( 
set k=%%i 
echo %k% %%i 

结果: 
3 1 
3 2 
3 3 
这里已经是用了延迟变量,为什么还会出现这种情况呢?再看实例五: 
实例五: 代码如下:

@echo off 
setlocal enabledelayedexpansion 
set k= 3 
for /l %%i in (1,1,3) do ( 
set k=%%i 
echo !k! %%i 

结果: 
1 1 
2 2 
3 3 
原来在延迟变量扩展中,要使用!来引用变量。

setlocal enabledelayedexpansion的更多相关文章

  1. bat脚本-set(setlocal enabledelayedexpansion) 学习

    设置本地为延迟扩展.其实也就是:延迟变量,全称延迟环境变量扩展. 事件一: @echo off set a=4 set a=5&echo %a% pause 解说:为什么是4而不是5呢?在ec ...

  2. setlocal enabledelayedexpansion 解释

    看字面的意思是:设置本地为延迟扩展.其实也就是:延迟变量,全称"延迟环境变量扩展", 在cmd执行命令前会对脚本进行预处理,其中有一个过程是变量识别过程,在这个过程中,如果有两个% ...

  3. 批处理中setlocal enabledelayedexpansion的含义

    setlocal enabledelayedexpansion       延迟变量全称"延迟环境变量扩展",要理解这个东西,我们还得先理解一下什么叫扩展!       CMD在解 ...

  4. 批处理中setlocal enabledelayedexpansion的作用详细整理

    转自:https://www.jb51.net/article/29323.htm 设置本地为延迟扩展.其实也就是:延迟变量,全称延迟环境变量扩展, 想进阶,变量延迟是必过的一关!所以这一部分希望你能 ...

  5. SETLOCAL

    Quote from: http://ss64.com/nt/setlocal.html SETLOCAL Set options to control the visibility of envir ...

  6. 变量延迟(setlocal)之浅见

    变量延迟,浅见认为就是变量预处理,在事先声明变量,告诉cmd环境哪个先哪个后.默认情况下是停用,可以用两种方法启用/停用: 一.cmd /v:on 和cmd /v:off ,范围在cmd这个环境直至e ...

  7. setlocal 与 变量延迟

    setlocal 与 变量延迟 本条内容引用[英雄出品]的批处理教程: 要想进阶,变量延迟是必过的一关!所以这一部分希望你能认真看. 为了更好的说明问题,我们先引入一个例子.例1: @echo off ...

  8. cmd enabledelayedexpansion

    先来说说变量延迟扩展吧.当然,放狗一搜,就能看到满天飞的关于变量延迟扩展的文章,所以,我这里就简单介绍一下.先来看一段批处理: set str=test if %str%==test ( set st ...

  9. SQL Server 批量主分区备份(Multiple Jobs)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 案例分析(Case) 方案一(Solution One) 方案二(Solution Two) ...

随机推荐

  1. appStore应用发布流程

    原文转自: http://blog.sina.com.cn/s/blog_68661bd801019uzd.html       首先确定帐号是否能发布, https://developer.appl ...

  2. Qt Library 链接库

    官方教程:http://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application http://qimo601.i ...

  3. 关于mysql中数据存储复合树形结构,查询时结果按树形结构输出

    1.主要思想:根据已有数据,规则性的造数据 select * FROM(select lId,strName,lId as lParentId,-1 as orderIdx from tbClassi ...

  4. php word转HTML

    因为安装的的xampp不知道如何查看我的Apache版本是多少,就先把com.allow_dcom=true打开了,但是仍旧报错说找不到com类,然后就把下面的extension扩展添加到php.in ...

  5. Node.js how to respond to an upgrade request?

    You just need to call socket.write with the appropriate HTTP syntax as plain text along these lines ...

  6. visual studio 2008安装报错问题处理

    今天刚入职,安装visual studio 2008时报错说web创建组件安装错误,后来发现是因为之前这电脑安装visual studio 2008的时候是office2007刚安装的版本,可是后来系 ...

  7. Blogger建立Blog部落格​​ - Blog透视镜

    Google谷歌提供Blogger免费建立Blog部落格服务,高自由度的设计,模版全面开放,允许你加入HTML/Script,最重要的是可以自定义网域,辛苦经营的Blog部落格,不希望有朝一日,倘若搬 ...

  8. Java iText5.5.1 绘制PDF表格

    iText下载链接:http://sourceforge.net/projects/itext/files/ 会有两个文件夹:extrajars中的extrajars-2.3.jar文件用于解决中文不 ...

  9. 理解JMS规范中消息的传输模式和消息持久化

    http://blog.csdn.net/aitangyong/article/category/2175061 http://blog.csdn.net/aitangyong/article/det ...

  10. Dubbo、Zookeeper、SpringMVC的整合使用

    互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...