如何在批处理中将变量值放入另一个变量名中?

4
假设我在批处理脚本中定义了以下变量:
set VariableFirst=value1
set VariableLast=value2

接着我在代码的另一部分设置了另一个变量。

set Type=First

我想访问%VariableFirst%%VariableLast%其中之一,具体取决于变量%Type%的值(类似于echo %Variable%Type%%,但这不起作用)。在Windows批处理脚本中如何实现?


请参见:https://dev59.com/62kw5IYBdhLWcg3wDWTL#10167990 - Aacini
1个回答

8
在您的具体情况下,这应该可以解决问题:
@ECHO OFF
SETLOCAL EnableDelayedExpansion
set VariableFirst=value1
set VariableLast=value2
set Type=First
echo !Variable%Type%!

以下是解释:

关键在于SETLOCAL EnableDelayedExpansion。通常情况下,变量是在解析时计算的。考虑以下代码:

@ECHO OFF
SET a=b
SET b=abc
ECHO %%a%%

您希望将%a%评估为K,使得ECHO %%a%%输出ECHO %b%,并且输出结果为abc。但是这种方法行不通。在解析时进行评估意味着变量的值在处理代码之前被设置。 SET a=bSET b=abc会起作用,但ECHO %%a%%不会,因为要知道%a%是b,必须先执行第一行,但执行发生在变量设置之后。所以%%a%%变成了%a%,输出结果只是%a%。

您需要做的是强制解释器在运行时评估最后一行,逐行执行并在到达最后一行时评估它。为此,您需要在脚本开头添加SETLOCAL EnableDelayedExpansion。现在,使用感叹号包围的变量名称(!...!)强制解释器考虑在此行之前对变量所做的所有更改来评估当前变量的值。

现在看一下这个例子:

@ECHO OFF
SETLOCAL EnableDelayedExpansion
SET a=b
SET b=abc
ECHO !%a%!

现在a是b,b是abc,!%a%!在运行时被求值。因此,在这种情况下,ECHO !%a%!在控制台知道%a%是b并且可以用abc替换!%a%!的点上被评估。所以输出结果是abc。


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