Windows 10上环境变量过大

238

我最近从Windows 8.1升级到了Windows 10。

现在我想为我的Apache Maven新安装设置一个环境变量。

每次我创建用户变量后一切正常。然而,我还需要创建系统变量,在其中将bin目录附加到我已经在用户变量中创建的变量上作为“路径”。

但是,每次我这样做时,都会出现错误提示:“此环境变量太大”。因此,我无法创建路径。

我附上了这个错误的图片。

输入图片描述


49
希望他们有一天能解决这个问题。这种情况绝不应该发生。^^ - itmuckel
7
正确的解决方案是应用程序停止滥用PATH环境变量。 正确的解决方案已经存在将近20年了。但是让开发人员使用它就像拔牙一样困难。 - Ian Boyd
1
@IanBoyd - 将路径放入“应用程序路径”注册表区域是安装程序要做的事情。这不是大多数用户熟悉的内容。所以你指责我们开发人员是正确的。 :( - Jesse Chisholm
4
当然可以!如果您能说服工具编写者只在Windows中工作,永远不要在Linux上开始工作,那么就可以迁移到Windows和OS/X。而且上述列出的文件名中至少有两个来自微软。;-) ;-) ;-) - Jesse Chisholm
SQL Server Management Studio似乎在填充长路径的PATH变量方面特别糟糕。一个SSMS实例本身就会占用超过10%的PATH变量。 - Simon Elms
15个回答

229
当PATH环境变量的值过多时,会达到无法再添加更多值的点。尝试以下操作可以解决问题: 解决方案1:
  1. 创建一个新的系统环境变量,比如'NEWPATH'
  2. bin文件夹位置分配给'NEWPATH'
  3. 现在将'; %NEWPATH%'附加到PATH环境变量
如果仍然不起作用,请尝试将PATH环境变量中已经存在的一些部分复制到'NEWPATH',然后附加'NEWPATH'。 解决方案2: 检查PATH环境变量的值是否可以进行分组缩短路径。例如, C:\Program Files\Microsoft SQL Server\102\Tools\Binn;C:\Program Files\Microsoft SQL Server\102\DTS\Bin; 可以合并为 C:\Program Files\Microsoft SQL Server; 通过这种方式,您可以在固定长度的PATH变量中构建更多空间,并最终将bin目录位置调整到PATH中。

7
非常好用,谢谢!不过,使用 setx PATH 时需要小心,因为它会直接解析 %NEWPATH%,结果字符串可能再次过长... 因此,只应该使用对话框而不是命令行来采用这种方法。 - IceFire
3
这并不完全奏效:我正在使用MikTeX,它的pdflatex必须在PATH中,如果我把pdflatex的位置放到NEWPATH中,pdflatex就找不到了("the command pdflatex is not recognized")。 - Olorin
28
具有讽刺意味的是,微软 SQL Server 设置了很多路径变量,以至于它几乎填满了空间。我创建了一个 PATHS_MSSQL 变量,然后将 %PATHS_MSSQL% 添加到 PATH 变量中以取代它们。这样就释放了 PATH 变量中的大量空间。 - Steve Lloyd
1
寻找@steveLloyd评论的人,请看这里:https://superuser.com/questions/902907/do-i-need-sql-server-paths-in-my-path-environment-variable-for-it-to-work - Binoy
1
@SimonTewsi 环境变量在重新启动终端会话之前不会被重新读取。 - Cardin
显示剩余6条评论

98

有几种方法可以清理您的路径变量。最简单的方法是使用Rapid Environment Editor。这个免费实用程序将会:

  1. 删除重复路径(右键单击 → Cleanup Paths
  2. 删除不存在的文件夹(用红色显示,需要手动删除)
  3. 将长路径替换为短路径(右键单击 → long to short path)。

我按照上述步骤进行操作,并且只在最长的路径上使用第三步,直到路径变量大小再次得到控制。

如果您想进一步提高水平,这里有一个小型的C#工具,您可以修改它以实现其他逻辑。


5
您需要使用管理员权限运行Rapid Environment Editor。否则这些选项将被禁用。 - Tides

46

另一个解决方案,或者更是一个绕过 PATH 环境变量长度限制的解决方法,是使用PowerShell脚本来管理您的路径(添加、删除或更新);

  1. 通过单击“编辑文本”(请参见上面的屏幕截图),捕获当前 PATH 变量,并将其复制到剪贴板中并保存在文本文件中作为备份,以避免出现意外情况。这不是强制性的,但如果出现问题,它将允许您进行恢复。

  2. 现在,已经备份好了,将以下内容添加到新的 PowerShell (.ps1) 文件中(在下面的第一行中修改要添加的文件夹路径(+号后面的部分)):

$newPath = $env:Path + '; C:\Users\....\FirstFolderToAddToPath; C:\Users\....\SecondFolderToAddToPath;'

[Environment]::SetEnvironmentVariable("Path", $newPath, "Machine")

$env:Path = $newPath

在我尝试修改Windows 10界面后,由于路径长度限制丢失了大部分的路径变量,以下是我成功恢复(较长的)PATH变量的方法。


谢谢... 这很简单。好奇的是在第2行和第3行分配值之间有什么区别。 - Nayak
第三行将其设置为当前会话,第二行将其设置为机器默认值。 - Tetsujin no Oni
3
PS工作时间更长的路径,但传统的setx /m截断为1048个字符 :(. 您还可以在文本编辑器中编辑路径,然后只需执行[Environment]::SetEnvironmentVariable("Path", '\my\new;path1', "Machine")。您需要管理员Shell。 - Shital Shah
可以使用PS,但不能使用GUI。嗯,这有什么道理呢? 已点赞,谢谢! - Legends
脚本可以正常工作,但它也将用户变量路径(在我的用户帐户下)中定义的变量附加到系统路径中。 - Kunal

37

尝试使用RegEdit进行修改。在我的情况下,当长度大于3000时才有效。

按下Win+R,输入regedit以打开RegEdit。转到计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment,并修改Path的值为您的路径。然后重启计算机,应该就可以正常工作了。


1
这对我来说很好用。我认为它比其他方法更容易。 - shalitha senanayaka
尝试修改值,但出现错误:无法编辑路径:写入值的新内容时出错 - one-hand-octopus
当我重新启动电脑时,它可以正常工作。 - qleoz12

16

除了Swapnil的答案,请注意您可以修改Path环境变量的最大长度 - 否则该长度限制为2048个字符(而单个路径具有206个字符的历史限制)。

在Windows 10中,您可以通过将LongPathsEnabled注册表键设置为1来实现此目的,该键位于此处:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem

要访问注册表编辑器:Windows键 + R,键入Regedit

来源:Windows 10“启用NTFS长路径策略”选项丢失

还请查看此超级用户回答:一个回答 Windows 10“启用NTFS长路径策略”选项丢失

请注意,“环境变量过大”错误与整个变量相关,而不是当前正在添加的单个路径(以回答下面的“不准确的建议”评论)。

附加说明:应用程序兼容性

LongPathsEnabled相关的注册表键/组策略中的文本如下:

启用NTFS长路径将允许显式申明了long path的Win32应用程序和Windows Store应用程序访问超出每个节点正常260字符限制的路径。启用此设置将使长路径可在进程内访问。

这里的警告是术语显式申明。一般来说,应用程序需要在清单文件中明确声明功能;自Windows Vista以来的大多数Win32应用程序都已成为显式申明。要使用长路径,应用程序清单需要一个longPathAware元素:

<application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
        <ws2:longPathAware>true</ws2:longPathAware>
    </windowsSettings>
</application>

更多信息在此处

一些用户抱怨Windows资源管理器和其他应用程序尚未支持LongPathsEnabled,虽然通常可以找到工作替代方案。例如,在这篇论坛帖子中,一个用户说:

唯一支持长路径和长文件名的资源管理器替代品是总指挥。它还允许编辑文件名和打开/处理文件,如果接受应用程序也使用扩展API函数。
记事本似乎支持。MKVtoolnix也是。令人惊讶的是,即使多年未被开发,MPC-HC也支持。不出所料,糟糕的VLC不支持(严肃吗?),可爱的PotPlayer也不支持。

此外,还有一个有趣的SuperUser讨论。特别是,这个答案描述了使用Cygwin(一个*nix仿真层)或使用NTFS Junction Points(实质上是链接,像符号链接)拆分长路径的两个可行替代方案。


23
这个建议准确吗?PATH 变量(即多个路径的连接)的最大长度是 2048 个字符。你提到的 260 个字符是一个路径的最大长度。它们有关联但不同。 - Hendy Irawan
是的,这是准确的。我最初错误地写下了Path变量的长度为260,但我编辑了帖子以进行更正。单个路径具有206的历史限制,而Path变量的总长度为2048,后者的限制可以根据说明进行修改。 - alelom
1
一句警告。第二个超级用户答案下的评论说:值得注意的是,大多数程序(包括Windows资源管理器)尚未识别长文件路径功能。 - Simon Elms
@SimonTewsi 谢谢,我已经添加了一个部分来详细说明那一点。 - alelom

11

我将所有路径都改为变量形式,包括Program Filesprogramdata(后者只省了一个字符,但不太重要)。

例如对于Node.js,我将普通路径

C:\Program Files\nodejs\

改为

%ProgramFiles%\nodejs\

同样,对于"C:\Program Files (x86)",也可以使用"%ProgramFiles(x86)%"来代替。

虽然这样做只省了几个字符,但足以避免出现问题。


9
为什么不直接使用%x86%代替"C:\Program Files (x86)",使用%x64%代替"C:\Program Files"呢?这似乎是减少字符开销的更好方法。 - Xorcist
1
@Xorcist - 不错!我之前不知道那些。 - mark1234
我认为它们不会默认存在,但你可以自己创建它们。 - Gabriel Fair
我也是这样做的,我为“C:\Program Files”创建了%PF%,并使用它约20次,使路径缩短了足够多。 - UnDiUdin
1
@Xorcist,通过创建另一个变量来完成这个操作是怎么做的? - Demodave
@Demodave,前往“环境变量”窗口,点击“新建...”按钮,添加名称为“x86”,值为“%ProgramFiles(x86)%”;然后添加名称为“x64”,值为“%ProgramFiles%”。(注意:已经打开的任何命令窗口中都不会出现新变量。) - pbarney

8

我发现你可以通过PowerShell实现。

[System.Environment]::SetEnvironmentVariable("PATH", "C:\Program Files (x86......etc.....", "Machine")

所以我获取了现有的系统路径,将其复制到Notepad中,添加了我的新内容,然后将其粘贴到上面的"C:\Program Files"部分。路径已更新。完成。

1
您需要以管理员身份运行PowerShell。 - TTT
1
我也做过那件事,但我只是粘贴了我的路径,结果所有的路径都被删除了。真是太愚蠢了。 - Pawel

4

显然,Rapid Environment Editor可以为您完成此操作(来自Shital Shah的答案),但您还可以将路径缩短为其8.3文件名版本。仅使用这四个替换,您就可以获得很多收益:

C:\Program Files       --> C:\PROGRA~1
C:\Program Files (x86) --> C:\PROGRA~2
C:\Users\vd-wps\AppData\Roaming --> %APPDATA%
C:\Users\vd-wps\AppData\Local --> %LOCALAPPDATA%

如果你将当前路径复制到记事本中,请先搜索并替换C:\Program Files (x86),然后再替换C:\Program Files


2
我最初尝试了这种方法,但随着系统和应用程序更新使用非 8.3 路径将路径添加回来(可能是在发现该字符串不存在于路径中后),我的路径慢慢增长并出现了重复条目。最终结果是路径比起我开始时更长,并需要手动清理。 - Steve Hollasch

2

除了其他方法(例如PowerShell),我发现有一个不错的GUI界面,"Rapid Environment Editor"可以处理更大的文本值。

最初的回答:除了其他方法(如PowerShell),我发现一个很好用的GUI界面,叫做“Rapid Environment Editor”,它可以处理更大的文本值。

2

解决方法:

请重新启动系统。重新启动后,PATH不再为空,但可能会被截断为2047(4095)个字符。

如果重新启动系统无法解决问题,请执行以下操作:

启动 C:\windows\system32\regedit.exe。进入注册表项"HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"并从“Path”键中清除不必要的目录。然后重新启动系统。

注意:在某些特殊情况下,如果系统无法启动,请执行以下操作:

  • Login in the safe mode

  • Open the command prompt shell and type:

     reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d ^%SystemRoot^%\system32;^%SystemRoot^% /f
    

更多详情请参考:

系统 PATH 变量长度的限制


如何将限制增加至至少 4095 - Dan M.
1
警告!最后一个 reg add 语句将覆盖您现有的路径变量,并且它们将永久丢失。在运行该命令之前最好先备份它们,以便您可以返回并手动修复问题。以下是如何备份的方法:reg export "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" path.tmp /y & type path.tmp|find "Path"|find "C:\\Windows" > path.txt & del path.tmp 您的旧路径将在 path.txt 中。 - pbarney
1
原来在intel.com上的文章已经无法访问。这是存档版本:系统PATH变量长度限制 - Bass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接