假设我在Windows 7中将以下设置为系统环境变量
FOO = foo
path = ...;%FOO%/bin
以下示例在cmd中运行
set FOO=bar
start cmd
echo %FOO%
//bar
echo %path%
//...;foo/bin
路径环境变量在启动cmd时没有重新评估,但新的FOO变量确实存在。如何根据父命令终端中设置的新FOO变量来获取自我重新启动的路径?
编辑:我正在寻找成为......的路径; bar / bin
答案 0 :(得分:1)
没有“命令行相当于从桌面或开始菜单打开cmd.exe”,它会重现您关心的行为。环境变量从父进程继承。
shell读取注册表并执行插值(使用自己的环境,这是从注册表中读取的过程,并且不知道您在命令解释器中设置的变量),这就是更新注册表设置的原因。反映在从shell启动的cmd.exe中。
如果从正在运行的cmd.exe启动新的cmd.exe,则不会获得shell行为,并且您将继承现有环境。 Windows中没有任何内容在命令解释器中使用变量来插入注册表设置。负责从注册表中读取环境的代码与cmd.exe完全无关...它位于explorer.exe中(或者可能是资源管理器使用的shell DLL之一)。
使用VB脚本来读取注册表并构建批处理文件的 This answer尽可能好。我还没有测试是否在VB脚本使用的注册表访问COM组件(Environment("System")
对象上的WScript.Shell
方法)中执行插值,或者环境变量引用是否存在于批处理文件中并且是在批处理期间插值。因此,您可能会对评估和变量赋值的顺序感到困惑,在这种情况下,您最好调整脚本以仅获取PATH设置本身并保留所有其他变量。
答案 1 :(得分:0)
我也发现这很有用
set path=%path:foo/bin=bar/bin%
不像我想要的那样动态,但它可以替换变量的一部分。