延迟扩展将导致批处理文件中的变量在执行时而不是在解析时扩展(变量赋值),此选项通过
SETLOCAL EnableDelayedExpansion
命令打开。延迟扩展意味着用它的值替换它的变量。
默认情况下,在执行每行之前,扩展只会发生一次, 启用延迟扩展,可以使每次执行该行时都会进行扩展,或者说,对于 FOR 循环命令中的每个循环都会执行扩展。
具体来说, %vars%
引用的是会话变量,而每一个语句只有在结束后才会影响到会话变量(扩展),启用延迟扩展,实际上就是启用局部变量的读取(格式:!vars!
)。
以下例子:
@echo off rem %vars% 引用的是会话变量,而每一个语句只有在结束后才会影响到会话变量,在一个会话中多次执行此脚本可以验证。 for /l %%a in (0,1,5) do ( rem FOR 循环代码作为一个整体语句,%i% 总是从会话变量中取值,因此循环中局部变量 i 值不变,比 %i% 大 1 。 set /a i=%i%+1 rem 循环结束后局部变量 i 才被扩展到会话变量,在同一会话的下一次执行中,%i% 才可以拿到变更后的会话变量。 echo i: %i% ) for /l %%a in (0,1,5) do ( rem FOR 循环代码作为一个整体语句,局部变量 j 的值由 1 变到 5,语句执行完成后,j=5 被扩展到会话变量。 set j=%%a rem 因此脚本第一次执行 j 为空,随后总是 5 。 echo j: %j% ) rem 启用延迟扩展 setlocal enabledelayedexpansion for /l %%a in (0,1,5) do ( rem !vars! 用于读取局部变量,因此可以读到 1 - 5 的数据。 set /a k=!k!+1 echo K: !k! rem 读取会话变量 j(总是 5)。 echo j: %j% ) endlocal
脚本第一次执行输出:
i: i: i: i: i: i: j: j: j: j: j: j: K: 1 j: 5 K: 2 j: 5 K: 3 j: 5 K: 4 j: 5 K: 5 j: 5 K: 6 j: 5
第二次执行输出:
i: 1 i: 1 i: 1 i: 1 i: 1 i: 1 j: 5 j: 5 j: 5 j: 5 j: 5 j: 5 K: 1 j: 5 K: 2 j: 5 K: 3 j: 5 K: 4 j: 5 K: 5 j: 5 K: 6 j: 5
第三次执行输出:
i: 2 i: 2 i: 2 i: 2 i: 2 i: 2 j: 5 j: 5 j: 5 j: 5 j: 5 j: 5 K: 1 j: 5 K: 2 j: 5 K: 3 j: 5 K: 4 j: 5 K: 5 j: 5 K: 6 j: 5
标签:语句,变量,CMD,扩展,rem,执行,延迟 From: https://www.cnblogs.com/64gdrifbottle/p/18282972