避免按字母顺序读取 Windows 环境变量

避免按字母顺序读取 Windows 环境变量

通常情况下,如果我定义一个用户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 和我自己提出的回答以及讨论,我尝试了以下方法:

  1. set_env_vars.bat在任意目录中创建一个文件,并在 中设置它的快捷方式%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

  2. set /P PTEST=Enter value for PTEST添加一行set_env_vars.bat以确保在登录期间正在读取该文件。

  3. 注销并重新登录。我确认已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

总之:

  1. 安装文件setvars.cmd(名称任意)在目录中%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup,或放在setvars.cmd其他地方并从那里设置它的快捷方式。

  2. 在该文件中,使用(例如)

    setx DIR2 C:\dir2
    set DIR2=C:\dir2
    setx DIR1 %DIR2%;C:\dir1
    set DIR1=%DIR2%;C:\dir1
    

经过测试并且有效。 如果控制面板用于设置任何从此时起,它可能会弄乱不按字母顺序排列的嵌套定义


**总结**

似乎至少有 3 种定义用户环境变量的替代方法:

  1. 通过控制面板。
    右键单击计算机 -> 属性 -> 高级系统设置 -> 环境变量 -> 为 USER1 创建用户变量 -> 输入姓名价值对于变量 -> Ok。
    变量的“嵌套”用法按字母顺序阅读
    变量也按字母顺序显示。

  2. 通过注册表编辑HKEY_CURRENT_USER\Environment。Windows
    键 -> reged ->HKEY_CURRENT_USER\Environment在地址栏中转到 -> 编辑 -> 新建 -> REG_EXPAND_SZ-> 键入姓名-> 右键单击​​添加的名称 -> 修改 -> 类型价值-> 好的。
    变量的“嵌套”用法按定义顺序读取
    变量按字母顺序显示,只是为了方便。
    原则上,这回答了这个问题。但如果使用了不遵循字母顺序的“嵌套”定义,则“禁止”再次使用控制面板方法,否则它会强制按字母顺序读取并弄乱定义。

  3. 通过命令行/批处理文件/自动执行。
    详情如下。帮助这个答案,并增加了使用SETX var value而不是仅仅SET var=value.
    变量的“嵌套”使用按定义顺序读取
    通过适当的自动化,每次登录时都会完成此操作,因此使用控制面板方式只会弄乱当前会话的“嵌套”定义。这种方法可能是最好的组合

请注意,为了避免必须注销才能重新读取变量,可以使用, 或者refreshenv

方法 3 的细节:实现 OP 目标的正确方法(获得一个功能上与通过注册表(或控制面板)定义变量相同的解决方案,但避免按字母顺序排列)是:

  1. 用一个.bat (或者,更好,一个.cmd文件,登录时读取(方法 3),例如setvars.cmd

  2. 在该文件中,使用setx在注册表级别设置环境变量(例如var2)。 这不会更新本地环境

  3. 为了能够使用在 Windows 会话中持续存在的“嵌套”变量定义(例如,var1就 的值而言var2),var2还需要在 生成的进程中定义一个setvars.cmd变量。根据上面的第 2 项, 无法实现这一点setx。为此,需要添加set与每行对应的一行setx。这样,在注册表和本地进程中就可以获得相同的环境。或者,可以尝试将REG query HKCU\Environment /V ...与其他命令(例如在 中使用的命令)链接使用refreshenv),但我没有继续这样做。如果曾经使用控制面板方式,它可能会弄乱不遵循字母顺序的嵌套定义。只需再次执行即可解决此问题setvars.cmd

相关内容