首页 > 其他分享 >【CMD 延迟扩展】FOR 语句读不到值的问题

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

时间:2024-07-04 09:41:53浏览次数:17  
标签:语句 变量 CMD 扩展 rem 执行 延迟

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

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

相关文章

  • 编译原理 第六章&编译原理必考大题: 语义分析及中间代码生成&必考大题语句翻译
    第六章语义分析及中间代码生成&必考大题语句翻译文章目录第六章语义分析及中间代码生成&必考大题语句翻译写在最前6.1语义分析6.2中间代码6.2.1逆波兰式6.2.2四元式6.2.3三元式6.3语句翻译(必考大题)6.3.1布尔表达式的翻译6.3.2if语句的翻译6.3.3while语句翻......
  • 三、if语句
    3.1一个简单实例 cars=['audi','bmw','subaru','toyota']forcarincars:ifcar=='bmw':pirnt(car.upper())else:pirnt(car.title())AudiBMWSubaruToyota3.2 条件测试(True F......
  • Mybatis使用foreach执行in语句、批量增删改查
    参考:https://www.cnblogs.com/leeego-123/p/10725210.html一、xml文件中foreach的主要属性foreach元素的属性主要有collection,item,index,separator,open,close。collection:表示集合,数据源item:表示集合中的每一个元素index:用于表示在迭代过程中,每次迭代到的位置separator:表示在......
  • MySQL 中 SQL 查询语句的执行顺序
    在MySQL中,SQL查询的执行顺序通常按照以下顺序进行:FROM:从指定的表中选择数据。WHERE:对数据进行筛选,只选择满足条件的行。GROUPBY:按照指定的列对数据进行分组。SELECT:选择要返回的列或表达式。HAVING:对分组后的数据进行筛选,只选择满足条件的分组。UNION[ALL]ORDERBY:对......
  • 使用CMD命令.修改为Win 7传统右键菜单模式
    @echoofftitleH之尘.右键菜单%窗口标题%:menucolor02clsecho~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~echo~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~echo欢迎使用H之尘脚本echo.echo请选择项目():echo.&echo【1】修改为Win7传统右键菜单模式echo.&e......
  • CMD模板
    @echooffcolor09title打开网络中心控制面板%窗口标题%@echo-------------------------------------------@echo-------------------------------------------@echo-------------------------------------------@echo--------------这里可以写中文-------------@ec......
  • 从0到1Flink的成长之路(二十)-Flink 高级特性(二)之自动重启策略和恢复 ,固定延迟重启策
    从0到1Flink的成长之路(二十)-Flink高级特性(二)之自动重启策略和恢复,,固定延迟重启策略(开发中使用)自动重启策略和恢复1)、重启策略配置方式配置文件在flink-conf.yml中可以进行配置,示例如下:restart-strategy:fixed-delayrestart-strategy.fixed-delay.attempts:3restart-strat......
  • mysql语句大全-工作中常用整理(欢迎大家在评论区继续补充)
    1.NOTEXISTS和NOTINSELECTCOUNT(ca.aaa)FROMxxcaWHERENOTEXISTS(SELECTlabel.*FROMxxxlabelWHERElabel.aaa=ca.aaa) SELECTCOUNT(ca.aaa)FROMxxcaWHEREca.aaaNOTIN(SELECTlabel.aaaFROMxxxlabelWHERElabel.aaa=ca.aaa) 2.查询表结......
  • 12.阻塞赋值与非阻塞赋值语句的区别和规范
    (1)阻塞赋值“=”  直到现行的赋值语句完成,才允许下一条赋值语句的执行,在串行块(begin-end)中,各赋值语句将以它们在顺序块中的排列次序依次执行。(2)非阻塞赋值“<=”    在赋值开始时,计算赋值号右边的语句,赋值结束时,更新赋值号左边的语句,因此其他在同一时间的语句都会......
  • mysql基础语句实列
    --增insertintobooks(book_name)VALUES('盗墓笔记')insertintochapters(chapter_name,book_id)VALUES('盗墓笔记第三章',1)--查selectidfrombooksselect*fromchaptersselectid,chapter_namefromchapters--两表联查selectbooks.id,book_name,cha......