Урок 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, вывод результата и переход к этой же метке. Цикл будет выполняться бесконечно, что бы прекратить выполнение сценария нажмите комбинацию клавиш
Процедуры – в других языках программирования это блок кода, который можно многократно вызывать, сама процедура ничего не возвращает. В командной строке под процедурой имеется нечто другое: тут с помощью функции 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.
Если передать сценарию аргумент содержащий символы, а не цифры, то произойдет ошибка.
scriptcoding.ru
Недостатки использования GOTO в CMD — cmd
GOTO в сценарии загрузки Windows, как правило, безопасен в использовании, а иногда и необходим. Но есть три неинтуитивных конструктивных элемента, которые стоит отметить:
Вы можете GOTO метку, помещенную в скобках в скобках, но это, вероятно, не даст вам результат, который вы намереваетесь. Например, GOTO в блоке DO цикла FOR цикла немедленно прекратит цикл. Если GOTO ссылается на метку в блоке DO, управление передается правильно в расположение метки, но парсерный анализатор теперь ничего не знает о контексте цикла FOR. Код будет выполнен, как если бы он не был в цикле. См. Принятый ответ на (пакет Windows). Перейти внутрь, если блок ведет себя очень странно для получения дополнительной информации.
2) Расположение метки может повлиять на производительность.
Это, как правило, не проблема, если вы имеете дело с действительно большим сценарием.
При выполнении GOTO :label
(или CALL :label
) пакетный процессор начинает сканирование из текущего места сценария, ища первое вхождение :label
. Если он достигнет конца файла, не найдя метку, он возвращается к вершине и продолжает поиск. Ошибка будет поднята, если она достигнет начальной точки, не найдя метку. Поэтому производительность иногда может быть улучшена в очень больших сценариях, структурируя скрипт таким образом, чтобы метки появлялись вскоре после их соответствующего GOTO (или CALL). Конечно, если метка ссылается на многие местоположения, это может быть невозможно.
3) Тот же ярлык можно безопасно использовать в нескольких местах (не рекомендуется)
Как только вы поймете процесс проверки меток, описанный в пункте 2 выше, вы можете безопасно повторно использовать ярлык, если будете осторожны.
Например, следующий скрипт будет работать правильно:
@echo off for %%A in (1 2 3 X Y Z) do ( echo %%A if %%A equ 3 goto break ) :break for %%A in (A B C 8 9 10) do ( echo %%A if %%A equ C goto break ) :break
— ВЫВОД —
1
2
3
A
B
C
Хотя повторное использование меток работает, это не очень хорошая практика, поскольку это может смутить любого другого, кто пытается интерпретировать или отлаживать сценарий.
qaru.site
Cmd goto — Как сделать что бы Батник (BAT) Зациклировался ?! — 2 ответа
Goto eof
Автор Дмитриевич задал вопрос в разделе Другие языки и технологии
Как сделать что бы Батник (BAT) Зациклировался ?! и получил лучший ответ
Ответ от Nephalim[гуру]
GotoВ пакетной программе передает управление Windows XP в строку, определенную меткой. Когда метка найдена, выполнение продолжается со следующей за ней строки. Синтаксис goto метка Параметры метка Строка в пакетной программе, к которой выполняется переход. /? Отображение справки в командной строке. Заметки Работа с расширениями команды Если расширения команды включены (по умолчанию они включены) и в команде goto используется метка :EOF, управление будет передано в конец файла текущего пакетного сценария для выхода из него без назначения метки. Когда используется команда goto с меткой :EOF, перед меткой должно быть вставлено двоеточие. Пример: goto :EOF Описание расширений команды call, включающих эту возможность, см. в разделе cmd ссылки «См. также». Использование допустимых значений метки Метка может включать пробелы, но не может включать другие разделители, такие как точка с запятой или знак равенства. В команде goto используются только первые восемь знаков метки. Например, следующие метки эквивалентны и рассматриваются как :hithere0: :hithere0 :hithere01 :hithere02 Совпадение меток в пакетных программах Метка, заданная в команде, должна соответствовать метке в тексте пакетной программы. Метка в пакетной программе должна начинаться с двоеточия (:). В Windows XP строка пакетной программы, начинающаяся с двоеточия (:), опознается как метка и не обрабатывается как команда. Если строка начинается с двоеточия, все присутствующие в ней команды обработаны не будут. Если в пакетном файле не содержится заданной метки, программа будет остановлена, а на экран будет выведено следующее сообщение: Метка не найдена. Использование команды goto для обработки условий Команду goto можно использовать совместно с другими командами для выполнения операций с условиями. Чтобы получить дополнительные сведения об использовании команды goto для обработки условий, выберите раздел if из списка в ссылке «См. также». Примеры Следующая пакетная программа форматирует диск в дисководе A как системный диск. Если форматирование прошло успешно, команда goto передает управление Windows XP на метку :end. echo off format a: /s if not errorlevel 1 goto end echo Ошибка при форматировании. :end ?echo конец пакетной программы.
Привет! Вот подборка тем с ответами на Ваш вопрос: Как сделать что бы Батник (BAT) Зациклировался ?!
Ответ от Ётас РБ[гуру]
В начале места откуда должен зацикливаться поставить метку. После подтверждения вопроса поставить переход на метку.
Ответ от 2 ответа[гуру]
Привет! Вот еще темы с похожими вопросами:
Goto на Википедии
Посмотрите статью на википедии про Goto
Ответить на вопрос:
2oa.ru
|
www.sites.google.com