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