重启解决99%的问题

非常值得吐槽的是系统环境变量竟然就存储在一个文件里
在powershell里使用命令$env:Path即可查看文件内容
你甚至可以通过命令$env:Path += ";<路径>"来实现对path的增加(并不全局,见下文)

既然是文件,就会有一个很蛋疼的地方
——对单个软件(或者其他使用path的程序)来说不实时更新

比如说你打开了一个软件,这个软件需要你把某个路径加入path,这样软件才能正确调用

  • 首先你运行软件,发现报错了,显示找不到可执行文件
  • 然后你去搜了一下,发现是某个东西没加进path,软件检索不到
  • 于是你更改了path,但是没有重启软件,再次运行,还是检索不到
  • 这是因为软件启动时已经将path文件读入了,且不会故意再去读
  • 所以重启软件就能解决

但是更为惊喜的是我遇到的情况

  • 众所周知一些软件是可以唤出powershell的,比如我用的github desktop
  • 原本我认为powershell是单独的软件,启动时应该是自行初始化的
  • 但事实是,如果你不重启github desktop,无论你重启多少次powershell,这个powershell就是不更新path,甚至你调用$env:Path方法读取到的内容也没有更新
  • 也就是说,由软件唤起的powershell会继承软件的一部分数据,包括读取到的path
  • $env:Path方法并不是读取全局的path

经过一些调查可以发现
在 Windows 上,环境变量可以在三个作用域内定义:

  • 计算机(或系统)作用域
  • 用户范围
  • 流程范围

Process 作用域包含当前进程或 PowerShell 会话中可用的环境变量。 该变量列表继承自父进程,并由 Machine 和 User 作用域中的变量构造而成。

在 PowerShell 中更改环境变量时,更改仅影响当前会话。 此行为类似于 Windows 命令外壳中的 set 命令和基于 UNIX 的环境中的 setenv 命令的行为。 要更改 Machine 或 User 作用域中的值,必须使用 System.Environment 类的方法。

要更改计算机作用域的变量,还必须拥有相应权限。 如果你尝试在没有足够权限的情况下更改值,该命令将失败并且 PowerShell 将显示错误。