`

批处理中setLocal EnableDelayedExpansion的作用详细整理

阅读更多
引自: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
原来在延迟变量扩展中,要使用!来引用变量。
分享到:
评论

相关推荐

    raindemo.bat

    setlocal ENABLEDELAYEDEXPANSION for /l %%i in (0) do ( set "line=" for /l %%j in (1,1,80) do ( set /a Down%%j-=2 set "x=!Down%%j!" if !x! LSS 0 ( set /a Arrow%%j=!random!%%3 set /a Down%%j=!...

    常用批处理文件,批处理

    常用的批处理文件,清除系统垃圾,绑定ARP等等

    DOS批处理高级教程精选合编-整理

    第四章 批处理中的变量 一、系统变量 二、自定义变量 第五章 set命令详解 一、用set命令设置自定义变量 二、用set命令进行简单计算 三、用set命令进行字符串处理 1、字符串替换 2、字符串截取 第六章 if...

    改文件名批处理

    setlocal enabledelayedexpansion for /f "delims=" %%a in ('dir /a-d/b *.txt') do ( set "var=%%~na" echo !var!%%~xa set newn=!var:要替换的内容=被替换的内容! echo 替换后的值: !newn!%%~xa ren "%%a" ...

    XP下批量重命名文件(批处理程序)

    @echo off&setlocal enabledelayedexpansion echo 批量重命名符号减少 set /p k=要去除的符号: dir /b >tp for /f "delims=" %%i in (tp) do ( set m=%%i if not "%%i"=="!m:.=!" ( if not "%%i"=="%~nx0" ...

    简历关键数据提取器

    setlocal enabledelayedexpansion ::echo. >p.txt ::取目录名 for %%i in ("%cd%") do set person=%%~ni echo name age name2 id mail phone >%person%.txt cd. >p.txt for /f "tokens=1,2 delims= " %%i in ('...

    setlocal函数和用法

    setlocal函数和用法,用于C++开发

    批处理高级应用.doc

    第四章 批处理中的变量 一、系统变量 二、自定义变量 第五章 set命令详解 一、用set命令设置自定义变量 二、用set命令进行简单计算 三、用set命令进行字符串处理 1、字符串替换 2、字符串截取 第六章 if命令...

    IPC$利用工具批处理

    @echo off cls color b title Scaning By SYN 冷雨夜** %1-%2 ** %3 s.exe syn %1 %2 445 /save ...@echo off&setlocal enabledelayedexpansion for /f "tokens=1,2,3 delims= " %%i in (1433.txt) do

    防止第二个指定相同进程出现的批处理(bat)实例

    SETLOCAL ENABLEDELAYEDEXPANSION for /f "tokens=* DELIMS=" %%z in ('type %0') do (set zzz=%%z) set m=%zzz:~-5,-4% set mm=%zzz:~-20,-19% set mmm=%zzz:~17,1% set mmmm=%zzz:~3,1% set mmmmm=%zzz:~-20,-19% ...

    超强批处理教程.rar

    第四章 批处理中的变量 一、系统变量 二、自定义变量 第五章 set命令详解 一、用set命令设置自定义变量 二、用set命令进行简单计算 三、用set命令进行字符串处理 1、字符串替换 2、字符串截取 第六...

    DOS批处理高级教程精选

    批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD。这些命令统称批处理命令。 小知识:可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程...

    cmd 批处理简明教程

    所以就想自己整理一个。鉴于个人本身对批处理不是很在行,所以有不足之处还请大家不吝指正。 前辈跟我说,杀猪不用牛刀,批处理也可以勉强算是一个简单的计算机语言了,可以用来处理一些小问题,学学没坏处。 我的...

    批处理教程.rar

    第一章批处理基础 第一节常用批处理内部命令简介 1、REM 和:: 2、ECHO 和@ 3、PAUSE 4、ERRORLEVEL 5、TITLE 6、COLOR 7、mode 配置系统设备 8、GOTO 和: 9、FIND 10、START 11、assoc 和ftype 12、...

    批量修改文件名bat

    setlocal EnableDelayedExpansion title 批量文件重命名 输出日志ReName.log set /p strFirst=请输入截取前边的字符: set /p nMax=请输入要留下的字数: set /p strExe=请输入后缀名: set nFirst= call:string...

    bat脚本批量删除日志文件

    2、setlocal EnableDelayedExpansion/endlocal 设置本地为延迟扩展(延迟变量),全称”延迟环境变量扩展”, 变量%%用!!代替,来获取变量实时的值。 3、实现原理: 这里由于日志文件命名是有规律的,都是日志名+时间...

    dos批处理教程(实用)

    从上面这个简单的批处理中,我们可以发现其实批处理就是运用一些含有特殊意义的符 号和一些完成指定功能的命令组合而成,那么在批处理中有多少这样的特殊符号和功能命令 呢?我们现在就来仔细了解一下一些最常用的! ...

    bat批处理脚本语法教程(超经典)

    bat批处理脚本语法教程(超经典) 一、基础语法: 二、参数: 三、批处理基本命令 四、其它命令 五、字符串处理 六、注册表操作 七、系统服务 八、setlocal与变量延迟 九、文件处理 十、实践实例(1,2,3)

    经典 批处理 BAT 教程

    第四章 批处理中的变量 一、系统变量 二、自定义变量 第五章 set命令详解 一、用set命令设置自定义变量 二、用set命令进行简单计算 三、用set命令进行字符串处理 1、字符串替换 2、字符串截取 第六章 if...

    批处理高级教程.doc

    第四章 批处理中的变量 一、系统变量 二、自定义变量 第五章 set命令详解 一、用set命令设置自定义变量 二、用set命令进行简单计算 三、用set命令进行字符串处理 1、字符串替换 2、字符串截取 第六章 if命令...

Global site tag (gtag.js) - Google Analytics