如何recursion地展开一个环境variables?

假设如下:

echo %MY_ENV_VAR%扩展为%USERPROFILE%\some\path
echo %USERPROFILE%展开为C:\Users\MyUser

我的目标是在以下path创build一个空文件: C:\Users\MyUser\some\path\FOO.txt

我尝试了以下命令: type nul > %MY_ENV_VAR%\FOO.txt

不幸的是,输出是一个错误状态系统找不到指定的path。

我很确定这是因为shell不是recursion地扩展%MY_ENV_VAR% ,而是试图find一个以%USERPROFILE%开头的文字path。

我怎样才能最好地完成我的目标?

Solutions Collecting From Web of "如何recursion地展开一个环境variables?"

 rem Create the problem set "MY_ENV_VAR=%%USERPROFILE%%\some\path" echo %MY_ENV_VAR% rem One solution call set "MY_ENV_VAR=%MY_ENV_VAR%" echo %MY_ENV_VAR% 

call行中,解析器将用变量的内容替换%MY_ENV_VAR% ,生成

 call set "MY_ENV_VAR=%USERPROFILE%\some\path" 

当这个命令执行的时候,这个call会强制第二个解析阶段,产生

 set "MY_ENV_VAR=C:\Users\MyUser\some\path" 

当然,如果USERPROFILE包含另一个变量引用,则必须重复该过程。

编辑 – 为“递归”问题添加了一个“解决方案”,并将所有代码放在一个子例程中。

 @echo off setlocal enableextensions disabledelayedexpansion rem Create the problem set "_1first=c:\users" set "_2second=%%_1first%%\test" set "_3third=%%_2second%%\so & me\path" set "_4fourth=%%_3third%%" set "MY_ENV_VAR=%%_4fourth%%" echo inner variables echo ----------------------------- set _ echo ----------------------------- echo( echo "MY_ENV_VAR = [%MY_ENV_VAR%]" call :expandInnerVariables MY_ENV_VAR echo "MY_ENV_VAR = [%MY_ENV_VAR%]" goto :eof :expandInnerVariables varName setlocal enableextensions disabledelayedexpansion set "aux==" for /l %%i in (0 1 100) do ( setlocal enabledelayedexpansion if "!%~1!"=="" ( endlocal & goto :endExpand ) else for /f "delims=" %%a in ("=!%~1!") do ( endlocal & call set "%~1%%a" setlocal enabledelayedexpansion for /f "delims=" %%b in ("=!%~1!") do ( endlocal & set "aux=%%b" & if %%a==%%b goto :endExpand ) ) ) :endExpand endlocal & set "%~1%aux%" goto :eof