← Назад в блог

Сколько символов помещается в переменную окружения Windows?

Почему длинное значение может храниться в окружении, но не работать в cmd.exe.

Олег Данилов Автор Олег Данилов

Windows — очень забавная операционная система, полная внутренних противоречий. С длиной переменных окружения в ней давно не всё просто. RapidEE раньше отмечал как ошибку значения длиннее 2047 символов, а затем — 4096. Поэтому мне захотелось проверить, как обстоят дела в новых версиях Windows…

Я проверил Windows 11 (сборка 26200) и Windows Server 2022 (сборка 20348). Нативный SetEnvironmentVariableW на обеих машинах создал в окружении процесса временную переменную со значением в 1 000 000 символов, и PowerShell прочитал его целиком. Это наибольший размер, который я проверил. Пока выглядит неплохо.

Однако дальше начались чудеса.

  1. В моих тестах cmd.exe переставал надёжно раскрывать значения длиной около 8191 символа.
  2. PowerShell прочитал значение целиком. Однако Windows PowerShell 5.1 через Environment.SetEnvironmentVariable отказался создать значение длиной 32 767 символов, тогда как локальный PowerShell 7 создал значение в миллион символов.

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

Поэтому RapidEE теперь предупреждает, когда длина значения превышает 8191 символ, — это ориентир совместимости с cmd.exe.