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

时间:2015-01-08 20:24:31

标签: windows batch-file

我用Google搜索并搜索了Stackoverflow但没有成功。也许我不知道使用正确的词语来找到我正在寻找的东西。

这种努力的简单观点是检查项目配置变量的存在性和正确性。如果未定义这些,则说明设置不正确。同样,如果目录不存在,则项目设置不正确。

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

1 个答案:

答案 0 :(得分:1)

我相信这是你需要的一点点(在ELSE声明中):

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

或者更简洁(但不太可读):

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

要么您要求将SETLOCAL命令更改为:

SETLOCAL EnableDelayedExpansion

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

这实质上使CALL SET VariableValue=%%!VariableName!%%评估为:

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

当它经历循环迭代时,会将VariableValue设置为先前在配置中定义的相应变量值。