1

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

假设我的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%"
4

2 回答 2

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%!
于 2013-04-12T09:59:05.463 回答
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%"
于 2013-04-12T14:01:40.463 回答