Windows 设置新的PATH环境变量后激活注册表更改

Windows 设置新的PATH环境变量后激活注册表更改,windows,batch-file,cmd,registry,environment-variables,Windows,Batch File,Cmd,Registry,Environment Variables,我在批次标签下有这个代码。该代码检查队列目录是否位于 系统路径环境变量,然后根据结果编辑变量 我想确保PATH变量在每个版本的windows中都被永久更改, 由于windows xp及以下版本没有“setx”命令,我最终得到了一个“reg add” 这些操作系统的命令 代码中的一切都正常工作,但问题是我希望更改 立即生效。在代码编辑系统的windows版本中 通过“reg add”的路径变量情况并非如此。显然,注册表的更改已经完成 要激活“cmd.exe”以注意更改 命令索引站点ss64对reg

我在批次标签下有这个代码。该代码检查队列目录是否位于 系统路径环境变量,然后根据结果编辑变量

我想确保PATH变量在每个版本的windows中都被永久更改, 由于windows xp及以下版本没有“setx”命令,我最终得到了一个“reg add” 这些操作系统的命令

代码中的一切都正常工作,但问题是我希望更改 立即生效。在代码编辑系统的windows版本中 通过“reg add”的路径变量情况并非如此。显然,注册表的更改已经完成 要激活“cmd.exe”以注意更改

命令索引站点ss64对reg.exe命令的描述说明如下:

激活

要在不注销的情况下激活HKEY_当前_用户中的注册表更改:

RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters,1,True

但这只更新当前用户配置单元,而不是本地计算机配置单元

我知道我可以修改代码来处理当前用户的环境变量,但那是不可能的 最后一个案例场景。由于可能存在或不可能存在路径,因此有更多的代码 从队列中添加目录时的值。该值可能包含数据,也可能不包含数据,以及 取决于是否应完全删除该值

我要问的是:

  • 有人知道有什么技巧可以绕过reg命令的限制吗
  • 是否有任何第三方应用程序可以设置path变量?(对于windows build 5.2及以下版本,必须小巧、便携、可免费分发)
  • 是否有其他方法更新注册表
相关问题\n答案:

代码:
环境是特定于程序的,并在程序创建时创建。SetX不会更改当前程序的任何内容

因此,计算机启动并读取各种环境(以及登录时)

Winlogon启动资源管理器并向其提供Winlogon环境的副本,资源管理器启动记事本并向其提供资源管理器环境的副本

请记住,没有程序可以访问其他程序的内存。因此,您无法更改另一个正在运行的程序的环境

因此,在重新启动之前,Winlogon、Explorer或记事本都不会受到环境更改的影响

CMD有点不同,因为它在启动并更新给定的副本时会获取当前设置

但是您必须同时使用set和setx来更改当前的cmd窗口

另外,您正在运行的函数是SystemParametersInfo函数更新

它使用系统参数信息(不是环境字符串)更新用户配置文件,然后选择性地广播WM_设置更改程序获取的内容。由于它不适用于环境,程序将不知道如何处理它

#include "windows.h"

void main(void) {
    SendMessageTimeout(
        HWND_BROADCAST,
        WM_SETTINGCHANGE,
        (WPARAM) NULL,
        (LPARAM) "Environment",
        SMTO_NORMAL,
        1000,
        NULL
    );
}

这将更新/激活注册表中的环境更改。演示者

您试过了吗?试过了!这正是我想要的:)谢谢!你说的都是对的,我一直都知道。正如我在问题中所说的,我正试图找到一种方法来解决这个问题。此外,此代码是应用程序安装环境的一部分,将运行一次,然后关闭。因此,不需要在当前控制台内存中设置变量
#include "windows.h"

void main(void) {
    SendMessageTimeout(
        HWND_BROADCAST,
        WM_SETTINGCHANGE,
        (WPARAM) NULL,
        (LPARAM) "Environment",
        SMTO_NORMAL,
        1000,
        NULL
    );
}