Объявление собственных переменных является неотъемлемой часть практически любого языка программирования, так в языке vbscript они объявляются с помощью ключевого слова dim, а в jscript – используется ключевое слово var.
Переменные командной строки Windows представляют немного другой характер, тут нельзя объявить группу переменных cmd, или же сразу присвоить значения нескольким переменным в командной строке. Давайте посмотрим на следующие строчки кода:
setVar1=D:WorksetVar2=100setVar3="Привет Мир!!!"
В данном примере, с помощью ключевого слова cmd set мы поэтапно объявили три переменные (Var1, Var2 и Var3), как и в языке vbscript, в cmd регистр символов не играет роли, поэтому, данные строчки выведут фразу «Привет Мир!!!»
или
echo%Var3%echo%VAR3%echo%vAr3%
Стоит учитывать один момент, запись
и
это не одно и тоже, то есть, в первом случае мы создаем cmd переменную «var1», а во втором – «var1 «. С присвоением значений аналогичная ситуация, так что обращайте внимание на пробел!!!
Видим, что бы вывести значение переменной с помощью функции Echo, мы заключаем ее в символ «%», для set – просто прописываем ее имя, так же стоит учитывать, что всем переменным присваивается строковой тип.
Если вы запустите на выполнение команду cmd set, которая выводит список всех переменных и их значений в текущем сеансе, то увидите, что там будут присутствовать и только что созданные cmd переменные и переменные среды. Мы сможем обращаться к ним на протяжение всего сеанса работы.
Что бы очистить переменные в командной строке Windows от их содержимого, нужно просто присвоить пустое значение:
Мы просто после имени прописали знак равенства и все. Стоит помнить, что если в таких языках программирования как vbscript и jscript присвоение пустого значения переменной не влияет на ее существование, то в командной строке происходит полное ее удаление, то есть, команда:
просто выведет строчку %Var3%, а команда
Выведет сообщение «переменная среды var3 не определена»
Стоит учитывать тот момент, что если мы хотим, что бы переменная командной строки Windows содержала специальные символы (например, @ < > & | ^ ), то их нужно экранировать. В языке jscript для вывода специальных символов используются esc-последовательности, в командной строке специальный символ экранируется с помощью «^»:
setVar4=100 ^&3 = 5setVar5=100 ^^3
В данном примере мы экранировали символы & и ^, тем самым присвоив фразы:
«100 & 3 = 5»
«100 ^3»
Стоит обратить внимание, что если мы попытаемся вывести значения данных переменных с помощью функции cmd set, то проблем не возникнет, но если будет использовать функцию echo, то получим совсем не тот результат, что ожидали. Так, при попытке выполнить следующую команду:
Получим предупреждение:
100
«3» не является внутренней или внешней командой, исполняемой программой или командным файлом.
Это происходит из-за повторного анализа спец-символов при использовании функции echo. Надо просто прописать символ «^» экранирования не один раз, а трижды:
setVar4=100 ^^^&3 = 5setVar5=100 ^^^^3
Теперь при выполнении кода:
все пройдет успешно.
Как и в сценариях сервера Windows Script Host, переменные в командной строке Windows могут содержать заданную область видимости.
Область видимости – блок кода, за пределами которого нельзя получить доступ к переменным, объявленным в нем. Довольно ясно значение области видимости проявляется при роботе с функциями, по этому вопросу можете прочить статью «Урок 3 по JScript: Объявление пользовательских функций«.
Понятно, что переменные cmd, созданные в текущем окне командной строки недоступна для других процессов, но, есть возможность задать ограничения еще большие.
Что бы задать локальную область видимости, используется блок SETLOCAL … ENDLOCAL. Все cmd переменные командной строки Windows, объявленные в середине данного блока не будут видны за его пределами. Откройте редактор (я использую редактор Notepad++, так как он сразу подсвечивает код), и пропишите в нем следующие строчки кода:
@echo offsetvar1=0rem Начало локализацииsetlocalsetvar1=5echo Lokalnaya: var1= %var1%endlocal echo Globalnaya: var1= %var1%
Видим, что вначале мы объявили var1 и присвоили ей значение 0, далее мы снова объявили переменную с аналогичным именем, но уже в блоке SETLOCAL … ENDLOCAL. В сценарии происходит вывод значения как локальной, так и глобальной var1. Я специально использовал латинские знаки, что бы у вас в случае чего не выводились крякозябры.
Переменные среды в командной строке
20.07.2015, 22:01. Показов 73085. Ответов 1
Переменные среды
Автор: spe******t, Вадим Стеркин aka Vadikan
Источник
Переменные среды, используемые в пакетных (командных) файлах, позволяют обходиться без указания абсолютных путей к директориям. Например, если нам заранее неизвестна буква системного диска, мы всегда можем использовать переменную %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 FilesCommon 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 из директории Windowssystem32, используя переменную %SystemRoot%. Вместо DEL /F /Q, как вы понимаете, может быть все что угодно: от команды копирования COPY до команды запуска установки нужного нам приложения со всеми параметрами командной строки, если это потребуется.
Во всех командах я специально использовал «кавычки» – это не случайно. Весь путь, включая переменные, надо заключать в кавычки, если вы используете пути, содержащие пробелы. Даже если сама переменная кавычек не содержит, после ее разбора системой в пути могут появится пробелы (например, %ProgramFiles% в C:Program Files). В любом случае кавычки лучше использовать – это является хорошим тоном оформления командных файлов.
Как задать свои переменные
Разобранный выше пример использовал уже существующие переменные среды. И вы, вероятно, обратили внимание на символы процентов, окружающие названия переменных. Эти символы нужны для того, чтобы разрешить подстановку значений переменной в командной строке или в пакетном файле. Символы процентов указывают на то, что Cmd.exe должна обратиться к значениям переменных, а не делать посимвольное сравнение. Ниже вы увидите, как это работает. Задать свои переменные в пакетном файле можно командой SET.
Команда SET
Вы можете задать в командном файле свои переменные при помощи все той же команды SET.
Чтобы добавить переменную, введите в командной строке:
Код
set имя_переменной=значение
Чтобы отобразить переменную, введите в командной строке:
Чтобы удалить переменную, введите в командной строке:
Например,
задает переменную mydir, которая будет возвращать путь к указанной папке. Подробнее о команде вы можете прочитать из set /?.
Важное примечание: переменные, задаваемые командой set, действуют лишь на протяжении командной сессии (см. ниже), в которой они были заданы.
Эти переменные могут быть созданы, к примеру, для любых путей, надо лишь задать или найти алгоритм присвоения переменной в каждой частной ситуации, пользуясь готовыми примерами или создавая свои на их основе. Как правило, такие переменные создаются в текущей сессии командными файлами с помощью некоторых операторов.
Пример назначения переменных в файле RunOnceEx.cmd, импортирующем параметры в реестр
Код
@echo off SET KEY=HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx 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%installSoftwareWinRar.exe /s" /f REG ADD %KEY%%i% /V 2 /D "REGEDIT /S %systemdrive%installSoftwarerar_set.reg /s" /f SET /A i+=1
В данном скрипте командой SET задаются две переменных — %i% и %KEY%. Обратите внимание, что задаются они без символов процентов, а вот для обращения к ним %% уже нужны. Переменная %KEY% служит для упрощения и оптимизации кода. Она остается неизменной на протяжении текущей командной сессии, что избавляет от необходимости каждый раз включать в код раздел реестра. Каждый раз, когда в коде встречается %KEY%, будет происходить ее замена на HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun OnceEx. А вот %i% служит для последовательной нумерации разделов реестра. При начальном значении 100 переменная увеличивается на единицу при помощи команды SET /A i+=1 после каждого блока команд, что дает последовательность 100, 101, 102 и т.д. Таким образом, строка
Код
REG ADD %KEY%%i% /V 1 /D "%systemdrive%installSoftwareWinRar.exe /s" /f
на самом деле отработает так
Код
REG ADD HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx100 /V 1 /D "C:installSoftwareWinRar.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%INSTALLDVDToolsNBRomNero.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_MACHINESYSTEMCurrentControlSetControlSession ManagerEnvironment" /v cdrom /d %CDROM% /f
После нахождения файла WIN51 диску, на котором он был найден, присваивается локальная переменная %CDROM%, которая тут же и назначается в виде постоянной системной переменной посредством импорта в реестр. Этот метод предложил в одной из тем на конференции Oszone Sanja Alone. Заодно вы узнали. где в реестре хранятся настройки системных переменных. Настройки пользовательских переменных хранятся в HKCUEnvironment. Пути, возвращаемые переменными %PROGRAMFILES% и %COMMONPROGRAMFILES%, можно посмотреть в параметрах ProgramFilesDir и CommonFilesDir в HKLMSOFTWAREMicrosoftWindowsCurrentVersion, но менять их там не следует. Каталоги установки программ (отличные от %SystemDrive%Program Files) нужно конфигурировать через файл ответов.
Резюме
Командная оболочка Windows (cmd.exe) — это весьма мощный инструмент работы с системой. При помощи пакетных файлов можно автоматизировать изрядное количество задач, и именно поэтому они часто используются для автоматической установки Windows. Умелое использование переменных в пакетных файлах позволяет решать широкий спектр вопросов. Работа с командной оболочкой становится более эффективной и одновременно упрощается код пакетных файлов. Другие примеры использования переменных вы можете найти на страницах сайта или форума. Все примеры, использованные в этой статье, взяты из скриптов участников форума OsZone.ru, за что им большое спасибо.
Терминология
Командная оболочка
— это отдельный программный продукт, который обеспечивает прямую связь между пользователем и операционной системой. Текстовый пользовательский интерфейс командной строки предоставляет среду, в которой выполняются приложения и служебные программы с текстовым интерфейсом.
cmd.exe — интерпретатор команд, который командная оболочка ОС Windows использует для перевода введенной команды в формат, понятный системе.
Командная сессия может инициироваться как запуском cmd.exe, так и запуском пакетного файла. Иными словами создается текущая командная оболочка. Соответственно выход из этой оболочки (к примеру, окончание работы пакетного файла) завершает командную сессию.
Пользовательский сеанс (пользовательская сессия) начинается с момента входа пользователя в систему (log on) и завершается при выходе (log off).
4
Переменные. Команда SET
Задание переменных
Вручную
Ввод с клавиатуры
set /p x="BBeduTe cTpoky: "
Типы переменных
Тип строка
Ограничение 8184 символа.
Тип число
Ограничение от -2147483647 до 2147483647.
Использование переменных
Вывод значения переменных
Существующие переменные
%RANDOM% — раскрывается в случайное десятичное число между 0 и 32767.(от 0 до (2^17)-1)
set /a random10=%random%/3277
Выводит случайное число от 0 до 9.
У меня это число по нелепой псевдослучайности цифру секунды
%CD% — раскрывается в строку текущей директории.
%DATE% — раскрывается в текущую дату, используя тот же формат команды DATE.
%TIME% — раскрывается в текущую дату, используя формат команды TIME.
%ERRORLEVEL% — раскрывается в текущее значение ERRORLEVEL.
Уровень ошибки, 0 — это нет ошибки, 1 — это есть ошибка, а другие это номера ошибки.
Чтобы получить полный список переменных и их значений введите команду SET
Операции со строковыми или численными переменными
Соединение 2-ух строковых переменных
set x=Gaz
set y=Prom
echo %x%%y%
(GazProm)
Вывод определенного(ых) символа(ов) из строки
Символы номеруются начиная с 0!
Вывод 1-ого символа
Вывод 3-х символов с конца строки
Вывод всей строки кроме 2-ух первых символов
Вывод всей строки кроме 2-ух последних символов
Вывод 3-х символов начиная с 3
Удаление подстроки из строки
set str=babywka
echo %str:ba=%
(bywka)
Замена подстроки из строки на другую подстроку
set str=babywka
echo %str:bab=xlop%
(xlopywka)
Удаление кавычек(«) из строки
set str2="qwerty"
echo %str2:"=%
(qwert)
В данном случае: если кавычки в начале и конце строки — можно юзать
echo %str2:~1,-1%
(qwert)
Существуют 2 способа использовать переменную в переменной, например:
вывод n-ого символа
Первый способ с call set
call set x=%%str:~%n%,1%%
echo %x%
Второй способ с for и setlocal enabledelayedexpansion
setlocal enabledelayedexpansion
for /l %%i in (%n%,1,%n%) do (set x=!str:~%%i,1!)
echo %x%
тут неважно что в for писать, главное
писать в do
С циклами мы разберемся в следующей статье.
Но, пока уточню: если код второго способа юзать в пакетном файле (BATнике), то вместо %i юзаем %%i.
Операции с числовыми переменными
Увеличивание на единицу
Увеличивание в 2 раза
аналогично
Возведение в квадрат
Возведение в куб
Деление
Деление в CMD является целочисленным!(то есть делится до целого числа)
set /a x=15
set /a y=4
set /a xy=%x%/%y%
(3)
Сложение
set /a x=5
set /a y=-6
set /a xy=%x%+%y%
(5+(-6)=5-6=-1)
Вычитание
set /a x=5
set /a y=-6
set /a xy=%x%-%y%
(5-(-6)=5+6=11)
Вычисление остатка от деления
(при записи в батник, процент «%» нужно удваивать «%%»)
Унарные операторы
Логическое отрицание (Logical NOT)
дает результат(%y%) 1 (True), если переменная(%x%) равна 0 (False), и 0 (False) (%y%) в любых других случаях
Например
set /a x=5
set /a y="!"%x%
(0)
set /a x=0
set /a y="!"%x%
(1)
Побитовая инверсия (Bitwise NOT):
дает результат -1-%x% (%y%)
Например
set /a x=5
set /a y="~"%x%
(-1-5=-(1+5)= -6)
set /a x=-3
set /a y="~"%x%
(-1-(-3)=-1+3=3-1= 2)
Унарный минус (устанавливает/сбрасывает знаковый бит)
дает результат 0-%x% (%y%)
Например
set /a x=5
set /a y="-"%x%
(-5)
set /a x=-3
set /a y="-"%x%
(3)
Двоичные операторы
set x=3
(в двоичной системе счисления - 0011)
set y=5
(в двоичной системе счисления - 0101)
Побитовое И (AND)
Побитовое И — это бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0.
set /a xy=%x%"&"%y%
(1, в двоичной системе счисления - 0001)
Побитовое ИЛИ (OR)
Побитовое ИЛИ — это бинарная операция, действие которой эквивалентно применению логического ИЛИ к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
Другими словами, если оба соответствующих бита операндов равны 0, двоичный разряд результата равен 0; если же хотя бы один бит из пары равен 1, двоичный разряд результата равен 1.
set /a xy=%x%"|"%y%
(7, в двоичной системе счисления - 0111)
Побитовое исключающее ИЛИ (XOR)
Побитовое исключающее ИЛИ (или побитовое сложение по модулю два) — это бинарная операция, действие которой эквивалентно применению логического исключающего ИЛИ к каждой паре битов, которые стоят на
одинаковых позициях в двоичных представлениях операндов.
Другими словами, если соответствующие биты операндов различны, то двоичный разряд результата равен 1; если же биты совпадают, то двоичный разряд результата равен 0.
set /a xy=%x%"^"%y%
(6, в двоичной системе счисления - 0110)
К битовым операциям также относят битовые сдвиги. При сдвиге значения битов копируются в соседние по направлению сдвига.
Различают сдвиг влево (в направлении от младшего бита к старшему) и вправо (в направлении от старшего бита к младшему).
При логическом сдвиге значение последнего бита по направлению сдвига теряется (копируясь в бит переноса), а первый приобретает нулевое значение.
Двоичный арифметический сдвиг
Арифметический сдвиг аналогичен логическому, но значение слова считается знаковым числом, представленным в дополнительном коде.
Так, при правом сдвиге старший бит сохраняет свое значение. Левый арифметический сдвиг идентичен логическому.
Вправо
set /a xy=%x%">>"1
(1, в двоичной системе счисления - 0011->0001)
set /a xy2=%y%">>"1
(2, в двоичной системе счисления - 0101->0010)
set /a n=13
(в двоичной системе счисления - 1101)
set /a xn=%n%">>"2
(3, в двоичной системе счисления - 1101->0011)
set /a my=-%y%">>"1
(-3, в двоичной системе счисления - 1011(-5)->1101(-3))
Влево
set /a xy=%x%"<<"1
(6, в двоичной системе счисления - 0011->0110)
set /a xy2=%y%"<<"1
(10, в двоичной системе счисления - 0101->1010)
set /a xy3=%y%"<<"4
(80, в двоичной системе счисления - 0101->1010000)
set /a my=-%y%"<<"1
(-10, в двоичной системе счисления - 1011(-5)->10110(-10))
Максимальный размер отдельной переменной среды составляет 8192 байта.(у меня выходило только 8184, наверное это вместе с названием…)
Максимальный общий размер всех переменных среды, включая имена переменных и знак равенства, составляет 65 536 Кбайт.
И я забыл, про 8-ричную и 16-ричную систему счисления в CMD
Системы счисления
Числовые значения рассматриваются как десятичные, если перед ними не стоит префикс 0x для шестнадцатеричных чисел, и 0 для восьмеричных чисел. Например, числа 0x12, и 022 обозначают десятичное число 18.
Обратите внимание на запись восьмеричных числе: 08 и 09 не являются допустимыми числами, так как в восьмеричной системе исчисления цифры 8 и 9 не используются.
Восьмеричная система счисления
set /a x=022
(Это 22 в восьмеричной системе счисления, и 18 в десятичной)
Можно производить все операции, также как и с десятеричными числами.
Но после задания значения переменной, значение хранится в десятичной системе счисления.
Например, сложение
set /a xy=022+07
(Это 22+7=31 в восьмеричной системе счисления, и 31 в десятичной)
Шестнадцатеричная система счисления
set /a x=0x3A
(Это 3A в восьмеричной системе счисления, и 58 в десятичной)
Вычитание
set /a xy=0x3A-0x66
(Это 3A-66=-54 в восьмеричной системе счисления, и -44 в десятичной)
Сохранение в переменной вывода программы
К сожаление, передача вывода программ на вход команды set не работает:
echo 1|set /p AA=""
set AA
Поэтому можно воспользоваться временным сохранением в файл:
echo 1> 0.tmp
set /p AA="" <0.tmp
del 0.tmp
echo %AA%
Примеры использования
Узнать динамически генерируемое имя архива WinRar:
rar a -z%Comment% -p%p% "-ag yyyy-mm-dd[n]" %OutPath%%arhivename%.%ext% @%FileList% >rar.log.tmp
for /f "tokens=2*" %%I in ('find /i "Creating archive" ^<rar.log.tmp') do @echo %%J >rarfilename.tmp
set /p rarfilename="" <rarfilename.tmp
del rarfilename.tmp
Узнать имя последнего изменённого файла в папке:
dir /b /a-d /o-d *.* >%temp%.tmp
set /p lastfile="" <%temp%.tmp
del %temp%.tmp
echo "%lastfile%"
Комментарий от Dragokas :
По сути эта команда считывает в переменную первую строку файла:
Комментарий от m00slim25:
Эти операции, как и все остальные, поддерживают кавычный синтаксис:
set /a "y=!%x%"
set /a "y=~%x%"
set /a "y=-%x%"
Оператор == используется только для строчного сравнения. Кавычки необходимы если в переменной/операнде имеются пробелы.
Для арифметического сравнения необходимо использовать арифметические операторы:
EQU : Равно (=)
NEQ : Не равно (!=)
LSS : Меньше (<)
LEQ : Меньше или равно (<=)
GTR : Больше (>)
GEQ : Больше или равно (>=)
Использовать операторы, указанные в скобках, не представляется возможным, потому что, например, операторы < и > являются указателями перенаправления ввода-вывода.
Переменные занимают центральное место во многих языках написания сценариев, но играют меньшую роль в командной строке Windows. Многие команды предопределены, и область применения переменных довольно ограничена. Тем не менее, существуют важные приложения командной строки, где необходимо использовать переменные, и в этой статье я расскажу, как командная строка использует переменные.
Содержание
- Как определяются переменные с помощью команды «set»
- Локализация переменных
- Переменные из пользовательского ввода
- Арифметические операции
- Переменные в операторах сравнения в пакетных файлах
Как определяются переменные с помощью команды «set»
В некотором смысле, существует две категории переменных для командной строки. Некоторые могут использовать термин «переменная» для обозначения символов или аргументов %1, %2, …%9, которые используются для представления пользовательского ввода в пакетных файлах. (См. обсуждение на этой странице.) Однако термин «переменная» обычно используется в командной строке для объектов, которые объявляются как переменные среды с помощью команды «set». Обратите внимание, что это довольно примитивный способ определения переменных. Например, нет никакого ввода. Переменные окружения, включая числа, хранятся в виде строк, и операции с ними должны учитывать это. Переменные объявляются и получают значение в одном операторе с помощью команды «set».
Синтаксис следующий:
set some_variable = some_value
Имена переменных не чувствительны к регистру и могут состоять из обычных буквенно-цифровых и других распространенных символов. Некоторые символы зарезервированы и должны быть экранированы. Их следует избегать. Кроме того, поскольку это переменные среды, их имена должны быть заключены в знаки процента при использовании в ссылках и выражениях, например:
Знаки процента не используются в левой части оператора set, который объявляет переменную.
Локализация переменных
Объявление переменной длится до тех пор, пока открыто настоящее командное окно. Если вы используете пакетный файл, который не закрывает свой экземпляр командного окна при завершении пакетного файла, все переменные, объявленные в пакетном файле, остаются. Если вы хотите локализовать переменную на определенный набор операторов, используйте команды «setlocal» и «endlocal». Таким образом. чтобы ограничить объявление переменной определенным блоком кода, используйте:
....
setlocal
set some_variable = some_value
...некоторые утверждения
endlocal
...
Переменные из пользовательского ввода
Команда «set» также может принимать ввод от пользователя в качестве значения переменной. Для этого используется переключатель «/p». Пакетный файл будет ждать, пока пользователь введет значение после оператора
Когда пользователь введет значение, сценарий продолжит выполнение. Также можно использовать строку сообщения для запроса ввода.
Например:
set /p new_variable="Введите значение"
Обратите внимание на пробел в конце сообщения подсказки. В противном случае сообщение подсказки и введенное пользователем значение будут отображаться на экране вместе. Это работает, но выглядит забавно. У пользователя может возникнуть соблазн нажать пробел, что добавит ведущий пробел к вводимому значению.
Арифметические операции
Командная строка не предназначена для работы с математическими функциями, но можно выполнять некоторые очень простые целочисленные арифметические действия с переменными. К команде «set» был добавлен ключ » /a», позволяющий выполнять некоторые базовые функции. В основном, это сложение и вычитание. Например, можно увеличивать или уменьшать счетчики в цикле. В принципе, можно также выполнять умножение и деление, но работать можно только с целыми числами, поэтому практическое применение ограничено. Хотя переменные хранятся в виде строк, командный интерпретатор распознает строки, содержащие только целые числа, что позволяет использовать их в арифметических выражениях. Синтаксис выглядит следующим образом
set /a some_variable={арифметическое выражение}
Символ | Операция |
---|---|
+ | Сложение |
— | Вычитание |
* | Умножение |
/ | Деление |
Вот пример увеличения переменной %counter%:
set /a counter=%counter%+1
Это также можно записать как:
Переменные в операторах сравнения в пакетных файлах
Переменные часто используются в сравнениях в условных операторах в пакетных файлах. Из-за того, что в командной строке переменные трактуются несколько вольно, необходимо быть осторожным при сравнении переменных. Для строк самым безопасным способом является заключение переменных в кавычки.
Например:
if "%variable1%" == "%variable2%" [команда]
Командная оболочка это отдельный программный продукт, который обеспечивает прямую связь между пользователем и операционной системой. Текстовый пользовательский интерфейс командной строки предоставляет среду, в которой выполняются приложения и служебные программы с текстовым интерфейсом. В командной оболочке программы выполняются и результат выполнения отображается на экране в виде, сходном с интерпретатором Command.com MS-DOS.
Использование нескольких команд и символов условной обработки
Можно выполнять несколько команд из одной командной строки или сценария с помощью сиволов условной обработки. При использовании нескольких команд, содержащих символы условной обработки, выполнение команд, стоящих справа от символа условной обработки, будет проводиться в зависимости от результатов выполнения команды, стоящей слева от символа. Например, требуется, чтобы команда выполнялась, только если предыдущая команда не была выполнена успешно. Или требуется, чтобы команда выполнялась, только если предыдущая команда была выполнена успешно.
Для передачи нескольких команд можно использовать специальные символы, перечисленные в следующей таблице.
Символ | Синтаксис | Определение |
---|---|---|
& […] | команда1 & команда2 | Используется для разделения нескольких команд в одной командной строке. В Cmd.exe выполняется первая команда, затем вторая команда. |
&& […] | команда1 && команда2 | Запускает команду, стоящую за символом &&, только если команда, стоящая перед этим символом была выполнена успешно. В Cmd.exe выполняется первая команда. Вторая команда выполняется, только если первая была выполнена успешно. |
|| […] | команда1 || команда2 | Запускает команду, стоящую за символом ||, только если команда, стоящая перед символом || не была выполнена. В Cmd.exe выполняется первая команда. Вторая команда выполняется, только если первая не была выполнена (полученный код ошибки превышает ноль). |
( ) […] | (команда1 & команда2) | Используется для группировки или вложения команд. |
; или , | команда1 параметр1;параметр2 | Используется для разделения параметров команды. |
Примечания
- Амперсанд (&), вертикальная черта (|) и скобки ( ) являются специальными символами, которым должен предшествовать управляющий символ (^) или кавычки, если эти символы передаются в качестве аргументов.
- Если команда завершает операцию успешно, возвращается нулевой (0) код ошибки или не возвращается никакого кода.
Вложенные командные оболочки
Имеется возможность вкладывать командные оболочки в Cmd.exe, открывая новый экземпляр Cmd.exe из командной строки. По умолчанию каждый экземпляр Cmd.exe наследует среду своего родительского приложения Cmd.exe. Вложение экземпляров Cmd.exe позволяет вносить в локальную среду изменения, которые не повлияют на родительское приложение Cmd.exe. Это позволяет сохранять исходную среду Cmd.exe и возвращаться к ней после удаления вложенной командной оболочки. Изменения вложенной командной оболочки не сохраняются.
Чтобы создать вложенную командную оболочку, в командной строке введите:
cmd
Появится сообщение следующего вида:
Microsoft (R) Windows XP (TM)
(C) Copyright 1985-2001 Microsoft Corp.
Чтобы закрыть все вложенные командные оболочки, введите команду exit.
Можно еще уже локализовать изменения в экземпляре Cmd.exe (или в сценарии) с помощью команд setlocal и endlocal. Команда setlocal создает локальную область, аendlocal ее удаляет. Любые изменения, сделанные внутри области, созданной командами setlocal и endlocal, не учитываются; таким образом исходная среда остается без изменений. С помощью этих команд можно создать до 32 вложенных областей.
Использование переменных среды в Cmd.exe
Среда командной оболочки Cmd.exe определяется переменными, задающими поведение командной оболочки и операционной системы. Имеется возможность определить поведение среды командной оболочки или среды всей операционной системы с помощью двух типов переменных среды: системных и локальных. Системные переменные среды определяют поведение глобальной среды операционной системы. Локальные переменные среды определяют поведение среды в данном экземпляре Cmd.exe.
Системные переменные среды заданы заранее в операционной системе и доступны для всех процессов Windows XP. Только пользователи с привилегиями администратора могут изменять эти переменные. Эти переменные наиболее часто используются в сценариях входа в систему.
Локальные переменные среды доступны, только когда пользователь, для которого они были созданы, вошел в систему. Локальные переменные из кустаHKEY_CURRENT_USER подходят только для текущего пользователя, но определяют поведение глобальной среды операционной системы.
В следующем списке представлены различные типы переменных в порядке убывания приоритета.
- Встроенные системные переменные
- Системные переменные куста HKEY_LOCAL_MACHINE
- Локальные переменные куста HKEY_CURRENT_USER
- Все переменные среды и пути указаны в файле Autoexec.bat.
- Все переменные среды и пути указаны в сценарии входа в систему (если он имеется).
- Переменные, используемые интерактивно в сценарии или пакетном файле
В командной оболочке каждый экземпляр Cmd.exe наследует среду своего родительского приложения. Поэтому можно изменять переменные в новой среде Cmd.exe, что не повлияет на среду родительского приложения.
В следующей таблице приведен список системных и локальных переменных.
Переменная | Тип | Описание |
---|---|---|
%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 (т. е. системный каталог). |
%SYSTEMROOT% | Системная | Возвращает размещение системного каталога Windows XP. |
%TEMP% и %TMP% | Системная и пользо- вательская |
Возвращает временные папки, по умолчанию используемые приложениями, которые доступны пользователям, выполнившим вход в систему. Некоторые приложения требуют переменную TEMP, другие переменную TMP. |
%TIME% | Системная | Возвращает текущее время. Использует тот же формат, что и команда time /t. Создается командой Cmd.exe. |
%USERDOMAIN% | Локальная | Возвращает имя домена, содержащего список учетных записей пользователей. |
%USERNAME% | Локальная | Возвращает имя пользователя, выполнившего вход в систему. |
%USERPROFILE% | Локальная | Возвращает размещение профиля для текущего пользователя. |
%WINDIR% | Системная | Возвращает размещение каталога операционной системы. |
Установка переменных среды
Используйте команду set для создания, удаления или отображения переменных среды. Команда set изменяет переменные только в среде текущей оболочки.
Чтобы отобразить переменную, в командной строке введите:
set имя_переменной
Чтобы добавить переменную, в командной строке введите:
set variablename=значение
Чтобы удалить переменную, в командной строке введите:
set имя_переменной=
Имеется возможность использовать большинство символов в качестве значений переменных, в том числе пробел. При использовании специальных символов, таких как <, >, &, или ^, перед ними следует помещать управляющий символ (^) или кавычки. При использовании кавычек они включаются в значение переменной, так как все символы, следующие после знака равенства принимаются за значение переменной. Учтите следующие примеры.
- Чтобы создать значение переменной new&name ,введите:
set varname=new^&name
- Чтобы создать значение переменной «new&name» ,введите:
set varname=»new&name»
- При вводе в командной строке set varname=new&name появляется следующее сообщение об ошибке:
"'name' is not recognized as an internal or external command, operable program or batch file."
В именах переменных регистр символов не учитывается. Однако, команда setотображает значение переменной так, как оно было введено. Можно комбинировать символы нижнего и верхнего регистра в именах переменных, чтобы облегчить восприятие кода (например, ИмяПользователя).
Примечания
- Максимальный размер отдельной переменной среды составляет 8192 байта.
- Максимальный общий размер всех переменных среды, включая имена переменных и знак равенства, составляет 65 536 Кбайт.
Подстановка значений в переменные среды
Чтобы иметь возможность подставлять значения в переменную среды из командной строки или из сценариев, следует заключить имя соответствующей переменной в символы процентов (%имя_переменной%). Символы процентов указывают на то, что Cmd.exe должен обратиться к значениям переменных, а не делать посимвольное сравнение. После определения значения для имени переменной, заключите имя переменной в символы процентов. Cmd.exe проводит поиск всех вхождений имени переменной и заменяет его на определенное значение переменной. Например, требуется создать сценарий, содержащий различные значения (например, имена пользователей), и требуется определить соответствующее значение переменной среды USERNAME для каждого пользователя. Для этого следует написать сценарий с использованием переменной USERNAME, заключенной в кавычки. При выполнении сценария Cmd.exe заменит вхождения %USERNAME% соответствующими значениями, что избавит от необходимости делать это вручную для каждого пользователя. Подстановка значений не является рекурсивной. Cmd.exe проверяет переменные один раз. Дополнительные сведения о подстановке значений в переменные смотри в разделах For и Call.
Переменная окружения (переменная среды́, англ. environment variable) — текстовая переменная операционной системы, хранящая какую-либо информацию — например, данные о настройках системы или сведения о текущем пользователе.
Работа с переменными¶
В качестве примера можно привести переменную %APPDATA%
, которая указывает путь до папки, в которой хранятся настройки некоторых программ текущего пользователя. Обычно это C:Documents And SettingsПользовательApplication Data
, где Пользователь это изменяемое значение. Для каждой учетной записи используется своё имя пользователя.
Чтобы каждый раз не узнавать имя учетной записи текущего пользователя и не подставлять в путь к папке Application Data
соответствующее значение и используется переменная окружения %APPDATA%
.
Это позволяет, к примеру, быстро открывать папку Application Data
, для этого в меню «Пуск →Найти» или в «Пуск →Выполнить» введите %APPDATA%
и нажмите клавишу Enter
.
Чтобы получить значение переменной окружения через командную строку, используется команда echo
, например:
echo %PROCESSOR_ARCHITECTURE%
Введенная в командной строке, эта комбинация отобразит архитектуру процессора текущего компьютера. Возможен один из трёх вариантов: x86
, IA64
, AMD64
.
Список переменных¶
Далее приводится список основных переменных, более подробный список приведен в статье Переменная среды Windows.
Переменная | Описание |
---|---|
%APPDATA% |
Возвращает используемое по умолчанию размещение данных приложений. В Windows XP это C:Documents and Settings%UserName%Application Data . В Windows 7 — C:Users%UserName%AppDataRoaming . |
%PROCESSOR_ARCHITECTURE% |
Архитектура процессора. Возможные варианты: x86 , IA64 , AMD64 . |
%USERNAME% |
Имя текущего пользователя. |
%CD% |
Указывает путь к текущему каталогу. Идентична команде CD без аргументов. |
%USERPROFILE% |
Путь к профилю текущего пользователя. |
%WINDIR% |
Каталог, в котором установлена Windows. |
%LOGONSERVER% |
Имя контроллера домена, использовавшегося для авторизации текущего пользователя. |
%HOMEPATH% |
Возвращает полный путь к основному каталогу пользователя. Задаётся на основании расположения основного каталога. Основной каталог пользователя указывается в оснастке «Локальные пользователи и группы». |
%DATE% |
Возвращает текущую дату. Использует тот же формат, что и команда date /t . Создаётся командой Cmd.exe . |
%TIME% |
Возвращает текущее время. Использует тот же формат, что и команда time /t . Создаётся командой Cmd.exe . |
%COMPUTERNAME% |
Имя компьютера. |
%TEMP% и %TMP% |
Возвращает временные каталоги, по умолчанию используемые приложениями, которые доступны пользователям, выполнившим вход в систему. Некоторые приложения требуют переменную TEMP , другие — переменную TMP . Потенциально TEMP и TMP могут указывать на разные каталоги, но обычно совпадают. |
%ROGRAMFILES% |
Путь к каталогу Program Files. |
%PROGRAMFILES(x86)% |
Путь к каталогу Program Files (x86) в 64-разрядных системах для приложений архитектуры x86 . |
%PATH% |
Указывает путь поиска исполняемых файлов. |
Изменение переменных¶
Чтобы изменить значение переменной, используется команда SET
, например:
Предупреждение
Бездумное изменение стандартных значений переменных может привести к необратимым последствиям!
Настройка переменных среды Windows может помочь сократить время, необходимое для набора команд в командной строке или, если вы часто пишете скрипты для собственных задач, сделать их более читаемыми. В большинстве случаев обычные пользователи добавляют записи в системную переменную среды PATH, хотя бывают и другие задачи.
В этой пошаговой инструкции базовая информация о том, как открыть переменные среды Windows 11 и Windows 10, создать или отредактировать их.
Что такое переменные среды
Переменные среды в Windows — записи о расположении системных папок, свойствах системы и другие, которые доступны для любой программы или скрипта.
Одна из наиболее часто используемых переменных среды — PATH, указывающая на папки, в которых выполняется поиск файлов, вызываемых в командной строке, терминале Windows, файле bat или из других источников. В качестве примера её назначения:
- Если вы откроете командную строку (или диалоговое окно «Выполнить»), введёте regedit и нажмете Enter — вы сможете запустить редактор реестра, не указывая полный путь к файлу regedit.exe, поскольку путь C:Windows добавлен в переменную среды Path.
- Если же тем же образом в командной строке написать имя программы, путь к которой не добавлен в Path (chrome.exe, adb.exe, pip и другие), вы получите сообщение «Не является внутренней или внешней командой, исполняемой программой или пакетным файлом».
Если предположить, что вы часто используете команды adb.exe (например, для установки приложений Android в Windows 11), pip install (для установки пакетов Python) или любые другие то для того, чтобы не писать каждый раз полный путь к этим файлам, имеет смысл добавить эти пути в переменные среды.
Также вы можете добавлять и иные переменные среды (не обязательно содержащие пути), а в дальнейшем получать и использовать их значения в сценариях BAT (командной строки) или PowerShell. Пример получения и отображения значения системной переменной PATH для обоих случаев:
echo %PATH% echo $Env:PATH
Получить список всех переменных среды в командной строке и PowerShell соответственно можно следующими командами:
set ls env:
Редактирование переменных среды Windows 11/10
Прежде чем приступать, учтите: изменение системных переменных среды по умолчанию может привести к проблемам в работе системы, не удаляйте уже имеющиеся переменные среды. Возможно, имеет смысл создать точку восстановления системы, если вы не уверены в своих действиях.
- Чтобы открыть переменные среды Windows вы можете использовать поиск в панели задач (начните вводить «Переменных» и откройте пункт «Изменение системных переменных среды») или нажать клавиши Win+R на клавиатуре, ввести sysdm.cpl и нажать Enter.
- На вкладке «Дополнительно» нажмите кнопку «Переменные среды…»
- В разделе «Переменные среды пользователя» (если требуется изменение только для текущего пользователя) или «Системные переменные» выберите переменную, которую нужно изменить и нажмите «Изменить» (обычно требуется именно это), либо, если необходимо создать новую переменную — нажмите кнопку «Создать». В моем примере — добавляем свои пути в системную переменную Path (выбираем эту переменную и нажимаем «Изменить»).
- Для добавления нового значения (пути) в системную переменную в следующем окне можно нажать кнопку «Создать», либо просто дважды кликнуть по первой пустой строке, затем — ввести нужный путь к папке, содержащей нужные нам исполняемые файлы.
- Также вы можете использовать кнопку «Изменить текст», в этом случае окно изменения системной переменной откроется в ином виде: имя переменной, а ниже — её значение. В случае указания путей значение будет представлять собой все пути, хранящиеся в переменной, разделенные знаком «точка с запятой».
- При создании новой переменной среды окно будет тем же, что и в 5-м шаге: необходимо будет указать имя системной переменной в верхнем поле, а её значение — в нижнем.
После создания или изменения переменной среды и сохранения сделанных настроек, переменная или обновленные значения сразу становятся доступны для текущего пользователя или в системе в целом в зависимости от того, какие именно переменные редактировались или создавались.