Команда SET используется для просмотра и изменения переменных среды окружения в командной строке Windows. Переменные окружения — это переменные, принимаемые значения которых характеризуют среду, в которой выполняется текущая программа — пути системных файлов, сведения об аппаратных средствах, каталоги пользователя и т.п. Значения переменных среды формируются в процессе загрузки Windows, регистрации пользователя в системе, при выполнении отдельных процессов или с помощью команды SET.
1. Примеры.
1.1. Для просмотра значения, принимаемого конкретной переменной можно воспользоваться командой :
C:\ SET переменная
1.2. Отобразить значение переменной PATH:
C:\ SET PATH
1.3. Для создания новой переменной, или изменения значения существующей, используется команда :
C:\ SET переменная=строка
- переменная — Имя переменной среды.
- строка — Строка символов, присваиваемая указанной переменной.
1.4. Установить значение переменной MyName:
C:\ SET MyName=Vasya
1.5. Изменить значение переменной PATH, добавив в начало строки C:\progs:
C:\ SET path=C:\progs;%path%
Значение, принимаемое переменной , доступно для обработки в командных файлах, при использовании ее имени, заключенного в знаки процента — % . Например команда выдачи текста на дисплей ECHO в виде:
1.6. Выведет на экран слово «date», а команда:
C:\ ECHO date
ECHO %date% выведет на экран значение переменной date, т.е. текущую дату в формате операционной системы.
1.7. Команда 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 указать только часть имени, то будет выведен список переменных, имена которых начинаются с указанной строки. Например:
1.8. Выведет значения всех переменных, имена которых начинаются с ‘U’:
C:\ SET U
1.9. Команда SET поддерживает два дополнительных ключа:
C:\ SET /A выражение C:\ SET /P variable=[promptString]
Ключ /A указывает, что строка справа от знака равенства является числовым выражением, значение которого вычисляется. Обработчик выражений очень прост и поддерживает следующие операции, перечисленные в порядке убывания приоритета:
() - группировка * / % - арифметические операторы + - - арифметические операторы << >> - двоичный сдвиг & - двоичное И ^ - двоичное исключающее ИЛИ | - двоичное ИЛИ = - присвоение , - разделитель операторов
1.10. При использовании любых логических или двоичных операторов необходимо заключить строку выражения в кавычки. Любые нечисловые строки в выражении рассматриваются как имена переменных среды, значения которых преобразуются в числовой вид перед использованием. Если переменная с указанным именем не определена в системе, вместо нее подставляется нулевое значение. Это позволяет выполнять арифметические операции со значениями переменных среды, причем не нужно вводить знаки % для получения значений. Если команда SET /A вызывается из командной строки, а не из пакетного файла, она выводит окончательное значение выражения. Слева от любого оператора присваивания должно стоять имя переменной среды.
1.11. Числовые значения рассматриваются как десятичные, если перед ними не стоит префикс:
- 0x — для шестнадцатеричных чисел
- 0 — для восьмеричных чисел.
1.12. Пример использования префиксов:
C:\ SET /A REZ=0xA+012 C:\ ECHO %REZ%
В данном командном файле значение переменной REZ вычисляется сложением числа 10, представленного в шестнадцатеричном виде ( 0xA ) и числа 10 , представленного в восьмеричном ( 012 ).
1.13. Ключ /P позволяет установить значение переменной для входной строки, введенной пользователем. Показывает указанное приглашение promptString перед чтением введенной строки. Приглашение promptString может быть пустым. Данный ключ позволяет организовать диалог с пользователем в командном файле:
@ECHO OFF SET /P NAME=Введите имя пользователя: SET /P pass=Введите пароль: ECHO Имя пользователя - %NAME% , Пароль - %PASS%
1.14. В командных файлах довольно часто требуется работать с частью значения, принимаемого переменной, для чего используются подстановочные значения.
Следующая запись заменяет в принимаемом значении переменной строку1 на строку2:
переменная:строка1=строка2
1.15. Следующий командный файл использует замену символа «точка» на символ «тире» в значении переменной, соответствующем текущей дате:
@ECHO OFF set tm=%DATE% ECHO Дата1 = %tm% SET tm=%DATE:.=-% ECHO Дата2 = %tm%
Для выделения части значения, принимаемого переменной, используется следующая конструкция:
переменная:~x,y
где x — число пропускаемых символов от начала строки, а y — количество символов, используемых в качестве значения переменной.
1.16. Следующий пример использует отображение текущего времени без секунд и долей секунд (только первые 5 символов из стандартного значения переменной TIME):
@ECHO OFF set tm=%TIME% ECHO Время1 = %tm% SET tm=%TIME:~0,5% ECHO Время2 = %tm%
1.17. Если значение y ( длина ) не указана, то используется оставшееся до конца строки значение переменной. Если значение y отрицательно, то используется часть строки значения переменной от конца. Предыдущий пример можно изменить , указав, что в принимаемом значении времени отбрасываются 6 символов от конца:
@ECHO OFF set tm=%TIME% ECHO Время1 = %tm% SET tm=%TIME:~0,-6% ECHO Время2 = %tm%
1.18. Возможно использование число пропусков не задано, и используется отрицательное число, то принимаемое значение будет частью переменной от конца строки. Следующая запись извлечет последние 10 символов переменной PATH:
%PATH:~-10% -
Нулевое значение можно не указывать, сохраняя формат подстановки:
%PATH:~0,-2%
эквивалентно
%PATH:~,-2%
1.19. При использовании переменных окружения в командных файлах существует определенное ограничение, связанное с тем фактом, что присваиваемое значение остается без изменения при его модификации внутри группы команд, задаваемой скобками, например в командах IF или FOR . Для обхода данного ограничения используется запуск командного процессора с параметром /V:ON и вместо знаков процента, для получения принимаемого переменной значения, используются восклицательные знаки. Кроме того, существует возможность использовать стандартный запуск командного процессора, но с локальным включением данного режима командой :
Setlocal EnableDelayedExpansion
1.20. Разница в результатах использования значений переменных довольно наглядно демонстрируется следующим командным файлом:
Setlocal EnableDelayedExpansion @ECHO OFF set VAR=before if "%VAR%" == "before" ( set VAR=after if "!VAR!" == "after" @echo Со знаком процента=%VAR% , Со знаком вопроса=!VAR! )
1.21. Команда set VAR=after выполняется внутри подпрограммы, ограниченной скобками и, если убрать команду Setlocal EnableDelayedExpansion или не использовать для получения значения переменной VAR восклицательные знаки, ее значение останется старым ( тем, что было установлено до входа в подпрограмму ). Аналогичная же проблема наблюдается и тогда, когда значение переменной изменяется внутри цикла команды FOR. Например, для получения списка файлов текущего каталога такой командный файл не будет работать:
set LIST= for %%i in (*) do set LIST=%LIST% %%i echo %LIST%
1.22. Значение переменной LIST внутри цикла изменено не будет. Для того, чтобы это произошло, командный файл нужно изменить следующим образом:
Setlocal EnableDelayedExpansion set LIST= for %%i in (*) do set LIST=!LIST! %%i echo %LIST%
Теперь, значение переменной LIST внутри цикла FOR будет изменяться, последовательно принимая значения имен файлов, разделенных пробелом ( set LIST=!LIST! %%i)