Сколько символов помещается в переменную окружения Windows?
Почему длинное значение может храниться в окружении, но не работать в cmd.exe.
Windows — очень забавная операционная система, полная внутренних противоречий. С длиной переменных окружения в ней давно не всё просто. RapidEE раньше отмечал как ошибку значения длиннее 2047 символов, а затем — 4096. Поэтому мне захотелось проверить, как обстоят дела в новых версиях Windows…
Я проверил Windows 11 (сборка 26200) и Windows Server 2022 (сборка 20348). Нативный SetEnvironmentVariableW на обеих машинах создал в окружении процесса временную переменную со значением в 1 000 000 символов, и PowerShell прочитал его целиком. Это наибольший размер, который я проверил. Пока выглядит неплохо.
Однако дальше начались чудеса.
- В моих тестах
cmd.exeпереставал надёжно раскрывать значения длиной около 8191 символа. - PowerShell прочитал значение целиком. Однако Windows PowerShell 5.1 через
Environment.SetEnvironmentVariableотказался создать значение длиной 32 767 символов, тогда как локальный PowerShell 7 создал значение в миллион символов.
В этих тестах мне удалось установить значение длиной в миллион символов, но у отдельных приложений и API есть собственные ограничения.
Поэтому RapidEE теперь предупреждает, когда длина значения превышает 8191 символ, — это ориентир совместимости с cmd.exe.
RapidEE
Автор