V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NewConn
V2EX  ›  Windows

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

  •  
  •   NewConn · 2022-02-25 11:05:57 +08:00 · 1802 次点击
    这是一个创建于 1032 天前的主题,其中的信息可能已经有所发展或是发生改变。

    系统版本: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

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

    6 条回复    2022-02-26 13:56:10 +08:00
    lonewolfakela
        1
    lonewolfakela  
       2022-02-25 11:18:27 +08:00
    单条环境变量是有字符数上限的(我忘了是 2048 还是 4096 了),装的东西比较多的话 PATH 变量很容易超过上限。这个情况有可能是到上限了。如果可以的话,把一部分 PATH 从系统 PATH 移动到用户 PATH 就好……或者删掉一些不需要的
    0TSH60F7J2rVkg8t
        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%

    这样可以缩短环境变量长度,节省空间。对于有大量重复目录的环境变量都可以做这样的修改。但需要注意,当对某些软件进行“修复”和“升级”的时候,可能会被那个软件写回完整的路径,到时候需要自己手工再次修改。
    NewConn
        3
    NewConn  
    OP
       2022-02-25 11:44:19 +08:00
    @lonewolfakela
    @ahhui
    我第二条其实就是建了一个新的环境变量名,缩短了 PATH 的长度。不过我也删了几个不用的 PATH 条目,我再观察一下后续状况。
    谢谢两位
    lonewolfakela
        4
    lonewolfakela  
       2022-02-25 12:08:03 +08:00
    @NewConn 你之前第二条方案没用是因为,你看你第一次被截断之后都只剩下个“D:”俩字符了,那第二次也被截断到只剩下“%N”俩字也很正常。另外这种把某个字段单独拉出来写成新的环境变量并不一定有用,有些情况下环境变量字符限制是按全部展开之后的字符来算的
    codehz
        5
    codehz  
       2022-02-25 14:02:23 +08:00 via Android
    主要是 win 的设置里的环境变量是分成系统的和用户的,一般程序只能读到合并好的结果(包括内部用其他环境变量展开的也会先解析好(
    这时候某些设计不良的软件再尝试 append 就会把所有内容重新附加到用户环境变量设置里,很容易就会超过限制了(
    ChaosesIb
        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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3174 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:55 · PVG 20:55 · LAX 04:55 · JFK 07:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.