Блог об операционных системах, програмном обеспечении и прочем... Командная строка получить переменные среды


[CMD] Переменные среды в командной строке

Переменные средыАвтор: specialist, Вадим Стеркин aka VadikanИсточник​Переменные среды, используемые в пакетных (командных) файлах, позволяют обходиться без указания абсолютных путей к директориям. Например, если нам заранее неизвестна буква системного диска, мы всегда можем использовать переменную %systemdrive%, возвращающую букву диска, на котором установлена ОС. Также, переменные применяются для оптимизации кода - многократно повторяющемуся параметру (например, разделе реестра) можно назначить короткую переменную и использовать ее. В данной статье подробно рассматриваются различные приемы работы с переменными, а также способы изменения и создания новых переменных. Теперь обо всем по порядку.

Классификация переменных средыСправка Windows различает два типа переменных среды: системные и локальные. Системные переменные возвращают одинаковые значения для всех пользователей. К примеру, %systemdrive% - буква системного диска, и она для всех пользователей одинакова. А вот значения, возвращаемые локальными переменными, варьируются в зависимости от вошедшего в систему пользователя. Например, %userprofile% может возвращать C:\Documents and Settings\ТекущийПользователь, где ТекущийПользователь - название учетной записи пользователя.

Узнать, какие переменные среды в операционной системе вам доступны и какие значения в данный момент им присвоены, вам поможет команда SET, запущенная из командной строки без параметров (Пуск – Выполнить – cmd – set). В рамках данной статьи нас интересуют переменные, обозначающие путь к различным папкам (каталогам). Чуть подробнее о некоторых из них ниже:

Использование переменных в пакетных файлах Начнем с простенького примера:

CMD/BATCH:

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 имя_переменной= Например,задает переменную mydir, которая будет возвращать путь к указанной папке. Подробнее о команде вы можете прочитать из set /?.

Важное примечание: переменные, задаваемые командой set, действуют лишь на протяжении командной сессии (см. ниже), в которой они были заданы.

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

Пример назначения переменных в файле RunOnceEx.cmd, импортирующем параметры в реестр

CMD/BATCH:

@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 /?).

Допустим, если нужно получить переменную %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. Следуя коду, приведенному выше, нужно после определения переменной назначить ее системной.

CMD/BATCH:

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. Умелое использование переменных в пакетных файлах позволяет решать широкий спектр вопросов. Работа с командной оболочкой становится более эффективной и одновременно упрощается код пакетных файлов. Другие примеры использования переменных вы можете найти на страницах сайта или форума. Все примеры, использованные в этой статье, взяты из скриптов участников форума OsZone.ru, за что им большое спасибо.

ТерминологияКомандная оболочка — это отдельный программный продукт, который обеспечивает прямую связь между пользователем и операционной системой. Текстовый пользовательский интерфейс командной строки предоставляет среду, в которой выполняются приложения и служебные программы с текстовым интерфейсом.

cmd.exe - интерпретатор команд, который командная оболочка ОС Windows использует для перевода введенной команды в формат, понятный системе.

Командная сессия может инициироваться как запуском cmd.exe, так и запуском пакетного файла. Иными словами создается текущая командная оболочка. Соответственно выход из этой оболочки (к примеру, окончание работы пакетного файла) завершает командную сессию.

Пользовательский сеанс (пользовательская сессия) начинается с момента входа пользователя в систему (log on) и завершается при выходе (log off).

safezone.cc

отображение и изменение переменных среды окружения Windows

&nbsp &nbsp Команда SET используется для просмотра и изменения переменных среды окружения в командной строке Windows. Переменные окружения - это переменные, принимаемые значения которых характеризуют среду, в которой выполняется текущая программа - пути системных файлов, сведения об аппаратных средствах, каталоги пользователя и т.п. Значения переменных среды формируются в процессе загрузки Windows, регистрации пользователя в системе, при выполнении отдельных процессов или с помощью команды SET. Для просмотра значения, принимаемого конкретной переменной можно воспользоваться командой :

SET переменная SET PATH - отобразить значение переменной PATH Для создания новой переменной, или изменения значения существующей, используется команда :

SET переменная=строка

