在批处理文件中,如何获取其名称为另一个环境变量值的环境变量的值?

时间:2013-04-12 09:50:59

标签: windows batch-file

如果我知道一个环境变量包含另一个环境变量的名称,我该如何获取第二个环境变量的值?

假设我的批处理文件中有一个文件java.properties,其中包含以下内容。

JAVA_HOME_OVERRIDE_ENV_VAR=JAVA_HOME_1_7_0_17

我想要做的是检查是否设置了JAVA_HOME_1_7_0_17,如果是,请执行相当于set JAVA_HOME=%JAVA_HOME_1_7_0_17%的操作。我可以弄清楚我正在寻找什么环境变量,但我不知道如何获得它的价值。这就是我到目前为止......

@echo off
setlocal enabledelayedexpansion

if exist %~dp0\java.properties (
    echo "Found java properties."

    for /F "tokens=1* usebackq delims==" %%A IN (%~dp0\java.properties) DO (
        if "%%A"=="JAVA_HOME_OVERRIDE_ENV_VAR" set JAVA_HOME_OVERRIDE_ENV_VAR=%%B
    )

    if not [!JAVA_HOME_OVERRIDE_ENV_VAR!] == [] (
        echo "Override var is !JAVA_HOME_OVERRIDE_ENV_VAR!"
        REM This is where I'm stuck!!!
        REM Assume JAVA_HOME_OVERRIDE_ENV_VAR is JAVA_HOME_1_7_0_17
    )
)

endlocal & set JAVA_HOME=%JAVA_HOME%

我想要做的是检查环境变量JAVA_HOME_1_7_0_17是否存在,如果存在,请使用其值来设置JAVA_HOME

更新

我认为嵌套的if语句使得事情变得更加困难。我摆脱了他们,以下似乎工作。

@echo off

setlocal enabledelayedexpansion

if not exist "%~dp0\java.properties" (
    goto:EOF
)

for /F "tokens=1* usebackq delims==" %%A IN ("%~dp0\java.properties") DO (
    if "%%A"=="JAVA_HOME_OVERRIDE_ENV_VAR" set JAVA_HOME_OVERRIDE_ENV_VAR=%%B
)

if [!JAVA_HOME_OVERRIDE_ENV_VAR!] == [] (
    goto:EOF
)

set JAVA_HOME=!%JAVA_HOME_OVERRIDE_ENV_VAR%!

endlocal & set JAVA_HOME="%JAVA_HOME%"

2 个答案:

答案 0 :(得分:2)

尝试set JAVA_HOME=%!JAVA_HOME_OVERRIDE_ENV_VAR!%

编辑:如果!JAVA_HOME_OVERRIDE_ENV_VAR!设置在同一行,则此功能无效。尝试

call set JAVA_HOME=!%JAVA_HOME_OVERRIDE_ENV_VAR%!

一个缺点是,因为它会在磁盘上搜索名为set的文件/可执行文件,所以该命令应该花费更长的时间来完成,尽管它应该只在大循环中才会显而易见。

编辑2:尝试一下......

(在前面添加set override=0,在set override=1下添加if not,然后替换endlocal

@echo off
setlocal enabledelayedexpansion
set override=0

if exist %~dp0\java.properties (
    echo "Found java properties."

    for /F "tokens=1* usebackq delims==" %%A IN (%~dp0\java.properties) DO (
        if "%%A"=="JAVA_HOME_OVERRIDE_ENV_VAR" set JAVA_HOME_OVERRIDE_ENV_VAR=%%B
    )

    if not [!JAVA_HOME_OVERRIDE_ENV_VAR!] == [] (
        echo "Override var is !JAVA_HOME_OVERRIDE_ENV_VAR!"
        set override=1
        REM Assume JAVA_HOME_OVERRIDE_ENV_VAR is JAVA_HOME_1_7_0_17
    )
)

endlocal & if override=1 set JAVA_HOME=!%JAVA_HOME_OVERRIDE_ENV_VAR%!

答案 1 :(得分:0)

我会使用FINDSTR过滤掉相关的行,IF DEFINED来验证变量的存在,并在循环内延迟扩展以获得适当的值。

您的代码可以像以下一样简单:

@echo off
setlocal enableDelayedExpansion
for /f "tokens=1* delims==" %%A in (
  '2^>nul findstr /bil "JAVA_HOME_OVERRIDE_ENV_VAR=" "%~dp0\java.properties"'
) do if defined %%B set "JAVA_HOME=!%%B!"
endlocal & set "JAVA_HOME=%JAVA_HOME%"