setlocal 与 变量延迟

news/2025/2/25 15:51:38

setlocal 与 变量延迟



本条内容引用[英雄出品]的批处理教程:

要想进阶,变量延迟是必过的一关!所以这一部分希望你能认真看。

为了更好的说明问题,我们先引入一个例子。
例1:
 @echo off
 set a=4
 set a=5 & echo %a%
 pause
结果:4
解说:为什么是4而不是5呢?在echo之前明明已经把变量a的值改成5了?

让我们先了解一下批处理运行命令的机制:

批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。我们现在分析一下例1,批处理在运行到这句“set a=5 & echo %a%”之前,先把这一句整句读取并做了预处理——对变量a赋了值,那么%a%当然就是4了!(没有为什么,批处理就是这样做的。)

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

那么如何开启变量延迟呢?变量延迟又需要注意什么呢?举个例子说明一下:

例2:
 @echo off
 setlocal enabledelayedexpansion
 set a=4
 set a=5 & echo !a!
 pause
结果:5
解说:启动了变量延迟,得到了正确答案。变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。

分析一下例2,首先“setlocal enabledelayedexpansion”开启变量延迟,然后“set a=4”先给变量a赋值为
4,“set a=5 & echo !a!”这句是给变量a赋值为5并输出(由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时a的值就是5了)。

再举一个例子巩固一下。
例3:
 @echo off
 setlocal enabledelayedexpansion
 for /l %%i in (1,1,5) do (
 set a=%%i
 echo !a!
 )
 pause

结果:
1
2
3
4
5
解说:本例开启了变量延迟并用“!!”将变量扩起来,因此得到我们预期的结果。如果不用变量延迟会出现什
么结果呢?结果是这样的:
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
即没有感知到for语句中的动态变化。

提示:在没有开启变量延迟的情况下,某条命令行中的变量改变,必须到下一条命令才能体现。这一点也可以加以利用,看例子。

例:交换两个变量的值,且不用中间变量

@echo off
::目的:交换两个变量的值,但是不使用临时变量
::Code by JM 2007-1-24 CMD@XP
::出处:http://www.cn-dos.net/forum/viewthread.php?tid=27078
set var1=abc
set var2=123
echo 交换前: var1=%var1% var2=%var2%
set var1=%var2%& set var2=%var1%
echo 交换后: var1=%var1% var2=%var2%
pause

转载于:https://www.cnblogs.com/lbnnbs/p/4781487.html


http://www.niftyadmin.cn/n/710495.html

相关文章

shell脚本编写3

字符串的处理: ${:截取 /替换 #掐头 % 去尾} 字符串的截取的三种处理方法: 方法一:(注:从左开始第一位是以0开始) ${} 格式${取用的变量名:起始位数:长度} 例: x1234567890 echo ${x:1:3} (输出是234&#…

linux shell 中21含义-完美理解-费元星

笨鸟先飞,先理解。 脚本是: nohup /mnt/Nand3/H2000G >/dev/null 2>&1 & 对于& 1 更准确的说应该是文件描述符 1,而1 一般代表的就是STDOUT_FILENO,实际上这个操作就是一个dup2(2)调用.他标准输出到all_result ,然后复制标准输出到文…

35 最大值

35 最大值 作者: frankhuhu时间限制: 10S章节: 一维数组 emmm…明明和他爸可真是热爱数学呀!!! 问题描述 : 为了培养明明对数学的热爱,明明的爸爸经常想出一些简单有趣且富有数学思想的游戏给明明玩。有一次,明明的…

LVS

LVS负载均衡详解工作模式介绍:工作模式是配置在:real server 上1.Virtualserver via NAT(VS-NAT) -m优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,物理服务器可以分配Internet的保留私有地址…

使用linux mysql客户端建立表时遇到格式解析的问题

发现在notepad写好的建表脚本,粘贴到linux客户端后,执行时总是报我的脚本有问题。 我看了又看,发现建表脚本本身是没有问题,问题出在"Tab"键上和注释上边了。 解决办法是,将"tab"的换成空格&#…

10个和 Flash 一样的 HTML5 应用演示

大家可能听到很多关于 Flash 是否会被 HTML5 取代的讨论,个人认为,HTML5在某些应用场合有其更先进的地方,会慢慢取代 Flash,但是无法被完全取代,Flash 永远会占有一席之地。 如果你想知道 HTML5 能做些什么&#xff0c…

pyhthon 处理pdf 合集

查永春的CSDN博客 https://blog.csdn.net/zyc121561/column/info/25026 提取指定的PDF表格保存到Excel Python提取PDF内容(文本、图像、线条等) 提取PDF内容保存到Excel--Python实现 PDF内容替换--Python实现 提取PDF关键字并写入Excel Python提取PDF电…

31 最高频率

31 最高频率 作者: 朱凯时间限制: 10S章节: 一维数组 问题描述 : 明明的爸爸是一位著名的数学家。他在明明很小的时候就发现明明有过人的数学天赋,因此有意培养他对数学的兴趣。一次,明明的爸爸和明明玩起了一个数字游戏,这个游戏的名字叫…