通常,如果我根据另一个 (var 2) 定义一个用户Windows 10 环境变量 (var 1),则 var 2 应该按字母顺序排在 var 1 之前,这样它才能工作。这是在这里确定的,例如
例如,在窗口
这个
APYTHONDIR -> C:\Users\user1\myprogs
PATH -> %APYTHONDIR%
有效,但是这个
PYTHONDIR -> C:\Users\user1\myprogs
PATH -> %PYTHONDIR%
才不是。
有什么办法避免吗? 解决它?
我的意思是获得一个功能上与通过注册表(或控制面板)定义变量相同的解决方案。
我总是可以使用命名来确保“嵌套”定义遵循字母顺序。这不是我想要的。
我考虑过在启动批处理文件(autoexec.nt
,或当前的任何文件)中按所需顺序设置它们。我不确定这是否适用于任何需要环境变量的应用程序。例如,octave symbolic integration 需要在 中找到python
某处,以这种方式添加PATH
目录。PATH
编辑根据 harrymc 和我自己的回答,以及在讨论之后,这就是我尝试过的:
在任意目录创建一个文件
set_env_vars.bat
,并在%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
.添加一行
set /P PTEST=Enter value for PTEST
以set_env_vars.bat
确保在登录期间正在读取文件。注销和登录。我确认
set_env_vars.bat
已阅读。
然后,我添加了行
set ZTEST_DIR=C:\ztest
set YTEST_DIR=%ZTEST_DIR%;C:\ytest
到set_env_vars.bat
。加上注销/登录。这并没有给我 varsZTEST_DIR
和YTEST_DIR
我的环境。
然后,我用线条替换了那些
setx ZTEST_DIR C:\ztest
set /P WAITING_DUMMY=Enter value for WAITING_DUMMY
setx YTEST_DIR %ZTEST_DIR%;C:\ytest
在set_env_vars.bat
。(第二行尝试给系统时间来设置第一个变量)。加上注销/登录。这给了我 vars
YTEST_DIR=;C:\ytest
ZTEST_DIR=C:\ztest
在我的环境中。
如果你这样做
set "a=x%b%y"
, thena
的定义完全一样,并且%b%
只会在需要时展开。这就是为什么字母顺序不重要的原因。变量在需要它们的值时被替换,并且PATH
是立即需要的值的示例。要自动设置环境变量,请将 SET 命令 放入批处理文件 (
.bat
) 并将该文件复制到 Startup 文件夹。您的个人启动文件夹应该是
C:\Users\<user name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
,而 所有用户启动文件夹应该是C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
。问题:我在下面做的和你做的有什么不同?如果您得到不同的结果,您可以向我们展示类似的屏幕截图。
至于您发布的示例,结果符合预期。你使用过的
setx
命令,在注册表中为用户设置了环境变量,但在本地环境中没有。您需要从桌面启动一个新的命令提示符才能从该变量中受益。这里的重点是
setx
在注册表上工作,但不会导致重新评估本地环境。环境只构建一次,当一个进程启动时,然后在整个执行过程中保持不变(除非由进程本身在本地修改)。由父进程启动的任何子进程都将继承其父进程的环境,因此在这种情况下不会引用注册表。下面的演示演示了这个问题:变量在上面的命令提示符中设置,但没有本地值。然后从桌面启动下面的命令提示符,它确实具有该值。
总之:
目录中的安装文件
setvars.cmd
(名称是任意的)%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
,或放在setvars.cmd
其他地方并从那里设置快捷方式。在该文件中,使用(例如)
经过测试并且有效。 如果从现在开始使用控制面板设置任何变量,它可能会弄乱不按字母顺序排列的嵌套定义。
**tl;博士**
似乎至少有 3 种替代方法来定义用户环境变量:
通过控制面板。
右键单击计算机 -> 属性 -> 高级系统设置 -> 环境变量 -> 为 USER1 新建用户变量 -> 输入变量的名称和值-> 确定。
变量的“嵌套”用法按字母顺序读取。
变量也按字母顺序显示。
通过注册表编辑
HKEY_CURRENT_USER\Environment
.Windows 键 -> 注册 -> 在地址栏中转到
HKEY_CURRENT_USER\Environment
-> 编辑 -> 新建 -> 输入REG_EXPAND_SZ
名称- > 右键单击添加的名称 -> 修改 -> 输入值-> 确定。变量的“嵌套”用法按照定义它们的顺序读取。
变量按字母顺序显示,只是为了方便。
这原则上回答了这个问题。但是,如果使用了不遵循字母顺序的“嵌套”定义,则将“禁止”再次使用控制面板方法,否则它会强制按字母顺序阅读并弄乱定义。
通过命令行/批处理文件/autoexec。
详情如下。在这个答案的帮助下,添加了
SETX var value
instead of instead of onlySET var=value
。变量的“嵌套”用法按照定义它们的顺序读取。
并且通过适当的自动化,这是在每次登录时完成的,因此使用控制面板方式只会弄乱当前会话的“嵌套”定义。这种方法可能是最好的组合。
请注意,为避免必须注销以重新读取变量,可以使用this或
refreshenv
。方法 3 的详细信息:实现 OP 目标的正确方法(获得功能上与通过注册表(或控制面板)定义变量相同的解决方案,但避免按字母顺序排列)是:
使用
.bat
(或更好的.cmd
)文件,在登录期间读取(方法 3),例如,setvars.cmd
.在该文件中,
setx
用于在注册表级别设置环境变量(例如,var2
)。 这不会更新本地环境。为了能够使用在 windows 会话中持续存在的“嵌套”变量定义(例如,
var1
根据 的值var2
),var2
还需要在 产生的进程中定义一个变量setvars.cmd
。根据上面的第 2 项,这不是由setx
. 为此,可以添加set
对应于每一行的setx
一行。这样,在注册表和本地进程中获得相同的环境。或者,可以尝试将REG query HKCU\Environment /V ...
chained 与其他命令一起使用(如使用的,例如 inrefreshenv
),但我没有继续这样做。如果曾经使用过控制面板方式,它可能会弄乱不按字母顺序排列的嵌套定义。这可以通过简单地再次执行来克服setvars.cmd
。