переменная - Имя переменной среды.строка - Строка символов, присваиваемая указанной переменной.

SET MyName=Vasya - установить значение переменной MyName

SET path=C:\progs;%path% - изменить значение переменной PATH, добавив в начало строки C:\progs

Значение, принимаемое переменной , доступно для обработки в командных файлах, при использовании ее имени, заключенного в знаки процента - % . Например команда выдачи текста на дисплей ECHO в виде:

ECHO date - выведет на экран слово "date", а команда ECHO %date% выведет на экран значение переменной date, т.е. текущую дату в формате операционной системы.

Команда SET без параметров используется для вывода текущих значений переменных среды.

ALLUSERSPROFILE=C:\ProgramData APPDATA=C:\Users\Usr\AppData\Roaming CommonProgramFiles=C:\Program Files\Common Files COMPUTERNAME=TEST7 ComSpec=C:\windows\system32\cmd.exe FP_NO_HOST_CHECK=NO HOMEDRIVE=C: HOMEPATH=\Users\Usr LOCALAPPDATA=C:\Users\Usr\AppData\Local LOGONSERVER=\\TEST7 NUMBER_OF_PROCESSORS=2 OS=Windows_NT Path=C:\windows\system32;C:\windows; PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS; .VBE;.JS;.JSE;.WSF;.WSH;.MSC PROCESSOR_ARCHITECTURE=x86 PROCESSOR_IDENTIFIER=x86 Family 15 Model 3 Stepping 4, GenuineIntel PROCESSOR_LEVEL=15 PROCESSOR_REVISION=0304 ProgramData=C:\ProgramData ProgramFiles=C:\Program Files PROMPT=$P$G PSModulePath=C:\windows\system32\Windows PowerShell\v1.0\Modules\ PUBLIC=C:\Users\Public SystemDrive=C: SystemRoot=C:\windows TEMP=C:\Users\Usr\AppData \Local\Temp TMP=C:\Users\Usr\AppData \Local\Temp USERDOMAIN=test7 USERNAME=Usr USERPROFILE=C:\Users\Usr windir=C:\windows

Кроме переменных, отображаемых в списке, при вызове команды SET, существуют и другие, значения которых изменяется динамически:

%CD% - принимает значение текущего каталога.%DATE% - принимает значение текущей даты.%TIME% - принимает значение текущего времени. %RANDOM% - значение случайного числа в диапазоне между 0 и 32767.%ERRORLEVEL% - текущее значение ERRORLEVEL, специальной переменной, которая используется в качестве признака результата выполнения программы.%CMDEXTVERSION% значение версии расширенной обработки команд CMD.EXE.%CMDCMDLINE% - раскрывается в исходную командную строку, которая вызвала командный процессор .

Если при вызове команды SET указать только часть имени, то будет выведен список переменных, имена которых начинаются с указанной строки. Например:

SET U - выведет значения всех переменных, имена которых начинаются с 'U'.

Команда SET поддерживает два дополнительных ключа:

SET /A выражение

SET /P variable=[promptString]

Ключ /A указывает, что строка справа от знака равенства является числовым выражением, значение которого вычисляется. Обработчик выражений очень прост и поддерживает следующие операции, перечисленные в порядке убывания приоритета:

() * / % + -> & ^ | = *= /= %= += -= &= ^= |= >= , - группировка - арифметические операторы - арифметические операторы - двоичный сдвиг - двоичное И - двоичное исключающее ИЛИ - двоичное ИЛИ - присвоение

- разделитель операторов

При использовании любых логических или двоичных операторов необходимо заключить строку выражения в кавычки. Любые нечисловые строки в выражении рассматриваются как имена переменных среды, значения которых преобразуются в числовой вид перед использованием. Если переменная с указанным именем не определена в системе, вместо нее подставляется нулевое значение. Это позволяет выполнять арифметические операции со значениями переменных среды, причем не нужно вводить знаки % для получения значений. Если команда SET /A вызывается из командной строки, а не из пакетного файла, она выводит окончательное значение выражения. Слева от любого оператора присваивания должно стоять имя переменной среды. Числовые значения рассматриваются как десятичные, если перед ними не стоит префикс:

