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

4

我是一个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个回答

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时,双百分号会被解释为单个百分号,调用echo会强制进行另一个解释,现在展开var1的实际值。

1
我所拥有的恰好。关键是这里不需要使用delayedexpansion,因为采用了“调用echo”解决方法来获取变量的运行时值。在 OP 的代码中,两者都被替换,因为set没有在可变的值上执行 - 此时,%var%!var!是相同的。 - Magoo
它像魔法一样奏效,我不知道百分号符号的“嵌套”扩展技巧。非常感谢您的及时回答,真的很感激! - atanasov_ivaylo

1
首先,这不是一个“普通的新手问题”;你想做的事情有些不寻常...
你需要在代码中进行两个小修改:
  • 在这一行中:set var2=var1 init value : %var1%, var1 delayed value : !var1!,普通的%var1%和延迟的!var1!扩展的值是相同的。您不想在var2中存储!var1!,而是字面字符串!var1!,因此当您稍后扩展var2时,这样的字符串将被重新扩展。要做到这一点,您需要转义感叹号;如果该字符串用引号括起来,则使用插入符号进行操作:"^!var1^!",否则使用三个插入符号:^^^!var1^^^!(一个转义的插入符号加上一个转义的感叹号)。
  • 显然,如果您想在var2字符串中进行双重扩展,则第一个必须是标准的%var2%扩展,而不是延迟的!var2!扩展。

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

@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%

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接