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

如题所述

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
太多了,太好要整理,然后处理。追问

????

批处理问题,什么是延迟变量,求高手详细解释!
bat批处理执行时会逐条命令预处理再执行,但这逐“条”是指完整的一条即如果有括号括起来的多行或用连接命令符连接起来的各子命令一起作为一个处理单元,预处理时会把%VAR%之类的变量处理成这个处理单元之前变量的值 在CMD帮助信息里称作“扩展”例如:set a=1 if %a% equ 1 set a=2&echo %a...

谁给我讲讲批处理的延迟变量,我弄不懂大神们帮帮忙
setlocal EnableDelayedExpansion这个命令用来启用"延迟环境变量扩展" 在我们启用了"延迟环境变量扩展"后,当CMD在解释涵有嵌套格式的命令时,他会把嵌套的命令一条一条的先执行一次,然后再进行匹配操作,这样我们的赋值操作就会完成.并且再"延迟环境变量扩展"启用后,CMD会用!号来判断这是不是一个变量,如没...

批处理命令中“ %%a ”是什么意思?
你所看到的应该是局部的一小块代码,一般是嵌套在For语句中使用的,其作用在帮助"Set \/?"中有叙述,它是"延迟环境变量".是在循环过程中取代%原有的作用,将循环体中被调用的值保留循环内所做过的修改.具体要做些试验,帮助中已经有了.第二句的黑黑本应是ASCII的08(),也就是退格键,吃掉换行符,也...

批处理变量问题
这种用法是调用批处理或子过程时的参数用法, 以及for命令直接在命令行下执行时的循环变量用法。var的用法,主要用于for循环中,循环变量使用的,一般var为单字母。 说见 for \/?var%的用法是平常变量的调用方法,相应的如果打用了setlocal enabledelayedexpansion 则会变成 !var! 具体请参见 set \/?...

批处理延迟变量问题
主要是不支持if 表达式中附加计算,所以要再借助一变量如::to set\/a b+=1,c=a*50 echo %b if %b% lss %c% goto :to 附注:看标题还以为是另一问题呢,另一网友答的代码虽无误,却是没必要去注意"延迟"问题 这种goto 循环可以用for \/L代替,此时可能有变量延迟问题---在复合句中对于...

批处理 例子中变量延迟什么时候用,为什么递增循环中要用,递减就不用
标识行不应处于某括号内,不然造成解释混乱---本来在复合句内需要“变量延迟”的,一goto认为跳转到新的单独行,就不是复合句了,最后还会多了右括号 其实此例的括号都是多余的,而且造成错误 if errorlevel 1 (可改成 if errorlevel 1 goto :loop1 其实批处理是顺序执行,除去满足前一句判断条件已...

批处理-延迟变量在什么时候用?为什么要用?
Question3:什么是变量延迟,批处理里面的“Setlocal EnableDelayedExpansion”有什么用?Answer:参考下面这两个贴子,相信你对变量延迟就会有一定的认识:http:\/\/www.cn-dos.net\/forum\/viewthread.php?tid=20733 http:\/\/www.cn-dos.net\/forum\/viewthread.php?tid=28273 QQ上已经给过你答案了.难道这几...

批处理 例子中变量延迟什么时候用,为什么递增循环中要用,递减就不用
标识行不应处于某括号内,不然造成解释混乱---本来在复合句内需要“变量延迟”的,一goto认为跳转到新的单独行,就不是复合句了,最后还会多了右括号 其实此例的括号都是多余的,而且造成错误 if errorlevel 1 (可改成 if errorlevel 1 goto :loop1 其实批处理是顺序执行,除去满足前一句判断条件已...

批处理高手请进
不是很明白你意思。你是说文本中的这些都是有对应的文件,是要把对应的文件名改成.rmvb后缀名吗?如果是,假设这些 rm 文件和文本文件都在同一个目录下,代码如下:echo off setlocal enabledelayedexpansion for \/f "tokens=4 delims=_,|" %%a in (1.txt) do (set aa=%%a ren !aa! !aa!

DOS批处理命令实现自动复制指定的文件夹到其他位置
我做批处理主要用到的是以下几个命令:1.——setlocal ENABLEDELAYEDEXPANSION 作用是延迟变量,全称"延迟环境变量扩展"。主要用于定义一个变量Milti_ID, 每搜索到一 个要找的文件夹QQTEST,会自动加1,最后统计出当前复制的是第几个,一共搜索出几个。2.——dir \/s \/ad \/b 作用是列出当前文件夹...

相似回答