0x - для шестнадцатеричных чисел0 - для восьмеричных чисел.

Пример использования префиксов:

SET /A REZ=0xA+012 ECHO %REZ%

В данном командном файле значение переменной REZ вычисляется сложением числа 10, представленного в шестнадцатеричном виде ( 0xA ) и числа 10 , представленного в восьмеричном ( 012 ).

Ключ /P позволяет установить значение переменной для входной строки, введенной пользователем. Показывает указанное приглашение promptString перед чтением введенной строки. Приглашение promptString может быть пустым. Данный ключ позволяет организовать диалог с пользователем в командном файле: @ECHO OFF SET /P NAME=Введите имя пользователя: SET /P pass=Введите пароль: ECHO Имя пользователя - %NAME% , Пароль - %PASS%

В командных файлах довольно часто требуется работать с частью значения, принимаемого переменной, для чего используются подстановочные значения:

переменная:строка1=строка2 - заменяет в принимаемом значении переменной строку1 на строку2

Следующий командный файл использует замену символа "точка" на символ "тире" в значении переменной, соответствующем текущей дате:

@ECHO OFF set tm=%DATE% ECHO Дата1 = %tm% SET tm=%DATE:.=-% ECHO Дата2 = %tm%

Для выделения части значения, принимаемого переменной, используется следующая конструкция:

переменная:~x,y - где x - число пропускаемых символов от начала строки, а y - количество символов, используемых в качестве значения переменной.

Следующий пример использует отображение текущего времени без секунд и долей секунд (только первые 5 символов из стандартного значения переменной TIME):

@ECHO OFF set tm=%TIME% ECHO Время1 = %tm% SET tm=%TIME:~0,5% ECHO Время2 = %tm% Если значение y ( длина ) не указана, то используется оставшееся до конца строки значение переменной. Если значение y отрицательно, то используется часть строки значения переменной от конца. Предыдущий пример можно изменить , указав, что в принимаемом значении времени отбрасываются 6 символов от конца: @ECHO OFF set tm=%TIME% ECHO Время1 = %tm% SET tm=%TIME:~0,-6% ECHO Время2 = %tm% Возможно использование число пропусков не задано, и используется отрицательное число, то принимаемое значение будет частью переменной от конца строки:

%PATH:~-10% - извлечет последние 10 символов переменной PATH

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

%PATH:~0,-2% эквивалентно %PATH:~,-2%

При использовании переменных окружения в командных файлах существует определенное ограничение, связанное с тем фактом, что присваиваемое значение остается без изменения при его модификации внутри группы команд, задаваемой скобками, например в командах IF или FOR . Для обхода данного ограничения используется запуск командного процессора с параметром /V:ON и вместо знаков процента, для получения принимаемого переменной значения, используются восклицательные знаки. Кроме того, существует возможность использовать стандартный запуск командного процессора, но с локальным включением данного режима командой :

Setlocal EnableDelayedExpansion

Разница в результатах использования значений переменных довольно наглядно демонстрируется следующим командным файлом:

Setlocal EnableDelayedExpansion @ECHO OFF set VAR=before if "%VAR%" == "before" ( set VAR=after if "!VAR!" == "after" @echo Со знаком процента=%VAR% , Со знаком вопроса=!VAR! ) Команда set VAR=after выполняется внутри подпрограммы, ограниченной скобками и, если убрать команду Setlocal EnableDelayedExpansion или не использовать для получения значения переменной VAR восклицательные знаки, ее значение останется старым ( тем, что было установлено до входа в подпрограмму ). Аналогичная же проблема наблюдается и тогда, когда значение переменной изменяется внутри цикла команды FOR. Например, для получения списка файлов текущего каталога такой командный файл не будет работать:

set LIST= for %%i in (*) do set LIST=%LIST% %%i echo %LIST%

Значение переменной LIST внутри цикла изменено не будет. Для того, чтобы это произошло, командный файл нужно изменить следующим образом:

Setlocal EnableDelayedExpansion set LIST= for %%i in (*) do set LIST=!LIST! %%i echo %LIST% Теперь, значение переменной LIST внутри цикла FOR будет изменяться, последовательно принимая значения имен файлов, разделенных пробелом ( set LIST=!LIST! %%i)

