通常情况下,如果我定义一个用户Windows 10 环境变量(变量 1)相对于另一个变量(变量 2),变量 2 应按字母顺序位于变量 1 之前才能正常工作。这被识别为这里例如
例如,在窗口中
这
APYTHONDIR -> C:\Users\user1\myprogs
PATH -> %APYTHONDIR%
有效,但是这个
PYTHONDIR -> C:\Users\user1\myprogs
PATH -> %PYTHONDIR%
才不是。
有什么方法可以避免吗? 正在解决这个问题?
我的意思是得到一个功能上与通过注册表(或控制面板)定义变量相同的解决方案。
我总是可以使用命名来确保“嵌套”定义遵循字母顺序。但这不是我想要的。
我考虑在启动批处理文件(autoexec.nt
,或任何当前文件)中按所需顺序设置它们。我不确定这是否适用于需要环境变量的任何应用程序。例如,八度符号积分需要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
。加上注销/登录。这并没有给我环境中的变量ZTEST_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
。(第二行尝试给系统时间设置第一个变量)。加上注销/登录。这给了我变量
YTEST_DIR=;C:\ytest
ZTEST_DIR=C:\ztest
在我的环境中。
答案1
如果您这样做set "a=x%b%y"
,那么a
的定义与此完全相同,并且%b%
仅在需要时才会扩展。这就是字母顺序不重要的原因。当需要变量的值时,会替换变量,并且PATH
是立即需要的值的示例。
要自动设置环境变量,请将
SET 命令
在批处理文件中 ( .bat
) 并将文件复制到
启动文件夹。
您的个人启动文件夹应该
C:\Users\<user name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
是
全部用户启动文件夹应该是
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
。
问题:下面我做的和你做的有什么不同?如果你得到不同的结果,你可以给我们看一个类似的截图。
至于您发布的示例,结果符合预期。您使用了setx
在注册表中为用户设置环境变量的命令,但不在本地环境中。您需要从桌面启动一个新的命令提示符才能从该变量中受益。
此处的重点是setx
注册表可行,但不会导致重新评估本地环境。环境仅在启动进程时构建一次,然后在整个执行过程中保持不变(除非进程本身在本地进行了修改)。由父进程启动的任何子进程都将继承其父进程的环境,因此在这种情况下不会引用注册表。
下面的演示说明了这个问题:变量在上面的命令提示符中设置,但没有本地值。然后从桌面启动下面的命令提示符,它确实有该值。
答案2
总之:
安装文件
setvars.cmd
(名称任意)在目录中%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
,或放在setvars.cmd
其他地方并从那里设置它的快捷方式。在该文件中,使用(例如)
setx DIR2 C:\dir2 set DIR2=C:\dir2 setx DIR1 %DIR2%;C:\dir1 set DIR1=%DIR2%;C:\dir1
经过测试并且有效。 如果控制面板用于设置任何从此时起,它可能会弄乱不按字母顺序排列的嵌套定义。
**总结**
似乎至少有 3 种定义用户环境变量的替代方法:
通过控制面板。
右键单击计算机 -> 属性 -> 高级系统设置 -> 环境变量 -> 为 USER1 创建用户变量 -> 输入姓名和价值对于变量 -> Ok。
变量的“嵌套”用法按字母顺序阅读。
变量也按字母顺序显示。通过注册表编辑
HKEY_CURRENT_USER\Environment
。Windows
键 -> reged ->HKEY_CURRENT_USER\Environment
在地址栏中转到 -> 编辑 -> 新建 ->REG_EXPAND_SZ
-> 键入姓名-> 右键单击添加的名称 -> 修改 -> 类型价值-> 好的。
变量的“嵌套”用法按定义顺序读取。
变量按字母顺序显示,只是为了方便。
原则上,这回答了这个问题。但如果使用了不遵循字母顺序的“嵌套”定义,则“禁止”再次使用控制面板方法,否则它会强制按字母顺序读取并弄乱定义。通过命令行/批处理文件/自动执行。
详情如下。帮助这个答案,并增加了使用SETX var value
而不是仅仅SET var=value
.
变量的“嵌套”使用按定义顺序读取。
通过适当的自动化,每次登录时都会完成此操作,因此使用控制面板方式只会弄乱当前会话的“嵌套”定义。这种方法可能是最好的组合。
请注意,为了避免必须注销才能重新读取变量,可以使用这, 或者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 ...
与其他命令(例如在 中使用的命令)链接使用refreshenv
),但我没有继续这样做。如果曾经使用控制面板方式,它可能会弄乱不遵循字母顺序的嵌套定义。只需再次执行即可解决此问题setvars.cmd
。