Войти

Показать полную графическую версию : (статья) Переменные среды


Страниц : [1] 2 3

Vadikan
15-02-2006, 09:55
В этой статье будут рассмотрены два типа переменных, использующихся в командных (пакетных, исполняемых) файлах, оболочках программ выбора приложений для автоматической установки и тому подобных случаях для задания путей командам установки, копирования, перемещения, а также прочих операций, совершаемых над файлами. Использование абсолютных путей (c:\Documents and Settings\All Users\Рабочий стол) не всегда удобно (так как, например, мы не всегда заранее знаем, на каком диске у нас возникнет необходимость установить операционную систему), а при использовании пременных сред (%ALLUSERSPROFILE%\Рабочий стол) и локальных переменных, получается гораздо короче, удобнее и не привязывает к определенной букве диска.
Читать дальше... (http://oszone.net/display.php?id=3673)[hr]Статья основана на сообщении specialist (http://forum.oszone.net/member.php?userid=36355) в теме Маленькие Хитрости.

a1ex
15-02-2006, 22:01
А почему вдруг локальные переменные стали временными? Ведь время их жизни может быть таким же как и у системных ;). А локальные они потому, что существуют только в окружении конкретного CMD.

EgOrus
15-02-2006, 22:50
specialist
Vadikan
%ALLUSERSPROFILE%, %SYSTEMDRIVE%, %TEMP%, %PATH% и т.п. правильнее назвать не системными переменными, а переменными окружения или еще переменными среды. Причем если %ALLUSERSPROFILE% - это переменная среды пользователя, то %SYSTEMDRIVE% - системная переменная окружения.
Еще статью можно дополнить сторонними утилитами например setenv.exe, кот. позволяет создавать "не временные" переменные окружения различного типа (User Env, Machine Env, Def User Env) из ком строки с использованием все тех же переменных окружения.

Vadikan
15-02-2006, 22:51
a1ex
Логично. Я просто не в курсе как вообще в локализованой системе называются Environment Variables. Переменные среды? Тогда, наверное, статью надо назвать "Переменные среды и локальные переменные"?
/Не видел пост EgOrus

Vadikan
15-02-2006, 22:53
EgOrus
A setenv не тоже самое делает, что можно сделать добавив переменную через HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment ?

/статья исправлена

Petya V4sechkin
16-02-2006, 10:58
Vadikan
Если добавлять переменные через реестр, то они начинают действовать только после перезагрузки.
А setenv.exe или setx.exe делают их доступными уже в текущей сессии (но не в текущем процессе, почему-то, а во всех следующих процессах).

Вот еще ссылка по классификации переменных:
http://www.microsoft.com/technet/scriptcenter/guide/sas_wsh_kmmj.mspx

a1ex
16-02-2006, 11:09
Vadikan
А я же и не помню, как было в английской ;).В локализованной XP они называются системные и локальные.
А переменные окружения IMHO , это совокупность системных и локальных переменных, которые получает вновь запущенный CMD по наследству из родительского процесса.
EgOrus
Центр справки и подеержки XP с MUI говорит, что ALLUSERSPROFILE локальная, TEMP системная и пользовательская, SYSTEMDRIVE и PATH системные.

Vadikan
16-02-2006, 22:25
a1ex А переменные окружения IMHO , это совокупность системных и локальных переменных, которые получает вновь запущенный CMD по наследству из родительского процесса.Переменные среды = Environment Variables - это название кнопки и диалогового окна, вызываемого кликом по ней в свойствах системы - дополнительно. Я правильно, понимаю? Тогда новое название статьи "Переменные среды и локальные переменные" вполне верно отражает суть содержания. Ну можно изменить "среды" на "окружения", это все-таки не так ухо режет.
%allusersprofile% локальная? Меня вообще не удивляет разброс в переводах, т.к. они совсем необязательно делаются одним человеком.

Petya V4sechkin А setenv.exe или setx.exe делают их доступными уже в текущей сессии (но не в текущем процессе, почему-то, а во всех следующих процессах).
Пользовательской сессии, а не командной, так? Спасибо, я внесу это в статью. Ссылка тоже кстати, т.к. я собирался дополнить все это дело рассказом о импорте желаемых значений переменных на Т-12. Только как перевести Volatile... Непостоянные, наверное.

Petya V4sechkin
17-02-2006, 09:18
Vadikan
Нда, с классификацией переменных черт ногу сломит :) Одно дело - для пользователей, другое (по ссылке, что я приводил) - для программирования. К примеру, там переменные типа AllUsersProfile, UserProfile, SystemRoot, SystemDrive являются "переменными процесса" (и не относятся к "системным"). Хотя по обычной логике (не программистской :)) их хочется обозвать как раз системными.

