Командные файлы windows примеры

Что такое батники и с чем их едят

Пакетный файл или в простонародье батник – это файл, который запускает командную сроку или сокращенно cmd, которая построчно интерпретирует команды, записанные в нем. Подробнее смотрите на https://ru.wikipedia.org/wiki/Пакетный_файл

.

Первая программа и основные команды

Чтобы сделать батник, нужно сначала создать текстовый файл с именем test и изменить расширение c .txt на .bat. О том, как можно это сделать, читайте здесь: https://remontka.pro/file-extensions

. У вас должен появиться файл с такой иконкой:

test.bat
test.bat

Нажимаем на него ПРАВОЙ
кнопкой мыши. Должно появиться диалоговое окно. Нажмем “Открыть”. Должен открыться блокнот, пишем:

 @echo off
echo Hello world!
pause 

Бат-файлы ведут свою историю со времен MS-DOS. Новые фичи добавлялись с сохранением обратной совместимости. Из-за этого многое в языке bat-файлов, как мы увидим далее, нелогично и неудобно.

Вместе с тем, в bat-файле можно использовать переменные, условия, циклы и подпрограммы. При помощи некоторых костылей можно передавать данные на вход команд и разбирать их вывод. Проще говоря, можно программировать.

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

Зачем же сегодня использовать этот язык? Главным образом, для автоматизации выполнения консольных команд. Запуск команд выполняется в bat-файле проще, чем в каком-либо другом языке: инструкция запуска команды – это сама команда без каких бы то ни было ключевых слов, знаков препинания и подключаемых библиотек.

Для сравнения, Java, . NET и Python для выполнения этой простой задачи требуют подключить библиотеку/сборку/модуль и вызвать метод.

Язык C++ сам по себе вообще не определяет для этого стандартный и независимый от платформы способ. Тут вам понадобится библиотека целевой операционной системы. В Windows это windows.h
и функция CreateProcess()
, а в Linux надо вызвать fork()
, а затем exec()
.

Второе место по простоте вызова команд операционной системы занимает Perl – в нем достаточно заключить команду в обратные кавычки ( ``
).

Первое место с bat-файлами делят PowerShell и bash.

Зачем же разбирать командный интерпретатор, а не Power Shell, который, кроме всего прочего, дает доступ ко всему богатству возможностей . NET Framework?

Прежде всего, ради искусства. Разные люди делают интересные вещи чисто на bat-файлах именно потому, что это сложно. Т.е. можно рассматривать язык командного интерпретатора как эзотерический язык программирования
.

Кроме того, как-то раз в реальном проекте мне пришлось поддерживать bat-скрипты. Так что рано их списывать со счетов как морально устаревшую технологию.

Еще одно полезное отличительное свойство командного интерпретатора – для получения справки не нужен ни Гугл, ни интернет. Нужно лишь набрать команду help
. Причем, информация русском языке, если у вас русская винда.



Выполнение каких либо действий в заданный интервал времени.



    Речь пойдет не о запуске командного файла в определенное время, а

о выполнении какой-то его части только в определенный интервал времени,

например, с 10:00 до 12:00. Решения данной задачи потребует сравнения

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

файл, выполняющий запуск стандартного калькулятора Windows , только в том

случае, если он запущен в интервале времени от 10:00 до 12:00. Необходимо

получить текущее время и выполнить проверку того, что оно не больше 12:00 и

не меньше 10:00 .




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

при использовании формата:

IF /I строка1 оператор_сравнения строка2 команда

где оператор_сравнения
принимает следующие значения:

 EQL - равно NEQ - не равно LSS - меньше LEQ - меньше или равно GTR - больше GEQ - больше или равно 

а ключ /I
, если он указан, задает сравнение текстовых строк без учета

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

форме строка1==строка2
. Сравнения проводятся по общему типу данных,

так что если строки 1 и 2 содержат только цифры, то обе строки преобразуются в

числа, после чего выполняется их сравнение. Следовательно, для решения нашей

задачи нужно сравнить

строку из первых двух символов значения переменной TIME ( чч:мм:сс )

с заданным диапазоном :

 REM Время меньше 12:00 - перейти на анализ второго условия, иначе - выход
if %time:~0,2% lss 12 goto tst2
exit
:tst2
Rem Время больше 10:00 - перейти к выполнению, меньше - завершить работу выполнив exit
if %time:~0,2% gtr 10 goto excalc
exit
:excalc
calc.exe 

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

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



Пример создания архива каталога “Мои Документы”.



    Этот командный файл создает архивы содержимого папки

“Мои Документы” пользователей Win2K/XP, размещая их в каталоги

C:\ARHIV\Мои документы\Имя пользователя\Дата\время

rem Задается переменная FROM – откуда брать данные для архивирования

rem Задается переменная TO – куда помещать архивы

rem Создадим каталог ТО

rem Сформируем имя подкаталога из текущей даты

rem Сформируем имя файла архива из текущего времени – 12:00:00.99

rem отбросим сотые доли секунды и заменим символ : на символ . Результат – 12.00.00

rem Создадим подкаталог для файла архива

rem Команда для архивирования. Ключ -r нужен для архивирования с вложенными папками

rem вариант для архиватора ARJ : arj.exe a -r “%TO%\%VDATE%\%VTIME%.arj” “%FROM%\*.*”

rem При использовании архиватора RAR:

rar.exe a -r “%TO%\%VDATE%\%VTIME%.rar” “%FROM%\*.*”

Если у вас возникнут проблемы связанные с неверной кодировкой символов

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

CHCP
для смены кодовой страницы

chcp 866
– установить кодовую страницу 866 (DOS-кодировка)

chcp 1251
– установить кодовую страницу 1251 (Windows-кодировка)

Этот командный файл можно значительно сократить, убрав ненужные

переменные VTIME и VDATE, которые в данном примере, используются лишь для того ,

чтобы скрипт имел более наглядный и простой для понимания вид.

В операционных системах Windows XP/Vista/7 формат даты по умолчанию не

содержит название дня недели. Если есть необходимость получить это значение

без изменения настроек системы и использования дополнительного программного

обеспечения, можно воспользоваться сценарием Hindows Script Host (WSH).

– создаем файл сценария для получения названия дня недели, пусть с именем

weekday.vbs, и содержащим строку вывода на экран результата выполнения

функции WeekDayName

– выполняем скрипт WSH с использованием консольной

версии программы обработки сценариев cscript.exe и