ab57.ru

command-line - Список всех переменных среды из командной строки?

Я хотел бы знать, возможно ли из командной строки Windows перечислить ВСЕ переменные среды.

Что-то эквивалентное powershell gci env: (или ls env: или dir env:).

задан Nicola Cossu 16 марта '11 в 18:222011-03-16 18:22 источник поделиться

Просто сделай

SET

Вы также можете сделать SET prefix, чтобы увидеть все переменные с именами, начинающимися с prefix.

например, если вы хотите читать только derbydb из переменных окружения, выполните следующие действия:

set derby

и вы получите следующее:

DERBY_HOME=c:\Users\amro-a\Desktop\db-derby-10.10.1.1-bin\db-derby-10.10.1.1-bin ответ дан Jon 16 марта '11 в 18:242011-03-16 18:24 источник поделиться

У Джона есть правильный ответ, но для разработки немного больше с некоторым синтаксическим сахаром.

SET | more

позволяет вам видеть переменные на одну страницу за раз, а не на весь лот, или

SET > output.txt

отправляет вывод в файл output.txt, который вы можете открыть в блокноте или что-то еще...

источник поделиться

Просто запустите set из cmd.

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

ответ дан Grant Thomas 16 марта '11 в 18:272011-03-16 18:27 источник поделиться

Я бы сказал, что команда SET действительно не печатает все переменные среды. Например, мы можем повторять такие переменные, как CD, DATE, TIME, но они не указаны в выводе SET.

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

ответ дан Ievgen 30 сент. '13 в 20:142013-09-30 20:14 источник поделиться

Вы можете использовать SET в cmd

Чтобы показать текущую переменную, достаточно SET

Чтобы показать определенную переменную типа "PATH", используйте SET PATH.

Для получения справки введите set /?.

ответ дан Boyce Field 13 янв. '15 в 9:572015-01-13 09:57 источник поделиться

не теряйте время для поиска в реестре

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"

возвращает меньше заданной команды

ответ дан Paweł Piwowar 06 февр. '17 в 16:002017-02-06 16:00 источник поделиться

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

set [environment_varible], чтобы получить определенную переменную со значением.

set [environment_varible]= может использоваться для удаления переменной из пространства.

ответ дан Abhishek Gurjar 24 марта '17 в 7:442017-03-24 07:44 источник поделиться

qaru.site

windows - Есть ли команда для обновления переменных среды из командной строки в Windows?

Вы можете захватить переменные системной среды скриптом vbs, но вам нужен сценарий bat, чтобы фактически изменить текущие переменные среды, поэтому это комбинированное решение.

Создайте файл с именем resetvars.vbs содержащий этот код, и сохраните его на пути:

Set oShell = WScript.CreateObject("WScript.Shell") filename = oShell.ExpandEnvironmentStrings("%TEMP%\resetvars.bat") Set objFileSystem = CreateObject("Scripting.fileSystemObject") Set oFile = objFileSystem.CreateTextFile(filename, TRUE) set oEnv=oShell.Environment("System") for each sitem in oEnv oFile.WriteLine("SET " & sitem) next path = oEnv("PATH") set oEnv=oShell.Environment("User") for each sitem in oEnv oFile.WriteLine("SET " & sitem) next path = path & ";" & oEnv("PATH") oFile.WriteLine("SET PATH=" & path) oFile.Close

создайте другое имя файла resetvars.bat, содержащее этот код, в том же месте:

@echo off %~dp0resetvars.vbs call "%TEMP%\resetvars.bat"

Когда вы хотите обновить переменные среды, просто запустите resetvars.bat

Апологетика :

Две основные проблемы, с которыми я столкнулся с этим решением, были

а. Я не мог найти простой способ экспортировать переменные среды из сценария vbs обратно в командную строку и

б. переменная среды PATH представляет собой конкатенацию пользователя и системных переменных PATH.

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

Я использую странный vbs + bat + временный механизм bat, чтобы обойти проблему экспорта переменных из vbs.

Примечание : этот скрипт не удаляет переменные.

Вероятно, это можно улучшить.

ADDED

