Как сделать переменную в bat

Добавил пользователь Владимир З.
Обновлено: 10.09.2024

Урок bat-аники

Однако в нашей повседневной деятельности встречаются и вещи, которые не так интересны и интеллектуальны. Мы не очень любим говорить об этом, делаем вид, что Это – грязно, нечистоплотно и недостойно нашего внимания. Однако, приходит день, приходит час и перст Судьбы находит нас – нам надо написать еще один батничек… Иногда это запускалка для построения проекта, которая должна при ошибке компиляции скопировать логи на сетевой диск, иногда – запуск обновления исходных текстов из SVN. Иногда – что-нибудь еще.

К чему я это все? А к тому, что поговорим мы о полезных хитростях при написании файлов сценариев на встроенном командном языке Windows. К счастью, это занятие не является доминирующим в профессиональной деятельности автора, так что я не обязуюсь заполнить абсолютно все пробелы в данной области. Кроме того, рожденный ползать летать не может, и из cmd.exe, увы, не получится ни /usr/bin/perl, ни даже /bin/sh. Так что, все нижеприведенное – просто некоторые интересные факты из жизни файлов с расширением bat, на которые автор обратил внимание во время решения различных практических задач автоматизации.

ПРЕДУПРЕЖДЕНИЕ

Практически все описанные здесь рецепты подойдут только для Windows 2000 и старше. Bat-язык Windows 9x, к счастью, можно считать почившим, так что здесь он не рассматривается. Более того, диалекты cmd.exe операционных систем Windows 2000, Windows XP и Windows Server 2003 также немного различаются. Все приведенное ниже создано и проверено на компьютере под управлением операционной системы Windows XP. За подробной информацией по различиям в реализации той или иной команды обращайтесь к [1].

Как экранировать символ?

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

  • Операторы перенаправления ввода-вывода , >>.
  • Оператор конвейера |.
  • Операторы объединения команд ||, & и &&.
  • Оператор разыменования переменной %…%.

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

после чего все заработает так, как надо. Однако в других случаях все менее очевидно. Рассмотрим командный сценарий, который генерирует незатейливый HTML-файл:

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

К счастью, есть один малоизвестный способ, позволяющий добиться требуемого результата. Символ ^ позволяет экранировать любой другой символ с безусловным приоритетом. Таким образом, вышеприведенный пример генерации HTML может быть успешно записан так:

Как перенести длинную строку?

Совет по поводу экранирующего символа ^ имеет еще одно применение: перенос строк. Я (как и многие из вас, наверное) люблю, чтобы любой исходный текст, который я пишу, выглядел красиво – даже *.bat-файлы. Одним из обязательных условий красоты и удобочитаемости кода для меня является его ширина: все строки должны умещаться в 78 столбцов. Можно поспорить по поводу числа 78, но в одном я непреклонен – ограничение на ширину текста кода должно быть, иначе это не код, а макароны.

Так вот долгое время *.bat-файлы портили мне жизнь тем, что иногда приходилось писать длинную строку – например, вызов какой-нибудь другой программы с кучей опций, и я не знал, что с этим делать. Происходило это нечасто, но всегда было неприятно. Но, к счастью, моя жизнь изменилась с тех пор, как я открыл для себя Супер-Символ ^:

Переменные среды, используемые в пакетных (командных) файлах, позволяют обходиться без указания абсолютных путей к директориям. Например, если нам заранее неизвестна буква системного диска, мы всегда можем использовать переменную %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%ЛокальнаяВозвращает используемое по умолчанию размещение данных приложений.

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

Начнем с простенького примера:

В этом примере я удаляю вышеуказанные ярлыки, которые маячат перед глазами в меню Пуск, используя переменную %AllUsersProfile%, а также все файлы с расширением SCR из директории Windows\system32, используя переменную %SystemRoot%. Вместо DEL /F /Q, как вы понимаете, может быть все что угодно: от команды копирования COPY до команды запуска установки нужного нам приложения со всеми параметрами командной строки, если это потребуется.

Во всех командах я специально использовал "кавычки" – это не случайно. Весь путь, включая переменные, надо заключать в кавычки, если вы используете пути, содержащие пробелы. Даже если сама переменная кавычек не содержит, после ее разбора системой в пути могут появится пробелы (например, %ProgramFiles% в C:\Program Files). В любом случае кавычки лучше использовать – это является хорошим тоном оформления командных файлов.

Как задать свои переменные

