假设我在批处理脚本中定义了以下变量:
set VariableFirst=value1
set VariableLast=value2
然后我在代码的另一部分中设置了另一个变量
set Type=First
我希望访问%VariableFirst%
和%VariableLast%
中的一个,具体取决于变量%Type%
的值(类似于echo %Variable%Type%%
,但这不起作用)。如何在Windows批处理脚本中执行此操作?
答案 0 :(得分:6)
在您的具体情况下,这应该有效:
@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=b
和SET b=abc
会起作用,但ECHO %% a %%不会因为要知道%a%是b必须执行的第一行但执行之后变量已设定。所以%% a %% bevomes%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并且可以替换!%a%的时候进行评估!用!b!这是abc。所以输出是abc。