Windows批处理中的动态变量重新评估

时间:2017-07-10 17:33:25

标签: windows batch-file

我是Windows批处理脚本的新手,可能这是一个常见的问题,多次回答。我遇到的问题是使用以下脚本:

@echo off

setlocal ENABLEDELAYEDEXPANSION

set var1=1
echo var1 = %var1%
set var2=var1 init value : %var1%, var1 delayed value : !var1!

set var1=2
echo var1 = %var1%
echo var2 = !var2!

endlocal

目前的输出是:

var1 = 1
var1 = 2
var2 = var1 init value : 1, var1 delayed value : 1

,但所需的输出应为:

var1 = 1
var1 = 2
var2 = var1 init value : 1, var1 delayed value : 2

如何实现,任何想法?在var1更改其值后,如何以某种方式重新评估var2变量?提前谢谢!

2 个答案:

答案 0 :(得分:3)

你的意思是这样的:

@echo off

setlocal ENABLEDELAYEDEXPANSION

set var1=1
echo var1 = %var1%
set var2=var1 init value : %var1%, var1 delayed value : %%var1%%

set var1=2
echo var1 = %var1%
call echo var2 = %var2%

endlocal

示例输出:

var1 = 1
var1 = 2
var2 = var1 init value : 1, var1 delayed value : 2

当设置var2时,双百分号将评估为单个符号,
调用回显强制另一个评估,现在扩展var1的实​​际值

答案 1 :(得分:1)

首先,这是不是一个“常见的新手问题”;你想做什么有点不寻常...

您需要在代码中进行两处小改动:

  • 在此行中:<canvas id="myCanvas" width="480" height="320"></canvas>正常set var2=var1 init value : %var1%, var1 delayed value : !var1!和延迟%var1%扩展的值相同。您不希望在!var1!中存储 !var1!的值,但文字字符串 var2,所以当您稍后展开{{ 1}},重新扩展这样的字符串。要做到这一点,你需要逃避感叹号;这是通过这种方式使用插入符号来完成的:!var1!当字符串用引号括起来时,或者用这样的三个插入符号:var2否则(转义符号加上转义感叹号)。
  • 显然,如果您想要"^!var1^!"中字符串的双扩展,那么第一个必须是标准^^^!var1^^^!扩展,不是延迟var2

这是前两个更改的最终代码:

%var2%