EnableDelayedExpansion并仍设置全局环境变量

Met*_*ome 2 batch-file

setlocal
for /F "tokens=1,2" %%a in (%env_cells%) do (
    call :env_setter env_setter_%%a
)
goto:EOF

:env_setter
rem doesn't do anything
endlocal
call %%1
goto:eof
Run Code Online (Sandbox Code Playgroud)

问题是上述方法禁用了:env_call产生的所有调用中的全局变量设置。有办法解决吗?

也许这是更详细的解释:

env_setter是对批处理文件的调用,该批处理文件本身包含set旨在在此调用上下文上设置环境变量的调用。因为setlocal在调用!env_cell!期间启用。并且:env_cell中的endlocal似乎没有禁用endlocal,上述set调用不会按预期更改此上下文。

在此特定示例中,可以使用%% a,但我希望大致了解这一功能。

是否有手动方式在if / for块中以反射方式访问变量值?

End*_*oro 6

把变量扔在墙上!

@echo off &setlocal
echo(

echo this obviously doesn't work
set "Counter="
for /l %%a in (1 1 5) do (
    SETLOCAL ENABLEDELAYEDEXPANSION
    set "Counter=!Counter!1"
    set "Variable=!Variable!!Counter!"
    echo !Counter!:!Variable!
    endlocal
)
echo Counter's value in the calling environment : %Counter%
echo Variable's value in the calling environment: %Variable%
echo(

echo throw your variables over the wall!
set "Counter="
for /l %%a in (1 1 5) do (
    SETLOCAL ENABLEDELAYEDEXPANSION
    set "Counter=!Counter!1"
    set "Variable=!Variable!!Counter!"
    echo !Counter!:!Variable!
    for /f %%a in ('set Counter^&set Variable') do (if "!"=="" endlocal)&set "%%a"
)
echo Counter's value in the calling environment : %Counter%
echo Variable's value in the calling environment: %Variable%
Run Code Online (Sandbox Code Playgroud)