Пользовательской сессии, а не командной, так?
Да, я имел в виду:
Сессия = пользовательская сессия;
Процесс = командная сессия.

Volatile, наверное, можно обозвать "переменными сессии пользователя" или просто "переменными сессии" (Applies to current logon session and is not saved between logoffs and restarts).

a1ex
17-02-2006, 11:44
Vadikan%allusersprofile% локальная? Меня вообще не удивляет разброс в переводах, т.к. они совсем необязательно делаются одним человеком.
Специально отключил MUI, в английской она тоже локальная. Короче там все переменные локальные, кроме системных. А системые есть встроенные , я так понимаю это типа TIME, и прописанные в кусте local_machine. Видимо allusersprofile прописывается в current_user.
Petya V4sechkinА setenv.exe или setx.exe делают их доступными уже в текущей сессии (но не в текущем процессе, почему-то, а во всех следующих процессах).
Для текущего процесса они забыли сделать простую команду set Variable=Value , можно добавить и самому ;).

Dirk Diggler
17-02-2006, 22:40
вообще, даже при обращении по переменной, не факт, что у пользователя "рабочий стол" называется "рабочий стол" и т.п., и в общем-то теряется весь смысл использования переменных. Точную инфу можно получить из ключей реестра по адресу
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
а задать эти значения - в HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

Vadikan
17-02-2006, 23:53
a1ex
Да, действительно, я сейчас нашел сам это в справке. Я понял логику :) Системные - возвращают одинаковые значения для всех пользователей, а локальные - возвращают различные значения, в зависимости от залогиненного пользователя (%username%, например). С %ALLUSERSPROFILE% действительно непонятно, что-то я сходу не нашел где она прописана. Может HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList, но это HKLM и прямо сейчас я уже не моуг экспериментировать.

Petya V4sechkin
С Volatile понятно. Да, я видел, что там страница про WSH и дальше второй таблицы не пошел :)

All
Расковыряли переменные :) Но надо как-то определяться с классификацией :) Значит от справки идет: Системные и Локальные (пользовательские). Это я могу отклассифицировать в статье легко. У нас еще есть Локальные, используемые в скриптах. И как нам их отделить от пользовательских? Может быть сделать так:

Введение
<..>

Переменные среды
Четко разделить приведенные примеры переменных на Системные и Локальные (пользовательские) в соотв. со справкой Виндовс и об'яснить в чем разница.

Использование переменных в командных файлах (вместо Локальные переменные)
Первый пример DEL /F /Q "%AllUsersProfile%\Главное меню\Активация Windows.lnk"
DEL /F /Q "%AllUsersProfile%\Главное меню\WindowsUpdate.lnk" и его описание пойдут сюда.

Далее сказать, что в командых файлах при помощи SET можно задавать любые переменные, действующие на протяжении командной сессии. Т.е. вообще не называть их Локальными, чтобы не было путаницы в статье :) И показать второй пример RunOnceEx, а затем третий.

Изменение переменных среды и добавление собственных переменных

Описать импорт в реестр:
HKCU\Environment
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment (кстати, если на Т-12 импортировать, то должно работать уже при первом входе)
HKCU\Volatile Environment
а также использование setenv http://forum.oszone.net/showthread.php?p=350590&highlight=temp#post350590

Возможно, придется добавить словарик - командная сессия, текущий сеанс, и т.д.

Остается только вопрос как изменить %USERPROFILE%, %ALLUSERSPROFILE% и т.п. Только нужно ли это вообще?


Dirk Diggler
Надо рассматривать статью в контексте автоматической установки, все-таки. Мало ли что там пользователь наворотил. Может он половину системных файлов удалил. Но мы же ему шансов не даем это проделать. А что он потом там наворотит - это проблема техподдержки :)

Petya V4sechkin
18-02-2006, 07:52
Vadikan
Описать импорт в реестр:
HKCU\Volatile EnvironmentНе, для Volatile это не надо (нет смысла).

Petya V4sechkin
18-02-2006, 09:02
Кстати, получается уже три классификации переменных :)

1) на вкладке "Свойства системы -> Переменные среды";
2) по ссылке (http://www.microsoft.com/technet/scriptcenter/guide/sas_wsh_kmmj.mspx), которую я приводил выше;
3) в Центре справки и поддержки.

