Windows中是否有命令从命令提示符刷新环境变量?

柔情痞子 提交于 2020-02-27 15:17:37

如果修改或添加环境变量,则必须重新启动命令提示符。 我是否可以执行一个无需重启CMD即可执行的命令?


#1楼

我想到的最好的方法是只执行一个注册表查询。 这是我的例子。

在我的示例中,我使用添加了新环境变量的批处理文件进行了安装。 安装完成后,我需要立即执行此操作,但是无法使用这些新变量生成新进程。 我测试了生成另一个浏览器窗口并调用cmd.exe的方法,此方法可以正常工作,但在Vista和Windows 7上,资源管理器仅作为单个实例运行,并且通常以登录用户身份运行。由于我需要管理员权限才能自动执行操作,因此失败无论从本地系统运行还是以管理员身份运行,都可以执行此操作。 这样做的局限性在于它不能处理路径之类的问题,只能用于简单的环境变量。 这使我可以使用批处理转到目录(包含空格)并复制运行.exes等文件。这是今天从stackoverflow.com上的may资源编写的

对新批次的原始批次调用:

testenvget.cmd SDROOT(或任何变量)

@ECHO OFF
setlocal ENABLEEXTENSIONS
set keyname=HKLM\System\CurrentControlSet\Control\Session Manager\Environment
set value=%1
SET ERRKEY=0

REG QUERY "%KEYNAME%" /v "%VALUE%" 2>NUL| FIND /I "%VALUE%"
IF %ERRORLEVEL% EQU 0 (
ECHO The Registry Key Exists 
) ELSE (
SET ERRKEY=1
Echo The Registry Key Does not Exist
)

Echo %ERRKEY%
IF %ERRKEY% EQU 1 GOTO :ERROR

FOR /F "tokens=1-7" %%A IN ('REG QUERY "%KEYNAME%" /v "%VALUE%" 2^>NUL^| FIND /I "%VALUE%"') DO (
ECHO %%A
ECHO %%B
ECHO %%C
ECHO %%D
ECHO %%E
ECHO %%F
ECHO %%G
SET ValueName=%%A
SET ValueType=%%B
SET C1=%%C
SET C2=%%D
SET C3=%%E
SET C4=%%F
SET C5=%%G
)

SET VALUE1=%C1% %C2% %C3% %C4% %C5%
echo The Value of %VALUE% is %C1% %C2% %C3% %C4% %C5%
cd /d "%VALUE1%"
pause
REM **RUN Extra Commands here**
GOTO :EOF

:ERROR
Echo The the Enviroment Variable does not exist.
pause
GOTO :EOF

我还从各种不同的想法中想到了另一种方法。 请看下面。 基本上,这将从注册表中获取最新的路径变量,但是,这将导致许多问题,因为注册表查询本身将提供变量,这意味着到处都有变量将不起作用,因此请解决这个问题基本上使路径加倍。 真讨厌 更合适的方法是:设置路径=%Path%; C:\\ Program Files \\ Software .... \\

无论这是新的批处理文件,请谨慎使用。

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS
set org=%PATH%
for /f "tokens=2*" %%A in ('REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path ^|FIND /I "Path"') DO (
SET path=%%B
)
SET PATH=%org%;%PATH%
set path

#2楼

使用“ setx”并重新启动cmd提示符

有一个名为“ setx ”的命令行工具可用于此作业。 它用于读取和写入环境变量。 关闭命令窗口后,变量仍然存在。

它“无需编程或编写脚本即可在用户或系统环境中创建或修改环境变量。setx命令还检索注册表项的值并将其写入文本文件。”

注意:此工具创建或修改的变量将在以后的命令窗口中可用,但在当前的CMD.exe命令窗口中不可用。 因此,您必须重新启动。

如果缺少setx


或修改注册表

MSDN说:

要以编程方式添加或修改系统环境变量,请将它们添加到HKEY_LOCAL_MACHINE \\ System \\ CurrentControlSet \\ Control \\ Session Manager \\ Environment注册表项中,然后广播将lParam设置为字符串“ Environment ”的WM_SETTINGCHANGE消息。

这使应用程序(例如外壳程序)可以获取您的更新。


#3楼

或者您可以通过手动进行操作

要查看或更改环境变量:右键单击“我的电脑”,然后单击“属性”。 单击高级选项卡。 单击环境变量。 为用户或系统变量单击以下选项之一:单击“新建”以添加新的变量名称和值。 单击一个现有的变量,然后单击“编辑”以更改其名称或值。 单击一个现有的变量,然后单击删除将其删除。 http://support.microsoft.com/kb/310519

