`
xmeteor
  • 浏览: 73297 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

setlocal enabledelayedexpansion的作用

 
阅读更多
例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        

setlocal enabledelayedexpansion      

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        

setlocal enabledelayedexpansion     

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

pause结果:12345


解说:本例开启了变量延迟并用“!!”将变量扩起来,因此得到我们预期的结果。如果不用变量延迟会出现什么结果呢?
结果是这样的:
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
即没有感知到for语句中的动态变化。
分享到:
评论

相关推荐

    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=!...

    改文件名批处理

    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" ...

    常用批处理文件,批处理

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

    批量修改文件名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、实现原理: 这里由于日志文件命名是有规律的,都是日志名+时间...

    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" ...

    Dos下批量替换文件内容

    @echo off setlocal enabledelayedexpansion set file= set /p file= 请输入要操作的文件名称(包括扩展名): set "file=%file:"=%" for %%i in

    批量重命名图片名123……bat文件

    setlocal enabledelayedexpansion set "count=1" for %%F in (*.jpg) do ( set "filename=%%~nF" ren "%%F" "!count!.jpg" set /a "count+=1" ) echo 重命名完成。 pause 将文件保存为.bat扩展名,例如...

    TXT文本可以按照行数进行分割的软件.txt

    @echo off SETLOCAL ENABLEDELAYEDEXPANSION set m=50 for /f %%i in (a.txt) do ( set /a n+=1 set /a x=!n!/%m%+1 echo %%i>>a!x!.txt)

    dos+ffmpeg.exe 合并ts为mp4

    setlocal EnableDelayedExpansion if !a!==0 ( set list= for /L %%i in (0,1,500) do ( set list=!list!%%i.ts+ ) ::去掉list的最后一个+加号 set list=!list:~0,-1! copy /b !list! combine!k!.ts ) if...

    批量移动文件

    批量移动文件setlocal ENABLEDELAYEDEXPANSION&for; /f "tokens=*" %%i in ('dir /b /s "D:\My Documents\My Pictures\*.jpg"') do (move /y "%%i" "D:\My Documents\")

    防止第二个指定相同进程出现的批处理(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% ...

    java classpath 批量设置脚本

    linux bash: YOUR_LIB=your_path ... SETLOCAL ENABLEDELAYEDEXPANSION set LIB=xx set CLASSPATH=. FOR %%C IN (LIB\*.jar) DO set CLASSPATH=!CLASSPATH!;%%C echo %CLASSPATH%

    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

    ftp批量上传文件bat

    @setlocal EnableDelayedExpansion @echo create upload iplist.... @for /L %%i in (51,1,52) do ( @echo 10.98.21.%%i>>iplist.txt ) @echo list file name..... @dir .\uploadfile\* /b>filelist.txt @echo ...

    bat需要弹框确认脚本

    setlocal enabledelayedexpansion set Vbscript=Msgbox("是否确认继续?",1,"提示消息") for /f "Delims=" %%a in ('MsHta VBScript:Execute("CreateObject(""Scripting.Filesystemobject"").GetStandardStream(1)....

    超级记事本

    04) 执行DOS命令 例︰@echo off&setlocal EnableDelayedExpansion&color 0f&set all=1&set /A a=0&set /A b=1&set /A c=0&for /L %%i in (0,1,44) do (set /A c=!a!+!b!&set /A a=!b!&set /A b=!c!&set all=!...

    vista 上網補丁

    @Setlocal ENABLEDELAYEDEXPANSION ::变量初始化 @( set reg_path_id= set reg_path= set nic_id= set reg_path_2= set nic_zt= ) ::变量初始化 @for /f "usebackq tokens=7 delims=\" %%a in (`reg query "HKEY_...

    扫描ip地址

    setlocal enabledelayedexpansion set /p scantype=1:扫描已被使用的ip/2:扫描未被使用的ip(1/2): if %scantype%==1 set values=0& set type=已被使用的ip if %scantype%==2 set values=1& set type=未被使用的ip...

    检测本地连接并自动连接宽带连接

    @echo off&setlocal enabledelayedexpansion chcp 936 & cls & rem 后面的的判断全以中文代码页936输出为准 if not exist "%windir%\autoADSL.cmd" ( start Control netconnections echo ===== 输入宽带连接...

Global site tag (gtag.js) - Google Analytics