работа с пакетными файлами (.bat) в операционной системе DOS. Цель работы:Получить навыки работы в операционной системе DOS. Изучить структуру и специфические команды пакетных файлов (.bat): rem (Коментарий), echo (Вывод сообщения), call (Вызов другого пакетного файла), goto (Переход по метке), if (Условие), for (Цикл), shift (Сдвиг аргументов на один влево), set (Установить переменную окружения), cls (Очищение экрана)и др. Ход работы:Задача 1. Для начала рассмотрим работу с одним пакетным файлом и несколькими командами DOS. Файл ncopy.bat будет копировать все файлы из текущей директории в указанную в 1м аргументе, причем, сам файл ncopy.bat скопирован быть не должен. Листинг файла ncopy.bat. rem Убираем эхо-вывод команд
@echo off
rem Очищаем экран
cls rem Выводим текущее время
echo Time:
time /T
echo --------------------- rem Проверка, если первый аргумент (папка назначения) не указан, перейти на метку no_dir
if "%1"=="" goto no_dir rem В цикле for для всех файлов текущей папки проверяем если имя не равно ncopy.bat, и если это так, копируем файл в назначенную папку
for %%f in (*.*) do if not "%%f" == "ncopy.bat" copy %%f %1 rem Т.к. файлы были успешно скопированы, нет смысла выводить сообщение об ошибке, поэтому переходим к концу пакетного файла командой goto, тем самым, завершая работу
goto end :no_dir
rem Вывод сообщения об ошибке
echo Ошибка. Не указана папка. rem Работа окончена
:end Задача 2. Написание командного скрипта для вывода ряда фибоначи (т.е. где каждый последующий член ряда равен сумме двух предыдущих: 1, 1, 2, 3, 5, 8, 13, ...). Для этого будет использовано несколько пакетных файлов, работа с переменными окружения и тд. Программа вывода состоит из 4-х пакетных файлов:
fibonaci.bat - главный исполняемый файл
sum.bat - сложение двух чисел
inc.bat - увеличение числа на 1
сonvert.bat - преобразование аргументов в арабскую систему счисления. Базовые команды операционной системы DOS не позволяют работать с числами (складывать, умножать и тд), но есть средства для работы со строками (сложение, присвоение), через них будет имитироваться работа с числами. Для удобства была введена система из p-аргументов т.е. чтобы представить число 125, необходимо передать какому-либо пакетному файлу 3 аргумента: "pppppp" "ppp" "pp", где каждый аргумент это разряд, а кол-во символов p этоцифра: p = 0, pp = 1, ppp = 2, pppp = 3, и тд. Пакетный файл convert.bat преобразует систему из p-аргументов в арабскую систему счисления.
Листинг файла convert.bat. rem Убираем эхо-вывод команд
@echo off rem Очищаем переменную окружения result, в нее будет записан результат
set result= rem Цикл shift
:loop1 rem Преобразуем символыиз p-системы в арабскую if "%1" == "p" set result=0%result%
if "%1" == "pp" set result=1%result%
if "%1" == "ppp" set result=2%result%
if "%1" == "pppp" set result=3%result%
if "%1" == "ppppp" set result=4%result%
if "%1" == "pppppp" set result=5%result%
if "%1" == "ppppppp" set result=6%result%
if "%1" == "pppppppp" set result=7%result%
if "%1" == "ppppppppp" set result=8%result%
if "%1" == "pppppppppp" set result=9%result% rem Сдвигаем аргументы на один влево
shift
rem Если новый аргумент не является пустым, продолжаем работу
if not "%1" == "" goto loop1 Пакетный файл inc.bat увеличивает число в p-системе на единицу, возвращает результат в переменной окружения result.
Листинг файла inc.bat. @echo off set firstparam=%1
set allparams= if not "%firstparam%p"=="ppppppppppp" goto no_carry_result set allparams=p
set addcarry=1 :loop
shift
if "%1"=="" goto carry_result if %addcarry%==0 goto skip
if not "%1p"=="ppppppppppp" goto no_carry_set
set addcarry=1
set allparams=%allparams% p
goto loop :no_carry_set
set addcarry=0
if "%allparams%"=="" goto empty_allparams
set allparams=%allparams% p%1
goto loop
:empty_allparams
set allparams=p%1
goto loop :skip
set allparams=%allparams% %1
goto loop :no_carry_result
set result=%firstparam%p :loop2
shift
if "%1"=="" goto end
set result=%result% %1
goto loop2 :carry_result
set result=%allparams%
if %addcarry%==1 set result=%result% pp :end Пакетный файл sum.bat складывает два числа из переменных окружения (v1, v2) и возвращает результат в переменной v2.
Листинг файла sum.bat.
@echo off rem i - переменная-счетчик цикла
set i=p :loop
rem Если i = v1, необходимо завершить цикл
if "%i%"=="%v1%" goto loop_end
if "%i%"=="%v1% " goto loop_end rem Увеличить переменную v2 на 1
call inc.bat %v2%
set v2=%result% rem Увеличить переменную i на 1
call inc.bat %i%
set i=%result% goto loop
:loop_end Пакетный файл fibonaci.bat выводит ряд фибоначи.
Листинг файла fibonaci.bat. rem Убираем эхо-вывод команд
@echo off
rem Очистить экран
cls rem Установка первых двух членов прогрессии
set v1=pp
set v2=pp rem Выводпервых двух членов, т.к. они заведомо известны
echo 1
pause
echo 1
pause rem Главный цикл
:fib_loop rem Считаем сумму
set tempv2=%v2%
call sum.bat
set v1=%tempv2% rem Выводим результат в арабской системе
call convert.bat %result%
echo %result% rem Ждем нажатия любой клавиши для продолжения работы
pause
goto fib_loop Вывод:В ходе работы были получены навыки работы в операционной системе DOS. Изучена структура пакетных файлов DOS, их взаимодействие и специфические для них команды. Важно то, что использование .bat файлов экономит много времени при однообразных действиях с файлами.