关于win10的环境变量
win10中有两种环境变量
- 用户变量, 只针对当前用户有效
- 系统变量

优先级
经过一些测试得出如下结论:
虽然都是环境变量, 但是也有区别. 比如 Path 是一个特殊的环境变量. 看图, 在注册表中环境变量的类型有好多种

REG_SZ 是字符串类型 - 用户变量优先
针对这种情况, 用户变量优先, 系统同名变量忽略
REG_EXPAND_SZ 是 可扩充字符串值 - 系统优先
例如 Path, 像这种, 是将 系统+用户 拼接起来.

这种情况下, 通过此图不难得出 系统变量 优先于 用户变量 的结论
注意
针对可扩充类型环境变量, 貌似自定义无效.


重启计算机后
1 | PS D:\Users\foyou\TODO\PowerShell> $env:TesT |
环境变量对应的注册表位置
用户变量
1
计算机\HKEY_CURRENT_USER\Environment

系统变量
1
2
3
4
5
6
7
8
9
10HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment
# 这两个位置一摸一样, CurrentControlSet 映射于 ControlSet001
# 经过实验测试, 修改任意一个都可以
所以推荐:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
环境变量读取与临时修改
BAT
读取
加俩 % 即可
1 | D:\Users\foyou\TODO\PowerShell>echo %windir% |
修改
1 | D:\Users\foyou\TODO\PowerShell>set windir=123;%windir% |
Powershell
读
1 | PS D:\Users\foyou\TODO\PowerShell> $env:windir |
写
1 | PS D:\Users\foyou\TODO\PowerShell> $env:windir="123;$env:windir" |
其他
1 | [System.Environment]::SetEnvironmentVariable('test','test') |
全局修改(永久)环境变量
1 | # 系统类型设置, 需要管理员权限 |
或者改注册表也可以.
或者用调用其他语言的API.