批处理延迟变量

简介:

变量延迟   setlocal EnableDelayedExpansion

一个让大多数新手头痛的问题,网上教程虽多,但多半都是看不懂的,里面的专业术语太多。

以 cn-dos 联盟的willsort的这篇教程为例,(个人认为是解释的极具权威和专业的)

http://www.cn-dos.NET/forum/viewthread.PHP?tid=20733&fpage=1&highlight=%E5%BB%B6%E8%BF%9F

但可能就是因为专业,所以才看不懂,因为学cmd批处理的并不一定都是学计算机专业的。

这个鬼东西确实不太好理解,在下也是摸爬滚打多时,总结出一点点经验,现用通俗的方法

解释出来,希望能给新手些帮助,老鸟们见笑了,若有不对的地方,欢迎指出。

言归正传、

什么时候需要延迟变量,和该如何引用延迟变量,我想这才是大多数新手迫切想要知道的问题。

耐心看完下面的内容,我想对你应该是有帮助的。

要想了解延迟变量,首先你要明白什么是复合语句

好像又来了个专业名词,别急,这个超好理解。

所谓复合语句就是指一对()里的所有命令。比如for的do后面

如:

for /f "delims=" %%i in (a.txt) do (

   set var=%%i

   echo %%i

   set num=%%i

)

这里do后面的三句命令,在一对()里面,这就叫复合语句,当然不止for 还有if 等等。。

if "%var%"=="abc" (

echo ok

set lis=123

)

反正就是凡是()里的所有命令就叫复合语句

另外这也是复合语句 set abc=123&echo %abc%

没错,通过管道命令&连接起来的命令,也是复合语句。

好,了解了复合语句,现在开始讲延迟变量,也就说,在复合语句中才要使用延迟变量

我们先不去理解什么叫变量的扩展这玩意叫法太专业,我到现在都不太明白,

我们只要知道在什么时候需要使用延迟变量,如何才能正确提取到我们需要的变量就可以了,

这才是我们的目的。

cmd在处理复合语句的时候,如果复合语句中用到了变量,

会把变量的值当作复合语句之前变量的值来引用。如果在此之前变量没有被赋值,就把它当成空值。

呵呵,有点绕口。看个例子

 

1

 

@echo off

for /l %%i in (1 1 10) do (

set var=%%i

echo %var%

)

pause

 

 

运行上面的代码,显示什么?显示10个echo处于关闭状态。

按照逻辑,var的值应该依次是 1、2、3........10 才对啊!

这就是因为没有开启 延迟变量 的缘故,cmd把var的值当作复合语句之前的值来引用,

而再本例中,复合语句之前并没有给var定义,所以var的值是空的,所以会显示10个echo处于关闭状态。

再看例2

 

@echo off

set var=abc

for /l %%i in (1 1 10) do (

set var=%%i

echo %var%

)

pause

 

 

运行上面的代码,会显示什么,大家应该知道了吧?

再看例3

 

@echo off

set var=abc

for /l %%i in (1 1 5) do (

set var%%i=%%i

echo %var%

)

echo %var1% %var2% %var3% %var4% %var5%

pause

 

运行上面的代码后,复合语句中所赋的值全部显示出来了,这说明什么呢?

说明,在复合语句中,并不是没有给变量赋值,只是你若没有开启延迟变量,

你就没法在复合语句中提取到它,要等复合语句运行完毕后,才能提取到。

变量的表示方法:两种:   1、%var% 2、!var!

第一种表示方法,大家都知道,第二种就是引用 延迟的变量

在开启了延迟变量的情况下,如果在复合语句之外,用哪种方法表示都可以。

但是你若要在复合语句中引用复合语句即时得到的变量,就要用第二种方法。看例子

4

 

@echo off

setlocal EnableDelayedExpansion

set var=abc

for /l %%i in (1 1 10) do (

set var=%%i

echo %var%

echo !var!

)

pause

 

注意例子中有两个echo 一个是显示 %var% 一个是显示 !var!

结果很明白了,%var% 显示的结果是复合语句之前变量var的值,

而 !var! 显示的就是复合语句中即时得到的值。

再看例5

 

@echo off

setlocal EnableDelayedExpansion

for /l %%i in (1 1 5) do (

set var%%i=%%i

)

echo %var1% %var2% %var3% %var4% %var5%

echo !var1! !var2! !var3! !var4! !var5!

pause

 

这个例子说明什么,不用再解释了吧?

说明在开启了延迟变量的情况下,且在复合语句之外,用两种方法都可以表示变量。

就说到这吧。以上的解释,完全是出于个人的理解,也是为方便非专业人士理解,

解释肯定有错误的地方、就象学习英语时,为方便记忆,用汉字的读音来作解释一样。

呵呵,是一种偏门各位新手千万不要把以上所说的当成是真理,否则就变成是误人了。











本文转自leonardos51CTO博客,原文链接: http://blog.51cto.com/leomars/1857581  ,如需转载请自行联系原作者


相关文章
|
3月前
|
消息中间件 分布式计算 Java
流计算与批处理的区别是什么?请举例说明。
流计算与批处理的区别是什么?请举例说明。
31 0
|
3月前
|
Java 数据处理 Apache
流计算中的窗口操作是什么?请解释其作用和使用场景。
流计算中的窗口操作是什么?请解释其作用和使用场景。
20 0
|
9月前
|
设计模式 算法 安全
并发 并行 同步 异步 你分清了吗
并发 并行 同步 异步 你分清了吗
|
SQL 负载均衡 算法
自适应批作业调度器:为 Flink 批作业自动推导并行度
1.15 版本新引入的调度器,在作业运行时根据每个算子需要处理的实际数据量来自动推导并行度。
自适应批作业调度器:为 Flink 批作业自动推导并行度
setlocal 与变量延迟
setlocal 与变量延迟
73 0
|
存储 消息中间件 运维
函数计算异步任务能力介绍 - 任务触发去重
本文主要针对消息处理可靠性这一主题来介绍函数计算异步任务功能的技术细节,并展示如何在实际应用中使用函数计算所提供的这方面能力来增强任务执行的可靠性。
函数计算异步任务能力介绍 - 任务触发去重
C++中尽可能延迟变量定义的时间
C++中尽可能延迟变量定义的时间
110 0
|
消息中间件 SQL NoSQL
只会单机执行定时任务?多机执行 yyds!
那我们是否有一种方法,可以让任务在多机同时执行,然后又可以避免多机同时处理相同数据的问题呢?这里给大家介绍一种多机分片的方式,也是最近在公司Get到的新技能。
115 0
|
C++ Windows
c++计算代码执行时间的方法,毫秒级
方法一、 #include#includeusing namespace std;class CTimer{public:CTimer(){_start=clock();}~CTimer(){_end=clock();cout
1098 0

热门文章

最新文章