`
xmeteor
  • 浏览: 75273 次
  • 性别: 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" ...

    常用批处理文件,批处理

    批处理文件,通常以.bat或.cmd为扩展名,是一种在Windows操作系统中运行的脚本文件。它们由一系列命令组成,可以连续执行,极大地提高了工作效率,尤其适用于自动化日常任务或者执行多步操作。在这个压缩包中,包含...

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

    windows资源管理器任务栏卡顿 打开文件夹一直加载慢 图片文件不能预览 不显示缩略图 bat批处理脚本一键处理

    setlocal EnableDelayedExpansion @echo off echo. echo. @echo 正在处理中,请稍候...... echo. echo. @reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\SearchSettings" /v ...

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

    bat中for循环,实现变量自增的2种方式

    在这里,`setlocal enabledelayedexpansion`允许我们在循环内使用`!counter!`而不是`%counter%`来访问并更新变量的值。注意,启用延迟环境变量扩展后,变量的引用需使用感叹号而不是百分号。 以上两种方法都可以...

    解决latex无法插入svg格式图片问题,采用inkscape软件一键将当前文件夹下所有svg图片转换为pdf格式

    setlocal EnableDelayedExpansion color 0a echo %date% %time% echo Converting SVGs to separate PDFs now... for %%i in (*.svg) do ( echo Converting %%i to %%~ni.pdf inkscape --export-pdf=%%

    批量处理代码文件、提取文件内容

    setlocal enabledelayedexpansion set "folder=%cd%" set "outputFile=fileList.txt" if exist "%outputFile%" del "%outputFile%" for /R "%folder%" %%F in (*.js *.html) do ( set "ext=%%~xF" if "!ext!"==...

    dos 环境变量延迟扩展enabledelayedexpansion详解

    通过`setlocal enabledelayedexpansion`命令,可以在批处理脚本中启用这一功能。启用后,CMD会在执行命令块时才进行变量扩展,而不是在解析时。变量识别符号也由`%`变为`!`。例如: ```batch @echo off setlocal ...

    用BAT设置WINDOWS系统环境变量,如java的jdk环境变量

    setlocal enabledelayedexpansion set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_271 set PATH=%JAVA_HOME%\bin;%PATH% endlocal ``` 上述脚本设置了`JAVA_HOME`变量,并将`JAVA_HOME\bin`添加到系统的`PATH`变量中...

    批处理删除文件

    此脚本首先禁用回显(`@echo off`),然后启用延迟环境变量扩展(`setlocal enabledelayedexpansion`),这使得我们能在循环中修改变量。`for /f`循环遍历当前目录下所有非目录文件,按修改时间降序排列。如果文件...

    Dos下批量替换文件内容

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

    变量延迟详解 call setlocal

    `setlocal`开启局部变量作用域,`enabledelayedexpansion`则允许在执行期间动态地解析变量。这样,我们可以在for循环内部使用`!var!`来访问变量`var`的最新值,而非预处理时的值。 ```batch @echo off setlocal ...

    批量重命名图片名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扩展名,例如...

    文件夹批量重命名和添加前缀(命令行版)

    2. `setlocal enabledelayedexpansion` 启用延迟环境变量扩展,这样我们可以在for循环内部修改环境变量。 3. `set "prefix=新前缀_"` 设置前缀,可以根据实际需求更改。 4. `for /d %%i in (*) do (...)` 这个循环会...

    基于Windows系统的批量重命名的命令符

    这段脚本首先关闭命令回显(`@echo off`),然后启用延迟环境变量扩展(`setlocal enabledelayedexpansion`),这样可以在循环中修改变量值。`for %%i in (*) do`遍历当前目录下所有文件,`%%~ni`获取不带扩展名的...

    BAT批处理脚本-同一目录下同一类型的文件名改成连续的数字名.zip

    在这段脚本中,`@echo off`是关闭命令回显,`setlocal enabledelayedexpansion`则是启用延迟环境变量扩展,以便在`FOR`循环中修改环境变量。`set /a count=1`初始化计数器,`for`循环遍历当前目录下的所有`.txt`文件...

    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)

Global site tag (gtag.js) - Google Analytics