废话少说,先让我们来看一段代码:- @echo off
- set /a num=0
- for /l %%i in (1 1 3) do (
- Rem ================================
- set /a num+=1
- Rem 原意是变量num的值每次都加1
- Rem ================================
- echo %num%
- )
- pause>nul
复制代码 先猜猜看,运行之后的结果是什么呢?
你是不是认为它会显示:1 2 3 呢?我想大部分人会这么认为。
你再将以上代码保存为批处理文件,运行,看看结果。
你会看到,显示的结果并不是意料中的 1 2 3 而是 0 0 0,这个是为什么呢?
原来这个是因为,批处理在处理for 或者if 语句中的变量时,先要进行预处理,把其中的用%%括起来的变量,先替换为语句之前的变量(如上面的代码,for语句中的%num%早就被替换为语句前的 值:0),所以,for语句运行时,虽然已经给变量加了1,但是,值却不变(因为echo %num%中的%num%早已被替换为:0了)。
那么,要实现(for或者if)语句中的变量实时的变化(如这里,我就要将1 2 3 显示出来)要怎么办呢?那就要起用延迟变量,先在批处理中申明:setlocal enabledelayedexpansion
然后,将语句:echo %num%改成!num!(也就是将“%”改成“!”),这样就可以达到效果了,演示代码:- @echo off
- Rem ''''///////下面先申明起用延迟变量/////////////
- setlocal enabledelayedexpansion
- set /a num=0
- for /l %%i in (1 1 3) do (
- Rem ================================
- set /a num+=1
- Rem 变量num的值每次都加1
- Rem ================================
- Rem '''''''//////////////////下面的变量不能再用"%"括起来,而应该用"!"////////////
- echo !num!
- )
- pause>nul
复制代码 以上的解说到此为止,时间仓促,词不尽意,还有什么不明白的,跟贴说明。
归纳总结:
1、为什么要用延迟变量?
让if语句和for语句中的变量实时变化;
2、什么时候用延迟变量?
一般是用在 for 语句和 if 语句中;
3、怎么用延迟变量?
先在批处理中申明起用延迟变量:setlocal enabledelayedexpansion
然后将 for 语句、if语句中的变量用两个"!"括起来即可 |