Разобранный выше пример использовал уже существующие переменные среды. И вы, вероятно, обратили внимание на символы процентов, окружающие названия переменных. Эти символы нужны для того, чтобы разрешить подстановку значений переменной в командной строке или в пакетном файле. Символы процентов указывают на то, что Cmd.exe должна обратиться к значениям переменных, а не делать посимвольное сравнение. Ниже вы увидите, как это работает. Задать свои переменные в пакетном файле можно командой SET.

Команда SET
Вы можете задать в командном файле свои переменные при помощи все той же команды SET.


Бывает так, что написанный Вами BAT-файл работает на одном компьютере, но не работает на другом. Ошибка часто заключается в том, что были использованы прямые пути к файлам. Например батник для копирования всех текстовых файлов находящихся в папке windows на диске C

Такой батник будет работать на любом компьютере, только если операционная система установлена на диск С, если ОС расположена на другом диске D,F,K,J и т.д., необходимо использовать переменную %WINDIR%

Такой батник будет работать на любом компьютере - без разницы на какой диск установлена ОС

Переменные среды — текстовые переменные операционной системы, хранящие данные о ряде настроек системы. Используются переменные среды при копировании, перемещении, переименовании, удалении, создании файлов и папок других действий в командной строке.

Список переменных среды ОС Windows Вы можете посмотреть введя в командной строке: set и нажав клавишу Enter Также можно вывести список переменных в текстовый файл с помощью батника

Bat-файл с таким кодом создаст текстовый файл docent.txt(здесь и далее имена подставляйте свои)и выведет список переменных среды ОС Windows в этот текстовый документ в том-же месте где и располагается запущенный батник.

Список переменных сред

%APPDATA% используемое по умолчанию размещение данных приложений

%CD% путь к текущей папке

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

%CMDEXTVERSION% номер версии текущих расширений обработчика команд

%COMPUTERNAME% имя компьютера

%COMSPEC% путь к исполняемой командной оболочке

%DATE% текущие данные, использует тот же формат, что и команда date /t

%ERRORLEVEL% код ошибки последней использовавшейся команды

%HOMEDRIVE% имя диска локальной рабочей станции

%HOMEPATH% полный путь к основному каталогу пользователя

%HOMESHARE% сетевой путь к общему основному каталогу пользователя

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

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

%OS% имя операционной системы

%PATHEXT% список расширений файлов

%PROCESSOR_ARCHITECTURE% архитектура процессора. Значения: x86, IA64

%PROCESSOR_IDENTFIER% описание процессора

%PROCESSOR_LEVEL% номер модели процессора, установленного на компьютере

%PROCESSOR_REVISION% номер модификации процессора

%ProgramFiles% путь к Program Files

%PROMPT% параметры командной строки для текущего интерпретатора

%RANDOM% произвольное десятичное число от 0 до 32767

%SYSTEMDRIVE% имя диска, содержащего корневой каталог

%SYSTEMROOT% размещение системного каталога Windows

%TIME% текущее время

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

%USERNAME% имя пользователя, выполнившего вход в систему

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

%WINDIR% размещение каталога операционной системы

Если Вы хотите посмотреть чему равна переменная среды на Вашем компьютере в командной строке(окно CMD), не забывайте прописывать впереди переменной "echo"

echo — команда предназначенная для отображения строки текста

Например если Вы захотите узнать текущее время %TIME% и просто напишите %TIME% в CMD - то получите ошибку: "Синтаксическая ошибка в имени файла, имени папки или метке тома"

Если напишете echo %TIME% - то узнаете точное время

Батником вывести информацию в txt можно так

echo сегодня %DATE% время %TIME% >> docent.txt

echo имя компьютера %COMPUTERNAME% >> docent.txt

echo имя юзера %USERNAME% >> docent.txt

echo где Винда %WINDIR% >> docent.txt

echo и т.д. и т.п >> docent.txt

Использование переменной при удалении файлов и папок с помощью Bat файла

Удаление папки Docent которая находится на диске С в WINDOWS

RD С:\WINDOWS\Docent /S/Q

То-же самое, но удаляем папку с помощью переменной %WINDIR%

RD %WINDIR%\Docent /S/Q

Использование переменной при перемещении файлов

Перемещение текстового файла docent.txt из папки WINDOWS на диске С в папку Program Files которая тоже на диске С

MOVE "C:\WINDOWS\docent.txt" "C:\Program Files"

То-же самое, но перемещаем с помощью переменных %WINDIR% и %ProgramFiles%

Профессиональная поддержка ПК, поддержка IT-системы в целом – это то, о чем нужно задуматься уже сегодня. Доверьте это специалистам. Успехов!

Месяц без оплаты. Подробнее!

Попробуйте наши услуги обслуживания и получите третий месяц обслуживания в подарок!

