4.变量扩展-延迟(在批处理开头加上一行etlocal enabledelayedexpansion即可)
@echo off
set num=10
set num=100 & echo %num%
echo %num%
echo 虽然已经将num的值更改为100,但由于没有延迟扩展,所以值仍为10,不过在下一个语句num的值就改变了
pause
@echo off
SetLocal EnableDelayedExpansion
set num=10
set num=100 & echo !num!
echo 现在两个num的值一样了(注意%num%变成了!num!)
echo %num%
pause
更复杂的写法
set q=!tem%c%!
set a=!aa:~%bb%,10!
set b=!a:%文本1%=%文本2%!
注意:延迟扩展与call的冲突
@echo off&setlocal enabledelayedexpansion
call :1
echo %a%&pause
:1
setlocal enabledelayedexpansion&echo 运行一遍,然后删除本行,再运行一遍。
set a=欢迎光临
exit /b
保留第五行,输出错误结果;删除第五行,输出正确结果 欢迎光临
结论:使用call跳转标签或文件时,需确保目标无“setlocal enabledelayedexpansion”,否则将产生错误
若必须保留setlocal enabledelayedexpansion这一行,可参考解决方案
方案1:
@ echo off
setlocal enabledelayedexpansion
call :1 1
echo %a%&pause
:1
if not #%*==# goto 2
setlocal enabledelayedexpansion
:2
set a=欢迎光临
exit /b
方案2:
@ echo off
setlocal enabledelayedexpansion
call :1
for /F "delims=" %%i in (a) do set %%i
echo %a%&pause
:1
setlocal enabledelayedexpansion
set a=欢迎光临
(set)>a
goto :eof
汇总小节
for [/D] [/R [路径]] %%变量 in (集合) do (命令)
文件搜索 文件夹 子文件夹 指定目录 单字母 搜索/文本 批量
for /L %%变量 in (开始,间隔,结束) do (命令)
等差数列 单字母 开始,间隔,结束 批量
for /F ["选项"] %%变量 in (集合) do (命令)
文本处理 选项 单字母 搜索/"文本"/'命令' 批量
for /F "eol=! skip=n delims= -x tokens=1,7-9* usebackq "
选项 注释 行 分隔符 列 新语法("搜索"/'文本'/`命令`)
%a:文本1=文本2% %a:~10,5% %CD% %DATE% %TIME% %RANDOM%
替换 截取 当前目录 日期 时间 随机数