Pull to refresh

Решаем практические задачи на батниках

Reading time3 min
Views17K
Батники это не мощный язык программирования, но, в то же время, на нем можно решить много рутинных задач. Цель статьи не просто рассказать о возможностях Windows-консоли, а показать их, решая практические задачи с которыми мне приходилось сталкиваться.

Подтверждение выполнения



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 для вычисления выражений. ;)
Tags:
Hubs:
+27
Comments29

Articles