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

Avi*_*ohn 13 variables batch-file

什么是"变量扩张"?这仅仅意味着"变量定义"还是其他什么?

我说的时候会发生什么setLocal EnableDelayedExpansion?谷歌不清楚.

Aac*_*ini 19

  • 可变膨胀装置,更换封闭在一个变量%!通过它的值.
  • %normal%扩展发生只有一次,之前执行一条线.这意味着%variable%扩展具有相同的值,如果该行被执行多次(例如在for命令中)则无关紧要.
  • !delayed!膨胀进行的每个时间时执行的线.

看这个例子:

@echo off
setlocal EnableDelayedExpansion
set "var=Original"
set "var=New" & echo Normal: "%var%", Delayed: "!var!"
Run Code Online (Sandbox Code Playgroud)

输出:

Normal: "Original", Delayed: "New"
Run Code Online (Sandbox Code Playgroud)

另一个:

@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%"
Run Code Online (Sandbox Code Playgroud)

输出:

Normal:  "Normal 10"
Delayed: "Delayed 1 2 3 4 5 6 7 8 9 10"
Run Code Online (Sandbox Code Playgroud)

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

set "var1=%var2%" & set "var2=%var1%"
Run Code Online (Sandbox Code Playgroud)


jeb*_*jeb 5

在批处理变量中,将变量括在百分号中以进行扩展。

set myVariable=Hello world
echo %myVariable%
Run Code Online (Sandbox Code Playgroud)

这意味着变量扩展。

与其他编程语言相比,批处理实际上不能与变量一起使用。
通常,它仅在扩展它们时起作用。
它的工作方式类似于C / C ++的宏扩展。

因此,不存在用于获取变量长度的字符串长度函数,
但是您可以编写一个计算文本字符的函数。

setLocal EnableDelayedExpansion
说明常规百分比扩展有两个缺点。

扩展发生在解析用圆括号括起来的行或块时,而不是在执行该块时。

让我们看看这个例子

set var=one

set var=two & echo %var%
echo %var%
Run Code Online (Sandbox Code Playgroud)

输出将是

一个
2

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

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

set var=cat^&dog
echo %var%
Run Code Online (Sandbox Code Playgroud)

var
未知命令“ dog”

但是,自从MS-Dos(1920左右)开始以来,就存在百分比增长。

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

但是您必须先激活它才能与一起使用setlocal EnableDelayedExpansion,这是出于与旧程序兼容的原因。

setlocal EnableDelayedExpansion
set var=one
set var=two & echo !var!
set var=cat^&dog
echo !var!
Run Code Online (Sandbox Code Playgroud)

两只
猫和狗

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