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

时间:2014-03-29 17:03:40

标签: windows batch-file cmd registry environment-variables

我在批量标签下有这个代码。代码检查排队的目录是否在 系统 PATH 环境变量,然后根据结果编辑变量。

我想确保在每个版本的Windows中永久更改 PATH 变量, 因为windows xp及以下版本没有' setx'命令我最终得到了一个® reg' 这些操作系统的命令。

一切都按照代码运行,但问题是我想要更改 立即生效 。在代码编辑系统的Windows版本中 PATH 变量通过' reg add'不是这种情况。显然,注册表的变化有 要激活' cmd.exe'注意到这些变化。

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

  

启用

     

要在HKEY_CURRENT_USER中激活注册表更改而不注销:

     

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

但这只会更新 CURRENT_USER 配置单元而不是 LOCAL_MACHINE 配置单元。

我知道我可以更改代码以使用当前用户环境变量,但这样做 最后一种情况。由于可能存在或不存在PATH,因此需要更多代码 从队列添加目录时的值。值可能包含也可能不包含数据,以及 取决于该值应该或不应该完全删除。

我在问什么:

  • 有没有人知道有什么技巧可以解决这个reg命令的限制?
  • 是否有任何可以设置路径变量的第三方应用程序? (对于windows build 5.2及以下版本,必须小巧,便携,可免费分发)
  • 有没有其他方法来更新注册表?

相关问题\ anwers:

How would you write a .bat or .cmd file to remove an element from the PATH?

Can a script.bat make changes to Windows PATH Environment Variable

How to persistently set a variable in Windows 7 from a batch file?

Window batch file - removing the directory from a file path

Add/Remove from Path using Batch?

CODE:

call :confini;r;settings;installdir;instdir ; queue the value

for /f "delims=" %%i in ('echo "%path%" ^| find /c /i "%instdir%"') do (
    set result=%%i 2>nul
    )

for /f "tokens=4,5 delims=. " %%i in ('ver') do (
    set version=%%i.%%j 2>nul
    )

set reg1="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
set path0=%path%
for /l %%a in (1,1,1) do if "%path0:~-1%"==";" set "path0=%path0:~0,-1%"
set path1="%path0:;=" "%"

if /i %version% geq 6.0 (
    set "excmd=setx path -m "!pathN!" >nul"
    )

if /i %version% leq 5.2 (
    set "excmd=reg add %reg1% /v PATH /d "!pathN!" /f >nul & "%~dp0envirupd.exe""
    )

if %result%==0 (
    if /i %version% geq 6.0 (
        setx path -m "%instdir%;%path0%" >nul
        )
    if /i %version% leq 5.2 (
        reg add %reg1% /v PATH /d "%instdir%;%path0%" /f >nul
        %~dp0envirupd.exe
        )
    ) else (
        setlocal enabledelayedexpansion
        for %%p in (%path1%) do (
            if /i not "%%~p"=="%instdir%" (
                if "!pathN!"=="" (
                    set pathN=%%~p
                    ) else (
                        set pathN=!pathN!;%%~p
                        )
                )
            )
        %excmd%
        setlocal disabledelayedexpansion
        )

2 个答案:

答案 0 :(得分:0)

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

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

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

请记住,没有程序可以访问其他程序的内存。所以你不能改变另一个正在运行的程序的环境。

因此,在重新启动之前,Winlogon,Explorer或Notepad都不会受到环境变化的影响。

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

但是你必须使用set和setx来改变当前的cmd窗口。

您正在运行的功能是SystemParametersInfo函数更新。

它使用SystemParametersInfo信息(不是环境字符串)更新用户配置文件,然后可选地广播WM_SETTINGCHANGE程序获取的内容。因为它不适用于环境,程序不知道如何处理它。

答案 1 :(得分:0)

#include "windows.h"

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

这将更新/激活注册表中的环境更改。由MC ND提供