Ryan J
Ryan J

Reputation: 2552

In a batch file, how can I get the value of an environment variable whose name is the value of another environment variable?

If I know that one environment variable contains the name of another, how can I get the value of the second environment variable?

Assume I have a file java.properties alongside my batch file with the following contents.

JAVA_HOME_OVERRIDE_ENV_VAR=JAVA_HOME_1_7_0_17

What I want to do is check if JAVA_HOME_1_7_0_17 is set and, if so, do the equivalent of set JAVA_HOME=%JAVA_HOME_1_7_0_17%. I can figure out what environment variable I'm looking for, but I don't know how to get its value. This is what I have so far...

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

What I want to do is check if the environment variable JAVA_HOME_1_7_0_17 exists and, if it does, use its value to set JAVA_HOME.

Updated

I think the nested if statements are making things more difficult then needed. I got rid of them and the following seems to work.

@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%"

Upvotes: 1

Views: 5715

Answers (2)

dbenham
dbenham

Reputation: 130819

I would use FINDSTR to filter out the relevant line, IF DEFINED to validate the existence of the variable, and delayed expansion within the loop to get the appropriate value.

Your code could be as simple as:

@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%"

Upvotes: 0

user2033427
user2033427

Reputation: 873

Try set JAVA_HOME=%!JAVA_HOME_OVERRIDE_ENV_VAR!%.

EDIT: This should not work if !JAVA_HOME_OVERRIDE_ENV_VAR! was set on the same line. Try

call set JAVA_HOME=!%JAVA_HOME_OVERRIDE_ENV_VAR%!

a downside being that since it will search the disk for a file/executable with the name set, the command should take slightly longer to finish, though it should only be noticeable in large loops.

EDIT 2: Try this too...

(add set override=0 in front, add set override=1 under if not, and replace the endlocal line)

@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%!

Upvotes: 2

Related Questions