关于 Windows 10 环境变量的诡异情况 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NewConn
V2EX    Windows

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

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

    系统版本: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     Solana     2856 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 07:29 PVG 15:29 LAX 00:29 JFK 03:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86