setlocal 与变量延迟

简介: setlocal 与变量延迟

提示

要想进阶,变量延迟是必过的⼀关!


批处理运⾏命令的机制

批处理读取命令时是按⾏读取的(另外例如 for 命令等,其后⽤⼀对圆括号闭合的所有语句也当作⼀⾏),在处理之前要完成必要的预处理⼯作,这其中就包括对该⾏命令中的变量赋值。


变量延迟

看一个例子:

@echo off 
set a=4 
set a=5 & echo %a% 
pause点击复制复制失败已复制


输出:

4点击复制复制失败已复制


批处理在运⾏到这句 set a=5 & echo %a% 之前,先把这⼀句整句读取并做了预处理——对变量 a 赋了值,那么 %a% 当然就是 4 了!


Note

没有为什么,批处理就是这样做的。


⽽为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了⼀条完整的语句之后,不⽴即对该⾏的变量赋值,⽽会在某个单条语句执⾏之前再进⾏赋值, 也就是说延迟了对变量的赋值。


使用

变量延迟的启动语句是 setlocal enabledelayedexpansion ,并且变量 要⽤⼀对叹号 !! 括起来(注意要⽤英⽂的叹号),否则就没有变量延迟的效果。


对上面的示例进行一定的修改:

@echo off 
setlocal enabledelayedexpansion
set a=4 
set a=5 & echo !a! 
pause点击复制复制失败已复制


输出:

5点击复制复制失败已复制


示例1

@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do (
  set a=%%i
  echo !a!
)
pause点击复制复制失败已复制


输出:

1
2
3
4
5点击复制复制失败已复制


如果不使用变量延迟:

@echo off
for /l %%i in (1,1,5) do (
  set a=%%i
  echo %a%
)
pause点击复制复制失败已复制


输出:

ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。点击复制复制失败已复制


示例2

交换两个变量的值,且不⽤中间变量

@echo off
set var1=abc
set var2=123
echo 交换前: var1=%var1% var2=%var2%
set var1=%var2% & set var2=%var1%
echo 交换后: var1=%var1% var2=%var2%
pause点击复制复制失败已复制


输出:

交换前: var1=abc var2=123
交换后: var1=123  var2=abc
目录
相关文章
|
人工智能 机器人 测试技术
使用LM Studio在本地运行LLM完整教程
GPT-4被普遍认为是最好的生成式AI聊天机器人,但开源模型一直在变得越来越好,并且通过微调在某些特定领域是可以超过GPT4的。
6152 1
|
XML JavaScript 数据格式
XML DOM 浏览器差异
不同浏览器对XML DOM解析处理存在差异,尤其是在处理空白和换行方面。当XML文档中包含换行和空格时,Internet Explorer不会将这些视为文本节点,而其他浏览器则会。例如,一个简单的XML文档在各子节点间有空格和换行,IE会识别为4个子节点,而其他浏览器则识别为9个。示例代码通过加载XML文件并输出子节点数量来展示这一差异。
|
JavaScript API
Vue设计与实现 框架设计概览 Vue设计与实现 框架设计概览 权衡的艺术
Vue设计与实现 框架设计概览 Vue设计与实现 框架设计概览 权衡的艺术
136 1
《C++避坑神器·二十一》回调函数使用
《C++避坑神器·二十一》回调函数使用
159 0
|
存储 缓存 NoSQL
什么是数据库的 “缓存池” ?(万字干货)
Buffer Pool 是什么?从字面上看是缓存池的意思,没错,它其实也就是缓存池的意思。它是 MySQL 当中至关重要的一个组件,可以这么说,MySQL的所有的增删改的操作都是在 Buffer Pool 中执行的。
487 0
什么是数据库的 “缓存池” ?(万字干货)
|
弹性计算 Ubuntu 物联网
我的ECS使用体验报告
学生用户初次使用阿里云服务器的体验报告
|
C++ API 数据建模
Windbg查看调用堆栈(k*)
https://www.52pojie.cn/thread-664189-1-1.html       无论是分析程序崩溃原因,还是解决程序hang问题,我们最常查看的就是程序调用堆栈。
2353 0
|
7天前
|
人工智能 运维 安全
|
5天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!