我在批量标签下有这个代码。代码检查排队的目录是否在 系统 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,因此需要更多代码 从队列添加目录时的值。值可能包含也可能不包含数据,以及 取决于该值应该或不应该完全删除。
我在问什么:
相关问题\ 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?
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
)
答案 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提供