Если вам нужно экспортировать среду из одного окна cmd в другой, используйте этот скрипт (назовем его exportvars.vbs ):

Set oShell = WScript.CreateObject("WScript.Shell") filename = oShell.ExpandEnvironmentStrings("%TEMP%\resetvars.bat") Set objFileSystem = CreateObject("Scripting.fileSystemObject") Set oFile = objFileSystem.CreateTextFile(filename, TRUE) set oEnv=oShell.Environment("Process") for each sitem in oEnv oFile.WriteLine("SET " & sitem) next oFile.Close

Запустите exportvars.vbs в окне, из которого вы хотите экспортировать, затем переключитесь в окно, в которое хотите экспортировать, и введите:

"%TEMP%\resetvars.bat"

code-examples.net

WindowsFAQ.ru

Переменная

Тип

Описание

%ALLUSERSPROFILE%

Локальная

Возвращает размещение профиля «All Users».

%APPDATA%

Локальная

Возвращает используемое по умолчанию размещение данных приложений.

%CD%

Локальная

Возвращает путь к текущей папке.

%CMDCMDLINE%

Локальная

Возвращает строку команд, с помощью которой был запущен данный экземпляр Cmd.exe.

%CMDEXTVERSION%

Системная

Возвращает номер версии текущих расширений обработчика команд.

%COMPUTERNAME%

Системная

Возвращает имя компьютера.

%COMSPEC%

Системная

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

%DATE%

Системная

Возвращает текущие данные. Использует тот же формат, что и команда date /t. Создается командой Cmd.exe.

%ERRORLEVEL%

Системная

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

%HOMEDRIVE%

Системная

Возвращает имя диска локальной рабочей станции, связанного с основным каталогом пользователя. Задается на основании расположения основного каталога. Основной каталог пользователя указывается в оснастке «Локальные пользователи и группы».

%HOMEPATH%

Системная

Возвращает полный путь к основному каталогу пользователя. Задается на основании расположения основного каталога. Основной каталог пользователя указывается в оснастке «Локальные пользователи и группы».

%HOMESHARE%

Системная

Возвращает сетевой путь к общему основному каталогу пользователя. Задается на основании расположения основного каталога. Основной каталог пользователя указывается в оснастке «Локальные пользователи и группы».

%LOGONSEVER%

Локальная

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

%NUMBER_OF_PROCESSORS%

Системная

Задает количество процессоров, установленных на компьютере.

%OS%

Системная

Возвращает имя операционной системы. При использовании Windows 2000 имя операционной системы отображается как Windows_NT.

%PATH%

Системная

Указывает путь поиска для исполняемых файлов.

%PATHEXT%

Системная

Возвращает список расширений файлов, которые рассматриваются операционной системой как исполняемые.

%PROCESSOR_ARCHITECTURE%

Системная

Возвращает архитектуру процессора. Значения: x86, IA64.

%PROCESSOR_IDENTFIER%

Системная

Возвращает описание процессора.

%PROCESSOR_LEVEL%

Системная

Возвращает номер модели процессора, установленного на компьютере.

%PROCESSOR_REVISION%

Системная

Возвращает номер модификации процессора.

%PROMPT%

Локальная

Возвращает параметры командной строки для текущего интерпретатора. Создается командой Cmd.exe.

%RANDOM%

Системная

Возвращает произвольное десятичное число от 0 до 32767. Создается командой Cmd.exe.

%SYSTEMDRIVE%

Системная

Возвращает имя диска, содержащего корневой каталог Windows XP (т. е. системный каталог).

%SYSTEMROOT%

Системная

Возвращает размещение системного каталога Windows XP.

%TEMP% и %TMP%

Системная и пользовательская

Возвращает временные папки, по умолчанию используемые приложениями, которые доступны пользователям, выполнившим вход в систему. Некоторые приложения требуют переменную TEMP, другие — переменную TMP.

%TIME%

Системная

Возвращает текущее время. Использует тот же формат, что и команда time /t. Создается командой Cmd.exe.

%USERDOMAIN%

Локальная

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

%USERNAME%

Локальная

Возвращает имя пользователя, выполнившего вход в систему.

%USERPROFILE%

Локальная

Возвращает размещение профиля для текущего пользователя.