Очевидно, первая является подмножеством второй. А вот третья стоит особняком. Может быть потому, что справку и поддержку делали совсем другие люди, не имевшие отношения к разработке операционной системы? :)

Так что самое главное - не запутать читателя статьи :) Может, так и написать, что существуют разные классификации?

Vadikan
19-02-2006, 23:17
В общем, я задействовал справку виндовс и постарался учесть все пожелания :) http://oszone.net/display.php?id=3673 Комментарии?

Dirk Diggler
20-02-2006, 00:38
в списке не указаны %programfiles%(которая просто упоминается в тексте) и %commonprogramfiles%.

Vadikan
20-02-2006, 07:18
Dirk Diggler
Да, вот о них и речь :) Почему-то они не упоминаются . Вообще, у меня не срастается классификация с об'яснением. http://tinyurl.com/9jduo

Системные переменные среды заданы заранее в операционной системе и доступны для всех процессов операционной системы Windows Server. Изменять эти переменные могут только пользователи с административными учетными данными. Эти переменные наиболее часто используются в сценариях входа в систему. Понятно, их можно менять, и лежат они в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment. Локальные переменные среды доступны, только когда пользователь, для которого они были созданы, вошел в систему. Локальные переменные из куста HKEY_CURRENT_USER подходят только для текущего пользователя, но определяют поведение глобальной среды операционной системы.Из этих двух предложений я не улавливаю являются ли выделенные вещи одним и тем же. В следующем списке представлены различные типы переменных в порядке убывания приоритета.
1. Встроенные системные переменные
2. Системные переменные куста HKEY_LOCAL_MACHINE
3. Локальные переменные куста HKEY_CURRENT_USER
Вроде проясняется. Видимо, локальные переменные сидят в HKCU и больше нигде. А что такое встроенные? Видимо те, что в HKLM лежат. Зачем два раза повторять? В тоже время, системные переменные менять можно, а как поменять локальную (в контексте статьи)? Даже если в HKLM зaгнать свою username, это не будет иметь эффекта. Получаетеся что локальные больше всего похожи на встроенные системные :))))))))))

%programfiles% - видимо системная, по тому принципу, раз путь переназначить можно и в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion он лежит.

amel27
20-02-2006, 10:17
Получается, что системные/локальные - это классификация по области видимости, а встроенные (aka расчётные)/пользовательские - по возможности напрямую создавать/изменять/удалять (в смысле без последствий :) ). Тогда USERNAME - это встроенная локальная... Возможно слишком вольно, зато логично. Хотя сочетание "Системная пользовательская" звучит несколько дико... :)

Vadikan
20-02-2006, 11:00
amel27Получается, что системные/локальные - это классификация по области видимости <...> Тогда USERNAME - это встроенная локальная...Да, получается так, и фактически локальные нельзя изменить, но тогда непонятно что означает 3. Локальные переменные куста HKEY_CURRENT_USERВероятно, в нашей классификации это должно быть такВ следующем списке представлены различные типы переменных в порядке убывания приоритета.
1. [Встроенные] локальные переменные
2. Системные переменные куста HKEY_LOCAL_MACHINE
3. Пользовательские переменные куста HKEY_CURRENT_USER
:) Поэтому я не стал это включать в статью... Это уже просто запредел. Хотя все-таки хотелось бы получить какой-то квалифицированный коментарий от МС :)

Добавил %PROGRAMFILES% и %COMMONPROGRAMFILES% в таблицу, хотя это похоже не совсем правильно. Там другие параметры реестра, и например setenv только импортирует в HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment и %PROGRAMFILES% не меняет, насколько я понял.

Короче, в параграфе Изменение реестра написал так
Пути, возвращаемые переменными %PROGRAMFILES% и %COMMONPROGRAMFILES%, можно изменить в параметрах ProgramFilesDir и CommonFilesDir в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion или через файл ответов.

Подутомила уже эта классификация ;)

amel27
20-02-2006, 11:42
Да, получается так, и фактически локальные нельзя изменитьПочему нельзя? Некоторые можно, например TEMP.
Пути, возвращаемые переменными %PROGRAMFILES% и %COMMONPROGRAMFILES%, можно изменить в параметрах ProgramFilesDir и CommonFilesDir в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion или через файл ответовПервый способ прямой, но запрещенный (для переименования каталога недостаточно), второй - правильный, но косвенный... Т.е. переменная является встроенной системной. Интересно как будет звучать этот же тезис для NUMBER_OF_PROCESSORS? ;)




© OSzone.net 2001-2012