关于win10的环境变量

win10中有两种环境变量

  1. 用户变量, 只针对当前用户有效
  2. 系统变量

image-20201216142229038

优先级

经过一些测试得出如下结论:

虽然都是环境变量, 但是也有区别. 比如 Path 是一个特殊的环境变量. 看图, 在注册表中环境变量的类型有好多种

image-20201216153758268

  • REG_SZ 是字符串类型 - 用户变量优先

    针对这种情况, 用户变量优先, 系统同名变量忽略

  • REG_EXPAND_SZ可扩充字符串值 - 系统优先

    例如 Path, 像这种, 是将 系统+用户 拼接起来.

    image-20201216142729178

    这种情况下, 通过此图不难得出 系统变量 优先于 用户变量 的结论

注意

针对可扩充类型环境变量, 貌似自定义无效.

image-20201216154810738

image-20201216154847896

重启计算机后

1
2
PS D:\Users\foyou\TODO\PowerShell> $env:TesT
C:\Users\foyou\AppData\Local\Microsoft\WindowsApps;

环境变量对应的注册表位置

  1. 用户变量

    1
    计算机\HKEY_CURRENT_USER\Environment

    image-20201216144210915

  2. 系统变量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    HKEY_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
2
D:\Users\foyou\TODO\PowerShell>echo %windir%
C:\Windows

修改

1
2
3
4
D:\Users\foyou\TODO\PowerShell>set windir=123;%windir%

D:\Users\foyou\TODO\PowerShell>echo %windir%
123;C:\Windows

Powershell

1
2
PS D:\Users\foyou\TODO\PowerShell> $env:windir
C:\Windows

1
2
3
PS D:\Users\foyou\TODO\PowerShell> $env:windir="123;$env:windir"
PS D:\Users\foyou\TODO\PowerShell> $env:windir
123;C:\Windows

其他

1
2
[System.Environment]::SetEnvironmentVariable('test','test')
[System.Environment]::GetEnvironmentVariable('test')

全局修改(永久)环境变量

1
2
3
# 系统类型设置, 需要管理员权限
[Environment]::SetEnvironmentVariable('test', 'test', [System.EnvironmentVariableTarget]::Machine)
[Environment]::SetEnvironmentVariable("test", 'test', [System.EnvironmentVariableTarget]::User)

或者改注册表也可以.

或者用调用其他语言的API.