Батники это не мощный язык программирования, но, в то же время, на нем можно решить много рутинных задач. Цель статьи не просто рассказать о возможностях Windows-консоли, а показать их, решая практические задачи с которыми мне приходилось сталкиваться.
Устанавливаем переменную answer в пустое значение (необходимо, для того чтобы затереть предыдущее значение, например, если батник исполняется несколько раз). set с ключом /p устанавливает значение переменной, которое вводится пользователем. Проверяем значение переменной и если оно не равно y завершаем выполнение батника.
В батниках есть возможность получать подстроку используя синтаксис %variable:~m,n% Где variable это название переменной m – индекс первого символа, а n – количество символов подстроки.
Следовательно, если команда echo %date% (а формат даты может у вас отличатся) выведет 13.06.2009, то для того чтобы получить текущий месяц достаточно выполнить %date:~3,2% Таким образом, если нам необходимо, например, сформировать имя файла или директории, которое соответствует текущему месяцу и дню, мы это сделаем так:
Лично мне такое понадобилось для задания ключа /d для xcopy.
Я не сразу догадался, что это можно делать вот так: :)
Т.е. нужно поставить точку после echo.
В большинстве случаев это:
Задача состоит в том, чтобы заархивировать файл с именем, которое меняется ежедневно, но в другую папку. Следующим куском кода
мы выбираем все файлы по маске, исполняя команду rar a -ep c:\other_dir\%%~ni.rar %%i для каждого, где %%~ni это только имя файла.
Нужно, например, для того чтобы вести один лог для нескольких батников.
Если мы исполняем в одном батнике несколько повторяющихся команд, но с разными значениями переменных, то это можно реализовать так:
Таким образом, у меня отсылается десяток разных файлов разным получателям, используя The Bat! Такой файл читать и редактировать намного удобнее, чем это было бы десять команд The Bat! подряд.
Для начала получим список всех файлов, отсортированных по дате модификации:
И пройдемся по нему циклом.
Логично, что по завершению цикла в переменной %lastfile% у нас будет последний по дате модификации файл ;)
Где файл file_to_ftp.txt будет у нас выглядеть следующим образом:
Разобраться в коде предлагаю вам самим. :) Основная возможность, которую я хотел показать данным примером, это использование ключа /a команды set для вычисления выражений. ;)
Подтверждение выполнения
set answer= set /p answer="Выполнить? [y/n]:" if not "%answer%" == "y" exit /b
Устанавливаем переменную answer в пустое значение (необходимо, для того чтобы затереть предыдущее значение, например, если батник исполняется несколько раз). set с ключом /p устанавливает значение переменной, которое вводится пользователем. Проверяем значение переменной и если оно не равно y завершаем выполнение батника.
Как получить текущий месяц, день, год и т.п.?
В батниках есть возможность получать подстроку используя синтаксис %variable:~m,n% Где variable это название переменной m – индекс первого символа, а n – количество символов подстроки.
Следовательно, если команда echo %date% (а формат даты может у вас отличатся) выведет 13.06.2009, то для того чтобы получить текущий месяц достаточно выполнить %date:~3,2% Таким образом, если нам необходимо, например, сформировать имя файла или директории, которое соответствует текущему месяцу и дню, мы это сделаем так:
set fname=%date:~3,2%%date:~0,2%
Лично мне такое понадобилось для задания ключа /d для xcopy.
Как вывести пустую строку в лог-файл?
Я не сразу догадался, что это можно делать вот так: :)
echo.>> %logfile%
Т.е. нужно поставить точку после echo.
Предыдущая команда выполнена успешно?
В большинстве случаев это:
if %errorlevel%==0 ( echo OK>> %logfile% ) else ( echo ERROR #%errorlevel% >> %logfile% )
Архивирование файла с переменным именем
for %%i in (c:\dir\#fe*.*) do rar a -ep c:\other_dir\%%~ni.rar %%i
Задача состоит в том, чтобы заархивировать файл с именем, которое меняется ежедневно, но в другую папку. Следующим куском кода
for %%i in (c:\dir\#fe*.*) do
мы выбираем все файлы по маске, исполняя команду rar a -ep c:\other_dir\%%~ni.rar %%i для каждого, где %%~ni это только имя файла.
Имя текущего исполняемого батника
%~n0
Нужно, например, для того чтобы вести один лог для нескольких батников.
«Функция» в батниках
Если мы исполняем в одном батнике несколько повторяющихся команд, но с разными значениями переменных, то это можно реализовать так:
set thebat=c:\Program Files\The Bat!\thebat.exe set action=SEND set mailto=email_1@domain.com set subject=Subject_1 set attach=c:\dir\file???? call :mailit set mailto=email_2@domain.com set subject=Subject_2 set attach=c:\dir\file*.rar call :mailit … exit :mailit @echo on "%thebat%" /MAILTO="%mailto%";SUBJECT="%subject%";ATTACH="%attach%";%action% >> %logfile% @echo off exit /b
Таким образом, у меня отсылается десяток разных файлов разным получателям, используя The Bat! Такой файл читать и редактировать намного удобнее, чем это было бы десять команд The Bat! подряд.
Получить последний по дате создание файл
Для начала получим список всех файлов, отсортированных по дате модификации:
dir /b /od /a-d c:\dir\file_*.xls
И пройдемся по нему циклом.
for /f "tokens=*" %%a in (' dir /b /od /a-d c:\dir\file_*.xls ') do set "lastfile=%%a"
Логично, что по завершению цикла в переменной %lastfile% у нас будет последний по дате модификации файл ;)
Выкачать файл по FTP
ftp -s:file_to_ftp.txt 127.0.0.1
Где файл file_to_ftp.txt будет у нас выглядеть следующим образом:
login password bin cd /files put file.xls quit
Создаем нумерованные каталоги с инкрементом на единицу
set dir_last= for /f "tokens=*" %%i in ('dir /ad /b') do set dir_last=%%i if '%dir_last%'=='' (set dir_last=000) set dir_last=1%dir_last% set /a dir_last = %dir_last% - 1000 set /a dir_new=%dir_last% + 1 set dir_new=00%dir_new% set dir_new=%dir_new:~-3% md %dir_new%
Разобраться в коде предлагаю вам самим. :) Основная возможность, которую я хотел показать данным примером, это использование ключа /a команды set для вычисления выражений. ;)