Урок 10 по CMD — пользовательские подпрограммы, процедуры и функции

Урок 10 по CMD — пользовательские подпрограммы, процедуры и функции Командная строка

В этой статье мы рассмотрим, пользовательские подпрограммы, процедуры и функции командной строки, хотя… эти термины довольно условны в командной оболочке.

И так, давайте посмотрим, что именно подразумевается под этими терминами:

Подпрограмма – это билет в один конец. Во время вызова подпрограммы происходит переход на заданную метку, после чего код будет выполняться до конца сценария командной строки. Для перехода на заданную метку используется оператор goto. Такой оператор используется во многих языках программирования и с точки зрения программирования, его использование является плохим стилем.

Давайте рассмотрим такой пример:

@echo off
if "%1"=="" (
echo Peredayte parametry scenariju!) & (goto EXIT)
if "%1"=="1" goto SUB1
if "%1"=="10" goto SUB2
if "%1"=="100" goto SUB3
goto EXIT
 
:SUB1
set/A var1=%1+100
echo %var1%
set var1=
goto EXIT
 
:SUB2
set/A var2=%1+1
echo %var2%
set var2=
goto EXIT
 
:SUB3
set/A var3=%1+1000
echo %var3%
set var3=
goto EXIT
 
:EXIT
echo Zaversajem rabotu...

Видим, что для объявления метки, перед ее именем ставится двоеточие, тут мы объявили три метки: SUB1, SUB2, SUB3 и EXIT. В самом начале сценариях мы отключаем вывод эхо-сообщений с помощью функции командной строки echo. Далее идет проверка условия с помощью условного оператора if, в нем мы проверяем первый переданный аргумент сценарию (%1):

Если аргумент пустой, то происходит вывод сообщения, что надо передать аргумент сценарию, далее сразу происходит переход к метке EXIT. Видим, что тут мы сгруппировали две команды с помощью оператора &.

Если аргумент равен 1, то идет переход к метке SUB1. Тут мы создаем переменную var1 с помощью ключевого функции set командной строки, в переменной к первому аргументу прибавляется число 100, потом следует вывод результата, удаление переменной и переход к метке EXIT.

Если аргумент равен 10, то идет переход к метке SUB2. Аналогично, создается переменная var2 и происходит прибавление к аргументу 1.

Если аргумент равен 100, то идет переход к метке SUB3. Тут уже прибавляется 1000.

Обратите внимание, что если мы передадим условию значения, не проверяемые в условных операторах, например 400, то тоже произойдет переход к метке EXIT. Стоит понимать, что если мы уберем переход к метке, то код будет выполняться построчно до самого конца сценария.

Думаю, вы догадались, что можно с помощью оператора GOTO создать бесконечный цикл, например:

@echo off
set sum=1
 
:SUB1
set/A sum+=1
echo %sum%
goto SUB1

Тут происходит создание переменной sum со значением 1. После метки SUB1 происходит добавление к sum числа 1, вывод результата и переход к этой же метке. Цикл будет выполняться бесконечно, что бы прекратить выполнение сценария нажмите комбинацию клавиш Ctrl+C.

Процедуры – в других языках программирования это блок кода, который можно многократно вызывать, сама процедура ничего не возвращает. В командной строке под процедурой имеется нечто другое: тут с помощью функции call командной строки мы можем вызвать другую программу, в итоге, после завершения работы вызванной программы или сценария управление вновь передастся в текущий сценарий на следующую строчку, находящуюся после оператора вызова.

Давайте посмотрим такой пример:

@echo off
set var=d:\work\test.bat
call notepad.exe "%var%"
call calc.exe
dir
set var=

В данном примере созданная переменная var будет хранить путь к файлу test.bat (в моем случае это текущий сценарий). Потом мы вызываем программу notepad.exe (блокнот) , передавая ей путь к файлу. Как только мы закроем блокнот, произойдет вызов калькулятора. После завершения работы программы calc.exe (калькулятор) будет вызвана функция командной строки dir и произойдет вывод содержимого текущего каталога. В самом конце мы удаляем переменную var.

Учтите, что вы можете вызвать другую программу и без использования функции call, но в этом случае контроль над дочерним приложением будет утерян.

Вы можете написать и такой сценарий:

@echo off
call dir
call echo Hello World

это аналогично такому коду:

@echo off
dir 
echo Hello World

или такому:

@echo off
dir & echo Hello World

Функции – для остальных языков программирования это тоже блок кода, который можно многократно вызывать в теле сценария. Задача функции – вернуть некое значение, которое потом можно обработать. В командной строке функции носят приблизительно тот же характер, давайте посмотрим на такой пример:

@echo off
 
if "%1"=="" (
echo Peredayte parametry scenariju!) & (goto EXIT)
 
call :FACT %1
echo %Result%
goto :EXIT
 
:FACT
if %1 == 0 (set Result=1 & exit /b)
if %1 == 1 (set Result=1 & exit /b)
 
set /A PARAM=%1 - 1
call :FACT %PARAM%
set /A Result=%1 * %Result%
exit /b
 
:EXIT

В данном примере используется рекурсия для вычисления факториала заданного числа. Сперва происходит проверка условия – если сценарий запущен без аргументов, то идет вывод предупреждающего сообщения и переход к метке EXIT.

Далее следует вызов метки FACT со значение переданного параметра. После метки FACT происходит проверка на равенство 0 и 1, оператор exit/b говорит, что нужно произвести возврат в т место, откуда была вызвана данная строка. То есть, произойдет возврат в начало сценария к строке, следующей за строкой call :FACT %1, то есть, произойдет вывод содержимого переменной Result с помощью функции командной строки echo и переход к метке EXIT.

Если переданный параметр не равен 0 или один, то от него отнимается единиц и происходит снова возврат к метке FACT. Фактически мы циклично уменьшаем переданное значение до 1 и потом снова циклично умножаем его на значение, меньшее на 1.

Если передать сценарию аргумент содержащий символы, а не цифры, то произойдет ошибка.

Оцените статью
Технологии программирования и ведение блога
Добавить комментарий