使用SETLOCAL时如何持久地将目录添加到PATH?

时间:2013-01-26 22:49:47

标签: windows batch-file environment-variables

  

可能重复:
  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障碍的容器,但欢迎使用更优雅的解决方案。

1 个答案:

答案 0 :(得分:5)

将其添加到脚本的末尾(或在您返回之前):

endlocal & @set path=%path%

这样做的原因是cmd解析器在执行任何操作之前对整行执行环境变量扩展。因此,在执行endlocal时,cmd正在处理的行如下所示:

endlocal & @set path=c:\whatever\the;c:\new\path;c:\is

然后endlocal抛弃所有本地更改,但是路径中的更改已暂时保留在即将执行的set命令中。