%WINDIR%

Системная

Возвращает размещение каталога операционной системы.

www.windowsfaq.ru

создание или изменение переменных среды окружения Windows

&nbsp &nbsp Команда SETX используется для создания новых и изменения существующих переменных среды окружения в командной строке Windows. Переменные окружения, это переменные, принимаемые значения которых характеризуют программную среду, в которой выполняется текущая программа - пути системных файлов, сведения об аппаратных средствах, каталоги пользователей и т.п. Значения переменных среды формируются в процессе загрузки Windows, регистрации пользователя в системе, при выполнении отдельных программ или с помощью команды SET. Команда SetX, является более мощным средством администрирования Windows, позволяющим изменять системные или пользовательские переменные не только на локальном компьютере, но и на удаленном. Переменные можно задавать с помощью аргументов, параметров реестра или ввода из файла. В отличие от команды SET, изменения переменных окружения, сделанные командой SetX, записываются в реестр и действуют не только в данном сеансе командной строки, но и в любом другом. Первоначально, утилита SetX.exe входила в состав Windows 2000 Resource Kit в качестве дополнительного средства системного администрирования, но начиная с Windows Vista - входит в стандартный пакет поставки системы.

Используются три варианта синтаксиса команды SetX:

Синтаксис 1:

SETX [/S система [/U [домен\]пользователь [/P [пароль]]]] var значение [/M]

Синтаксис 2:

SETX [/S система [/U [домен\]пользователь [/P [пароль]]]] var /K путь [/M]

Синтаксис 3:

SETX [/S система [/U [домен\]пользователь [/P [пароль]]]] /F файл {var {/A x,y | /R x,y строка}[/M] | /X} [/D разделители]

Параметры командной строки:

/S система - Имя или IP-адрес удаленного компьютера. Если не указан, то команда выполняется по отношению к локальному компьютеру.

/U домен\]пользователь - Пользовательский контекст, в котором должна выполняться эта команда.

/P пароль - Пароль для этого пользовательского контекста.

var - Задаваемая переменная среды.

значение - Значение, назначаемое переменной среды.

/K путь - Задание переменной по информации, cодержащейся в параметре реестра. Путь должен задаваться в формате куст\раздел\...\параметр. Например, HKEY_LOCAL_MACHINE\System\ CurrentControlSet\Control\timeZoneInformation\StandardName.

/F файл - Имя текстового файла, который следует использовать.

/A x,y - Задание абсолютных координат файла (строка X, элемент Y) как параметров поиска в файле.

/R x,y строка - Задание координат относительно значения "строка" как параметров поиска.

/M - Указание создания переменной среды на системном уровне (HKEY_LOCAL_MACHINE). По умолчанию переменная среды создается в разделе HKEY_CURRENT_USER на уровне пользователя.

/X - Отображение содержимого файла с координатами x,y.

/D разделители - Указание дополнительных разделителей, таких как "," или "\". Встроенные разделители: символы пробела, табуляции, возврата каретки и перевода строки. Дополнительным разделителем может быть любой знак ASCII. Максимальное число разделителей, включая встроенные, равняется 15. Вывод справки по использованию.

Примечания.

1) SETX записывает переменные в главную среду в реестре.

2) На локальном компьютере переменные, созданные или измененные данным средством, будут доступны в будущем окне командной строки, но не в текущем окне CMD.exe.

3) На удаленном компьютере переменные, созданные или измененные данным средством, будут доступны со следующего сеанса входа.

4) Допустимые типы параметров реестра: REG_DWORD, REG_EXPAND_SZ, REG_SZ, REG_MULTI_SZ.

5) Поддерживаемые кусты: HKEY_LOCAL_MACHINE (HKLM), HKEY_CURRENT_USER (HKCU).

6) Разделители определяются с учетом регистра.

7) Значения типа REG_DWORD извлекаются из реестра в десятичном формате.

Значения переменных окружения ( Environment variables ) записываются в реестр:

Пользовательские переменные - в раздел : HKEY_CURRENT_USER\Environment

Системные переменные - в раздел HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

