AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1464316
Accepted
sancho.s ReinstateMonicaCellio
sancho.s ReinstateMonicaCellio
Asked: 2019-07-27 02:03:35 +0800 CST2019-07-27 02:03:35 +0800 CST 2019-07-27 02:03:35 +0800 CST

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

  • 772

通常,如果我根据另一个 (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 和我自己的回答,以及在讨论之后,这就是我尝试过的:

  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。加上注销/登录。这并没有给我 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

在我的环境中。

windows-10 windows
  • 2 2 个回答
  • 456 Views

2 个回答

  • Voted
  1. harrymc
    2019-08-01T10:13:48+08:002019-08-01T10:13:48+08:00

    如果你这样做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在注册表上工作,但不会导致重新评估本地环境。环境只构建一次,当一个进程启动时,然后在整个执行过程中保持不变(除非由进程本身在本地修改)。由父进程启动的任何子进程都将继承其父进程的环境,因此在这种情况下不会引用注册表。

    下面的演示演示了这个问题:变量在上面的命令提示符中设置,但没有本地值。然后从桌面启动下面的命令提示符,它确实具有该值。

    在此处输入图像描述

    • 2
  2. Best Answer
    sancho.s ReinstateMonicaCellio
    2019-08-01T18:03:19+08:002019-08-01T18:03:19+08:00

    总之:

    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
      

    经过测试并且有效。 如果从现在开始使用控制面板设置任何变量,它可能会弄乱不按字母顺序排列的嵌套定义。


    **tl;博士**

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

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

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

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

    请注意,为避免必须注销以重新读取变量,可以使用this或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 ...chained 与其他命令一起使用(如使用的,例如 in refreshenv),但我没有继续这样做。如果曾经使用过控制面板方式,它可能会弄乱不按字母顺序排列的嵌套定义。这可以通过简单地再次执行来克服setvars.cmd。

    • 0

相关问题

  • 如何在域和 Linux 活动目录中启用指纹传感器

  • 资源管理器侧面板中的桌面外壳快捷方式

  • 为什么我不能将文件从 Android 发送到 Windows 10?

  • 在多个文件上打开方式?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    Windows 10 服务称为 AarSvc_70f961。它是什么,我该如何禁用它?

    • 2 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Marko Smith

    ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1056)

    • 4 个回答
  • Marko Smith

    我如何知道 Windows 安装在哪个驱动器上?

    • 6 个回答
  • Martin Hope
    Albin 支持结束后如何激活 WindowsXP? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch Windows 10 删除大量小文件的速度非常慢。有什么办法可以加快速度吗? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Ctrl+C 和 Ctrl+V 是如何工作的? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve