为什么 Windows 对环境变量有限制?

Dou*_*des 16 windows-7 environment-variables

1024 个字符限制的技术原因是什么

在过去 3 年使用 Linux 后,很多 Windows 7 Pro 问题一直困扰着我的日常工作。最愚蠢的是文件名限制和环境变量忘记。我意识到 MSDN 说组合系统 ENV 的限制是 1024,但为什么呢?我有一个很大的用户路径变量集。它工作正常,除非我让它保持一段时间。然后突然它会停止识别 PATH 值,直到我重新启动。

Windows 如何存储会导致这种强加限制的 ENV 值?该值如何通过正常使用而损坏?

MSDN https://support.microsoft.com/en-us/kb/906469

更新 为了完整起见,我将描述我遇到上述问题的情况。我通常通过系统设置中的环境对话框设置用户环境路径。我在开发时运行的诸如 msbuild、vstest.console.exe、tf.exe 之类的东西。我几乎只在 ConEmu 中使用 PowerShell v4。几个小时或一天的正常运行时间后,这些命令将突然停止响应。通过 Env 对话框或命令行重置或更改值不会恢复功能。尽管回显 $env:PATH 将显示正确的值。重新启动是我找到的唯一解决方案。

Dav*_*ill 32

1024 个字符限制的技术原因是什么

您所指的限制不是 1024 字节。正如您链接到的文章中所述,这是一个错误,有可用的修补程序。

文章明确指出CreateEnvironmentBlock函数的限制为 2048 字节。

此外,该错误特定于两个旧版本的 Windows(XP 和 Server 2003)。

当应用程序调用 CreateEnvironmentBlock 函数在基于 Microsoft Windows Server 2003 或基于 Microsoft Windows XP 的计算机上检索环境变量时,返回的路径环境变量被截断为 1,024 字节。即使环境变量的最大大小为 2,048 字节,也会发生此行为。此问题会阻止应用程序获取正确的环境变量。

在基于 Windows Server 2003 或基于 Windows XP 的计算机上,返回的路径环境变量被截断为 1,024 字节


那么限制是 2048 个字符吗?

实际限制为 32,760 个字符。但是,您在实践中不太可能达到该理论最大值。

  • 批处理文件受最大命令行长度的限制,因为环境变量需要适合批处理器的命令行缓冲区。

    在运行 Microsoft Windows XP 或更高版本的计算机上,您可以在命令提示符下使用的字符串的最大长度为 8191 个字符。

    命令提示符会忽略从父进程继承并超过其自身 8191 个字符限制的任何环境变量。

  • 设置 Environment 注册表项在解析该注册表项并从中构建环境块的代码中具有 2048 个字符的限制。

来源记录如下。


该值 ( PATH)如何通过正常使用而损坏?

正如稍后所解释的,如果系统PATH被修改为超过 1920 个字符,就会发生这种情况。

您没有在问题中提供足够的信息来准确诊断为什么会发生这种情况。


我有一个很大的用户PATH变量集

PATH环境变量有特定限制。

为了使用户PATH变量与系统PATH变量成功合并,系统PATH变量必须< 1920 个字符。

发现在 Windows Server 2003 上,一旦系统 PATH 超过 1920 个字符,用户PATH环境变量不再与其合并来设置进程PATH环境变量,即使整个系统PATH(即使更大)也会包含在进程PATH变量中.

来源echo %PATH% 是否仅扩展到系统或用户变量?大卫赫弗南的回答


文件路径有什么限制?

最大路径长度限制

在 Windows API 中(以下段落中讨论的一些例外情况除外),路径的最大长度为 MAX_PATH,定义为 260 个字符。

  • 本地路径按以下顺序构造:驱动器号、冒号、反斜杠、由反斜杠分隔的名称组件和终止空字符。

  • 例如,驱动器 D 上的最大路径是D:\some 256-character path string<NUL>where<NUL>表示当前系统代码页的不可见终止空字符。(这里使用的字符< 和字符>是为了视觉清晰,不能是有效路径字符串的一部分。)

    注意:Windows API 中的文件 I/O 函数将“/”转换为“\”,作为将名称转换为 NT 样式名称的一部分,除非使用“\?\”前缀,如以下部分所述。

