批处理问题,什么是延迟变量,求高手详细解释!

如题所述

bat批处理执行时会逐条命令预处理再执行,但这逐“条”是指完整的一条即如果有括号括起来的多行或用连接命令符连接起来的各子命令一起作为一个处理单元,预处理时会把%VAR%之类的变量处理成这个处理单元之前变量的值 在CMD帮助信息里称作“扩展”例如:
set a=1
if %a% equ 1 set a=2&echo %a%
对于第二条命令预处理成
if 1 equ 1 set a=2&echo 1
但是我希望它不要这么快把后面的%a% "扩展"成原来的值1 而希望是执行set a=2 命令执行后再“扩展”成2 这就是延迟变量扩展(注意不是你说的延迟变量)为此可以写成
setlocal enabledelayedexpansion
if %a% equ 1 set a=2&echo !a!
参见set/?和setlocal/?
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-12-19
变量延时问题现象,是对一条复合语句而言的
批处理代码,你观察一下如下现象:

1、未开启变量延时
set str=AAA
if %str%==AAA (
    set str=BBB
    echo %str%
)
    echo %str%
运行结果是:
AAA
BBB
2.开启变量延时后
setlocal enabledelayedexpansion    ::开启变量延时功能
set str=AAA
if %str%==AAA (
    set str=BBB
    echo !str!   ::得用一对!!号
    echo %str%   ::还是一对%%号
)
    echo !str!
    echo %str%
运行结果:
BBB 
AAA
BBB    
BBB 

即,一条复合语句,对变量的解释动作是同时进行的,第二次赋值动作在时间上,其实是晚了一步,来不及,被抢先了。

第2个回答  2013-11-02
太多了,太好要整理,然后处理。追问

????