Windows XP环境变量

%ALLUSERSPROFILE% (%PROGRAMDATA%)   C:\Documents and Settings\All Users
%APPDATA%   C:\Documents and Settings\{username}\Application Data
%COMPUTERNAME%  {computername}
%COMMONPROGRAMFILES%    C:\Program Files\Common Files
%COMMONPROGRAMFILES(x86)%   C:\Program Files (x86)\Common Files
%COMSPEC%   C:\Windows\System32\cmd.exe
%HOMEDRIVE% C:
%HOMEPATH%  \Documents and Settings\{username}
%LOCALAPPDATA%  Not available
%LOGONSERVER%   \\{domain_logon_server}
%PATH%  C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;{plus program paths}
%PATHEXT%   .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.WSF;.WSH
%PROGRAMFILES%  C:\Program Files
%PROGRAMFILES(X86)% C:\Program Files (x86) (only in 64-bit version)
%PROMPT%    Code for current command prompt format. Code is usually $P$G
%SystemDrive%   C:
%SystemRoot%    The Windows directory, usually C:\Windows, formerly C:\WINNT
%TEMP% and %TMP%    C:\Documents and Settings\{username}\Local Settings\Temp
%USERDOMAIN%    {userdomain}
%USERNAME%  {username}
%USERPROFILE%   C:\Documents and Settings\{username}
%WINDIR%    C:\Windows
%PUBLIC%    
%PROGRAMDATA%   Only available in Windows Vista and newer versions
%PSModulePath%  

Windows 7环境变量

%ALLUSERSPROFILE% (%PROGRAMDATA%)   C:\ProgramData
%APPDATA%   C:\Users\{username}\AppData\Roaming
%COMPUTERNAME%  {computername}
%COMMONPROGRAMFILES%    C:\Program Files\Common Files
%COMMONPROGRAMFILES(x86)%   C:\Program Files (x86)\Common Files
%COMSPEC%   C:\Windows\System32\cmd.exe
%HOMEDRIVE% C:
%HOMEPATH%  \Users\{username}
%LOCALAPPDATA%  C:\Users\{username}\AppData\Local
%LOGONSERVER%   \\{domain_logon_server}
%PATH%  C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;{plus program paths}
%PATHEXT%   .com;.exe;.bat;.cmd;.vbs;.vbe;.js;.jse;.wsf;.wsh;.msc
%PROGRAMFILES%  C:\Program Files
%PROGRAMFILES(X86)% C:\Program Files (x86) (only in 64-bit version)
%PROMPT%    Code for current command prompt format. Code is usually $P$G
%SystemDrive%   C:
%SystemRoot%    C:\Windows
%TEMP% and %TMP%    C:\Users\{username}\AppData\Local\Temp
%USERDOMAIN%    {userdomain}
%USERNAME%  {username}
%USERPROFILE%   C:\Users\{username}
%WINDIR%    C:\Windows
%PUBLIC%    C:\Users\Public
%PROGRAMDATA%   C:\ProgramData
%PSModulePath%  %SystemRoot%\system32\WindowsPowerShell\v1.0\Modules\

http://www.binbert.com/blog/2010/09/default-environment-variable-values-of-windows-7-xp/

希望这可以帮助。


#4楼

编辑:仅当您正在执行的环境更改是由于运行批处理文件而导致的时才有效。

如果批处理文件以SETLOCAL开头,那么即使退出该批处理之前您忘记调用ENDLOCAL或意外中止,它也会始终在退出时解散回到原始环境。

我写的几乎每个批处理文件都以SETLOCAL开始,因为在大多数情况下,我不希望保留环境更改的副作用。 如果我确实希望某些环境变量更改传播到批处理文件之外,则我的最后一个ENDLOCAL如下所示:

ENDLOCAL & (
  SET RESULT1=%RESULT1%
  SET RESULT2=%RESULT2%
)

#5楼

通过设计,Windows没有内置的机制可以将环境变量添加/更改/删除传播到已经运行的cmd.exe,可以从另一个cmd.exe或从“我的电脑->属性->高级设置->环境变量”。

如果在现有打开的命令提示符范围之外修改或添加新的环境变量,则需要重新启动命令提示符,或者在现有命令提示符下使用SET手动添加。

最新接受的答案显示了部分解决方法,方法是手动刷新脚本中的所有环境变量。 该脚本处理在“我的电脑...环境变量”中全局更改环境变量的用例,但是如果在一个cmd.exe中更改了环境变量,该脚本将不会将其传播到另一个正在运行的cmd.exe。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!