在batch file中,如何获取其名称是另一个环境variables的值的环境variables的值?

如果我知道一个环境variables包含另一个环境variables的名称,我怎么能得到第二个环境variables的值?

假设我有一个文件java.properties旁边我的batch file与以下内容。

 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%的等效操作。 我可以弄清楚我在找什么样的环境variables,但是我不知道如何得到它的价值。 这是我迄今为止…

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

我想要做的是检查环境variablesJAVA_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%" 

试试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=0if notif not添加set override=1 ,并替换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%! 

我将使用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%"