Секреты Windows: Скрытые переменные

Источник: technet
Рэймонд Чен

Чтобы правильно встраивать переменные окружения друг в друга, надо всего лишь понимать последовательность операций.

Рэймонд Чен

В глубинах панели управления скрыто диалоговое окно Environment Variables. Чтобы его найти, перейдите в апплет панели управления System Properties. Затем встаньте на одну ногу, перейдите на вкладку Advanced и щелкните кнопку Environment Variables, произнося алфавит задом наперед.

Ну, пожалуй, не все эти действия так уж необходимы. Однако очевидно, что разработчики Windows не собирались предоставлять простой доступ к диалоговому окну Environment Variables обычным пользователям и, тем более, не рассчитывали на их понимание того, что оно делает.

При формировании среды для нового пользователя система обращается к параметрам, задаваемым в этом диалоговом окне, чтобы определить, какие переменные и с какими значениями добавить в среду. Общий принцип таков, что если переменная окружения определена в обоих разделах - User и System, - будет использоваться значение из раздела User.

Тем не менее, система не игнорирует переменные из раздела System полностью - они могут использоваться для определения переменных из раздела User. Люди часто стремятся, чтобы переменные окружения User основывались на переменных окружения System. Например, чтобы переменная PATH из раздела User представляла собой переменную PATH из раздела System, к которой добавлено еще несколько каталогов.

Вот как выполняется процесс формирования среды. Он, грубо говоря, состоит из четырех этапов.

  • Сначала система создает некоторые заранее определенные переменные окружения уровня компьютера, такие как SystemRoot и ALLUSERSPROFILE (но не COMPUTERNAME и ProgramFiles).
  • На втором этапе система создает переменные окружения из раздела System диалогового окна Environment Variables. В переменных окружения System можно использовать нотацию "%" для ссылки на заранее определенные переменные окружения, созданные на предыдущем этапе. Например, можно задать для переменной окружения System значение %SystemDrive%\Extras. Завершив формирование среды System, Windows приступает к формированию среды User.
  • Третий этап - формирование заранее определенных переменных уровня пользователя, таких как USERPROFILE и APPDATA. На этом же этапе создаются переменные, связанные с COMPUTERNAME и ProgramFiles, хотя с технической точки зрения это переменные System, а не переменные уровня пользователя.
  • Наконец, система создает переменные окружения для пользователя. Они находятся в разделе User диалогового окна Environment Variables и могут ссылаться на любые переменные, созданные на предыдущих трех этапах, так что можно задать для переменной окружения User значение %USERPROFILE%\Extras или значение собственной переменной System, определенное на втором этапе. Если переменная окружения User имеет такое же имя, что и переменная окружения System, новое значение замещает старое.

Замещение происходит после того, как система вычисляет новое значение, так что можно, например, определить значение переменной PATH из раздела User как %PATH%;C:\Extras. Переменная %PATH% будет ссылаться на версию переменной из раздела System. Теперь вам известно, что работает, и вы можете определить, что работать не должно: все то, что не было описано ранее как работающее.

Например, %SystemRoot% можно использовать везде. Любую переменную окружения System можно использовать для определения переменной окружения User. Можно также использовать заранее определенную переменную уровня пользователя для задания переменной окружения User. Но нельзя воспользоваться переменной окружения уровня пользователя для определения переменной окружения System. Время нельзя повернуть вспять.

У одного пользователя возникли проблемы, когда он задал для переменной PATH из раздела System  значение %APPDATA%;C:\Windows. Оказалось, что в полученной в результате среде путь просто содержал литеральное значение в том виде, в каком его задали (со знаками процента и прочим) - подстановка значения переменной окружения APPDATA не выполнилась. Если вы посмотрите приведенную выше последовательность этапов, причина будет очевидна. Пользователь пытался задать для переменной окружения System значение, основанное на еще не определенной переменной.

Решение несложно: отредактировать переменную PATH не в списке System, а в списке User. Тогда, если потребуется задействовать переменную %APPDATA%, эта переменная уже будет определена.

Код, формирующий среду User, мог бы строить сложный граф зависимостей. Тогда было бы можно реализовать специальный синтаксис, позволяющий при определении переменных объявлять, откуда берется значение %PATH% - из версии переменной PATH из раздела System или из раздела User. Было бы можно собирать всю эту информацию, строить граф зависимостей и корректно определять значения переменных в том порядке, в каком они зависят друг от друга. При этом пришлось бы решать, что делать при обнаружении циклических ссылок.

Но цель создания среды - не эмуляция механизма вычислений из области электронных таблиц. Требуется всего лишь создать блок переменных окружения по некоторой базовой информации, и благодаря простоте правил весь этот процесс оказывается несложным для описания и изучения. Неужели это так сложно понять?


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=32067