Команда SET - работа с переменными среды WindowsSET переменная 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) |
|