【DevChat】使用bat修改环境变量path的值
今天尝试使用DevChat插件进行脚本编程,随然没有100%满足我的需求,不过也挺厉害了,具体如下:
需求1
使用批处理检查是否存在BAT_HOME的环境变量,如果存在则删除,如果不存在则添加
方案:使用setx操作环境变量
@echo off setlocal enabledelayedexpansion if "%BAT_HOME%"=="" ( set BAT_HOME=C:\Users\%USERNAME%\my_bat_home setx BAT_HOME "%BAT_HOME%" echo BAT_HOME 环境变量已添加 ) else ( setx BAT_HOME="" echo BAT_HOME 环境变量已删除 )
这段代码首先使用 setlocal enabledelayedexpansion
来启用命令行扩展功能,然后使用 if "%BAT_HOME%"
判断 BAT_HOME 环境变量是否为空。如果为空,则将其设置为 C:\Users\%USERNAME%\my_bat_home
,然后使用 setx
命令将其添加到环境变量中。如果已经存在 BAT_HOME 环境变量,则使用 setx
命令将其设置为空。最后输出相应的提示信息。
需求2
使用批处理操作注册表,判断是否存在BAT_HOME的环境变量,如果存在则删除,如果不存在则添加。
方案:通过操作注册
很快又给出了答案,如下:
@echo off setlocal enabledelayedexpansion if "%BAT_HOME%"=="" ( set BAT_HOME=C:\Users\%USERNAME%\my_bat_home reg add "HKCU\Environment" /v BAT_HOME /t REG_SZ /d "%BAT_HOME%" /f echo BAT_HOME 环境变量已添加 ) else ( reg delete "HKCU\Environment" /v BAT_HOME /f echo BAT_HOME 环境变量已删除 )
这段代码首先使用 setlocal enabledelayedexpansion
来启用命令行扩展功能,然后使用 if "%BAT_HOME%"
判断 BAT_HOME 环境变量是否为空。如果为空,则将其设置为 C:\Users\%USERNAME%\my_bat_home
,然后使用 reg add
命令将 BAT_HOME 添加到注册表的 "HKCU\Environment" 键中。如果已经存在 BAT_HOME 环境变量,则使用 reg delete
命令将其删除。最后输出相应的提示信息。
需求2
使用批处理查找环境变量path是否存在BAT_HOME,如果存在则删除,如果不存在则添加
方案一:使用setx操作环境变量
在Windows系统中,你可以使用以下的批处理脚本来实现你的需求。这个脚本会检查环境变量PATH中是否存在BAT_HOME的路径,如果存在则删除,如果不存在则添加。
@echo off setlocal enabledelayedexpansion :: 指定需要检查的路径 set "pathToCheck=%BAT_HOME%" :: 获取当前的PATH环境变量 set "pathVar=%PATH%" :: 检查PATH环境变量中是否存在指定的路径 echo %pathVar% | findstr /C:"%pathToCheck%" 1>nul if errorlevel 1 ( echo Path not found. Adding it. setx Path "%pathVar%;%pathToCheck%" ) else ( echo Path found. Removing it. set "newPathVar=%pathVar:;%pathToCheck%=%" setx Path "%newPathVar%" ) endlocal
请注意,这个脚本只能在命令提示符(cmd.exe)中运行,而不能在PowerShell中运行。另外,setx
命令会永久地修改环境变量,如果你只想临时地修改环境变量,你可以使用set
命令代替setx
命令。
我考虑环境变量经常会使用JAVA_HOME这样类似的环境变量,接着我又想通过注册表来更改环境变量,我又给出如下要求
需求3
使用批处理操作注册表,查找环境变量path是否存在BAT_HOME,如果存在则删除,如果不存在则添加
方式二:通过操作注册表
在Windows系统中,你可以使用以下的批处理脚本来实现你的需求。这个脚本会检查注册表中的环境变量PATH是否包含BAT_HOME的路径,如果存在则删除,如果不存在则添加。
@echo off setlocal enabledelayedexpansion :: 指定需要检查的路径 set "pathToCheck=%BAT_HOME%" :: 获取当前的PATH环境变量 for /F "tokens=2*" %%a in ('reg query "HKCU\Environment" /v Path ^| findstr /i path') do set "pathVar=%%b" :: 检查PATH环境变量中是否存在指定的路径 echo %pathVar% | findstr /C:"%pathToCheck%" 1>nul if errorlevel 1 ( echo Path not found. Adding it. reg add "HKCU\Environment" /v Path /d "%pathVar%;%pathToCheck%" /f ) else ( echo Path found. Removing it. set "newPathVar=%pathVar:;%pathToCheck%=%" reg add "HKCU\Environment" /v Path /d "%newPathVar%" /f ) endlocal
请注意,这个脚本只能在命令提示符(cmd.exe)中运行,而不能在PowerShell中运行。另外,reg add
命令会永久地修改注册表,如果你只想临时地修改环境变量,你可以使用set
命令代替reg add
命令。
此外,修改注册表可能会影响系统的稳定性,所以在运行这个脚本之前,你应该先备份你的注册表。
重要说明
我自己测试的时候,分两种情况:
1)查找的是字符串。
例如:这里set "pathToCheck=%BAT_HOME%",其实是字符串,然后再执行echo %pathVar% | findstr /C:"%pathToCheck%" 1>nul这里查找的就是字符串。
2)查找的是变量中保存的字符串
例如:这里set "pathToCheck=BAT_HOME",其实是字符串,然后再执行echo %pathVar% | findstr /C:"!%pathToCheck%!" 1>nul这里查找的就是BAT_HOME变量中的字符串
其实find和findstr两个函数一样,主要看 pathToCheck 中是作为字符串,还是作为变量,如果是变量需要启用setlocal enabledelayedexpansion扩展,并且在pathToCheck的外面使用感叹号!
总结
整体感觉还不错,虽然这些代码都很简单,也都是常用的,以节省人力一点一点的敲代码的时间,但是如果想应用到生产系统上,还需要做进一步的微调和测试。
后续有时间,再去优化和测试吧。
=======================================================================================
个人使用
版本1
初步版本,紧紧算是能使用,很多问题都没有考虑,以后再修改。
@echo off&setlocal EnableDelayedExpansion cls rem 是否使用环境变量,然后再把变量加入path中 set useEnvName=1 set envName=BAT_HOME set envNameVal=D:\aa bb cc\dd\ee set envNameIsExist=0 set pathAllVal= set pathValIsExist=0 :main rem 系统环境变量:"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment" rem 用户环境变量:"HKCU\Environment" rem regPath的值是注册表路径,必须使用双引号,例如:"HKCU\Environment" set regPath="HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment" if %useEnvName%==1 call :chkEnvName if %envNameIsExist%.==1. call :delEnvName if %useEnvName%.==1. call :addEnvName call :chkPathVal call :delPathVal call :addPathVal goto envEnd :chkEnvName <Returns whether the variable name exists> set envNameIsExist=0&set envCount=0 for /f "skip=2 tokens=1,2,*" %%a in ('reg query %regPath%') do ( ::echo [chkEnvName]==[%%~a]==[%%b]==[%%c] echo [chkEnvName]%%~a|find /i "%envName%">nul && set envNameIsExist=1 set /a envCount+=1 ) echo [chkEnvName]envCount=%envCount% if /i not %1.==. set %1=%envNameIsExist% ::exit/b :delEnvName if %envNameIsExist%.==1. ( reg delete %regPath% /v %envName% /f echo [delEnvName]The %envName% environment variable has been deleted. ) set envNameIsExist=0&exit/b :addEnvName if %envNameIsExist%.==0. ( reg add %regPath% /v %envName% /t REG_SZ /d "%envNameVal%" /f echo [addEnvName]The %envName% environment variable has been added. ) set envNameIsExist=1&exit/b :chkPathVal <Returns whether the variable name exists> rem 根据是否存在环境变量,决定是查找、添加、删除等操作 echo [chkPath]================================== echo [chkPath]envNameIsExist=%envNameIsExist% set pathV= set pathValIsExist=0 for /f "skip=2 tokens=1,2,*" %%a in ('reg query %regPath% /v path') do (set pathAllVal=%%c) echo [chkPath]pathV1=%pathAllVal% rem 在path中查找是否存在%envName%配置的环境变量,例如:%BAT_HOME% echo [chkPath]envName=%envName% echo [chkPath]envName=!%envName%! echo %pathAllVal% | find "!%envName%!">nul && set pathValIsExist=1 ::echo %pathAllVal% | findstr /I /C:"!%envName%!">nul && set pathValIsExist=1 echo [chkPath]errorlevel=%errorlevel% rem 移除%envName%配置的环境变量,并写回注册表 echo [chkPath]pathValIsExist====%pathValIsExist% if /i not %1.==. set %1=%pathValIsExist% exit/b :delPathVal if %pathValIsExist%.==1. set newPathVal=!pathAllVal:%%%envName%%%;=! echo;&echo [delPathVal]pathV2=%newPathVal% if %pathValIsExist%.==1. reg add %regPath% /v "path" /d "%newPathVal%" /f & echo %envName% has been deleted. exit/b :addPathVal echo [addPathVal]pathValIsExist=%pathValIsExist% if %envNameIsExist%.==1. set newPathVal=!pathAllVal:%%%envName%%%;=! echo [addPathVal]envNameVal=%%%envName%%% echo [addPathVal]envNameIsExist=%envNameIsExist% if %envNameIsExist%.==1. ( reg add %regPath% /v Path /t REG_EXPAND_SZ /d "%newPathVal%%%%envName%%%;" /f echo the path %envName% has been added. ) :envEnd echo; ::pause
版本2
各个子函数功能已完成,后续优化:立即生效,使用参数设置环境变量
@echo off&setlocal EnableDelayedExpansion cls rem 是否使用环境变量,然后再把变量加入path中 set useEnvName=1 set envName=BAT_HOME set envNameVal=C:\Tmp set envNameIsExist=0 set pathValIsExist=0 set pathOldVal= set pathNewVal= :main echo [main]useEnvName=%useEnvName% echo [main]envName=%envName% echo [main]envNameVal=%envNameVal% rem 系统环境变量:"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment" rem 用户环境变量:"HKCU\Environment" rem regPath的值是注册表路径,必须使用双引号,例如:"HKCU\Environment" set regPath="HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment" if %useEnvName%.==1. call :chkEnvName if %envNameIsExist%.==1. call :delEnvName if %useEnvName%.==1. call :addEnvName call :chkPathVal chkValExist if %pathValIsExist%.==1. call :delPathVal call :addPathVal goto envEnd :chkEnvName <Returns whether the variable name exists> set envNameIsExist=0&set envCount=0 for /f "skip=2 tokens=1,2,*" %%a in ('reg query %regPath%') do ( echo [chkEnvName]%%~a|find /i "%envName%">nul && set envNameIsExist=1 set /a envCount+=1 ) echo [chkEnvName]envCount=%envCount% if /i not %1.==. set %1=%envNameIsExist% exit/b :delEnvName if %envNameIsExist%.==1. ( reg delete %regPath% /v %envName% /f echo [delEnvName]The %%%envName%%% environment variable has been deleted. ) set envNameIsExist=0&exit/b :addEnvName if %envNameIsExist%.==0. ( reg add %regPath% /v %envName% /t REG_SZ /d "%envNameVal%" /f echo [addEnvName]The %%%envName%%% environment variable has been added. ) set envNameIsExist=1&exit/b :chkPathVal <Returns whether the variable name exists> rem 根据是否存在环境变量,决定是查找、添加、删除等操作 echo [chkPathVal]================================== set pathValIsExist=0 for /f "skip=2 tokens=1,2,*" %%a in ('reg query %regPath% /v "Path"') do (set pathOldVal=%%c) rem 在path中查找是否存在%envName%配置的环境变量,例如:%BAT_HOME% echo [chkPathVal]useEnvName=%useEnvName% echo [chkPathVal]envName=%envName% echo [chkPathVal]envNameValue=!%envName%! echo [chkPathVal]envNameVal=%envNameVal% if %useEnvName%.==1. (echo !pathOldVal! | find "!%envName%!">nul && set pathValIsExist=1) else (echo !pathOldVal! | find "%envNameVal%;" && set pathValIsExist=1) echo [chkPathVal]pathValIsExist=%pathValIsExist% if /i not %1.==. set %1=%pathValIsExist% exit/b :delPathVal echo [delPathVal]================================== echo [delPathVal]useEnvName=%useEnvName% echo [delPathVal]pathValIsExist=%pathValIsExist% rem 移除%envName%或%envNameVal%配置的环境变量,并再写回注册表 ::if %useEnvName%.==1. (if %pathValIsExist%.==1. set pathNewVal=!pathOldVal:%%%envName%%%;=!) else (if %pathValIsExist%.==1. set pathNewVal=!pathOldVal:%envNameVal%;=!) if %pathValIsExist%.==1. (if %useEnvName%.==1. (set pathNewVal=!pathOldVal:%%%envName%%%;=!) else (set pathNewVal=!pathOldVal:%envNameVal%;=!)) ::echo [delPathVal]pathNewVal=%pathNewVal% if not "%pathNewVal%."=="." (reg add %regPath% /v "Path" /t REG_EXPAND_SZ /d "%pathNewVal%" /f & if %useEnvName%.==1. (echo [delPathVal]path value %%%envName%%% has been deleted.) else (echo [delPathVal]path value %envNameVal% has been deleted.)) exit/b :addPathVal echo [addPathVal]================================== echo [addPathVal]useEnvName=%useEnvName% echo [addPathVal]pathValIsExist=%pathValIsExist% rem 移除%envName%或%envNameVal%配置的环境变量,并把新值再写回注册表 if %useEnvName%.==1. (set pathNewVal=!pathOldVal:%%%envName%%%;=!) else (set pathNewVal=!pathOldVal:%envNameVal%;=!) echo;&echo [addPathVal]pathOldVal=%pathOldVal% echo;&echo [addPathVal]newPathVal=%pathNewVal% if not "%pathNewVal%."=="." if %useEnvName%.==1. (reg add %regPath% /v "Path" /t REG_EXPAND_SZ /d "%pathNewVal%%%%envName%%%;" /f &echo [addPathVal]the Path %%%envName%%% has been added.) else (reg add %regPath% /v "Path" /t REG_EXPAND_SZ /d "%pathNewVal%%envNameVal%;" /f &echo [addPathVal]the Path %envNameVal% has been added.) exit/b :envEnd echo; set Path=%envNameVal%;%Path% pause exit/b ::reg add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment" /v "PathTmp" /t REG_EXPAND_SZ /d "%MSMPI_BIN%;D:\Program Files\TortoiseGit\bin;C:\Program Files\TortoiseSVN\bin;%JAVA_HOME%;C:\Program Files\Azure Data Studio\bin;%BAT_HOME%;C:\Tmp1;" /f ::%MSMPI_BIN%;D:\Program Files\TortoiseGit\bin;C:\Program Files\TortoiseSVN\bin;%JAVA_HOME%;C:\Program Files\Azure Data Studio\bin;%BAT_HOME%;C:\Tmp1; ::%MSMPI_BIN%;D:\Program Files\TortoiseGit\bin;C:\Program Files\TortoiseSVN\bin;%JAVA_HOME%;C:\Program Files\Azure Data Studio\bin;%BAT_HOME%;C:\Tmp1;
=======================================================================================
[C语言和VBS]通过注册表配置环境变量并立即生效
最近开始学Java。我们主要学Java Application和Java Applet两个分类。为了在任意目录下都能编译和运行Java程序,需要对path和classpath环境变量进行相关设置。终于知道环境变量用处之一了。想用程序来实现一下设置环境变量。好不容易用注册表函数写好,结果不行。晕。。。后来想到应该要刷新一下。注销和重起都可以。但我想实现的是立即生效。后来上网搜了一下,得到如下结果: 通过修改注册表,修改了系统的环境变量,但是不会立即生效,除非在【我的电脑】上点击右键,然后打开环境变量的窗口,点击【OK】后,才能生效。后来用Spy++工具捕获消息,发现在点击【OK】按钮时,发送了WM_SETTINGCHANGE消息。 这里有两种方法可以实现: 1.SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,(LPARAM)TEXT("Environment")); 2.SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment", SMTO_ABORTIFHUNG, 5000, 0); 终于成功了,高兴哇。后来无意中发现用VBS配置环境变量并立即生效简单得要命,当场晕倒。。。 下面把两种实现方法都贴出来吧。
|
出处:http://www.360doc.com/content/09/1125/11/4910_9718032.shtml
=======================================================================================
批处理使用wmic命令,修改环境变量(加环境变量)
方法一:批处理中,修改环境变量,一次性有效(也就是在当前的脚本中有效)
CMD中运行
set path==%path%;d:/mypath
用 set path可以查看,当前的环境变量
方法二 :批处理中,修改环境变量,永久有效
::更改path环境变量值,新增e:\tools
wmic ENVIRONMENT where "name='path' and username='<system>'" set VariableValue="%path%;e:\tools"
另外介绍些关于wminc的用法(简单又实用)
::获取temp环境变量
wmic ENVIRONMENT where "name='temp'" get UserName,VariableValue
::新增系统环境变量home,值为%HOMEDRIVE%%HOMEPATH%
wmic ENVIRONMENT create name="home",username="<system>",VariableValue="%HOMEDRIVE%%HOMEPATH%"
::删除home环境变量
wmic ENVIRONMENT where "name='home'" delete
::获取temp环境变量
wmic ENVIRONMENT where "name='temp'" get UserName,VariableValue
::更改path环境变量值,新增e:\tools
wmic ENVIRONMENT where "name='path' and username='<system>'" set VariableValue="%path%;e:\tools"
::新增系统环境变量home,值为%HOMEDRIVE%%HOMEPATH%
wmic ENVIRONMENT create name="home",username="<system>",VariableValue="%HOMEDRIVE%%HOMEPATH%"
::删除home环境变量
wmic ENVIRONMENT where "name='home'" delete
一般来说,wmic创建或修改的系统变量不用重启windows生效,但如果你发现在DOS窗下检测不生效的话,你试着关闭 DOS窗,再检测一次.就生效了.
如果你的批处理想不关闭而直接让新的变量给下级程序应用可以这样写
view plaincopy to clipboardprint?
::检查path中有没有e:\tools(有就跳到run,没有就接着执行)
echo %path%|findstr /i "e:\tools"&&(goto run)
::先添加,防止没有时修改出错
wmic ENVIRONMENT create name="path",VariableValue="e:\tools;%path%"
::再修改,防止已有时添加出错
wmic ENVIRONMENT where "name='path' and username='<system>'" set VariableValue="e:\tools;%path%"
::再即时应用
set "path=e:\tools;%path%"
:run
start 程序.exe
::检查path中有没有e:\tools(有就跳到run,没有就接着执行)
echo %path%|findstr /i "e:\tools"&&(goto run)
::先添加,防止没有时修改出错
wmic ENVIRONMENT create name="path",VariableValue="e:\tools;%path%"
::再修改,防止已有时添加出错
wmic ENVIRONMENT where "name='path' and username='<system>'" set VariableValue="e:\tools;%path%"
::再即时应用
set "path=e:\tools;%path%"
:run
start 程序.exe
【出处】:https://www.cnblogs.com/wzxblog/p/5731699.html
=======================================================================================
使用wmic命令对环境变量进行配置
如何使windows系统环境变量的改变即时生效
在这里给出一种方案,使用wmic命令对JDK的环境变量进行配置,可即时生效,不用重启系统。该方法为本人在实际工作中实践出的方法,需要的朋友可以按照下文内容进行操作。
该命令使用批处理文件进行执行,其文件包的目录结构及文件内容如下:
目录结构:
------ JDK_Environment 文件夹
------ readme.txt 文本文档文件
------ JDK_Environment.bat 批处理文件
------ Step 文件夹------ JDK_Env_Step1.bat 批处理文件
------ JDK_Env_Step2.bat 批处理文件
文件:
文件1:readme.txt
位置:JDK_Environment 文件夹
内容:
==========使用wmic命令对JDK的环境变量进行配置,可即时生效,不用重启系统。==========
文件清单:
1. JDK_Environment.bat
文件类型:Windows批处理文件
文件说明:可直接执行该批处理,一步完成JDK环境变量的设置。
注:可直接使用JDK_Environment.bat,一步完成JDK环境变量的设置,
若使用Step文件夹中的批处理,则需按说明分步完成。
2. Step
文件类型:文件夹
文件说明:分步执行其中两份批处理文件,完成JDK环境变量的设置。
2.1 JDK_Env_Step1.bat
文件类型:Windows批处理文件
文件说明:首先执行,完成JDK环境变量设置的第一步,JAVA_HOME的设置。
2.2 JDK_Env_Step2.bat
文件类型:Windows批处理文件
文件说明:其次执行,继续完成JDK环境变量设置的第二步,path与CLASSPATH的设置。
注意:
1. 若在path与CLASSPATH变量值的设置时,使用了JAVA_HOME的引用%JAVA_HOME%,则需在不同的“命令提示符”窗口中,分别进行JAVA_HOME与他们俩的设置工作。(Step中的设置方式即为此种情况)
即:
打开“命令提示符”窗口A,在A中进行了JAVA_HOME的设置。
则,下一步path与CLASSPATH的设置,需要重新打开一新的“命令提示符”窗口B,在B中进行他们俩的设置。
原因:
A中窗口虽成功进行了JAVA_HOME的设置,但新设置的变量对当前A窗口并不生效,若继续在其中使用JAVA_HOME的引用%JAVA_HOME%,对path与CLASSPATH进行设置,则会发生找不到%JAVA_HOME%的错误。
解决方案:
1.1 JAVA_HOME与其它需要引用到它的变量,分别在不同窗口,严格按先后顺序进行设置。(见Step文件夹)
1.2 在path与CLASSPATH中不对%JAVA_HOME%进行引用,直接使用绝对路径。(见JDK_Environment.bat)
2.wmic中对原系统变量值的引用问题
例如:
对系统原Path变量的值进行了引用
::更新变量path,加入新值C:\Program Files\Java\jdk1.5.0_07\bin
wmic ENVIRONMENT where "name='path' and username='<system>'" set VariableValue="%path%;C:\Program Files\Java\jdk1.5.0_07\bin"
若用上面的顺序进行%path%的引用,即%path%;C:\Program Files\Java\jdk1.5.0_07\bin,%path%在增量之前,
增量C:\Program Files\Java\jdk1.5.0_07\bin之前需要要加分号,否则系统不会自动为其加上。
运行后效果如下:
若下面的顺序的进行%path%的引用,即%JAVA_HOME%\bin;%path%
::更新变量path,加入新值%JAVA_HOME%\bin
wmic ENVIRONMENT where "name='path' and username='<system>'" set VariableValue="%JAVA_HOME%\bin;%path%"
%path%在增量之后,增量%JAVA_HOME%\bin的后面要加一个分号,否则系统不会自动为其加上。
运行后效果如下:
C:\Program Files\Java\jdk1.5.0_07\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem
总结:无论增量与原变量引用之间先后顺序如何,他们之间都要添加分号进行分隔。
author:lioncode
date:2010/11/23 17:54
version:0.0.1
文件2:JDK_Environment.bat
位置:JDK_Environment 文件夹
内容:
::创建变量JAVA_HOME,值为C:\Program Files\Java\jdk1.5.0_07
wmic ENVIRONMENT create name="JAVA_HOME",username="<system>",VariableValue="C:\Program Files\Java\jdk1.5.0_07"
::更新变量path,加入新值C:\Program Files\Java\jdk1.5.0_07\bin
wmic ENVIRONMENT where "name='path' and username='<system>'" set VariableValue="%path%;C:\Program Files\Java\jdk1.5.0_07\bin"
::创建变量CLASSPATH,VariableValue等号后为其值。
wmic ENVIRONMENT create name="CLASSPATH",username="<system>",VariableValue=".;C:\Program Files\Java\jdk1.5.0_07\lib\dt.jar;C:\Program Files\Java\jdk1.5.0_07\lib\tools.jar;C:\Program Files\Java\jre1.5.0_07\lib\rt.jar"
文件3:JDK_Env_Step1.bat
位置:JDK_Environment /Step 文件夹
内容:
::创建变量JAVA_HOME,值为C:\Program Files\Java\jdk1.5.0_07
wmic ENVIRONMENT create name="JAVA_HOME",username="<system>",VariableValue="C:\Program Files\Java\jdk1.5.0_07"
文件4:JDK_Env_Step2.bat
位置:JDK_Environment /Step 文件夹
内容:
::更新变量path,加入新值%JAVA_HOME%\bin
wmic ENVIRONMENT where "name='path' and username='<system>'" set VariableValue="%JAVA_HOME%\bin;%path%"
::创建变量CLASSPATH,VariableValue等号后为其值。
wmic ENVIRONMENT create name="CLASSPATH",username="<system>",VariableValue=".;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;C:\Program Files\Java\jre1.5.0_07\lib\rt.jar"
==========================================================================================
下面是网阅的其他朋友解决此问题主要的几种方案,在此也给出大家作为参考。
理论阐述性技术贴:
在“我的电脑”->“属性”->“高级”->“环境变量”中增加或修改环境变量后,需重启系统才能使之生效。有没有什么方法可让它即时生效呢?下面介绍一种方法:
以修改环境变量“PATH”为例,修改完成后,进入DOS命令提示符,输入:set PATH=C: ,关闭DOS窗口。再次打开DOS窗口,输入:echo %PATH% ,可以发现“我的电脑”->“属性”->“高级”->“环境变量”中设置的 PATH 值已经生效。
不用担心DOS窗口中的修改会影响环境变量的值,DOS窗口中的环境变量只是Windows环境变量的一个副本而已。但是对副本的修改却会引发Windows环境变量的刷新,这正是我们想要的!
诡异啊,使用win+R->cmd 启动的cmd.exe 会发现在电脑属性中设置的环境变量立马生效了,在其他模式下启动的cmd却没有发生效果,怪哉!!查看了一下资料,在电脑属性中设置环境变量以后,以后启动的程序和线程会生效,而对以前驻留内存的程序不起作用,也有人说kill explorer.exe 再启动explorer.exe 可以激发设置其作用。
这里要理解的是,一个程序启动时,环境变量被复制到该程序所在的环境中,在该程序执行过程中不会被除该程序以外的其他程序所改变。也就是说,假设我们启动了一个cmd程序,然后通过控制面板修改了环境变量设置,但是已经启动了的cmd所拥有的环境变量并不会被改变。如果我们在修改环境变量之后启动cmd程序,则该程序将拥有新的环境变量。
那么结论就很明显了:修改环境变量之后,如果受影响的是应用程序,那么只要简单地重新启动此应用程序,环境变量的修改就会反映到该程序中,而不必重新启动计算机;但是,如果受影响的是系统服务,就必须重新启动才能将环境变量的修改反映到系统服务中(因为没有办法在不重启计算机的情况下重新启动系统服务管理器)。
方案一:修改注册表,并向系统广播消息
修改Windows环境变量后不重新启动使之立即生效的方法
不少程序需要添加各自的环境变量,方便定制性使用。用得最多的是用户指定目录如JAVA_HOME等变量,程序中可以根据获取变量%JAVA_HOME%,来获取对应设置的字符串。
一般做法是安装的时候就指定,或者程序中设定。
用批处理临时设置环境变量就不提了,这里讲让环境变量始终生效。
一般做法是修改环境变量注册表。
整个Windows都有效的环境变量在HKEY_LOCAL_MACHINESYSTEMControlSet001ControlSession ManagerEnvironment中设置
对当前用户有效的环境变量在HKEY_CURRENT_USEREnvironment中设置
其实只是简单的元数据
但往往修改玩后无法即时生效,往往需要重启系统。
要解决即时生效的问题,可以再在我的电脑属性中设置环境变量中确定一下即可。
依此看来,这个过程肯定是读取了注册表,再调用一个系统函数来更新整个系统的变量。一定可以编程解决的。
可惜网海茫茫,收不到。
一不做二不休,直接下载打开innosetup的代码,搜索Environment,果真找到了。
很简单:
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,LPARAM("Environment"), SMTO_ABORTIFHUNG, 5000, &MsgResult);
发一个全局的广播,等待各自相应后,立即生效。
{ Note: We originally used SendNotifyMessage to broadcast the message but it
turned out that while it worked fine on NT 4 and 2000 it didn't work on XP
-- the string "Environment" in lParam would be garbled on the receiving
end (why I'm not exactly sure). We now use SendMessageTimeout as directed
in the KB article 104011. It isn't as elegant since it could cause us to
be delayed if another app is hung, but it'll have to do. }
方案二:在高级属性中设置完毕后,在任意cmd下设置一次path的值,达到全局广播的目的
让环境变量生效不需重启Windows
可我搜索如何不需重启Windows让环境变量生效的方法,只找到三类方案:
下载一个专门的软件
编个小程序
修改注册表
我既然是个懒得重启Windows的人,难道我会不厌其烦按上述三种方法去做吗?没办法,我只有自己摸索。最后找到一个非常简单的在Windows下直接让环境变量生效的办法:
先到我的电脑>属性>高级>环境变量,添加新环境变量或修改已有的环境变量,然后运行“DOS命令提示符”或run cmd,假设要修改PATH变量,不管PATH的原值是什么,在DOS窗口直接把PATH修改为任意值,如:输入:set PATH=C:,关闭DOS窗口。再次打开DOS窗口,输入:echo %PATH% ,这时可以发现,我的电脑>属 性>高级>环境变量里PATH已经在Windows全局生效了。
不用担心在DOS窗口的修改会影响我的电脑>属性>高级>环境变量里的修改,DOS窗口的环境变量只是Windows环境变量的一个副本,副本的改动不会影响正本,但会触发正本的刷新,这正是我想要的——让环境变量生效。
方案三:
修改Windows环境变量并使之立即生效
一、环境变量的修改
(1)修改当前进程的某个环境变量:SetEnvironmentVariable。
(2)修改系统环境变量:在注册表HKEY_LOCAL_MACHINESystemCurrentCont rolSetControlSession ManagerEnvironment中修改。
(3)修改用户环境变量:在注册表中HKEY_CURRENT_USEREnvironment修改。
二、环境变量的生效
在网上搜了一下,有两种说法:
(1)SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,(LPARAM)TEXT("Environment"));
(2)SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,LPARAM("Environment"), SMTO_ABORTIFHUNG, 5000, &MsgResult);
没有尝试,先记在这儿。
==========================================================================================
下面是网阅的Windows官方资料,文档中阐述了环境变量更改后如何即时生效的原理。
出处:
微软帮助和技术支持
http://support.microsoft.com/kb/104011/zh-cn
容内:
注:(中文版-机器翻译)机器翻译无法保证原文的正确度,中文版之后已附上英文原版
您可以通过编辑以下注册表项修改用户环境变量:
HKEY_CURRENT_USER /
Environment
可以通过编辑以下注册表项来修改系统环境变量:
HKEY_LOCAL_MACHINE /
SYSTEM /
CurrentControlSet /
Control /
Session Manager /
Environment
注意必须作为 REG_EXPAND_SZ 注册表值在注册表中存储要扩展 (例如对于使用 %system%) 时需要的所有环境变量。不将从注册表读取时展开类型 REG_SZ 的任何值。
请注意 RegEdit.exe 没有一种添加 REG_EXPAND_SZ 的方法。 使用 RegEdt32.exe 手动编辑这些值时。
但是,请注意对环境变量所做的修改不会导致立即更改。例如对于如果对进行了更改之后启动另一个命令提示符,环境变量将反映上一个 (不在当前) 值。直到您先注销然后再次登录后,所做的更改不会生效。
若要影响这些更改,而无需注销、 WM_SETTINGCHANGE 向广播消息的所有窗口在系统中,因此,任何感兴趣的应用程序 (如 Windows 资源管理器、 程序管理器、 任务管理器、 控制面版和等中) 可以执行更新。
例如对于基于 Windows NT 的系统上下面的代码段应传播在命令提示符中使用的环境变量所做的更改:
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
(LPARAM) "Environment", SMTO_ABORTIFHUNG,
5000, &dwReturnValue);
无附带 Windows 95 和 Windows 98,包括 Windows 资源管理器和项目经理的应用程序的响应此消息。这样,Windows 95 和 Windows 98 上,从技术上讲是可以实现这篇文章时,除了要通知的第三方应用程序不起作用。更改在 Windows 95 的全局环境变量的唯一方法是修改 autoexec.bat 文件并重新启动。
英文原版:
地址:http://support.microsoft.com/kb/104011/en-us/
How to propagate environment variables to the system
You can modify user environment variables by editing the following Registry key:
HKEY_CURRENT_USER / Environment
You can modify system environment variables by editing the following Registry key:
HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Control / Session Manager / Environment
Note that RegEdit.exe does not have a way to add REG_EXPAND_SZ. Use RegEdt32.exe when editing these values manually.
However, note that modifications to the environment variables do not result in immediate change. For example, if you start another Command Prompt after making the changes, the environment variables will reflect the previous (not the current) values. The changes do not take effect until you log off and then log back on.
To effect these changes without having to log off, broadcast a WM_SETTINGCHANGE message to all windows in the system, so that any interested applications (such as Windows Explorer, Program Manager, Task Manager, Control Panel, and so forth) can perform an update.
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
(LPARAM) "Environment", SMTO_ABORTIFHUNG,
5000, &dwReturnValue);
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/17732982.html
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!