Если значения каких либо переменных изменены в данной сессии командной строки Windows, то изменения вступят в силу только в новом сеансе, после перезапуска CMD ( или PowerShell ). Для изменения системных переменных ( ключ /M ) требуются права администратора ( "Запуск от имени администратора " в Windows 7). Пользовательские переменные запоминаются в профиле и действительны, для перемещаемого профиля, на любом компьютере домена. Если одно и то же имя переменной имеется в среде пользователя и в среде системы, то значение пользовательской переменной имеет более высокий приоритет.

Для редактирования переменных можно использовать панель управления - Панель управления - Система - Дополнительно - Переменные среды ( Control Panel - System - Advanced - Environment Variables )

Для удаления переменных среды можно воспользоваться Панелью управления или удалением ключей редактором реестра или консольной утилитой REG

REG delete HKCU\Environment /V MyVar - удалить пользовательскую переменную MyVar

Присвоение переменной пустого значения командой Setx не приводит к удалению ее имени из реестра. Если например, имеется пользовательская переменная с пустым значением, то по команде SET она не отображается. И при наличии системной переменной с таким же именем, ее значение станет недоступным из-за более высокого приоритета пользовательской переменной. Поэтом, во избежание конфликтов желательно не оставлять в реестре мусор из переменных с неприсвоенными значениями.

Примеры использования Setx:

SETX MACHINE COMPAQ - создать на локальном компьютере переменную среды пользователя с именем MACHINE, принимающую значение COMPAQ. Для просмотра значений переменных можно воспользоваться командой echo:

echo %MACHINE% - отобразить значение переменной MACHINE

Можно также использовать команду SET в цепочке с командой поиска текста FIND:

set | Find /i "machine"

setx.exe MACHINE "Asustek Computer" /M - создать на локальном компьютере системную переменную MACHINE, принимающую значение Asustek Computer. Если значение переменной содержит пробелы, то оно заключается в двойные кавычки. Setx MYPATH "" - сбросить значение переменной окружения MYPATH ( сделать пустым )

SETX MYPATH "%PATH%" - создать на локальном компьютере пользрвательскую переменную окружения с именем MYPATH , принимающую текущее значение переменной PATH – пути поиска исполняемых файлов, сформированные на момент выполнения команды, например, Path=С:\Program Files\Far;С:\Program Files\NVIDIA Corporation\PhysX\Common;С:\WINDOWS\system32;С:\WINDOWS;С:\WINDOWS\System32\Wbem;. SETX MYPATH ~PATH~ - в качестве значения переменной будет записана строка, в которой символы ~ будут заменены на символы %, т.е в качестве значения переменной MYPATH будет записана строка %PATH%

SETX /S Server /U Mydomain\Admin /P AdmPass MYPATH "%PATH%" - установить на удаленном компьютере Server значение переменной окружения MYPATH равное текущему значению переменной PATH локального компьютера. Для подключения к удаленному компьютеру используется имя пользователя Admin в домене Mydomain и пароль AdmPass

SETX TZONE /K HKEY_LOCAL_MACHINE\System\CurrentControlSet\ Control\timeZoneInformation\StandardName - установить значение среды TZONE равным содержимому ключа реестра

HKLM\System\CurrentControlSet\Control\timeZoneInformation\StandardName При выполнении команды SetX отображается извлеченное значение ключа реестра и результат записи нового значения переменной:

Извлечено значение: "@tzres.dll,-912".

Успех. Указанное значение сохранено.

setx /s 192.168.0.1 /U admin /P Admpass BUILD /K "HKLM\Software\Microsoft\Windows NT\CurrentVersion\CurrentBuildNumber" - создать на удаленном компьютере с IP-адресом 192.168.0.1 переменную BUILD, принимающую значение ключа реестра HKLM\Software\Microsoft\Windows NT\CurrentVersion\CurrentBuildNumber

SETX /F ipconfig.out /X - разбор содержимого текстового файла ipconfig.out с выводом координат каждого поля в виде x,y – (номер строки, номер колонки) . Нумерация строк и колонок начинается с 0.

Для того, чтобы получить наглядное представление об обработке содержимого текстового файла, попробуйте создать текстовый файл следующего содержания:

a1 a2 a3 a4 a5 b1 b2 b3 b4 b5 c1 c2 c3 c4 c5 d1 d2 d3 d4 d5

