Почему Windows вообще имеет ограничение на переменные среды?

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

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

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

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

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

27
задан DouglasCodes
15.12.2022 12:09 Количество просмотров материала 3225
Распечатать страницу

1 ответ

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

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

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

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

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

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


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

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

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

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

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

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

источники описаны ниже.


как бы это значение (PATH) повреждены при нормальном использовании?

как пояснили позже, это может произойти, если система PATH изменен, чтобы быть больше, чем 1920 символов.

вы не предоставили достаточно информации в своем вопросе для точного диагноза о том, почему это происходит.


у меня есть большой пользователь PATH переменная

существует определенный предел на PATH переменные среды.

для <пользователей!--5 -- > переменная для успешного слияния с системой PATH переменной системы PATH переменная должна быть < 1920 символов.

выяснил, что на Windows Server 2003, как только системный путь проходит 1920 символов, пользователь PATH переменная окружения больше не объединяется с ней для установки процесса PATH переменная окружения, даже если полная система PATH (даже если больше) будет включен в процесс PATH переменной.

Source расширяется ли echo %PATH% только до системных или пользовательских переменных? ответ David Heffernan


какие ограничения на путь к файлу?

Ограничение Максимальной Длины Пути

в Windows API (за некоторыми исключениями, описанными ниже абзацы), максимальная длина пути-MAX_PATH, который является определяется как 260 символов.

  • локальный путь структурирован в следующем порядке: буква диска, двоеточие, обратная косая черта, компоненты имени, разделенные обратной косой чертой, и a завершающий символ null.

  • например, максимальный путь на диске D D:\some 256-character path string<NUL> здесь <NUL> представляет незримый прекращать символ null для текущей системной кодовой страницы. (Символы < и > использованы здесь для визуально ясности и не могут быть частью действительного строка пути.)

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

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

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

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

Source именование файлов и имен


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

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

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

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

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

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

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

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

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

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

Source какова максимальная длина переменной среды? Рэймонда Чена (сотрудника 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.

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

20
отвечен DavidPostill 2022-12-16 19:57

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх