可能重复:
Make an environment variable survive ENDLOCAL
How to keep the value of a variable outside a Windows batch script which uses “delayed expansion local” mode?
我有一个类似这样的批处理文件:
REM I need to use SETLOCAL so as not to pollute the environment
REM with any variables used to implement the logic in this script
SETLOCAL
SET I_DONT_WANT_THIS_VARIABLE_TO_LEAK_OUTSIDE=c:\
REM BUT, there is this one change to the environment I want to make sticky:
PATH %PATH%;%I_DONT_WANT_THIS_VARIABLE_TO_LEAK_OUTSIDE%
该脚本使用SETLOCAL
将环境与批处理文件想要执行的任何操作隔离开来,但这会导致问题:最后我做想要在某些环境中修改调用方的环境非常具体的方式,但SETLOCAL
阻止了这一点(批处理文件退出后,更改将被撤消)。在设置路径之前,我也无法调用ENDLOCAL
,因为这会将环境恢复到原始状态,消除变量的值,因此我无法将其值附加到路径上。
有没有办法设置路径而忽略有效的SETLOCAL
?或者,是否有任何技巧可以在调用ENDLOCAL
时明确保留变量的值?
我知道可以使用临时文件作为可绕过ENDLOCAL
障碍的容器,但欢迎使用更优雅的解决方案。
答案 0 :(得分:5)
将其添加到脚本的末尾(或在您返回之前):
endlocal & @set path=%path%
这样做的原因是cmd解析器在执行任何操作之前对整行执行环境变量扩展。因此,在执行endlocal
时,cmd
正在处理的行如下所示:
endlocal & @set path=c:\whatever\the;c:\new\path;c:\is
然后endlocal
抛弃所有本地更改,但是路径中的更改已暂时保留在即将执行的set
命令中。