系统版本:Windows 10 企业版 21H2 19044.1566
问题是这样的:
D:\Software\nodejs
安装 nodejs 后,在系统环境变量的PATH
最后添加了一条D:\Software\nodejs
(Windows 10 从哪个版本后,不用;
区分了,它按条目分开,每个条目展示一行),使用 Windows Terminal 打开 powershell ,可以正常取到 npm ,但是过段时间后,就提示 npm 找不到了,看环境变量,nodejs 那一条只剩一个D:
了NODEJS_HOME
的系统环境变量,然后在在系统环境变量的PATH
最后添加了一条%NODEJS_HOME%
,今早一看 npm 又找不到了,看环境变量只剩%N
。目前我初步怀疑原因有两个:
大家有遇到过这种状况吗?
1
lonewolfakela 2022-02-25 11:18:27 +08:00
单条环境变量是有字符数上限的(我忘了是 2048 还是 4096 了),装的东西比较多的话 PATH 变量很容易超过上限。这个情况有可能是到上限了。如果可以的话,把一部分 PATH 从系统 PATH 移动到用户 PATH 就好……或者删掉一些不需要的
|
2
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% 这样可以缩短环境变量长度,节省空间。对于有大量重复目录的环境变量都可以做这样的修改。但需要注意,当对某些软件进行“修复”和“升级”的时候,可能会被那个软件写回完整的路径,到时候需要自己手工再次修改。 |
3
NewConn OP |
4
lonewolfakela 2022-02-25 12:08:03 +08:00
@NewConn 你之前第二条方案没用是因为,你看你第一次被截断之后都只剩下个“D:”俩字符了,那第二次也被截断到只剩下“%N”俩字也很正常。另外这种把某个字段单独拉出来写成新的环境变量并不一定有用,有些情况下环境变量字符限制是按全部展开之后的字符来算的
|
5
codehz 2022-02-25 14:02:23 +08:00 via Android
主要是 win 的设置里的环境变量是分成系统的和用户的,一般程序只能读到合并好的结果(包括内部用其他环境变量展开的也会先解析好(
这时候某些设计不良的软件再尝试 append 就会把所有内容重新附加到用户环境变量设置里,很容易就会超过限制了( |
6
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 |