подавлением лишних сообщений (ключ //nologo)

cscript //nologo weekday.vbs

Пример командного файла для получения названия дня недели с

использованием функции WeekDayName :

for /f “Tokens=1*” %%i in (‘cscript /nologo weekday.vbs’) DO set DayName=%%i

REM Дальше можно использовать переменную DayName, а файл weekday.vbs – удалить

REM ERASE dayname.vbs



Возможности, предоставляемые в сценариях WSH, намного превосходят возможности

командной строки CMD, поэтому, если задачу необходимо решить с помощью

командного файла, можно воспользоваться приемом, как в рассмотренном выше

примере.



Изменение даты и времени файлов или папок.



    В Windows, к сожалению, не существует стандартного консольного средства для изменения даты и времени создания, доступа и модификации файлов и папок . Кто имел дело с Unix/Linux знает, что в этих операционных системах имеется простая и удобная утилита touch
с помощью которой можно изменить время последнего доступа или время модификации файла на текущее значение или на значение времени, заданное в качестве аргумента командной строки. Если файл не существует, утилита создает пустой файл с указанным именем и устанавливает время создания , последнего изменения, и последнего доступа. Поэтому, нередко touch
используют для создания пустых файлов.

:/>  Можно ли установить Windows 10 бесплатно и как его удалить? Как избавиться от виндовса?

Не секрет, что командная оболочка Unix/Linux значительно превосходит по своим возможностям командную строку Windows, поэтому, вполне понятно появление пакета UNIX Shell and Utilities
для Windows NT и старше. Этот пакет представляет собой Windows-версии наиболее популярных утилит из среды Unix/Linux , которые могут выполняться как консольные команды в среде оболочки пользователя (в среде модуля sh.exe
, входящего в пакет) или как исполняемые файлы в командной строке Windows. В набор входит

более 200 программ от компании Mortice Kern Systems (MKS)
,

рекомендуемых Microsoft в качестве средства миграции с Unix на Windows.

Справку по работе с touch.exe
можно получить при запуске утилиты с принятым в Unix ключом “–help”

При этом пользователю выводится краткая подсказка

-c
– Указывает утилите не создавать файл, если он не существует.

-m
– Устанавливает время последнего изменения файла.

-r file
– Использовать значения времени из файла, заданного аргументом file.

-t time
– Устанавливает время последнего изменения (модификации) и доступа в соответствии с указанным форматом date_time.

СС
– первые две цифры года (век).

YY
– последние две цифры года.

MM
– двузначный номер месяца.

DD
– двузначный номер дня.

hh
– значение часов даты.

mm
– значение минут даты.

SS
– значение секунд даты.

   

Примеры использования утилиты touch.exe
в командной строке Windows:

touch C:\folder\myfile.txt
– изменить время доступа и модификации файла C:\folder\myfile.txt на текущее. Если файл не существует, он будет создан с нулевой длиной и текущим временем создания, модификации и доступа.

touch C:\folder
– изменить время доступа и модификации папки C:\folder на текущее.

touch -f C:\ntldr C:\folder
– изменить время доступа и модификации папки C:\folder на время, установленное для файла C:\ntldr

touch -t 199803080102.00 C:\folder
– установить для существующей папки “C:\folder” значение даты и времени модификации – 1998г., 8 марта, 1 час : 2 минуты :00 секунд

touch -t 1112.30 C:\folder
– установить для существующей папки “C:\folder” значение даты и времени модификации – текущая дата, 11 час : 12 минут :30 секунд

touch -a -t 2222.20 C:\folder
– изменить только время доступа, время модификации не изменяется.

setdate.exe -c C:\1.txt 22.11.2011
– установить для файла C:\1.txt дату создания 22.11.2011

setdate.exe -m C:\1.txt 22.11.2011
– установить для файла C:\1.txt дату изменения (модификации) 22.11.2011

setdate.exe -a C:\1.txt 22.11.2011
– установить для файла C:\1.txt дату доступа 22.11.2011

setdate.exe -d C:\1.txt 22.11.2011
– установить для файла C:\1.txt все даты 22.11.2011



Выполнение команд по расписанию.



В операционных системах WINDOWS 2000/XP и старше существует утилита командной

строки AT. EXE
, позволяющая управлять задачами для

планировщика заданий
Windows, и таким образом, выполнить команду или

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

Естественно, для успешного функционирования команды AT
необходимо,

чтобы была запущена системная служба Планировщик заданий
(обычно

она существует и запускается автоматически при стандартной установке

системы).

\\имя_компьютера
– имя удаленного компьютера. Если этот параметр

опущен, задача относится к локальному компьютеру.

код
– порядковый номер запланированной задачи.

Указывается если нужно отменить уже запланированную задачу с помощью

ключа /delete
.

/delete
– отменить запланированную задачу. Если код задачи опущен,

отменяются все задачи, запланированные для указанного

компьютера.

/yes
– не будет запроса на подтверждение при отмене всех

запланированных задач.

время
– Время запуска команды.

/interactive
– интерактивный режим, разрешение взаимодействия

задачи с пользователем. Задачи, запущенные без этого ключа невидимы для

пользователя компьютера.

“команда”
– Команда или имя командного файла.


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

  • Просмотр списка запланированных задач:
  • – Удаление уже спланированных задач:
  • AT 3 /DELETE
    – удаление задачи с номером 3

    AT /DELETE /YES
    – удаление всех задач без запроса подтверждения

  • Создание интерактивных задач
  • at \\SERVER 15:21 /interactive notepad.exe
    – на компьютере

    SERVER в 15:21 запустить видимое для пользователя приложение

    “Блокнот” (notepad.exe)

    AT 15:30 /interactive regedit.exe
    – в 15:30 запустить видимый

    редактор реестра на своем компьютере.

  • Аналог “будильника” – всплывающие окна с текстом, напоминающие о

    необходимости каких-либо действий. Для посылки сообщения удаленному

    пользователю используется утилита NET. EXE
    в режиме отправки

    сообщения SEND
    . На компьютерах должна быть запущена служба

    сообщений, иначе NET SEND не будет работать. В ОС Windows Vista и более поздних,

    отправку сообщений нужно выполнять с помощью утилиты msg.exe
    , поскольку

    команда net send в этих ОС больше не поддерживается. Описание команды MSG
  • AT 17:30 net.exe send COMP Пора домой
    – в 17:30 отправить сообщение

    “Пора домой” пользователю компьютера COMP

    AT 17:30 msg.exe * /server:COMP Пора домой
    – то же, что и в предыдущем случае, но с использованием команды msg

    AT 17:39 msg.exe * Пора домой
    – запланировать на 17:39 отправку текстового сообщения “Пора домой” всем пользователям данного компьютера

    в среде Windows Vista / 7 / 8

    AT \\PROXY 15:30 net.exe send COMP2 Test Message
    – создать задание на

    компьютере PROXY, чтобы в 15:30 им было отправлено сообщение “Test Message”

    на компьютер COMP2

    AT 15:45 net.exe send имя своего компьютера Task Scheduler test
    – в

    15:45 на своем компьютере показать сообщение “Task Scheduler test”

    Для доступа к удаленному компьютеру и создания заданий,

    пользователь, выполняющий команду AT
    должен обладать

    соответствующими правами по отношению к удаленной системе.

    Создаваемые командой AT
    задачи доступны для обработки в среде

    пользователя с помощью оснастки “Назначенные задания” Windows.

    Пуск – Панель управления – Назначенные задания
    – здесь можно

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


    задачи. В Windows Vista / 7 используется меню – Панель управления – Администрирование – Планировщик заданий.



    Остановка и запуск системных служб.




    Для остановки и запуска служб из

    командной строки, в любой версии Windows, можно воспользоваться командой NET. EXE





    NET. EXE STOP < имя службы >

    NET. EXE START < имя службы >




    В качестве параметра команды можно использование как короткое, так и полное имя службы

    (“Dnscache” – короткое, “DNS-клиент” – полное имя службы).

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

    Пример перезапуска службы “DNS-клиент”

    net stop “DNS-клиент”

    net start “DNS-клиент”





    То же, с использованием короткого имени:


    net stop Dnscache

    net start Dnscache




    Полное имя службы можно скопировать из

    “Панель управления” – “Администрирование” – “Службы” – Имя службы –

    “Свойства” – “Выводимое имя”.

    То же самое, но в режиме командной

    строки: “Пуск” – “Выполнить” – services.msc
    .



    Для управления службами гораздо удобнее воспользоваться утилитой

    PsService.exe из

    утилит PsTools


    Утилита не требует установки и работает в любой OS Windows. Кроме запуска и

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

    продолжить, перезапустить.

        Для работы с системными службами в Windows XP и старше, можно использовать

    утилиту sc.exe
    ,

    позволяющую не только остановить/запустить службу, но и опросить ее

    состояние, параметры

    запуска и функционирования, изменить конфигурацию, а также работать не только

    с системными службами,

    но и с драйверами. При наличии соответствующих прав, можно управлять

    службами не только на локальной, но и на удаленной машине. Примеры:

    :/>  Ноутбук подключен к сети, но зарядка не идет: что делать?

    sc.exe stop DNSCache
    – остановить службу DNSCache на локальном компьютере.

    sc \\COMP start DNSCache
    запустить службу DNSCache на компьютере COMP

    Подсказку по работе с утилитой можно получить, введя:




    Выдача значения переменной ERRORLEVEL .






    Ввод пользователя

    SET /P A=Enter something:

    Выведет приглашение для ввода и будет ждать ввода строки. Введенная строка окажется в переменной A
    .

    Условия

    Ничего не выводит.

    Если строки до и после знаков равенства совпадают с учетом регистра, то команда выполняется, иначе не выполняется. В обеих строках можно использовать переменные. При этом надо иметь ввиду, что в переменных может быть всё, что угодно, включая знаки равенства и пустые строки. От значений переменных будет зависеть синтаксическая правильность команды.

    Вот такой способ проверить параметр командной строки работает и при отсутствии параметра, и если в нем спецсимволы:

    Оператор &&
    – это один из способов выполнить несколько команд под условием. На самом деле это ленивое «и», т.е. если первая команда вернет ненулевой errorlevel
    , то вторая уже не выполнится.

    Другой способ – скобки:

     if "%~1"=="help" (
     echo This is help exit /B
    ) else (
     Echo This is the main part
    ) 

    Как видите, со скобками можно использовать слово else
    .

    Насчет скобок нужно помнить одну вещь. Условие или цикл с блоком команд в скобках – это одна команда. Значения переменных в ней подставляются один раз в самом начале.

    То есть, нельзя внутри такого блока присвоить значение переменной и позже в том же блоке его использовать. Нельзя присвоить значение на одной итерации цикла и использовать на другой.

    При таких сценариях приходится выносить код в подпрограммы.

    Есть еще поздняя подстановка переменных. Ее надо включать командой SETLOCAL ENABLEDELAYEDEXPANSION
    , а вместо символа ” %
    ” использовать ” !
    “.

    Замена подстрок

     SET A=abcdefgh
    ECHO %A:c=C% 

    Заменяет строчную букву C на заглавную. Выводит:

    Выводит 2 символа, начиная с 5-го, в данном случае ” ef
    “.

    Дисклеймер

    Мне 12 и я сам в этой теме плохо шарю, т.к. инфы в инете мало. Пж, без хейта.

    Наводим красоту

    не эта :)
    не эта 🙂

    не делает ничего и служит комментарием к коду

     rem Это самая лучшая прога в мире!!!!! 

    Код включает русские символы и другие из ascii(например: “╬▓☼”, можно скопировать с http://pascalguru.ru/psevdograf.html

    ), иначе ascii символы превратятся в кракозябры:

     chcp 65001 

    Следующий код код работает, как команда “pause”, но ничего не выводит на экран и не реагирует на нажатие клавиш(я потом объясню, как это работает).

     :m
    goto m 

    А этот – меняет заголовок окна на “name”

    Заголовок окна
    Заголовок окна
     title name 

    Эта команда меняет цвет фона и текста, вместо a и b можно поставить любые шестнадцатеричные цифры(команда не сработает если a = b) см. таблицу ниже. Запись c одной буквой “а” аналогично записи “0a”

     color ab 
    Таблица
    Таблица

    Эта – досрочно завершает программу

     exit 

    Циклы и условия

    Цикл можно создать с помощью команды “for”, синтаксис следующий:

     for %%i in (a b c) do (	cmd
    ) 
     for %%i in (a b c) do cmd 

    (a b c) это список (не обязательно из 3-х элементов) и переменная %%i (нужно ставить символ после процентов, а не между) по очереди проходит по значениям в списке

    Если добавить флаг “/l”, то переменная в первый раз будет равна “a”. К ней каждый раз будет прибавляться “b”, пока она не станет больше “c”(тут размер ДОЛЖЕН
    равняться 3)

    запустите этот код, тут все наглядно

     @echo off
    chcp 65001
    echo Начало
    for /l %%i in (1 1 10) do echo %%i
    echo Конец
    pause 

    Команда if выполняет код, если условие верно (или если поставить not после if, когда НЕ
    верно), вот операторы сравнения:

    P. S. строки нужно брать в кавычки “%str%”==”Hello”

     @echo off
    set /p a=Enter number
    if a gtr 0 echo positive else\
    if a equ 0 echo 0 else echo negative
    pause 

    в 3-ей строке, если “a” > 0 выводиться “положительный”(на английском 🙂 ), если равен – 0,в 4-ой если меньше – “отрицательный”

    символ “\” означает, что команда продолжается на следующей строке

    Подробнее о переменных

    Если добавить флаг “/p”, то выводиться значение после символа “=”, а переменной задается введенное значение(запустите этот код:)

     @echo off
    set /p a=Enter str
    echo %a%
    pause 

    следующий код вырезает строку от символа номер “a” до символа номер “b” НЕ включительно(счет идет с нуля, отрицательные числа – счет с конца от единицы). Если аргумент один, то он присваивается числу “b”, а “a” = 0

     %str:~a,b% 

    следующий заменяет подстроки “a” в строке на строки “b”:

     %str:a=b% 

    Арифметика

    Команда set /A
    вычисляет выражения

     SET /A A=2+3
    ECHO %A% 

    Метки

    Создадите файл start.bat в той же папке, где и test.bat, напишите в нем:

     test.bat 2 2 

    Мы запустили батник, НО подали в него аргументы 2 и 2. Чтобы к ним обратиться, нужно написать %n, где “n” – номер аргумента, считая от одного(не от нуля), вот код, считающий сумму первого и второго аргумента (их может быть от нуля до 9-и):

     @echo off
    set /a res=%1+%2
    echo res
    pause 

    Метка – это именованное место в коде, она создается с помощью команды “:name”

    А этот переходит на метку :m и продолжает выполнение, начиная с нее

     rem куча кода
    :m
    rem куча кода
    goto m
    rem куча кода 

    И в завершение статьи, хочу сказать о команде call. Она превращает в последующей команде “%%” в “%”, а переменные – на их значения. Пример использования:

     call echo %%str:~%a%,%b%%% 

    Разыменование переменных

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

    Допустим, переменная A
    содержит ключ:

    Записать значение по ключу можно так:

    Следующая команда выведет «bbb»:

    А вот читать по ключу не так просто. Подстановка переменных не рекурсивна. То есть, нельзя, используя только знак « %
    », подставить «aaa» вместо «A», а затем, «bbb» вместо «aaa».

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

     SETLOCAL ENABLEDELAYEDEXPANSION
    echo !%A%! 

    Желающие усложнить себе задачу отказом от поздней подстановки, могут разбирать вывод команды set
    при помощи цикла for
    :

    Обратите внимание, что в цикле надо проверять имя переменной, которую нам вернули, даже если указать имя нужной переменной в команде set
    . Дело в том, что могут существовать переменные с именами, начинающимися с нужного. Если убрать параметр команды set
    , результат не изменится. Но указывая этот параметр, мы оптимизируем алгоритм. Но это не точно.

    Вызов подпрограмм и других скриптов

    Очередная контринтуитивная фича bat-файлов в том, что, если из одного bat-файла вызвать другой, выполнение первого файла не продолжится, если только не использовать ключевое слово call. То есть, мы должны разбираться, чем является команда, которую мы хотим вызвать. Если это bat-файл, то надо перед его именем написать call. Если это exe-файл или встроенная команда, то это слово не нужно. Кроме того, если вызываемый скрипт использует команду exit
    , то выполнение также не вернется к нам. Чтобы завершить только текущий скрипт, надо писать exit /B
    .

    При вызове одного скрипта из другого не создается новый процесс. Поэтому переменные окружения, установленные вызванным скриптом, видны вызывающему.

    В следующем примере

    вызывает call
    . Этот пример также демонстрирует работу с кодом завершения процесса.

     call 

    @echo off
    echo Before call
    call :b
    echo b returned %errorlevel%
    goto :eof

    :b
    echo Inside b.bat
    exit /B 1

    a.bat

    b.bat Командой
    также можно вызвать код, находящийся в том же файле:

     @echo off
    echo Before call
    call b.bat
    echo b.bat returned %errorlevel% 
     echo Inside b.bat
    exit /B 1 Работает аналогично предыдущему примеру, но это один файл. 
     

    С двоеточия начинаются метки. На них можно переходить командами

    и goto
    . В языке bat-файлов нет понятия подпрограммы. Мы будем так называть код, который вызывается через call
    и возвращает управление через exit /B
    или goto :eof
    . Метка :eof
    не определена, и это не ошибка. Эта метка не нуждается в определении. Она всегда означает конец файла. Т.е. переход на :eof
    – это выход – то же, что и exit /B
    , но без кода завершения. Before call
    Inside b.bat
    b.bat returned 1

    Переменные

    Создать переменную можно с помощью команды set, синтаксис объявления следующий: P. S. это не совсем переменные, это скорее макросы (для тех к кто не знает C/C++ это именованный кусочек кода, имя которого заменяется на этот кусочек кода)

     set a=Hello world 

    Если после "set" добавить флаг "/a" то:

    1. Переменной задастся значение выражения, а не его текст, например:

       set a=2+2
      > 2+2
      set /a a=2+2
      > 4 
    2. Переменной можно присвоить ТОЛЬКО числовое значение

    Чтобы обратиться к переменной, нужно окружить ее символами "%" (так %name%), пример кода:

     set /a a=%b%+%b%
    echo %a% 

    Цикл FOR

    Это единственный вид цикла. Если нужно что-то типа while
    или until
    , то придется использовать операторы if
    и goto
    .

    Зато цикл FOR имеет несколько опций, выходящих за рамки того, что обычно делает цикл

    Итерирование по словам

     @echo off
    FOR %%a in (one two three) do echo %%a 

    Выводит каждое слово в новой строке:

     one
    two
    three 

    Этот пример необходимо записать в bat-файл и запустить файл. Если вводить цикл в командной строке, то он должен выглядеть слегка иначе:

    Да, синтаксис переменной цикла зависит от того, вводим ли мы этот цикл в командной строке или он записан в файл. Если какой-то софт запускает команду, которую вы ему укажете, и вы хотите использовать в ней цикл, синтаксис зависит от того, каким образом этот софт передает команду командному интерпретатору. Это можно делать через командную строку или через стандартный ввод. В этих случаях используется один знак процента. Вариант с файлом мы уже пробовали в примере. Там используются два знака процента.

    Цикл разбирает строку в скобках по тем же правилам, что параметры командной строки: строка в кавычках – это один параметр. Пример:

     @echo off
    FOR %%a in ("twenty one" "twenty two") do echo %%~a 

    Выводит две строки:

     twenty one
    twenty two 

    Строки выводятся без кавычек, потому что использована переменная %%~a
    . %%a
    содержит кавычки.

    Цикл по файлам или папкам

    Следующая команда выводит список файлов в текущем каталоге:

    А так можно получить список папок:

    Параметр /R включает обход всех подкаталогов. При этом в переменной цикла полные пути:

    Вместо " *.*
    " можно писать просто " *
    ". Результат абсолютно такой же: в обоих случаях выбираются файлы как с расширениями, так и без.

    Цикл по числам с заданным шагом

    Используем параметр /L
    , а в скобках указываем начало, шаг и конец (включительно) через запятую. Обратите внимание, что для числа, указанного как конец интервала, команда тоже будет вызвана, если длина интервала делится на шаг. Шаг может быть отрицательным.

     10
    9
    8
    7
    6
    5 

    Разбор файлов и строк

    Каждый файл открывается, каждая строка читается и разбивается на одну или более подстрок. Подстроки записываются в отдельные переменные. Например, если переменная цикла - %%a
    , то будут созданы переменные %%a
    , %%b
    ,

    %%c exit /B
    и т.д.

    При разборе строки разделителями по умолчанию считаются пробелы и табуляции.

    Вот так можно разобрать строку, указанную непосредственно:

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

    Выводит список файлов, разбирая вывод команды exit
    .

    Наберите help for
    , чтобы узнать все опции.

    Переменные

    Переменные в bat-файлах – это переменные окружения. Это значит, что все переменные, установленные скриптом, доступны процессам, которые он запускает. Это надо иметь ввиду при работе с паролями.

    Переменные создаются и изменяются командой set
    :

    Создали переменную с именем hello
    и значением world
    .

    Команда set
    без параметров выводит список всех переменных.

    Следующая строка выведет слово "world":

    Имена переменных нечувствительны к регистру. Следующая строка тоже выведет слово "world":

    Значения переменных могут содержать знак равенства:

     set equation=x=y
    echo %equation% 

    Значение переменных вставляются в текст команды, и только потом происходит ее разбор. Это значит, что переменная может содержать саму команду и/или любое количество параметров.

    Специальные переменные

    Переменные, перечисленные ниже, используют один знак %, только в начале, в отличие от обычных переменных.

    %0
    – имя bat-файла, который сейчас выполняется, в том виде, как оно указано в командной строке. Для запуска bat-файла его имя может быть написано с полным путем, с относительным путем, без пути, с расширением, без расширения, маленькими или заглавными буквами. Соответственно, в переменной %0
    оно может оказаться во всех этих вариантах. Но в любом случае командой %0
    скрипт запускает сам себя.

    %*
    – все параметры, т.е. всё, что идет в командной строке после имени bat-файла, со всеми кавычками и пробелами, какие есть.

    %errorlevel%
    - код возврата последней команды

    %CD%
    - текущая директория

    %DATE%
    и %TIME%
    - текущие дата и время

    %RANDOM%
    - случайное число

    Преобразование параметров при подстановке

    %~1
    – первый параметр без кавычек. Как вы помните, параметр может быть указан либо в кавычках, либо без них, и кавычки, если они есть, будут и в переменной. От того, есть ли кавычки в переменной, зависит, будет ли содержащее ее выражение синтаксически правильным. Проверить наличие кавычек с помощью оператора if не получится, потому что в одном из двух случаев выполнение скрипта прервется из-за синтаксической ошибки. Однако, тильда перед именем переменной гарантирует, что кавычек на месте этой переменной не будет.

    %~dp0
    – полный путь к папке текущего bat-файла, без имени самого файла.

    %~nx0
    – имя и расширение текущего bat-файла, без пути

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

    Заключение

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