BAT
Команда FORFILES является удобным средством выполнения заданных команд для группы файлов в пакетных заданиях.
В BAT файлах можно использовать любые команды MS DOS. Смысл нашей программы будет в том, чтобы она создала папочку и скопировала туда содержимое текущей папочки. Пишем:
echo off
cls
echo start backup
mkdir backup
copy *.* backup
echo end backup
Запускаем.
И смотрим в проводнике:
Вот так, все получилось ! И не надо постоянно копировать много файлов и создавать папочку. Совершенно не обладая навыками программирования Вы можете все-таки облегчить себе жизнь.
Вызывая из командной строки bat файл:
или из другого файла:
call 6.bat 18012002
Внутри этого BAT файла Вы можно обработать параметры. Для получения параметра мы должны использовать символ % и номер параметра. MS DOS заменит эту конструкцию переданным параметром. Давайте пробовать:
echo off
cls
echo start backup
mkdir %1
copy *.* %1
echo end backup
Запускаем.
И результат.
Специальных команд, которые используются в BAT файлах не много. Именно специальных, которые могут пригодиться при создании логики командного файла. Конечно, эти команды относятся к внутренним командам MS DOS и могут использоваться в командной строке, но все-таки эти команды обретают смысл только в пакетных файлах.
call Вызов одного пакетного файла из другого.
echo Вывод сообщений и переключение режима отображения команд на экране.
for Запуск указанной команды для каждого из файлов в наборе.
goto Передача управления в отмеченную строку пакетного файла.
if Оператор условного выполнения команд в пакетном файле.
pause Приостановка выполнения пакетного файла и вывод сообщения
rem Помещение комментариев в пакетные файлы и файл CONFIG.SYS.
shift Изменение содержимого (сдвиг) подставляемых параметров для пакетного файла.
Кстати Вы можете легко получить подсказку по каждой этой команде в сеансе MS DOS используя ключ /?
Итак, у нас есть внутренние команды и внешние. После того как в BAT файле находится команда, то сначала проверяется есть ли такая команда внутри command.com. Например echo - это внутренняя команда и исполняет ее command.com. Если же эта команда не найдена, то будет произведен поиск файла с расширением exe или com во всех каталогах указанных в переменной среды PATH. Смотрите на рисунок ниже.
Команды echo и cls будут обработаны внутри command.com. А команда edit.com не будет обработана (кстати расширение можно не указывать) раз такой команды нет, то будут исследованы все доступные пути на предмет файлов с таким названием. Если файл будет найдет, то он будет запущен. Это очень важно, так как позволяет нам очень быстро используя простые средства разработки типа Turbo C++ или Turbo Pascal создавать расширения стандартных команд. Сразу скажу, что подобные программы должны создаваться для MS DOS, а современные средства разработки типа Visual C++ 6.0 не умеют создавать эти простенькие программы.
Pause позволяет остановить выполнение Bat-файла до нажатия клавиши на клавиатуре. Это может быть полезно, например, если Вы хотите, чтобы пользователь подтвердил выполнение какого-то действия нажатием на клавишу. То есть, что он в своем уме и осознает, что происходит.
Приостановка выполнения пакетного файла и вывод сообщения:
Нажмите любую клавишу....
PAUSE
Смотрим пример, который копирует файл на дискету.
echo off
cls
echo insert disk to A:
pause
copy 1.txt a:
В момент выполнения программа остановится.
А после нажатия скопируется. Но на экране останется окно.
Если Вы не хотите чтобы оно было, вызовите последней командой cls
.....
copy 1.txt a:
cls
И после копирования оно пропадет.
IF можно использовать для сравнения. Оператор условного выполнения команд в пакетном файле.
IF [NOT] ERRORLEVEL число команда
IF [NOT] строка1==строка2 команда
IF [NOT] EXIST имя_файла команда
NOT Windows выполняет команду лишь в том случае,
если условие ложно.
ERRORLEVEL число Условие истинно, если последняя запущенная программа
завершилась с кодом возврата, равным либо превышающим
указанное число.
команда Команда, которую следует выполнить в случае
истинности условия.
строка1==строка2 Условие истинно при совпадении обеих строк.
EXIST имя_файла Условие истинно, если указанный файл существует.
В случае сравнения строк если сравнение верно, то будет выполнена команда за IF, иначе она будет пропущена. Итак, создадим general.bat, который будет запускать с параметрами другой bat файл.
call 8.bat A
А в командном файле 8.bat напишем условие.
echo off
cls
if "%1"=="A" Attrib.exe
if "%1"=="E" Edit.com
Запускаем.
Сработала только строка с параметром A.
Команда shift позволяет сдвигать параметры.
Изменение содержимого (сдвиг) подставляемых параметров для пакетного файла.
SHIFT
Параметров может быть много. Например, столько:
call 10.bat Hello Params str 123
Первый параметр - это %0 в нем имя вызываемого bat файла. Давайте проверим.
echo off
clsecho %0
echo %1
echo %2
echo %3
echo %4
echo -------------------------------
echo shift
echo -------------------------------
shift
echo %0
echo %1
echo %2
echo %3
echo %4
Смотрим результат.
После вызова все параметры были смещены.
Здесь нам может помочь команда CALL:
CALL [диск:][путь]имя_файла [параметры_вызова]
параметры_вызова Параметры командной строки, использующиеся
при вызове пакетного файла.
Давайте попробуем создаем в той же папочке, где и наш файл для резерва, новый BAT файл General.Bat с вызовом другого.
call 5.bat
Запускаем и смотрим.
И результат тот же.
Для вывода сообщения в BAT файлах используется команда echo:
Вывод сообщений и переключение режима отображения команд на экране.
ECHO [ON | OFF]
ECHO [сообщение]
Ввод ECHO без параметров позволяет выяснить текущий режим отображения команд.
Давайте попробуем создать простой BAT файл:
echo
echo hello batch files
Запускаем.
Как видите, режим Echo включен по умолчанию. В итоге отображается и команда и результат. Давайте его выключим.
echo off
echo hello batch files
Запускаем.
Но первая команда все равно видна. Это можно исправить, сразу вызвав CLS(команда очистки экрана) после отключения режима отображения. CLS это внутренняя команда MS DOS и может вызываться прямо из командной строки.
echo off
cls
echo hello batch files
Запускаем.
Вот теперь то что надо, почти настоящая программа.
Подробнее ...
А теперь немного посложнее, нам нужно написать программу, которая возьмет эту строку из файла и создаст другой BAT файл, вписав туда имя вызываемого BAT файла и параметры. Вот его код.
#include "stdio.h"
#include "process.h"
#include "FCNTL.H"
#include "string.h"
#include "io.h"int main(int argc, char *argv[ ])
{
printf("First Steps Site(C) 2002\n");
if (argc==4)
{
int ifile;
int ofile;
int rez;
ifile=_open(argv[1],O_RDONLY);
if (ifile!=-1)
{
char buffer[255];
rez=read(ifile,buffer,254);
if (rez!=-1)
{
buffer[rez]=0;
ofile=open(argv[2], O_CREAT | O_WRONLY | O_TRUNC);
if (ofile!=-1)
{
write(ofile,argv[3],strlen(argv[3]));
write(ofile," ",2);
write(ofile,buffer,strlen(buffer));
close(ofile);
}
else
{
printf("error create\n");
return 1;
}
}
else
{
printf("error read\n");
return 1;
}
}
else
{
printf("error open file \n");
return 1;
}
return 0;
}
else
{
printf("error parametrs\n");
return 1;
}
}
Сам код и EXE есть в проекте. Как этим EXE можно воспользоваться ? Смотрите:
runbats.exe times.txt temp.bat start.bat
Первый параметр - это файл откуда брать строку, второй параметр - это какой BAT файл сформировать, третий параметр - это какой BAT файл вызывать. Результат работы будет такой.
Нам осталось только сложить все в месте. Пишем backup.bat:
times.exe times.txt
runbats times.txt temp.bat start.bat
temp.bat
Получить дату в файл, сформировать BAT файл с параметрами и запустить его. В результате работы все получится.
Вся идея в том, что последний BAT файл, который мы запускаем формируется динамически. А весь код, который нужно выполнить пишется в Start.bat. Если Вы хотите, чтобы копирование производилось на сервер, используйте UNC пути (см. "Шаг 18 - Universal Naming Convention - UNC"). Вот, например, BAT файл, который у меня работает.
mkdir \\Servers\work\%1
copy *.* \\Servers\work\%1
Можно добавить в автозапуск и Ваша папочка будет копироваться на сервер каждый день, кроме того Вы сможете найти копии по датам.
Одним из недостатков BAT файлов является то, что в результате работы какой-то программы мы не можем получить ее результат, кроме кода возврата. Ну, например, мы хотим, чтобы при запуске BAT файла производилось резервное копирование в папочку. Это мы можем сделать, а вот как сделать так, чтобы имя папки формировалось в соответствии с текущей датой. Умея немного программировать для DOS это можно сделать. Напишем программу Times.exe, которая будет записывать в указанный файл текущую дату. Я использовал Borland C++ 3.1, Вы можете использовать все, что может делать программы в формате MS DOS. Вот код.
#include "stdio.h"
#include "process.h"
#include "FCNTL.H"
#include "string.h"
#include "io.h"int main(int argc, char *argv[ ])
{
printf("First Steps Site(C) 2002\n");
if (argc==4)
{
int ifile;
int ofile;
int rez;
ifile=_open(argv[1],O_RDONLY);
if (ifile!=-1)
{
char buffer[255];
rez=read(ifile,buffer,254);
if (rez!=-1)
{
printf(argv[1]);
printf(" ");
printf(argv[2]);
printf(" ");
buffer[rez]=0;
printf(buffer);
printf("\n");
ofile=open(argv[2], O_CREAT | O_WRONLY | O_TRUNC);
if (ofile!=-1)
{
write(ofile,argv[3],strlen(argv[3]));
write(ofile," ",2);
write(ofile,buffer,strlen(buffer));
close(ofile);
}
else
{
printf("error create\n");
return 1;
}
}
else
{
printf("error read\n");
return 1;
}
}
else
{
printf("error open file \n");
return 1;
}
return 0;
}
else
{
printf("error parametrs\n");
return 1;
}
}
Сам код и готовый EXE находится в проекте. Использовать его достаточно легко, надо создавать BAT файл, в котором передается параметр.
times.exe times.txt
В результате работы будет создан текстовый файл, в котором находится текущая дата.
В прошлом примере мы посмотрели IF, но как нам поступать, если нужно выполнить больше чем одну команду? Вот тут нам поможет GOTO.
Передача управления в отмеченную строку пакетного файла.
GOTO метка
метка Текстовая строка, играющая в пакетном файле роль метки.
Метка должна находиться в отдельной строке программы и начинаться с двоеточия.
Эта команда переводит выполнение Bat-файла на указанную метку. Давайте переделаем прошлый пример на вывод нескольких строк в зависимости от параметров.
echo off
cls
if "%1"=="A" GOTO ACOM
if "%1"=="E" GOTO ECOM
:ACOM
echo This is
echo Parametrs A
echo God Bay !
GOTO ENDS
:ECOM
echo This is
echo Parametrs E
echo God Bay !
:ENDS
Запускаем.
Посмотрите, что будет, если передан параметр B.