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
目录
相关文章
|
10月前
|
Linux C语言 C++
现代c++中实现精确延时方法总结
现代c++中实现精确延时方法总结
|
2月前
|
JSON 前端开发 算法
2715. 执行可取消的延迟函数
2715. 执行可取消的延迟函数
13 0
|
7月前
|
Go 数据库
sync.Once-保证运行期间的某段代码只会执行一次
sync.Once-保证运行期间的某段代码只会执行一次
42 0
|
3月前
|
存储 安全 编译器
C/C++陷阱——临时变量的产生和特性
C/C++陷阱——临时变量的产生和特性
|
存储 PHP 开发者
静态延迟绑定|学习笔记
快速学习静态延迟绑定,前面学习了 self,self 代表类名,当前所属的类名,在哪个类名写的就代表哪个类,那如果需要确定这个类字使用的时候采取确定这个类到底代表哪个的时候,那self 就做不到了,就需要用到静态延迟绑定,所有本节课的目标主要是了解什么是静态延迟绑定,他的原理是什么,它如何去用。
73 0
静态延迟绑定|学习笔记
C++中尽可能延迟变量定义的时间
C++中尽可能延迟变量定义的时间
110 0
|
SQL 数据库连接 数据库
实时错误“91” 对象变量或with块变量未设置”
实时错误“91” 对象变量或with块变量未设置”
558 0
实时错误“91” 对象变量或with块变量未设置”
|
SQL 数据库连接 数据库
实时错误 ‘91‘ :对象变量或with块变量未设置
实时错误 ‘91‘ :对象变量或with块变量未设置
实时错误 ‘91‘ :对象变量或with块变量未设置
|
C++ Windows
c++计算代码执行时间的方法,毫秒级
方法一、 #include#includeusing namespace std;class CTimer{public:CTimer(){_start=clock();}~CTimer(){_end=clock();cout
1099 0
|
安全 Java 开发者
方法变量与同步|学习笔记
快速学习方法变量与同步