Ограничения на вложенность переменных среды Windows? - PullRequest
10 голосов
/ 29 августа 2010

Итак, есть ли предел того, насколько глубоко переменные среды могут быть вложены в Windows?Я много занимаюсь разработкой и пытаюсь настроить свои среды разработки, и многие из них вкладываются друг в друга, т. Е.


GLEW=%THIRD_PARTY_ROOT%\GLEW
GLEW_1_5_5=%GLEW%\glew-1.5.5
GLEW_BIN_PATH=%GLEW_ROOT%\bin
GLEW_INCLUDE_PATH=%GLEW_ROOT%\include
GLEW_LIB_PATH=%GLEW_ROOT%\lib
GLEW_ROOT=%GLEW_1_5_5%

OSG=%THIRD_PARTY_ROOT%\OpenSceneGraph
OSG_2_8_3=%OSG%\OpenSceneGraph-2.8.3
OSG_BIN_PATH=%OSG_ROOT%\bin
OSG_INCLUDE_PATH=%OSG_ROOT%\include
OSG_LIB_PATH=%OSG_ROOT%\lib
OSG_ROOT=%OSG_2_8_3%

THIRD_PARTY_ROOT=C:\dev\third-party

Но у меня было чертовски много временизаставить их действительно расширяться должным образом.Некоторое время, когда я смотрел на выходные данные set, я просто получал то, что выглядело так, как будто они расширялись по порядку, и поэтому те, которые зависели от foo_ROOT, не расширялись должным образом.Я попытался включить отложенное расширение, но это не помогло, но перезапуск, похоже, ... так что, возможно, отложенное расширение потребовало перезагрузки.расширить.Это действительно расстраивает, потому что там находятся dll, и, конечно, я могу получить что-нибудь еще, чтобы расширить ... какие-нибудь мысли?

Редактировать: У меня есть они в переменной PATH как:

<code>[everything else....];%GLEW_BIN_PATH%;%OSG_BIN_PATH%

Так что я не вижу очевидной причины, препятствующей их расширению ..

Ответы [ 4 ]

13 голосов
/ 21 апреля 2014

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

Windows расширяет и заполняет переменные среды в лексикографическом порядке (: -O)

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

Пример: Следующее определение:

VAR_01=1
VAR_02=%VAR_01%-2
VAR_03=%VAR_02%-3

Производит

VAR_01 is 1
VAR_02 is 1-2
VAR_03 is 1-2-3

Но

VAR_01=1
VAR_02=%VAR_03%-2
VAR_03=%VAR_01%-3

Производит

VAR_01 is 1
VAR_02 is -2
VAR_03 is 1-3

Срок действия VAR_03 не определяется при расширении VAR_02.

1 голос
/ 31 августа 2010

Да, это сводит меня с ума. Полное воспроизведение:

Свойства системы, переменные среды, настроенные так:

one = c:
two = %ONE%\two
three = %TWO%\three

Затем нажмите OK и запустите cmd. Вот что я вижу:

C:\>set one
one=C:

C:\>set two
two=C:\two

C:\>set three
three=%TWO%\three

Эта ссылка объясняет для Vista, но не упоминает, что это происходит на Win7. http://support.microsoft.com/kb/911089

... Jonas

0 голосов
/ 28 июля 2016

У меня получилось успешно экранировать знак процента:

GLEW=%%THIRD_PARTY_ROOT%%\GLEW

THIRD_PARTY_ROOT=C:\dev\third-party

C:\>set GLEW
GLEW=C:\dev\third-party\GLEW

При просмотре переменной из окна Переменная среды Windows она будет отображаться как

GLEW | %THIRD_PARTY_ROOT%\GLEW

Примечание: Двойные знаки процента будут работать только внутри скрипта.При использовании в командной строке используйте символ выхода каретки (например, GLEW=^%THIRD_PARTY_ROOT^%\GLEW).

0 голосов
/ 30 августа 2010

Вы также сохранили все необходимые переменные в системных переменных?Потому что для расширения значений в системе должна быть «постоянная» память всех необходимых переменных.

Если вы делаете все это вместе в строке в командной строке, просто произносите X=somethingи Y=%X%;else, затем, когда вы устанавливаете путь в PATH=%PATH%;%Y%, оболочка расширяет значения всех переменных до и сохраняет новое значение PATH;но как только вы закроете окно командной строки, система полностью забудет% X% и% Y%.

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

Чтобы гарантировать, что вы сохраняете все переменные в системе, чтобы они оставались там послеперезагрузите компьютер, либо воспользуйтесь панелью управления системными свойствами, либо командой SETX.EXE .Если вы собираетесь использовать их в системном PATH (а не только в пути к учетной записи пользователя), вам нужно будет использовать SETX /M X=blah или нижнюю часть System Properties |Вкладка «Переменные среды» с меткой «Системные переменные».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...