设置环境变量遇到的bug或难题,cmd管理员方式与普通方式的区别
在使用mingw64的过程中,需要手工添加环境变量,作为一个懒人,这怎么可以呢?于是想用命令的方式实现,结果遇到问题了,死活实现不了,
之前用过tdm-gcc,人家的安装完就可以用,还有试用过rust,人家在安装程序中已经明确告诉了会在注册表添加修改路径(hkey_current_user\environment->path),也是安装完就可以用,
他们都是怎么实现的?搜遍全网,也没有找到解决方案,下面总结一下我的测试结论:
用户变量在 hkey_current_user\environment->path
系统变量在 hkey_local_machine\system\controlset001\control\session manager\environment
或者 hkey_local_machine\system\currentcontrolset\control\session manager\environment
controlset001:系统真实的配置信息。
currentcontrolset:运行时配置。windows启动时会从controlset001复制一份副本,作为操作系统当前的配置信息。
我们对于计算机配置所作的修改都是直接写入到 currentcontrolset,
在重启过程中,windows会用currentcontrolset的内容覆盖掉controlset001,以保证这两个控件组一致。
----------------------------------------------------------------------------------------------------------------------
在我的电脑->系统设置->环境变量界面,用户变量或系统变量的path字段,手工添加,输入设置的路径,
在注册表hkcu\environment(用户变量)、controlset001或currentcontrolset(系统变量)会立即出现,且在新打开的命令行窗口立即有效
而在cmd窗口中set设置的环境变量为临时变量,如:set path=%path%;c:\mingw64
结论:以命令行方式对环境变量的操作只对当前窗口的应用有效,关闭窗口即消失!
----------------------------------------------------------------------------------------------------------------------
@setx path "%path%;%~dp0bin" /m
/m:设置计算机环境(需以管理员权限运行),即系统变量,默认设置是用户环境,即用户变量。
尽管使用了/m,%path%本身还是会读取所有的变量,即系统变量和用户变量,还会把系统路径变量替换为具体值。
c:\windows\system32>setx mypath "%path%" /m
警告: 正保存的数据被裁断到 1024 字符。
成功: 指定的值已得到保存。
c:\windows\system32>setx path "%path%;c:\mingw64" /m
警告: 正保存的数据被裁断到 1024 字符。
成功: 指定的值已得到保存。
结论:可以设置成功系统变量,并进入注册表,但是默认是短字符串类型reg_sz,而系统的path是长字符串类型reg_expand_sz;
系统的reg_expand_sz类型path被替换为reg_sz类型path,被裁断造成路径丢失,此方法完全行不通。
------------------------------------------------------------------------------------------------------------------------------
在cmd命令行下使用wmic永久修改windows环境变量
wmic environment where name="temp" get username,variablevalue
修改 os 环境变量值为windows_nt,这会覆盖掉原有的变量值
wmic environment where name="os" set variablevalue="windows_nt"
新增系统环境变量 mytemp,值为 %os%%systemdrive%
wmic environment create name="mytemp",username="<system>",variablevalue="%os%%systemdrive%"
删除 mytemp 环境变量
wmic environment where "name='mytemp'" delete
用法说明:
1、where关键字后跟的参数必须是一个连续的字符串,如果参数字符串含有空格需要用英文双引号"将参数括起来,
若字符串中有多个限定词,比如既有 name 又有 username,则需要使用 and 关键字来连接这些限定词。
2、在读取环境变量值时不需要管理员权限,但在创建、写入环境变量值时必须具备管理员权限。
wmic environment where "name='path' and username='<system>'" set variablevalue="%path%;c:\mingw64"
结论:在新打开的命令行窗口有效,
%path%本身还是会读取所有的变量,即系统变量和用户变量,还会把系统路径变量替换为具体值,此方法不可取
------------------------------------------------------------------------------------------------------------------
直接修改注册表controlset001或currentcontrolset(或hkcu\environment),在系统设置-环境变量界面立即出现,
但命令行窗口中只有以管理员权限运行才生效,普通模式必须重启才能生效(不重启的话每次打开cmd都得执行set命令才生效)。
另:图形界面的路径删除后注册表和命令行窗口同时立即起作用,即路径同时消失,
但注册表删除后,图形界面立即有效即消失,只有管理员命令行窗口立即有效,普通模式路径仍然可用,必须重启才能生效消失
普通命令行窗口怎么才能立即生效呢,总是慢半拍,是何原因呢?有高手路过请赐教。