Windows批处理文件:什么是变量扩展,EnableDelayedExpansion是什么意思?

时间:2014-08-15 09:43:32

标签: variables batch-file

变量扩展"是什么意思?这是简单的"变量定义"还是别的什么?

当我说setLocal EnableDelayedExpansion时会发生什么?谷歌并不清楚。

2 个答案:

答案 0 :(得分:17)

  • 变量扩展表示将%!中包含的变量替换为其值。
  • {<1}}扩展发生一次在执行行之前。这意味着%normal%扩展具有相同的值如果该行被执行多次(例如在%variable%命令中),则无关紧要。
  • 每次执行for扩展执行该行。

见这个例子:

!delayed!

输出:

@echo off
setlocal EnableDelayedExpansion
set "var=Original"
set "var=New" & echo Normal: "%var%", Delayed: "!var!"

另一个:

Normal: "Original", Delayed: "New"

输出:

@echo off
setlocal EnableDelayedExpansion
set "var1=Normal"
set "var2=Delayed"
for /L %%i in (1,1,10) do (
   set "var1=%var1% %%i"
   set "var2=!var2! %%i"
)
echo Normal:  "%var1%"
echo Delayed: "%var2%"

正常扩张不一定是劣势,但取决于它所使用的具体情况。例如,在任何其他编程语言中,要交换两个变量的值,您需要第三个的帮助,但在批处理中,它可以只在一行中完成:

Normal:  "Normal 10"
Delayed: "Delayed 1 2 3 4 5 6 7 8 9 10"

答案 1 :(得分:4)

批处理变量通过将它们用百分号括起来进行扩展。

set myVariable=Hello world
echo %myVariable%

这意味着可变扩张。

与其他编程语言相比,批处理并不真正适用于变量 通常它只适用于它们的扩展。
它就像C / C ++的宏扩展一样。

因此,不存在字符串长度函数来获取变量的长度,
但你可以写一个计算文字字符的函数。

setLocal的说明EnableDelayedExpansion
正常的百分比扩张有两个缺点。

扩展发生在解析用括号括起的行或块时,执行块时。

让我们看一下这个样本

set var=one

set var=two & echo %var%
echo %var%

输出

  

一个
  2

由于echo %var%将在之前展开set var=two将被执行。 这可能会在FOR循环中出现问题。

第二个缺点是批处理解析器将解析变量的扩展结果。

set var=cat^&dog
echo %var%
  

变种
  未知命令“dog”

但是自MS-Dos(1920年左右)开始以来存在百分比扩张。

DelayedExpansion添加了一个新的扩展字符,即感叹号!

但是你必须首先将它与setlocal EnableDelayedExpansion一起使用,这是为了兼容旧程序。

setlocal EnableDelayedExpansion
set var=one
set var=two & echo !var!
set var=cat^&dog
echo !var!
  

2个
  猫&安培;狗

因此,这解决了扩张百分比的两个问题。