Также, переменные применяются для оптимизации кода - многократно
повторяющемуся параметру (например, разделе реестра) можно назначить
короткую переменную и использовать ее. В данной статье подробно
рассматриваются различные приемы работы с переменными, а также способы
изменения и создания новых переменных. Теперь обо всем по порядку.Классификация переменных средыСправка Windows различает два типа переменных среды: системные и локальные. Системные переменные возвращают одинаковые значения для всех пользователей. К примеру, %systemdrive%
- буква системного диска, и она для всех пользователей одинакова. А вот
значения, возвращаемые локальными переменными, варьируются в
зависимости от вошедшего в систему пользователя. Например, %userprofile% может возвращать C:\Documents and Settings\ТекущийПользователь, где ТекущийПользователь - название учетной записи пользователя. Узнать,
какие переменные среды в операционной системе вам доступны и какие
значения в данный момент им присвоены, вам поможет команда SET, запущенная из командной строки без параметров (Пуск – Выполнить – cmd – set).
В рамках данной статьи нас интересуют переменные, обозначающие путь к
различным папкам (каталогам). Чуть подробнее о некоторых из них ниже: Переменная | Тип | Описание | %SYSTEMDRIVE% | Системная | Возвращает имя диска, содержащего корневой каталог операционной системы Windows XP/2003 (т. е. системный корневой каталог). | %SYSTEMROOT%, %WINDIR% | Системная | Возвращает размещение корневого каталога операционной системы Windows XP/2003 | %PATH% | Системная | Указывает путь поиска для исполняемых файлов. | %PROGRAMFILES% | Системная | Указывает путь к каталогу установки программ (Program Files) | %COMMONPROGRAMFILES% | Системная | Указывает путь к общему каталогу программ (Program Files\Common Files). | %TEMP% и %TMP% | Системная и пользовательская | Возвращает
временные папки, по умолчанию используемые приложениями, которые
доступны пользователям, выполнившим вход в систему. Некоторые
приложения требуют переменную TEMP, другие — переменную TMP. | %USERPROFILE% | Локальная | Возвращает размещение профиля для текущего пользователя. | %ALLUSERSPROFILE% | Локальная | Возвращает размещение профиля "All Users". | %CD% | Локальная | Возвращает путь к текущей папке. | %APPDATA% | Локальная | Возвращает используемое по умолчанию размещение данных приложений. |
Использование переменных в пакетных файлахНачнем с простенького примера: DEL /F /Q "%AllUsersProfile%\Главное меню\Активация Windows.lnk" DEL /F /Q "%AllUsersProfile%\Главное меню\WindowsUpdate.lnk" DEL /F /Q "%systemroot%\system32\*.scr" В этом примере я удаляю вышеуказанные ярлыки, которые маячат перед глазами в меню Пуск, используя переменную %AllUsersProfile%, а также все файлы с расширением SCR из директории Windows\system32, используя переменную %SystemRoot%. Вместо DEL /F /Q, как вы понимаете, может быть все что угодно: от команды копирования COPY до команды запуска установки нужного нам приложения со всеми параметрами командной строки, если это потребуется. Во
всех командах я специально использовал "кавычки" – это не случайно.
Весь путь, включая переменные, надо заключать в кавычки, если вы
используете пути, содержащие пробелы. Даже если сама переменная кавычек
не содержит, после ее разбора системой в пути могут появится пробелы
(например, %ProgramFiles% в C:\Program Files). В любом случае кавычки лучше использовать – это является хорошим тоном оформления командных файлов. Как задать свои переменные Разобранный
выше пример использовал уже существующие переменные среды. И вы,
вероятно, обратили внимание на символы процентов, окружающие названия
переменных. Эти символы нужны для того, чтобы разрешить подстановку
значений переменной в командной строке или в пакетном файле. Символы
процентов указывают на то, что Cmd.exe
должна обратиться к значениям переменных, а не делать посимвольное
сравнение. Ниже вы увидите, как это работает. Задать свои переменные в
пакетном файле можно командой SET. Команда SETВы можете задать в командном файле свои переменные при помощи все той же команды SET. Чтобы добавить переменную, введите в командной строке: set имя_переменной=значение Чтобы отобразить переменную, введите в командной строке: set имя_переменной Чтобы удалить переменную, введите в командной строке: set имя_переменной= Например, SET mydir=D:\Files\Work задает переменную mydir, которая будет возвращать путь к указанной папке. Подробнее о команде вы можете прочитать из set /?. Важное примечание: переменные, задаваемые командой set, действуют лишь на протяжении командной сессии, в которой они были заданы. Эти
переменные могут быть созданы, к примеру, для любых путей, надо лишь
задать или найти алгоритм присвоения переменной в каждой частной
ситуации, пользуясь готовыми примерами или создавая свои на их основе.
Как правило, такие переменные создаются в текущей сессии командными
файлами с помощью некоторых операторов. Пример назначения переменных в файле RunOnceEx.cmd, импортирующем параметры в реестр @echo off SET KEY=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx SET i=100
REG ADD %KEY% /V TITLE /D "Installing Applications" /f
REG ADD %KEY%\%i% /VE /D "WinRar 3.51" /f REG ADD %KEY%\%i% /V 1 /D "%systemdrive%\install\Software\WinRar.exe /s" /f REG ADD %KEY%\%i% /V 2 /D "REGEDIT /S %systemdrive%\install\Software\rar_set.reg /s" /f SET /A i+=1 В данном скрипте командой SET задаются две переменных - %i% и %KEY%. Обратите внимание, что задаются они без символов процентов, а вот для обращения к ним %% уже нужны. Переменная %KEY%
служит для упрощения и оптимизации кода. Она остается неизменной на
протяжении текущей командной сессии, что избавляет от необходимости
каждый раз включать в код раздел реестра. Каждый раз, когда в коде
встречается %KEY%, будет происходить ее замена на HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx. А вот %i%
служит для последовательной нумерации разделов реестра. При начальном
значении 100 переменная увеличивается на единицу при помощи команды SET /A i+=1 после каждого блока команд, что дает последовательность 100, 101, 102 и т.д. Таким образом, строка REG ADD %KEY%\%i% /V 1 /D "%systemdrive%\install\Software\WinRar.exe /s" /f на самом деле отработает так REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\100 /V 1 /D "C:\install\Software\WinRar.exe /s" /f Обратите внимание, что во фрагменте файла также используется системная переменная %systemdrive%, которая соответствует букве системного диска. Пример назначения переменных в командном файле, устанавливающем приложение с CD: for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if exist %%i:\WIN51 set CDROM=%%i: start /wait “%CDROM%\INSTALL\DVDTools\NBRom\Nero.exe” В
этом примере для всех перечисленных дисков происходит поиск
определенного файла (WIN51). В случае его обнаружения на одном из
дисков, последнему присваивается переменная %CDROM%, а далее уже происходит установка программного обеспечения с использованием пути, заданного созданной переменной. Изменение переменных среды и добавление собственных переменныхКак уже было сказано выше, действие переменных, заданных командой set,
ограничивается текущей командной сессией. Если вы хотите получить из
временной переменной системную или пользовательскую, то надо ее
прописать в реестр. Сделать это тоже можно различными способами. Утилита setenvУтилита работает из командной строки (сайт, загрузить). Работать с утилитой очень просто (setenv /?). Пользовательские настройки: setenv -u имя_переменной значение Системные настройки: setenv -m имя_переменной значение Настройки Default User: setenv -d имя_переменной значение Настройки текущего пользовательского сеанса: setenv -v имя_переменной значение Допустим, если нужно получить переменную %temp% еще на стадии установки, то можно это проделать из cmdlines.txt, например: :: Creating and Setting Temp folder... md %systemdrive%\Temp setenv -u Temp %systemdrive%\Temp setenv -u Tmp %systemdrive%\Temp
Утилита
удобна тем, что после задания переменной ею можно пользоваться сразу.
Ну почти сразу - в следующей командной сессии. Чтобы использовать ее в
текущей сессии, можно задействовать старую знакомую команду set: :: Creating #EgOrus# var set EgOrus=D:\EgOrus setenv -u EgOrus %EgOrus% Импорт параметров в реестрЕсли
же пойти путем внесения изменений в реестр после первого входа в
систему, то переменные начнут "работать" только после перезагрузки или
завершения пользовательского сеанса. Конечно, в процессе автоустановки
можно импортировать желаемые параметры на Т-12 (см. статью Твики реестра)
и обойти данную проблему. Если же вы не собираетесь использовать
назначенную переменную в текущем пользовательском сеансе, то импорт в
реестр вас тоже может устроить. Процесс импорта REG-файлов описывать
повторно не буду, а рассмотрю команду REG ADD на конкретном примере. Допустим, вы заинтересованы иметь в системе переменную %CDROM%
на постоянной основе и установить ее в процессе установки приложений с
CD. Следуя коду, приведенному выше, нужно после определения переменной
назначить ее системной. for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if exist %%i:\WIN51 set CDROM=%%i: REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v cdrom /d %CDROM% /f После нахождения файла WIN51 диску, на котором он был найден, присваивается локальная переменная %CDROM%,
которая тут же и назначается в виде постоянной системной переменной
посредством импорта в реестр. Этот метод предложил в одной из тем на
конференции Oszone Sanja Alone.
Заодно вы узнали. где в реестре хранятся настройки системных
переменных. Настройки пользовательских переменных хранятся в
HKCU\Environment. Пути, возвращаемые переменными %PROGRAMFILES% и
%COMMONPROGRAMFILES%, можно посмотреть в параметрах ProgramFilesDir и
CommonFilesDir в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion, но
менять их там не следует. Каталоги установки программ (отличные от
%SystemDrive%\Program Files) нужно конфигурировать через файл ответов. РезюмеКомандная
оболочка Windows (cmd.exe) - это весьма мощный инструмент работы с
системой. При помощи пакетных файлов можно автоматизировать изрядное
количество задач, и именно поэтому они часто используются для
автоматической установки Windows. Умелое использование переменных в
пакетных файлах позволяет решать широкий спектр вопросов. Работа с
командной оболочкой становится более эффективной и одновременно
упрощается код пакетных файлов. Другие примеры использования переменных
вы можете найти на страницах сайта или форума. Все примеры,
использованные в этой статье, взяты из скриптов участников форума, за что им большое спасибо.
ТерминологияКомандная оболочка
— это отдельный программный продукт, который обеспечивает прямую связь
между пользователем и операционной системой. Текстовый пользовательский
интерфейс командной строки предоставляет среду, в которой выполняются
приложения и служебные программы с текстовым интерфейсом. cmd.exe
- интерпретатор команд, который командная оболочка ОС Windows
использует для перевода введенной команды в формат, понятный системе. К тексту ^ Командная сессия может инициироваться как запуском cmd.exe,
так и запуском пакетного файла. Иными словами создается текущая
командная оболочка. Соответственно выход из этой оболочки (к примеру,
окончание работы пакетного файла) завершает командную сессию. К тексту ^ Пользовательский сеанс (пользовательская сессия) начинается с момента входа пользователя в систему (log on) и завершается при выходе (log off). К тексту ^
Источник: http://www.oszone.net/3673 |