例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语句中的动态变化。
分享到:
相关推荐
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操作系统中运行的脚本文件。它们由一系列命令组成,可以连续执行,极大地提高了工作效率,尤其适用于自动化日常任务或者执行多步操作。在这个压缩包中,包含...
setlocal EnableDelayedExpansion title 批量文件重命名 输出日志ReName.log set /p strFirst=请输入截取前边的字符: set /p nMax=请输入要留下的字数: set /p strExe=请输入后缀名: set nFirst= call:string...
2、setlocal EnableDelayedExpansion/endlocal 设置本地为延迟扩展(延迟变量),全称”延迟环境变量扩展”, 变量%%用!!代替,来获取变量实时的值。 3、实现原理: 这里由于日志文件命名是有规律的,都是日志名+时间...
setlocal EnableDelayedExpansion @echo off echo. echo. @echo 正在处理中,请稍候...... echo. echo. @reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\SearchSettings" /v ...
@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`允许我们在循环内使用`!counter!`而不是`%counter%`来访问并更新变量的值。注意,启用延迟环境变量扩展后,变量的引用需使用感叹号而不是百分号。 以上两种方法都可以...
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!"==...
通过`setlocal enabledelayedexpansion`命令,可以在批处理脚本中启用这一功能。启用后,CMD会在执行命令块时才进行变量扩展,而不是在解析时。变量识别符号也由`%`变为`!`。例如: ```batch @echo off setlocal ...
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`循环遍历当前目录下所有非目录文件,按修改时间降序排列。如果文件...
@echo off setlocal enabledelayedexpansion set file= set /p file= 请输入要操作的文件名称(包括扩展名): set "file=%file:"=%" for %%i in
`setlocal`开启局部变量作用域,`enabledelayedexpansion`则允许在执行期间动态地解析变量。这样,我们可以在for循环内部使用`!var!`来访问变量`var`的最新值,而非预处理时的值。 ```batch @echo off setlocal ...
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 (...)` 这个循环会...
这段脚本首先关闭命令回显(`@echo off`),然后启用延迟环境变量扩展(`setlocal enabledelayedexpansion`),这样可以在循环中修改变量值。`for %%i in (*) do`遍历当前目录下所有文件,`%%~ni`获取不带扩展名的...
在这段脚本中,`@echo off`是关闭命令回显,`setlocal enabledelayedexpansion`则是启用延迟环境变量扩展,以便在`FOR`循环中修改环境变量。`set /a count=1`初始化计数器,`for`循环遍历当前目录下的所有`.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)