如何从变量中的名称引用变量值?

How to reference a variable value from the name in a variable?

我用 Google 和 Whosebug 搜索都没有成功。也许我不知道使用正确的词来找到我要找的东西。

工作的简单视图是检查项目配置变量的存在性和正确性。如果未定义这些,则说明未正确设置。同样,如果目录不存在,则项目设置不正确。

=== project_setup.bat

@ECHO OFF
SET SOURCE_DIR=C:\src\project1
SET OBJECT_DIR=D:\intermediate\objects
SET TEST_DIR=C:\testing\project1
set SHIP_DIR=C:\final\project1

=== check_project_directories.bat

@ECHO OFF
SETLOCAL
SET EXITCODE=0

SET DIR_LIST=^
SOURCE_DIR ^
OBJECT_DIR ^
TEST_DIR ^
SHIP_DIR

FOR %%v IN (%DIR_LIST%) DO (
    IF NOT DEFINED %%v (
        ECHO %%v is not defined.
        SET EXITCODE=1
    ) ELSE (
        REM === How to use the value of the variable rather than the variable name?
        IF NOT EXIST "%%v" (
            ECHO Directory for %%v does not exist.
            SET EXITCODE=1
        )
    )
)

EXIT /B %EXITCODE%

我相信这是您需要的花絮(在您的 ELSE 声明中):

SET VariableName=%%v
CALL SET VariableValue=%%!VariableName!%%
IF NOT EXIST "!VariableValue!" (
...

或更简洁(但可读性较差):

CALL SET VariableValue=%%%%v%%
IF NOT EXIST "!VariableValue!" (
...

两者都需要您将 SETLOCAL 命令更改为:

SETLOCAL EnableDelayedExpansion

本质上,通过在 SET 语句前添加 CALL,您告诉脚本再次解析相应的行,但首先执行替换。

这实质上使 CALL SET VariableValue=%%!VariableName!%% 的计算结果为:

SET VariableValue=%SOURCE_DIR%
SET VariableValue=%OBJECT_DIR%
...

当它通过循环迭代时,会将 VariableValue 设置为您之前在配置中定义的相应变量值。