如何设置一个环境变量依赖于另一个环境变量?(Windows)

7

我正在寻找在Windows上如何设置一个依赖于另一个的环境变量。在我的情况下,我想要将新路径添加到PYTHONPATH中。假设存在一个现有的环境变量。

%INSTALLATION_DIR% = D:\Programs\MyProject

最简单的方法是:

SETX PYTHONPATH "%PYTHONPATH%;%INSTALLATION_DIR%\Utility\Scripts"

但是,%INSTALLATION_DIR%将直接被D:\Programs\MyProject替换,因此如果%INSTALLATION_DIR%更改,则不会更新PYTHONPATH

有没有一种方法可以将文本%INSTALLATION_DIR%写入环境变量,而不直接评估该变量?

如果可能的话,我想以自动化的方式完成这个过程(因此使用控制台、powershell或python),因为我想编写一个脚本,将一系列路径添加到PYTHONPATH中。


猜测您正在寻找延迟扩展。请参考https://dev59.com/Umkv5IYBdhLWcg3wfA4P。 - user2648008
1
谢谢您提供的链接,但这不是我要找的。问题不在于变量可以在脚本中更改,而是我想使用文本“%INSTALLATION_DIR%”而不是此环境变量的值。 - golden96371
2个回答

2
我找到了解决方法。如果环境变量的名称用引号括起来,它就不会被计算。SETX PYTHONPATH "%PYTHONPATH%;%"INSTALLATION_DIR"%\Utility\Scripts"。原始答案翻译成“最初的回答”。

1
请注意,INSTALLATION_DIR 应该是一个简单的值,不依赖于其他环境变量。在注册表中,它应该是一个 REG_SZ,而 PYTHONPATH 将是一个 REG_EXPAND_SZ。Windows 会先加载所有的 REG_SZ 值,然后再加载 REG_EXPAND_SZ 值,所以后者依赖前者总是没问题的。 - Eryk Sun
1
请注意,仅使用 setx.exe 会扩展当前的 PYTHONPATH 值,该值可能取决于其他变量。为了防止这种情况,您需要通过 reg.exe 获取未扩展的值。 - Eryk Sun
1
此外,帮助文档中通过示例记录了setx.exe会将"~"替换为"%"以避免shell扩展。 - Eryk Sun
感谢您的提示。如果新环境变量只包含单个路径,则使用“〜”或“^%”替代“%”的变体才有效。由于PYTHONPATH包含多个路径,因此我通过在Python中使用os.environ [PYTHONPATH]读取PYTHONPATH并将所有%字符替换为%“或%”来解决它。 - golden96371
1
如果您正在使用Python,应该使用winreg模块来读取和修改未展开的值。例如:k = winreg.OpenKey(winreg.HKEY_CURRENT_USER, 'Environment') new_value = winreg.QueryValueEx(k, 'PYTHONPATH')[0] + r';%INSTALLATION_DIR%\Utility\Scripts'。setx.exe通知Explorer更新其环境,因此您可能希望使用它来设置值,而不是使用winreg。例如:subprocess.call('setx.exe PYTHONPATH "{}"'.format(new_value))。请注意,在这种情况下没有CMD shell参与,因此您不必担心在命令行中转义百分号。 - Eryk Sun
可以直接在bat/cmd中检索未展开的值,参见此答案 - TamaMcGlinn

0
把 % 看作一个特殊字符,需要加倍。因此,应该写成: SETX PYTHONPATH "%PYTHONPATH%;%%%%INSTALLATION_DIR%%%%\Utility\Scripts"

这将导致 %D:\Programs\MyProject%\Utility\Scripts。 - golden96371
这个答案应该放在一个批处理文件中,然后运行它。如果你直接将它粘贴到CMD窗口中,那么你需要用^来转义%。CMD是一个很棒的编程语言,不是吗? - TamaMcGlinn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接