关于 Windows 10 环境变量的诡异情况

2022-02-25 11:05:57 +08:00
 NewConn

系统版本:Windows 10 企业版 21H2 19044.1566

问题是这样的:

  1. 本地D:\Software\nodejs安装 nodejs 后,在系统环境变量的PATH最后添加了一条D:\Software\nodejs(Windows 10 从哪个版本后,不用;区分了,它按条目分开,每个条目展示一行),使用 Windows Terminal 打开 powershell ,可以正常取到 npm ,但是过段时间后,就提示 npm 找不到了,看环境变量,nodejs 那一条只剩一个D:
  2. 昨天我又出现这种状况了,我改成加了一个名叫NODEJS_HOME的系统环境变量,然后在在系统环境变量的PATH最后添加了一条%NODEJS_HOME%,今早一看 npm 又找不到了,看环境变量只剩%N

目前我初步怀疑原因有两个:

  1. nodejs 本身的问题
  2. 系统环境变量最后一条的 bug

大家有遇到过这种状况吗?

1769 次点击
所在节点    Windows
6 条回复
lonewolfakela
2022-02-25 11:18:27 +08:00
单条环境变量是有字符数上限的(我忘了是 2048 还是 4096 了),装的东西比较多的话 PATH 变量很容易超过上限。这个情况有可能是到上限了。如果可以的话,把一部分 PATH 从系统 PATH 移动到用户 PATH 就好……或者删掉一些不需要的
0TSH60F7J2rVkg8t
2022-02-25 11:23:39 +08:00
老问题了,系统环境变量字符上限很容易在开发机器上出现,结果就是要么混乱,要么被截断。但是,貌似不会出现刚开始是好的,后面坏了的情况,因为坏了的情况一定是发生在修改环境变量的时候。所以考虑可能是某个第三方软件尝试把自己加到环境变量里的时候,自己的规则对长短做了截断,导致后续的失效。

解决办法就是:

1. 找出这个修改环境变量并导致截断的软件,删除之
2. 对环境变量里的路径做清理,将部分完整的路径,改换成其它“变量名”

对于 2 ,给个举例,比如下面是我的环境变量:
c:\windows\system32;d:\program files\some app

我可以把第二段单独声明成一个环境变量名,比如叫 SomeApp ,然后在系统环境变量 Path 里,修改如下:
c:\windows\system32;%SomeApp%

这样可以缩短环境变量长度,节省空间。对于有大量重复目录的环境变量都可以做这样的修改。但需要注意,当对某些软件进行“修复”和“升级”的时候,可能会被那个软件写回完整的路径,到时候需要自己手工再次修改。
NewConn
2022-02-25 11:44:19 +08:00
@lonewolfakela
@ahhui
我第二条其实就是建了一个新的环境变量名,缩短了 PATH 的长度。不过我也删了几个不用的 PATH 条目,我再观察一下后续状况。
谢谢两位
lonewolfakela
2022-02-25 12:08:03 +08:00
@NewConn 你之前第二条方案没用是因为,你看你第一次被截断之后都只剩下个“D:”俩字符了,那第二次也被截断到只剩下“%N”俩字也很正常。另外这种把某个字段单独拉出来写成新的环境变量并不一定有用,有些情况下环境变量字符限制是按全部展开之后的字符来算的
codehz
2022-02-25 14:02:23 +08:00
主要是 win 的设置里的环境变量是分成系统的和用户的,一般程序只能读到合并好的结果(包括内部用其他环境变量展开的也会先解析好(
这时候某些设计不良的软件再尝试 append 就会把所有内容重新附加到用户环境变量设置里,很容易就会超过限制了(
ChaosesIb
2022-02-26 13:56:10 +08:00
@lonewolfakela 单条环境变量的上限其实是 32760 字符,但总环境块的上限是 32767 ,cmd 上限是 8192 ,注册表和 ShellExecute 是 2048 ,所以最小上界还是 2048 字符。
详见 What is the maximum length of an environment variable? - The Old New Thing
aHR0cHM6Ly9kZXZibG9ncy5taWNyb3NvZnQuY29tL29sZG5ld3RoaW5nLzIwMTAwMjAzLTAwLz9wPTE1MDgz

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/836336

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX