假设我在批处理脚本中定义了以下变量:
set VariableFirst=value1
set VariableLast=value2
Run Code Online (Sandbox Code Playgroud)
然后在代码的另一部分设置另一个变量
set Type=First
Run Code Online (Sandbox Code Playgroud)
我想访问其中之一,%VariableFirst%并%VariableLast%取决于变量的值%Type%(类似的东西,echo %Variable%Type%%但这是行不通的)。如何在Windows批处理脚本中执行此操作?
在您的特定情况下,这应该起作用:
@ECHO OFF
SETLOCAL EnableDelayedExpansion
set VariableFirst=value1
set VariableLast=value2
set Type=First
echo !Variable%Type%!
Run Code Online (Sandbox Code Playgroud)
这里是解释:
关键是SETLOCAL EnableDelayedExpansion。通常,您的变量是在解析时求值的。考虑以下代码:
@ECHO OFF
SET a=b
SET b=abc
ECHO %%a%%
Run Code Online (Sandbox Code Playgroud)
您希望%a%被评估为K,因此ECHO %%a%%将变为ECHO %b%,输出将为abc。但这不会以这种方式工作。解析时评估意味着无需处理代码即可设置变量的值。SET a=b并且SET b=abc可以正常运行,但不会显示ECHO %% a %%,因为必须知道%a%是b,但必须执行第一行,但要在设置变量后执行。因此%% a %%表示%a%,而输出仅为%a%。
您需要做的是强制解释器在运行时评估最后一行,这意味着逐行执行并在到达时评估最后一行。为此,您需要SETLOCAL EnableDelayedExpansion在脚本的开头添加。现在!...!强制解释器考虑该行之前对变量所做的所有更改,以评估由感叹号包围的变量的当前值。
现在来看一下:
@ECHO OFF
SETLOCAL EnableDelayedExpansion
SET a=b
SET b=abc
ECHO !%a%!
Run Code Online (Sandbox Code Playgroud)
现在a是b,b是abc,!%a%!在运行时评估。因此,在这种情况下ECHO !%a%!,将在控制台知道%a%为b并可以替换!%a%!的时刻进行评估。与!b!这是abc。因此输出为abc。