BAT файлы CMD (vk-robot)

Вручную
Код (DOS):
set x=stroka
set /a y=55
Ввод с клавиатуры
Код (DOS):
set /p x="BBeduTe cTpoky: "
Типы переменных

Тип строка
Код (DOS):
set x=stroka
Ограничение 8184 символа.
Тип число
Код (DOS):
set /a x=25*5
Ограничение от -2147483647 до 2147483647.

Вывод значения переменных
Код (DOS):
echo %x%
Существующие переменные

%RANDOM% - раскрывается в случайное десятичное число между 0 и 32767.(от 0 до (2^17)-1)
Код (DOS):
set /a random10=%random%/3277
Выводит случайное число от 0 до 9.
У меня это число по нелепой псевдослучайности цифру секунды
%CD% - раскрывается в строку текущей директории.
%DATE% - раскрывается в текущую дату, используя тот же формат команды DATE.
%TIME% - раскрывается в текущую дату, используя формат команды TIME.
%ERRORLEVEL% - раскрывается в текущее значение ERRORLEVEL.
Уровень ошибки, 0 - это нет ошибки, 1 - это есть ошибка, а другие это номера ошибки.

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

Операции со строковыми или численными переменными

Соединение 2-ух строковых переменных
Код (DOS):
set x=Gaz
set y=Prom
echo %x%%y%
(GazProm)
Вывод определенного(ых) символа(ов) из строки
Символы номеруются начиная с 0!

Код (DOS):
set str=babywka
Вывод 1-ого символа
Код (DOS):
echo %str:~0,1%
(b)
Вывод 3-х символов с конца строки
Код (DOS):
echo %str:~-3%
(wka)
Вывод всей строки кроме 2-ух первых символов
Код (DOS):
echo %str:~2%
(bywka)
Вывод всей строки кроме 2-ух последних символов
Код (DOS):
echo %str:~0,-2%
(babyw)
Вывод 3-х символов начиная с 3
Код (DOS):
echo %str:~2,3%
(byw)
Удаление подстроки из строки
Код (DOS):
set str=babywka
echo %str:ba=%
(bywka)
Замена подстроки из строки на другую подстроку
Код (DOS):
set str=babywka
echo %str:bab=xlop%
(xlopywka)
Удаление кавычек(") из строки
Код (DOS):
set str2="qwerty"
echo %str2:"=%
(qwert)
В данном случае: если кавычки в начале и конце строки - можно юзать
Код (DOS):
echo %str2:~1,-1%
(qwert)
Существуют 2 способа использовать переменную в переменной, например: вывод n-ого символа

Первый способ с call set
Код (DOS):
call set x=%%str:~%n%,1%%
echo %x%
Второй способ с for и setlocal enabledelayedexpansion
Код (DOS):
setlocal enabledelayedexpansion
for /l %%i in (%n%,1,%n%) do (set x=!str:~%%i,1!)
echo %x%
тут неважно что в for писать, главное
Код (DOS):
set x=!str:~%n%,1!
писать в do
С циклами мы разберемся в следующей статье.
Но, пока уточню: если код второго способа юзать в пакетном файле (BATнике), то вместо %i юзаем %%i.

Операции с числовыми переменными

Увеличивание на единицу
Код (DOS):
set /a x+=1
Увеличивание в 2 раза
Код (DOS):
set /a x+=%x%
аналогично
Код (DOS):
set /a x*=2
Возведение в квадрат
Код (DOS):
set /a x*=%x%
Возведение в куб
Код (DOS):
set /a x=%x%*%x%*%x%
Деление
Деление в CMD является целочисленным!(то есть делится до целого числа)
Код (DOS):
set /a x=15
set /a y=4
set /a xy=%x%/%y%
(3)
Сложение
Код (DOS):
set /a x=5
set /a y=-6
set /a xy=%x%+%y%
(5+(-6)=5-6=-1)
Вычитание
Код (DOS):
set /a x=5
set /a y=-6
set /a xy=%x%-%y%
(5-(-6)=5+6=11)
Вычисление остатка
Код (DOS):
set /a xy=%x% "%" %y%
Унарные операторы
(Не знаю, как они называются)

Код (DOS):
set /a y="!"%x%
дает результат(%y%) 1, если переменная(%x%) равна 0, и 0 (%y%) в любых других случаях
Код (DOS):
Например
set /a x=5
set /a y="!"%x%
(0)
set /a x=0
set /a y="!"%x%
(1)
Код (DOS):
set /a y="~"%x%
дает результат -1-%x% (%y%)
Например
Код (DOS):
set /a x=5
set /a y="~"%x%

Читайте также: