Приветствую Вас Гость | RSS

marolok.ucoz.ru

Вторник, 23.04.2024, 22:56
Главная » Статьи » Мои статьи

Bat файлы

Для вывода сообщения в BAT файлах используется команда echo:

Вывод сообщений и переключение режима отображения команд на экране.
ECHO [ON | OFF]
ECHO [сообщение]
Ввод ECHO без параметров позволяет выяснить текущий режим отображения команд.

Давайте попробуем создать простой BAT файл:

echo
echo hello batch files

Запускаем.

3_1.gif (6799 b)

Как видите, режим Echo включен по умолчанию. В итоге отображается и команда и результат.

Давайте его выключим.

echo off
echo hello batch files

Запускаем.

3_2.gif (5289 b)

Но первая команда все равно видна. Это можно исправить, сразу вызвав CLS(команда очистки экрана)

после отключения режима отображения. CLS это внутренняя команда MS DOS и может вызываться

прямо из командной строки.

echo off
cls
echo hello batch files

Запускаем.

3_3.gif (2929 b)

Вот теперь то что надо, почти настоящая программа.

В BAT файлах можно использовать любые команды MS DOS. Смысл нашей программы будет в том,

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

echo off
cls
echo start backup
mkdir backup
copy *.* backup
echo end backup

Запускаем.

4_1.gif (4331 b)

И смотрим в проводнике:

4_2.gif (1561 b)

Вот так, все получилось ! И не надо постоянно копировать много файлов и создавать папочку.

Совершенно не обладая навыками программирования Вы можете все-таки облегчить себе жизнь.


Здесь нам может помочь команда CALL:

CALL [диск:][путь]имя_файла [параметры_вызова]
параметры_вызова Параметры командной строки, использующиеся
при вызове пакетного файла.

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

General.Bat с вызовом другого.

call 5.bat

5_1.gif (854 b)

Запускаем и смотрим.

5_2.gif (4378 b)

И результат тот же.

5_3.gif (1898 b)

Вызывая из командной строки bat файл:

6_1.gif (5294 b)

или из другого файла:

call 6.bat 18012002

Внутри этого BAT файла Вы можно обработать параметры. Для получения параметра мы

должны использовать символ % и номер параметра. MS DOS заменит эту конструкцию

переданным параметром. Давайте пробовать:

echo off
cls
echo start backup
mkdir %1
copy *.* %1
echo end backup

Запускаем.

6_2.gif (4512 b)

И результат.

6_3.gif (1329 b)

Pause позволяет остановить выполнение Bat-файла до нажатия клавиши на клавиатуре.

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

выполнение какого-то действия нажатием на клавишу. То есть, что он в своем уме и

осознает, что происходит.

Приостановка выполнения пакетного файла и вывод сообщения:
Нажмите любую клавишу....
PAUSE

Смотрим пример, который копирует файл на дискету.

echo off
cls
echo insert disk to A:
pause
copy 1.txt a:

В момент выполнения программа остановится.

7_1.gif (4502 b)

А после нажатия скопируется. Но на экране останется окно.

7_2.gif (4984 b)

Если Вы не хотите чтобы оно было, вызовите последней командой 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

Запускаем.

8_1.gif (6825 b)

Сработала только строка с параметром A.

В прошлом примере мы посмотрели 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

Запускаем.

9_1.gif (3560 b)

Посмотрите, что будет, если передан параметр B.

Команда shift позволяет сдвигать параметры.

Изменение содержимого (сдвиг) подставляемых параметров для пакетного файла.
SHIFT

Параметров может быть много. Например, столько:

call 10.bat Hello Params str 123

Первый параметр - это %0 в нем имя вызываемого bat файла. Давайте проверим.

echo off
cls

echo %0
echo %1
echo %2
echo %3
echo %4
echo -------------------------------
echo shift
echo -------------------------------
shift
echo %0
echo %1
echo %2
echo %3
echo %4

Смотрим результат.

10_1.gif (5992 b)

После вызова все параметры были смещены.

Итак, у нас есть внутренние команды и внешние. После того как в BAT файле

находится команда, то сначала проверяется есть ли такая команда внутри

command.com. Например echo - это внутренняя команда и исполняет ее

command.com. Если же эта команда не найдена, то будет произведен поиск

файла с расширением exe или com во всех каталогах указанных в

переменной среды PATH. Смотрите на рисунок ниже.


11_1.gif (4467 b)

Команды echo и cls будут обработаны внутри command.com. А команда

edit.com не будет обработана (кстати расширение можно не указывать) раз

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

файлов с таким названием. Если файл будет найдет, то он будет запущен. Это

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

средства разработки типа Turbo C++ или Turbo Pascal создавать

расширения стандартных команд. Сразу скажу, что подобные программы

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

Visual C++ 6.0 не умеют создавать эти простенькие программы.


Одним из недостатков 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

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

текущая дата.

12_1.gif (3615 b)

А теперь немного посложнее, нам нужно написать программу, которая

возьмет эту строку из файла и создаст другой 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 файл вызывать. Результат работы будет такой.

13_1.gif (4033 b)

Нам осталось только сложить все в месте. Пишем backup.bat:

times.exe times.txt
runbats times.txt temp.bat start.bat
temp.bat

Получить дату в файл, сформировать BAT файл с параметрами и

запустить его. В результате работы все получится.


14_1.gif (21388 b)

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

А весь код, который нужно выполнить пишется в Start.bat. Если Вы

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

UNC пути (см. "Шаг 18 - Universal Naming Convention - UNC"). Вот,

например, BAT файл, который у меня работает.


mkdir \\Servers\work\%1
copy *.* \\Servers\work\%1

Можно добавить в автозапуск и Ваша папочка будет копироваться

на сервер каждый день, кроме того Вы сможете найти копии по

датам.

Здравствуйте. Прочитал вашу новую рубрику про Bat-файлы. Очень

полезная вещь. Сегодня мы, Windows-пользователи, забыли про

командные строки напрочь, а это плохо, потому что, благодаря им,

можно здорово автоматизировать некоторые операции. Я частенько

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

Пример 1: Вы хотите подсчитать количество строк в текущей

директории во всех файлах *.cpp и *.h. У Вас, к примеру, есть

программа linecount.exe, которая считает строки для указанного

ей при запуске файла. Как с помощью BAT-файла пересчитать все

*.cpp и *.h? Можно вот так:

echo "Found Files" >result_file.txt 
for %%a in (*.cpp, *.h) do linеcount %%a >>result_file.txt

Эти же команды можно набирать непосредственно в командной

строке, но тогда вместо %%a пишется .

В конструкции for можно через запятую указывать не только

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

примером.

Пример 2: Нам нужно создать на диске папки с именами '1', '2',

........ (Задача не очень то умная, но это первое что пришло мне в

голову. Главное - идея)

for %%a in (1, 2, 3, 4, 5 ) do mkdir %%a 

Просто, неправда? И главное - быстро. Пример можно усложнить,

добавив к созданию папки копирование в нее какого-либо файла,

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

дискету. Резервирование данных в 5 директориях, скорее всего,

поможет считать записанную информацию дома, если только не

испортится нулевая дорожка :-)

Не забывайте, что в BAT-файлах для переменных вы должны

использовать префикс %%, а в командной строке - %.

Здравствуйте

1. Если использовать команду DATE /t >%D_Date% теперь есть

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

что хочешь и компоновать как надо.

2. В W2000 есть зарезервированные системные переменные DATE

и TIME, которые нигде не описаны. Попробуй проиграться с ними.

echo %DATE%
echo %TIME%





Источник: http://www.firststeps.ru/msoffice/win/bats/bats1.html
Категория: Мои статьи | Добавил: Marolok (21.08.2010)
Просмотров: 24141 | Комментарии: 2 | Рейтинг: 3.2/4
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]