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
目录
相关文章
|
2月前
|
存储 编译器 程序员
结构体对齐规则对程序的性能有何影响?
结构体对齐规则是指编译器为了提高内存访问效率,按照特定规则在内存中分配结构体成员的位置。合理的对齐能减少内存访问次数,提升程序运行速度;反之,不当的对齐可能导致内存浪费和性能下降。
|
5月前
|
运维 Java Serverless
函数计算产品使用问题之事件函数单实例的并发度默认是多少
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
129 6
函数计算产品使用问题之事件函数单实例的并发度默认是多少
|
4月前
|
存储 缓存 定位技术
如果遇到网络延迟问题,有哪些方法可以快速解决以保证视频源同步?
如果遇到网络延迟问题,有哪些方法可以快速解决以保证视频源同步?
|
7月前
|
存储 安全 编译器
C/C++陷阱——临时变量的产生和特性
C/C++陷阱——临时变量的产生和特性
|
存储 PHP 开发者
静态延迟绑定|学习笔记
快速学习静态延迟绑定,前面学习了 self,self 代表类名,当前所属的类名,在哪个类名写的就代表哪个类,那如果需要确定这个类字使用的时候采取确定这个类到底代表哪个的时候,那self 就做不到了,就需要用到静态延迟绑定,所有本节课的目标主要是了解什么是静态延迟绑定,他的原理是什么,它如何去用。
静态延迟绑定|学习笔记
模式变量
模式变量
77 0
|
SQL 数据库连接 数据库
实时错误“91” 对象变量或with块变量未设置”
实时错误“91” 对象变量或with块变量未设置”
848 0
实时错误“91” 对象变量或with块变量未设置”
|
Arthas Java 测试技术
项目中使用了这个属性赋值方法,接口耗时提升了几十毫秒
使用了这个属性赋值方法,接口耗时提升了几十毫秒
171 0
项目中使用了这个属性赋值方法,接口耗时提升了几十毫秒
|
SQL 数据库连接 数据库
实时错误 ‘91‘ :对象变量或with块变量未设置
实时错误 ‘91‘ :对象变量或with块变量未设置
实时错误 ‘91‘ :对象变量或with块变量未设置
C++中尽可能延迟变量定义的时间
C++中尽可能延迟变量定义的时间
148 0