【CMD 延迟扩展】FOR 语句读不到值的问题
延迟扩展将导致批处理文件中的变量在执行时而不是在解析时扩展(变量赋值),此选项通过
1 | SETLOCAL EnableDelayedExpansion |
命令打开。延迟扩展意味着用它的值替换它的变量。
默认情况下,在执行每行之前,扩展只会发生一次, 启用延迟扩展,可以使每次执行该行时都会进行扩展,或者说,对于 FOR 循环命令中的每个循环都会执行扩展。
具体来说, %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
脚本第一次执行输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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 |
第二次执行输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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 |
第三次执行输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战