Результат обработки этого содержимого командой SetX:

(0,0 a1)(0,1 a2)(0,2 a3)(0,3 a4)(0,4 a5) (1,0 b1)(1,1 b2)(1,2 b3)(1,3 b4)(1,4 b5) (2,0 c1)(2,1 c2)(2,2 c3)(2,3 c4)(2,4 c5) (3,0 d1)(3,1 d2)(3,2 d3)(3,3 d4)(3,4 d5)

Таким образом, элемент (0,0 a1) - это координаты 0,0, которым соответствует значение a1

SETX Key1 /F file.out /A 1,2 присвоить переменной Key1 значение из текстового файла file.out соответствующее содержимому второй строки третьей колонки – в данном примере - b3

SETX Key2 /F file.out /R 0,2 b3 присвоить переменной Key2 значение поля из текстового файла. Для поиска в текстовом файле используется шаблон b3 и значение извлекается по координатам 0,2 относительно найденного b3, т.е. в данном примере – это будет b5 ( Смещение по строкам= 0, смещение по колонкам = 2)

ab57.ru

Переменные среды в пакетных (командных) файлах

Переменные среды, используемые в пакетных (командных) файлах, позволяют обходиться без указания абсолютных путей к директориям. Например, если нам заранее неизвестна буква системного диска, мы всегда можем использовать переменную %systemdrive%, возвращающую букву диска, на котором установлена ОС. Также, переменные применяются для оптимизации кода - многократно повторяющемуся параметру (например, разделе реестра) можно назначить короткую переменную и использовать ее. В данной статье подробно рассматриваются различные приемы работы с переменными, а также способы изменения и создания новых переменных. Теперь обо всем по порядку.

Классификация переменных среды

Справка 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 offSET KEY=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceExSET i=100REG ADD %KEY% /V TITLE /D "Installing Applications" /fREG ADD %KEY%\%i% /VE /D "WinRar 3.51" /fREG ADD %KEY%\%i% /V 1 /D "%systemdrive%\install\Software\WinRar.exe /s" /fREG ADD %KEY%\%i% /V 2 /D "REGEDIT /S %systemdrive%\install\Software\rar_set.reg /s" /fSET /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%\Tempsetenv -u Temp %systemdrive%\Tempsetenv -u Tmp %systemdrive%\Temp

Утилита удобна тем, что после задания переменной ею можно  пользоваться сразу. Ну почти сразу - в следующей командной сессии. Чтобы использовать ее в текущей сессии, можно задействовать старую знакомую команду set:

:: Creating #EgOrus# varset EgOrus=D:\EgOrussetenv -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).

Переменные среды, используемые в пакетных (командных) файлах, позволяют обходиться без указания абсолютных путей к директориям. Например, если нам заранее неизвестна буква системного диска, мы всегда можем использовать переменную %systemdrive%, возвращающую букву диска, на котором установлена ОС. Также, переменные применяются для оптимизации кода - многократно повторяющемуся параметру (например, разделе реестра) можно назначить короткую переменную и использовать ее. В данной статье подробно рассматриваются различные приемы работы с переменными, а также способы изменения и создания новых переменных. Теперь обо всем по порядку.

Классификация переменных среды

Справка 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 offSET KEY=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceExSET i=100REG ADD %KEY% /V TITLE /D "Installing Applications" /fREG ADD %KEY%\%i% /VE /D "WinRar 3.51" /fREG ADD %KEY%\%i% /V 1 /D "%systemdrive%\install\Software\WinRar.exe /s" /fREG ADD %KEY%\%i% /V 2 /D "REGEDIT /S %systemdrive%\install\Software\rar_set.reg /s" /fSET /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%\Tempsetenv -u Temp %systemdrive%\Tempsetenv -u Tmp %systemdrive%\Temp

Утилита удобна тем, что после задания переменной ею можно  пользоваться сразу. Ну почти сразу - в следующей командной сессии. Чтобы использовать ее в текущей сессии, можно задействовать старую знакомую команду set:

:: Creating #EgOrus# varset EgOrus=D:\EgOrussetenv -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).

winpcbox.blogspot.com