7

Какие технические причины для ограничения 1024 символа

После использования Linux в течение последних 3 лет, многие проблемы с Windows 7 Pro беспокоили меня в моей повседневной работе. Наиболее бессмысленными являются ограничение имени файла и забывание переменной среды. Я понимаю, что MSDN говорит, что ограничение для объединенной системы ENV составляет 1024, но почему? У меня есть большая переменная пути пользователя. Это работает нормально, если я не оставлю это на некоторое время. Затем он внезапно перестанет распознавать значение PATH, пока я не перезапущу.

Как окна хранят значения ENV, которые могут привести к этому наложенному пределу? Как это значение может быть повреждено при обычном использовании?

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

Обновление Для полноты картины я опишу ситуации, с которыми сталкиваюсь в упомянутой проблеме. Я обычно задаю User Env PATH через диалог среды в настройках системы. Такие вещи, как msbuild, vstest.console.exe, tf.exe, которые я запускаю во время разработки. Я почти исключительно использую PowerShell v4 в ConEmu. Через несколько часов или день безотказной работы эти команды внезапно перестанут отвечать на запросы как распознанные. Сброс или изменение значений через диалог Env или командную строку не восстановит функциональность. Хотя отображение $ env:PATH покажет правильные значения. Перезапуск был единственным решением, которое я нашел.

1 ответ1

21

Какие технические причины для ограничения 1024 символа

Ограничение, на которое вы ссылаетесь, не составляет 1024 байта. Как объяснялось в статье, на которую вы ссылались, это была ошибка с доступным исправлением.

В статье прямо говорится, что ограничение для функции CreateEnvironmentBlock составляет 2048 байт.

Кроме того, ошибка была характерна для двух старых версий Windows (XP и Server 2003).

Когда приложение вызывает функцию CreateEnvironmentBlock для получения переменных среды на компьютере под управлением Microsoft Windows Server 2003 или Microsoft Windows XP, возвращаемая переменная среды пути усекается до 1024 байтов. Это происходит, даже если максимальный размер переменной среды составляет 2048 байт. Эта проблема не позволяет приложению получить правильную переменную среды.

Источник . Возвращаемая переменная среды пути усекается до 1024 байта на компьютере под управлением Windows Server 2003 или Windows XP


Так ли предел 2048 символов?

Фактический лимит составляет 32 760 символов. Однако вы вряд ли достигнете этого теоретического максимума на практике.

  • Пакетный файл ограничен максимальной длиной командной строки, поскольку переменная среды должна помещаться в буфер командной строки пакетного процессора.

    На компьютерах под управлением Microsoft Windows XP или новее максимальная длина строки, которую можно использовать в командной строке, составляет 8191 символ.

    Командная строка игнорирует любые переменные среды, которые унаследованы от родительского процесса и имеют более длительные ограничения, чем его собственные ограничения в 8191 символ.

  • Задание раздела реестра среды имеет ограничение в 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> где <NUL> представляет невидимый завершающий нулевой символ для текущей системной кодовой страницы. (Символы < и > используются здесь для наглядности и не могут быть частью допустимой строки пути.)

    Примечание. Функции файлового ввода-вывода в Windows API преобразуют «/» в «\» как часть преобразования имени в имя в стиле NT, кроме случаев использования «\?\"префикс, как описано в следующих разделах.

Windows API имеет много функций, которые также имеют версии Unicode, чтобы разрешить путь расширенной длины для максимальной общей длины пути 32 767 символов.

  • Этот тип пути состоит из компонентов , разделенных обратной косой черты, каждый до значения , возвращаемого в параметре lpMaximumComponentLength функции GetVolumeInformation (это значение обычно 255 символов). Чтобы указать путь расширенной длины, используйте "\?\" префикс. Например, "\?\D:\очень длинный путь ".

Примечание. Максимальный путь в 32 767 символов является приблизительным, поскольку "\?"\"Префикс может быть расширен системой до более длинной строки во время выполнения, и это расширение применяется к общей длине.

Файлы имен источников , пути и пространства имен


Какова максимальная длина переменной среды?

Теоретическая максимальная длина переменной среды составляет около 32 760 символов. Однако вы вряд ли достигнете этого теоретического максимума на практике.

  • Все переменные среды должны находиться вместе в одном блоке среды, который сам по себе имеет ограничение в 32767 символов.

  • Но это количество является суммой всех имен и значений переменных среды, поэтому, я думаю, вы можете достичь этой теоретической максимальной длины, если вы удалите все переменные среды и затем установите одну переменную с именем X с этим действительно огромным значением в 32 760 символов.

  • На практике, конечно же, вы должны совместно использовать блок окружения со всеми другими переменными в блоке, поэтому ваш случайный вызов SetEnvironmentVariable со строкой из 32 760 символов вряд ли будет успешным.

Но это не единственный практический предел.

  • Это также зависит от того, как вы устанавливаете переменную; т. е. код, через который проходит ваш метод установки переменных среды, прежде чем он попадет в вызов SetEnvironmentVariable .

  • Если вы используете пакетный файл, то вы ограничены максимальной длиной командной строки, поскольку переменная среды должна помещаться в буфер командной строки пакетного процессора.

  • С другой стороны, может быть, вы устанавливаете раздел реестра Environment, и в этом случае вы сталкиваетесь с ограничением в 2048 символов в коде, который анализирует этот раздел реестра и создает из него блок среды.

  • В диалоговом окне также есть ограничение для интерактивной установки переменных среды, числовое значение которых я не знаю, насколько мне известно.

Источник Какова максимальная длина переменной среды? Раймонд Чен (сотрудник Microsoft).


Ограничение строки командной строки (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
    
  • В пакетном файле общая длина следующей командной строки, которую вы используете в пакетном файле, не может содержать более 2047 или 8191 символов (в зависимости от вашей операционной системы):

    cmd.exe /k ExecutableFile.exe parameter1, parameter2 ... parameterN
    

    Это ограничение применяется к командным строкам, содержащимся в пакетных файлах, когда вы используете командную строку для запуска пакетного файла.

  • В командной строке общая длина EnvironmentVariable1 после развертывания EnvironmentVariable2 и EnvironmentVariable3 не может содержать более 2047 или 8191 символов (в зависимости от вашей операционной системы):

    c:> set EnvironmentVariable1=EnvironmentVariable2EnvironmentVariable3
    
  • В пакетном файле общая длина следующей командной строки после раскрытия переменных среды в командной строке не может содержать более 2047 или 8191 символов (в зависимости от вашей операционной системы):

    ExecutableFile.exe parameter1 parameter2
    
  • Несмотря на то, что ограничение Win32 для переменных среды составляет 32 767 символов, в командной строке игнорируются любые переменные среды, которые унаследованы от родительского процесса и имеют более длительные ограничения, чем 2047 или 8191 (в зависимости от операционной системы). Смотрите функцию SetEnvironmentVariable.

Ограничение строки командной строки исходного командного строки (Cmd.exe)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .