【问题标题】:How to persistently add directories to PATH when using SETLOCAL? [duplicate]使用 SETLOCAL 时如何将目录持久添加到 PATH? [复制]
【发布时间】:2013-01-10 15:10:02
【问题描述】:

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

【问题讨论】:

    标签: windows batch-file environment-variables


    【解决方案1】:

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

    endlocal & @set path=%path%
    

    这个工作的原因是 cmd 解析器在执行它之前将环境变量扩展到整行。所以当endlocal 执行时,cmd 正在处理的行看起来像:

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

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

    【讨论】:

    • @ 当然是可选的。如果需要保存多个变量,endlocal & (<br>set var1=%var1%<br>set var2=%var2%<br>...<br>) 可能会稍微方便一些。
    • 就像哥伦布的蛋:回想起来很明显。谢谢!
    • @Jon:除了执行一个简单的命令列表之外,cmd 脚本中几乎没有什么是显而易见的。
    猜你喜欢
    • 2018-02-21
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多