【CMD 延迟扩展】FOR 语句读不到值的问题

延迟扩展将导致批处理文件中的变量在执行时而不是在解析时扩展(变量赋值),此选项通过

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 为空,随后总是 5echo 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

  

posted @ 2024-07-04 09:33  64G漂流瓶  阅读(1)  评论(0编辑  收藏  举报