Windows API 有许多函数,这些函数也有 Unicode 版本,以允许最大总路径长度为 32,767 个字符的扩展长度路径。

  • 这种类型的路径由反斜杠分隔的组件组成,每个组件最多为 函数lpMaximumComponentLength参数中返回的值 GetVolumeInformation(该值通常为 255 个字符)。要指定扩展长度的路径,请使用“\?\”前缀。例如,“\?\D:\非常长的路径”。

注意:32,767 个字符的最大路径是近似值,因为“\?\”前缀可能在运行时被系统扩展为更长的字符串,并且这种扩展适用于总长度。

命名文件、路径和命名空间


环境变量的最大长度是多少?

环境变量的理论最大长度约为 32,760 个字符。但是,您在实践中不太可能达到该理论最大值。

  • 所有环境变量必须共同存在于单个环境块中,该块本身的限制为 32767 个字符。

  • 但该计数是所有环境变量名称和值的总和,所以我猜,如果您删除所有环境变量,然后使用真正巨大的 32,760 个字符的值设置一个名为 X 的单个变量,您可能会达到理论最大长度。

  • 在实践中,当然,您必须与块中的所有其他变量共享环境块,因此您SetEnvironmentVariable使用 32,760 个字符的字符串随机调用 不太可能成功。

但这并不是您唯一的实际限制。

  • 它还取决于您如何设置变量;即,您的环境变量设置技术在SetEnvironmentVariable调用之前通过的代码。

  • 如果您使用的是批处理文件,那么您将受到最大命令行长度的限制,因为环境变量需要适合批处理器的命令行缓冲区。

  • 另一方面,也许您正在设置 Environment 注册表项,在这种情况下,您会在解析该注册表项并从中构建环境块的代码中遇到 2048 个字符的限制。

  • 在交互式设置环境变量的对话框中也有一个限制,我不知道它的数值。

Source环境变量的最大长度是多少?作者:Raymond Chen(微软员工)。


命令提示符 ( Cmd.exe) 命令行字符串限制

在运行 Microsoft Windows XP 或更高版本的计算机上,您可以在命令提示符下使用的字符串的最大长度为 8191 个字符。在运行 Microsoft Windows 2000 或 Windows NT 4.0 的计算机上,您可以在命令提示符下使用的字符串的最大长度为 2047 个字符。

此限制适用于命令行、其他进程继承的单个环境变量(例如 PATH 变量)以及所有环境变量扩展。如果您使用命令提示符运行批处理文件,则此限制也适用于批处理文件处理。

例子

以下列表提供了一些示例,说明此限制如何应用于在命令提示符中运行的命令和在批处理文件中使用的命令。

  • 在命令提示符中,您在命令提示符下使用的以下命令行的总长度不能超过 2047 或 8191 个字符(取决于您的操作系统):

    cmd.exe /k ExecutableFile.exe parameter1, parameter2 ... parameterN
    
    Run Code Online (Sandbox Code Playgroud)
  • 在批处理文件中,您在批处理文件中使用的以下命令行的总长度不能超过 2047 或 8191 个字符(取决于您的操作系统):

    cmd.exe /k ExecutableFile.exe parameter1, parameter2 ... parameterN
    
    Run Code Online (Sandbox Code Playgroud)

    当您使用命令提示符运行批处理文件时,此限制适用于批处理文件中包含的命令行。

  • 在命令提示符中,展开 EnvironmentVariable2 和 EnvironmentVariable3 后 EnvironmentVariable1 的总长度不能超过 2047 或 8191 个字符(取决于您的操作系统):

    c:> set EnvironmentVariable1=EnvironmentVariable2EnvironmentVariable3
    
    Run Code Online (Sandbox Code Playgroud)
  • 在批处理文件中,在命令行中展开环境变量后,以下命令行的总长度不能超过 2047 或 8191 个字符(取决于您的操作系统):

    ExecutableFile.exe parameter1 parameter2
    
    Run Code Online (Sandbox Code Playgroud)
  • 即使 Win32 对环境变量的限制是 32,767 个字符,命令提示符也会忽略从父进程继承的任何环境变量,并且长于其自身的 2047 或 8191 个字符的限制(根据操作系统)。请参阅SetEnvironmentVariable 函数

命令提示符 (Cmd.exe) 命令行字符串限制