Ограничения на вложенность переменных среды Windows?

Итак, существует ли ограничение на то, насколько глубокие переменные среды могут быть вложены в 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

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

В любом случае, у меня есть GLEW_BIN_PATH и OSG_BIN_PATH в моей переменной PATH, и они отказываются расширяться. Это действительно разочаровывает, потому что dll там живет и, конечно, я могу получить evvvverything еще, чтобы расширить... любые мысли?

Изменить: я имею их в переменной PATH как:

[everything else....];%GLEW_BIN_PATH%;%OSG_BIN_PATH%

Поэтому я не вижу очевидной причины, чтобы они не расширялись..

Ответ 1

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

Windows расширяет и заполняет переменные Enviroment в лексикографическом порядке (: -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

Due VAR_03 не определяется при расширении VAR_02.

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

У меня был успех с побегом знака процента:

GLEW=%%THIRD_PARTY_ROOT%%\GLEW

THIRD_PARTY_ROOT=C:\dev\third-party

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

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

GLEW | %THIRD_PARTY_ROOT%\GLEW

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