Bat файлы примеры: Написание bat файлов — примеры батников | Info-Comp.ru
Содержание
Учебные материалы по математике | Работа с bat-файлами
ТЕОРИЯ 1
Для работы с bat-файлами для удобства будем использовать программу FAR.
Небольшое отступление. Те, кому FAR использовать ну совсем не хочется, могут воспользоваться командной строкой Windows: Пуск->Выполнить-> ввести команду cmd Перед вами появится командное окно — эмулятор системы MS DOS.
Для тех, кому работать с GUI[1] приятнее запускает программу FAR Manager.
Основные команды в FAR’e:
Alt+F1 (F2) — выбрать диск в левой (правой) панели
Вверх/вниз — перемещение по дереву каталогов
F7 — создать каталог
Shift+F4 — создать файл
F4 — редактировать выделенный файл (F8 – для смены кодировки)
F3 — просмотр выделенного файла (F8 – для смены кодировки)
Enter — зависит от того, где установлен курсов и введена ли команда внизу экрана. Если введена команда — она будет выполнена. Если курсор установлен на имени каталога — мы «зайдем» в каталог. Если на «..» — «поднимемся» на каталог выше. Если курсор стоит на имени файла — результат нажатия Enter’a будет аналогичен двойному щелчку мыши в «Проводнике».
Ctrl+O показать экран с результатами команд.
Ctrl+вверх/вниз — показать область ввода команд (удобно для отладки)
Для изучения bat-файлов будет полезно знать:
· для перенаправления потока вывода используется символ «>».
Пример: пусть в вашем файле выполняется команда echo. Тогда она выведет какой-то текст на экран. Если вам хочется, чтобы все результаты работы вашего bat-файла выводились не на экран, а в файл — наберите в командной строке что-нибудь вида «c:> mybatfile. bat > myoutput. txt». Тогда результаты работы вашего файла mybatfile. bat, находящегося в корне диска c: будут записаны в файл myoutput. txt в том же каталоге.
· Для создания bat-файла можно использовать программу FAR (или аналогичные ей: VC — Volcov Commaner, TC — Total Commander, WinCom — Windows Commander), или использовать встроенную программу «Блокнот» (Notepad). Важно: при сохранения файле в Блокноте нужно указать в поле «Тип файла» не «.txt Текстовые файлы», а «.* Все файлы» и написать полное имя, например, mybatfile. bat. Тогда расширением файла будет именно. bat, а не. txt — расширение по умолчанию.
УПРАЖНЕНИЯ 1 (echo, cls, dir, del, %1)
1. Создаем bat-файл с таким содержимым:
echo «Hello from Politeh!»
Сохраняем файл, запускаем и проверяем, что он работает.
2. Изучаем способ вызова справки по необходимым командам:
<имя_команды> /?
for /? — будет выведена справка по команде for
Задание №1: изучить справку команды mkdir и сделать bat-файл (можно просто дополнить первый файл), который будет создавать заданную директорию.
Задание №2: вывести справку по командам for и if в файлы for_help. txt и if_help. txt соответственно. Как это сделать? Читаем «полезное знание №1» 🙂
Примечание: когда откроете файл for_help. txt – скорее всего, увидите «кракозябру». Её можно прочитать тремя способами (точнее изменить кодировку с Windows-1251 на CP‑866):
1. открыть файл в Word, он, обычно, автоматически предлагает правильную кодировку
2. открыть файл в FAR (нажав F4), после этого изменив кодировку по команде Shoift+F8
3. открыть блокнотом и изменить шрифт на Terminal.
3. Изучаем команды cls, echo, dir, del. Для этого используем эти команды в собственном bat-файле и убеждаемся, что фактические результаты совпадают с ожидаемыми.
4. Изучаем возможность работы с аргументами: если внутри bat-файла использовать комбинации символов %0, %1,…, %9, то можно получить значения аргументов, переданных системному обработчику вместе с вашим bat-файлом.
Задание №1: создать bat-файл, который должен будет запускаться с двумя параметрами (например, так: mybat. bat 1 22) и выводить такой текст:
parameter1 = 1
parameter2 = 22
где 1 и 22 — это параметры запуска вашего bat-файла.
Задание №2: изменить созданный файл так, чтобы в случае, когда первый параметр — это строка test, выдавалось сообщение «First parameter — <test>!» Для решения задачи используем команду if.
Задание №3. Классика жанра. Написать bat-файл, который удаляет файл, путь к которому задан в виде первого аргумента. Обязательно нужно проверить, существует ли файл с заданным путем или нет (с помощью if exist).
УПРАЖНЕНИЯ 2 (dir, for, goto, path)
Как вывести файлы в каталоге:
«Дешево, надежно и практично»: команда dir Команда for в простом варианте:
FOR %%F IN (*.*) DO ECHO %%F
Все файлы будут выведены друг за другом Чуть более красивый вариант с командой for:
for %%i in (*) do (
echo %%i
echo ——
)
Будут выведены все файлы, причем с разделителями.
Важно: в этом примере показано, как записывать команды не в одну строчку – с использованием обрамляющих круглых скобок. Команда for может использоваться не только для работы с файлами, но и для работы с числами.
В справке по команде for написано:
FOR /L %переменная IN (начало, шаг, конец) DO команда [параметры]
Набор раскрывается в последовательность чисел с заданными началом, концом
и шагом приращения. Так, набор (1,1,5) раскрывается в (1 2 3 4 5),
а набор (5,-1,1) заменяется на (5 4 3 2 1)
Пример:
@echo off
FOR /L %%f IN (1,1,10) DO echo %%f
Такой файл выведет последовательность чисел от 1 до 10 включительно.
Метки в bat-файлах
Метки позволяют переходить от одной команды к другой практически в производном порядке. Так же, как и в большинстве языков программирования, метки задаются словом goto.
Пример:
@echo off
if %1==odin goto odin
if %1==dva goto dva
goto end
:odin
echo Odin!!
goto end
:dva
echo Dva!!
goto end
:end
echo End of example
Как тестируем? Правильно: например, mybat. bat odin – должны увидеть радостные возгласы на тему первого параметра J
Переменная path
Очень полезно знать, что прописано в эту переменную, когда вы будете устанавливать какую-нибудь программу типа Visual Studio и т. п. или когда какая-нибудь программа будет писать, что она не может найти какие-нибудь пути.
Как посмотреть, в какие каталоги смотрит Windows, когда ищет файлы: набираем
set path > path.txt и смотрим, что записалось в файл path. txt.
Любознательные могут сравнить значения каталогов с тем, что указано в строке Свойства Системы-> Дополнительно -> Переменные среды.
УПРАЖНЕНИЯ 3 (cmd, del, 8.3, call, set, формулы)
1. Как запустить bat-файл без FAR’a? Пуск->Выполнить‑>»cmd». А дальше используем команды «dir», «cd» и др.
2. Пишем bat-файл удаления другого файла
Вызов: my. bat temp. doc
Схема bat-файла (пишем в несколько строчек!):
if not exist <имя_файла>
echo Нет файла <имя_файла>
else
del <имя_файла>
3. Усложняем: делаем удаление файла с именем больше 8 символов (слушаем про «требование 8.3 для DOS»).
4. Пишем bat-файл копирования заданного файла в параллельный каталог Backup (изучаем команды «cd..» , «cd..backup» , «copy myfile. zip ..backup»)
5. Передаем переменные между двумя bat-файлами — изучаем команду set
a. Пишем главный файл — main. bat:
call f1.bat mystring
call f2.bat
b. Пишем файл f1.bat
set AAA=%1
echo Новая переменная =%AAA%
c. Пишем файл f2.bat
echo Знаем переменную AAA: %AAA%
d. Добиваемся работоспособности. Для удобства вставляем «@echo off» в начало каждого файла
6. Пишем bat-файл удаления всех файлов в текущем каталоге. Вспоминаем про важное замечание с прошлого занятия.
7. В параллельном каталоге Backup создаем каталог с текущей датой и копируем туда все файлы с расширением «bat» в этот каталог. Если каталога backup нет — создаем его.
[1] GUI = Graphical User Interface — Графический Интерфейс Пользователя — в противоположность текстовому интерфейсу командной строки
Pers.
narod.ru. Программы. BAT-файлы. Командные файлы в DOS/Windows
Pers.narod.ru. Программы. BAT-файлы. Командные файлы в DOS/Windows
Этот сайт больше не обновляется. Подключите Javascript, чтобы увидеть новый адрес страницы или перейдите к статье
Pers.narod.ru. Программы. BAT-файлы.
|
Материал по теме «Командные файлы»
1. Определение командного файла. Командные (пакетные) файлы — особая категория исполняемых файлов.
Расширение: *.bat (от англ. batch — «пакет», «группа»). Запуск командного файла осуществляется так же, как запуск исполняемой программы, то есть, указывается имя файла и, если требуется, параметры.
Назначение: BAT-файлы служат для организации взаимодействия пользователей с прикладными программами.
Состав: текст, который интерпретируется командным процессором. Строки этого текста могут представлять собой:
- внешние или внутренние команды ОС;
- обращения к исполняемым программам *.COM или *.EXE, и вызовы других командных файлов;
- команды для управления выдачей на экран, а также для организации ветвлений и циклов;
- метки, на которые совершается переход при выполнении заданного в файле условия.
Каждая команда находится на отдельной строке.
2. Команды пакетной обработки.
а) REM комментарий в тексте файла. Обычно используют, чтобы временно убрать из текста какую-либо команду. Формат: REM [любая строка]
б) ECHO вывод на экран сообщений. Формат: ECHO [ON или OFF или Сообщение]
Параметры ON и OFF включают и выключают выдачу на экран системных сообщений («эха»). Команда ECHO OFF используется, чтобы не «засорять» экран при исполнении BAT-файла. Произвольная строка после ECHO понимается как сообщение и без изменений выводится на экран. Пустая строка обозначается одной точкой. Примеры:
echo. Перейти к следующей строке;
echo Программа не найдена! Выдает на экран сообщение «Программа не найдена!».
в) @. Может быть только первым символом строки и подавляет ее выдачу на экран. Используется только в пакетном режиме. Пример:
@echo off Выключаем «эхо»; из-за символа @ сама команда echo off тоже не выводится на экран; этой строкой обычно начинаются командные файлы.
г) PAUSE приостанавливает вывод на экран, выводит сообщение «Нажмите любую клавишу…» и ждет нажатия любой клавиши. Параметров не имеет.
д) IF позволяет проверять условие и выполнять ветвление в зависимости от результата проверки.
Общий вид команды: IF [NOT] [условие] [действие], где «действие» — любая команда, выполняемая, если истинно условие. Условие записывается в одной из трех форм, поэтому команда IF имеет три формата.
Формат 1. Проверка кода завершения последней перед оператором IF команды. Используется конструкция следующего вида: IF ERRORLEVEL число
Любая программа может выработать в момент своего окончания собственный код завершения, который доступен другим программам через переменную с именем ERRORLEVEL. Большинство команд и программ при нормальном завершении устанавливают errorlevel=0. Задав условие if errorlevel 1, Вы определите, что оно будет выполнено, если программа вырабатывает код завершения больший, либо равный 1.
Формат 2. Проверка наличия файла в каталоге. Оператор IF имеет вид: IF EXIST имя файла
Команда проверяет, существует ли файл с заданным именем. При обнаружении файла условие считается выполненным. Можно использовать маску — тогда условие выполнено, если найден хотя бы один подходящий файл.
Формат 3. Сравнение двух строк. Оператор имеет вид: IF [строка_1]==[строка_2]
Условие выполняется, если строки 1 и 2 совпадают. Чтобы застраховаться от случая, когда одна из строк оказывается пустой, обе строки заключают в одинаковые символы, например, в квадратные скобки.
Любое из этих трех условий может задаваться со знаком логического отрицания NOT. При этом истинность условия трактуется в обратном смысле. Примеры:
if exist c:\autoexec.bat type c:\autoexec.bat
если в головном каталоге диска c: есть файл autoexec.bat, вывести его на экран;
if not exist c:\WORK\*.* echo Нет файлов!
если в каталоге WORK нет ни одного файла, вывести соответствующее сообщение;
format a:
if errorlevel 1 echo Форматирование прошло не безупречно!
если программа format установила errorlevel больше нуля,сообщить об ошибке;
if %A%==Yes cls
если переменная с именем A равна строке ‘Yes’, очистить экран.
Аналогично команда IF может использоваться из командной строки.
е) GOTO позволяет передавать управление на заданную метку Формат команды: GOTO метка
Метка начинается со знака : Пример:
if %A%==Yes goto Clear
goto Not_Clear
:Clear
cls
:Not_Clear
Если переменная A совпадает со строкой Yes, перейти на метку Clear и очистить экран. В противном случае пропустить очистку экрана.
ж) CALL осуществляет вызов одного командного файла из другого с последующим возвратом в вызывающий файл. Формат команды: CALL [имя файла]
В имени вызываемого файла могут содержаться дополнительные параметры, которые обрабатываются вызванным файлом. Пример:
Вызывающий командный файл: (example.bat)
@echo off
echo Файл запущен!
call version
echo Продолжаем!
Вызываемый командный файл: (version. bat)
@echo off
echo Ваша версия операционной системы:
ver
pause
example.bat вызывает version.bat, после выполнения которого вновь получает управление.
з) Переменные в командных файлах используются для обмена информацией между отдельными командами. Существуют два их вида:
1) переменная, определяемая в цикле. Ее имя состоит символа процента (в старых версиях DOS/Windows — двух символов) и последующих букв, например, %A. Набор значений, которые последовательно принимает такая переменная, задается при ее определении в команде for (см. ниже).
2) переменная окружения. Она определяется внутренней командой DOS вида
SET [имя]=[значение],
где имя и значение — произвольные строки, и в течение всего сеанса работы хранится в специальной области памяти, называемой «системным окружением». Системное окружение управляется командным интерпретатором command. com. Чтобы использовать переменную окружения в командном файле нужно ее имя заключить в символы процента %, например, командами
set weekday=sunday
echo %weekday%
переменной с именем weekday присваивают значение sunday и выводят ее значение на экран командой ECHO. Для удаления переменной из окружения используют строку вида set имя=
Для просмотра окружения можно использовать команду SET без параметров.
В DOS и Windows, как правило, используются следующие стандартные переменные окружения:
- winbootdir Главный каталог ОС Windows (в версиях NT/2000 может называться SystemRoot)
- COMSPEC Полное имя текущего командного процессора
- PROMPT Вид строки приглашения диалогового режима
- TEMP Каталог для временных файлов (иcпользуется также TMP)
- PATH Список путей, по которым ищутся исполняемые программы, если путь не указан при запуске программы. По умолчанию программа ищется сначала в текущей папке, затем в папках, перечисленных в PATH. Пути разделяются символом ;
и) FOR обеспечивает циклическое выполнение команд. Формат: FOR переменная IN (набор) DO действие
Понятие переменной определено выше. Набор — это одна или несколько строк, разделенных пробелами или запятыми. Чаще всего в качестве элементов набора выступают имена файлов или маски. Действие — любая допустимая команда. Цикл работает следующим образом: переменная последовательно принимает значения элементов набора и они подставляются в текст команды. Примеры:
For %a in (*.txt) do copy %a con
Переменной %%a последовательно присваиваются имена файлов с расширением txt из текущего каталога и каждый файл выводится на экран.
for %r in (*.*) do if exist a:\%r echo %r есть на диске a:
Команда перебирает файлы текущей директории и выясняет, есть ли на диске a: файл с таким же именем. Если такой файл существует, печатается сообщение. Вместо переменной %%r в команде ECHO каждый раз подставляется очередное имя файла.
for %z in (0,1,2,3,4,5,6,7,8,9) do if %z==%test% echo z=test=%z
Если переменная %z, принимающая значения цифр от 0 до 9, совпадает с переменной окружения test, печатается сообщение.
FOR может использоваться и в командной строке, например, для многократного выполнения команды, в которой нельзя использовать маску. Пример:
FOR %A IN (*.txt) DO TYPE %A
Все найденные в текущей директории файлы с расширением TXT последовательно выводятся на экран.
к) Параметры командного файла. При запуске из командной строки командному файлу могут быть переданы параметры. Они разделяются пробелами и количество их не может превышать девяти. Изнутри пакетного файла параметры доступны через строки вида %0, %1, …, %9, где %0 — имя самого командного файла, %1 — имя первого параметра и так далее. Например, мы запускаем командный файл MOVA.BAT командой mova.bat *.tmp *.txt *.doc
После запуска параметр %0 равен строке «mova. bat», параметр %1 — строке «*.tmp» и т. д. Наш командный файл должен перемещать файлы, подходящие под переданные ему маски, на диск a:. Для первого параметра это легко сделать двумя командами: copy %1 a:\%1 и del %1. Первая копирует файлы на диск a:, вторая уничтожает источник копирования. Для второго параметра мы могли бы повторить те же команды, подставив в них %2 вместо %1. Но программа сразу же становится нерациональной, тем более, что число параметров заранее неизвестно. Помочь нам может команда SHIFT, которая сдвигает параметры командного файла на один влево. После применения SHIFT параметру %0 присваивается старое значение %1, в нашем случае это строка «*.tmp», а параметр %1 принимает значение «*.txt». Теперь этими же двумя командами мы можем обработать любое число параметров. Позаботившись об условии выхода из программы, получаем ее окончательный текст:
@echo off
:LOOP
copy %1 a:\%1
del %1
shift
if not [%1]==[] goto LOOP
Благодаря команде SHIFT мы каждый раз обращаемся лишь к первому из переданных параметров и правильность работы не зависит от числа переданных параметров. Если очередная строка с маской не пуста, оператор goto LOOP передает управление к началу программы.
л) Дополнительные средства для написания командных файлов.
Рассмотренные выше команды пакетной обработки позволяют организовать автоматический запуск программ и обработку файлов. Не хватает лишь возможностей пользователя влиять на этот процесс, в частности, возможности выполнять действия в зависимости от выбора с клавиатуры.
В состав большинства версий DOS/Windows включена внешняя команда choice, служащая для выбора действия. Формат команды:
CHOICE [/C:клавиши] [/N] [/T:выбор,время] [сообщение]
Здесь сообщение — любая строка текста, клавиши — список буквенных обозначений клавиш, допустимых для выбора. По умолчанию прописные и строчные буквы не различаются, а если список клавиш не указан, принимается /C:YN. Параметр /N запрещает вывод после сообщения списка клавиш и знака вопроса, а после параметра /T могут быть указаны выбор, принимаемый при отсутствии ввода с клавиатуры и время в секундах, через которое он будет сделан.
Результат работы команды — установка значения ERRORLEVEL равным порядковому номеру в списке выбранной клавиши. Например, после ввода команды
choice /c:01 /n /t:0,5 Продолжить?(1-да,0-нет)
значение ERRORLEVEL будет установлено в 1 при нажатии клавиши 0 или отсутствии ввода с клавиатуры в течении 5 секунд, а при нажатии клавиши 1 программа установит значение ERRORLEVEL, равное 2.
Скачать CHOICE.COM в архиве ZIP (2 Кб)
Изучение мощной пакетной команды Goto
В Windows использование пакетных файлов для написания сценариев общих задач используется уже несколько десятилетий. Несмотря на то, что в настоящее время существуют другие языки сценариев, такие как PowerShell, пакетные файлы по-прежнему широко используются. Если вы видите пакетную команду goto
в пакетном файле и всегда задавались вопросом, что она делает, вам повезло.
В этом руководстве вы узнаете, как пакетная команда goto работает в пакетных файлах с несколькими примерами, и где вы все еще можете найти применение этой старой команде сегодня!
Предварительные условия
Поскольку исполняемый файл goto
является частью набора пакетных команд cmd. exe
, любая поддерживаемая версия Windows будет работать.
Понимание простого
Команда goto
Короче говоря, команда goto
— это способ управления потоком пакетного файла. Как правило, при выполнении пакетного файла сценарий выполняется сверху вниз после каждой строки. Но иногда вам нужно, чтобы скрипт начал выполняться в другом месте скрипта. 9Для этого идеально подходит команда 0003 goto .
Допустим, у вас есть пакетный скрипт с парой простых строк для отправки текста на экран, как показано ниже.
@эхо выключено
echo Сначала запустить эту строку
echo Выполнить эту строку второй
echo Запустите эту строку в-третьих
Когда вы запустите ее, как показано ниже, она отправляет три сообщения на экран.
Запуск простого пакетного файла
Теперь, возможно, вы хотите запустить третью строку перед второй строкой. Вы можете вырезать и вставлять, но для реального пакетного файла это может быть невозможно. Вместо этого вы можете перенаправить пакетный файл с помощью команды goto
. Для этого вы будете использовать команду GOTO
в сочетании с меткой.
Ниже вы можете увидеть три концепта:
-
метки перехода к
, созданные с помощью двоеточия с кодом под названиемrun_first
. - Комментарии, начинающиеся с
::
, указывают на то, что код не является исполняемым. - Необязательная
команда goto:eof
, которая сообщает пакетному сценарию завершить или перейти к концу файла (или
). Обратите внимание на двоеточие и пробел здесь. Если вы просто используетеGOTO eof
без двоеточия, пакетный скрипт ищет метку:eof
где-то в файле и не переходит в конец и не возвращается!
Когда вы запустите приведенный ниже сценарий, вы увидите, что пакетный сценарий запускает код в том порядке, в котором у вас есть команды GOTO
. Команда goto
изменяет поток пакетного сценария. Первая команда echo
никогда не запускается, так как пакетный сценарий переходит к указанным 9Команда 0003 перейти к . С этого момента сценарий выполняется построчно.
@эхо выключено
:: Начать комментарии. Команды goto ссылаются на метки
GOTO run_first
:: Необязательная внутренняя команда goto для немедленного перехода к концу скрипта
ПЕРЕЙТИ: eof
echo Эта строка никогда не будет выводиться
:run_first
echo Сначала запустить эту строку
:: Каждая метка начинается с двоеточия
echo Выполнить эту строку второй
echo Выполнить эту строку третьей
Запуск простого пакетного файла
Передовой опыт использования меток
В предыдущем примере вы определили метки со знаком подчеркивания. В этом подходе нет ничего плохого, но есть много других способов создания этих меток. Есть несколько предостережений, о которых следует помнить, так как не любая этикетка будет работать.
Что будет работать в этикетке:
- Пробелы
- Точки
- Дефисы
Что не будет работать в этикетке: 900 05
- Знаки равенства (
=
) - Точки с запятой (
;
) - Оканчивается чем угодно, кроме пробела, двоеточия или CR/LF (возврат каретки/перевод строки) или просто нажатием Enter.
Добавление различных управляющих символов приведет к тому, что пакетный сценарий будет выполняться бесконечно в цикле и потребует завершения вручную.
Если вы определяете метку и команда goto
не может ее найти, вы получите сообщение об ошибке, указывающее « Система не может найти метку партии, указанную ».
Если метка не найдена при поиске вперед от инструкции GOTO до конца файла,
cmd.exe
перезапустит поиск в начале файла.
:: Пробелы допустимы в метках
GOTO Метка с пробелами
: Метка с пробелами
Эхо Это от ярлыка с пробелами
:: Знаки подчеркивания, дефисы и точки допустимы
GOTO Label_hyphenated-with.a.period
:Label_hyphenated-с.а.периодом
Эхо Эта метка содержит подчеркивание, дефис и точку.
:: Нельзя использовать управляющие символы, такие как точка с запятой (;) или знак равенства (=).
:: Ярлык GOTO=Равно
:: Ярлык GOTO; точка с запятой
:: Если вы укажете оператор GOTO, но не имеете соответствующей метки
:: вы увидите ошибку
GOTO Label_nonexisting
На самом деле, если вы используете любой из операторов GOTO со знаком равенства (=) или точкой с запятой (;),
Демонстрация различных итераций меток
Использование команды
if
с командой goto
9 0002 Прыжки в разные точки пакетного файла удобно, но в предыдущем примере это было непрактично. Чтобы добавить больше практичности, что, если вам нужен пакетный скрипт для запуска некоторых команд, только если определенное условие выполняется?
9Команда 0003 goto , используемая в сочетании с командой if
, позволяет точно определить, когда будет выполнен переход. Например, посмотрите на приведенный ниже пример. В этом примере пакетный файл использует команду call
для запуска программы. Эта программа всегда будет возвращать код выхода, который всегда представлен во внутренней переменной ERRORLEVEL
.
Затем пакетный файл проверяет, не равна ли переменная ERRORLEVEL
0. Если это так, сценарий переходит к концу. В противном случае он запускает 9Команда 0003 echo сообщает вам, что произошла ошибка, и , затем переходит к концу пакетного сценария.
@эхо выключено
:: Выполнение команды вызова с одним пробелом после установит %ERRORLEVEL%
:: переменная окружения в 1, но без выхода из общего скрипта.
вызов
if %ERRORLEVEL% NEQ 0 GOTO Конец
эхо Произошла ошибка, и уровень ошибки был установлен на ненулевое значение
ПЕРЕЙТИ: eof
:: Это никогда не запустится, если есть ошибка
:Конец
эхо Конец скрипта
Когда вы запустите приведенный выше скрипт, вы увидите, что вызов
вернул ненулевой код выхода и существовала команда echo
, чтобы сообщить вам об ошибке.
Ненулевой код выхода
Вызов подпрограммы и использование команды
goto
Теперь, когда вы изучили основы оператора goto
, как насчет использования команды goto
с подпрограммой? Подпрограмма похожа на блок кода или функцию, которую вы можете вызвать для выполнения. Как и в команде goto
, есть вызов команды
, которая также использует метки.
В отличие от команды goto
, команда call
запустит код после метки, а затем вернет выполнение после исходной команды call
после завершения.
В приведенном ниже примере этот пакетный файл запускает подпрограмму с именем my_subroutine
с использованием команды call
. Затем, внутри этой подпрограммы, пакетный сценарий запускает команду goto:eof
для перехода в конец сценария.
@эхо выключено
:: Используйте команду SET, чтобы получить пользовательский ввод и назначить этот ввод переменной %Text%
установить /p Text="Введите текст: "
:: Вызвать подпрограмму с меткой :my_subroutine и передать переменную %text%
вызов: my_subroutine% Text%
:: Вернитесь сюда после подпрограммы, повторите какой-нибудь текст, а затем завершите сценарий
Эхо Конец скрипта
ПЕРЕЙТИ: eof
:: Запустить все в подпрограмме
:моя_подпрограмма
:: Каждой переданной переменной последовательно присваивается номер переменной, т.е. %Text% = %1
Повторить текст пользователя: %1
:: Переходит к концу файла, автоматически выходя из подпрограммы
ПЕРЕЙТИ: конец
пакетный файл запускает подпрограмму
Как и в случае любой команды, существуют особые случаи, ошибки и важные соображения, которые следует учитывать при использовании оператора goto
в коде.
Командные расширения и специальная метка
:eof
Вы могли заметить, что в предыдущих примерах широко использовалась метка :eof
. cmd.exe
имеет как внутренние, так и внешние команды. Хотя команда goto
встроена в cmd.exe
, специальная метка :eof
известна как расширение команды.
Расширения команд можно отключить следующими способами:
- Задайте для раздела реестра DWORD
HKCU\Software\Microsoft\Command Processor\EnableExtensionsCommand
значение0
. - Используйте параметр
cmd.exe /e:off
, чтобы отключить расширения команд. - В пакетном сценарии выполните команду
SETLOCAL DisableExtensions
Хотя команда goto
будет работать в большинстве контекстов, специальная метка :eof
больше не действует. Вы можете обойти это ограничение, используя метку goto
в самом конце пакетного сценария.
SETLOCAL DisableExtensions
Эхо Это будет отображаться
:: Следующая команда сломает скрипт, так как метка :eof не существует
:: GOTO:eof
ПЕРЕЙТИ к концу
Эхо Это не будет отображаться
:End
Левый скрипт не работает из-за :eof метка
, тогда как правый сценарий правильно идет в конец.
При отключении расширений команд другие функции
cmd.exe
также перестают работать, например динамические переменные,%TIME%
.
Использование групп команд и команд Goto Batch в операторе
if
Группа команд — это последовательность команд, сгруппированных в скобках. Это позволяет использовать весь набор команд как одну. Если вы включите оператор goto
в группе команд и оператор if
, остальные условные операторы игнорируются, например приведенный ниже оператор else
, и выполняется включенный код.
:: Как и раньше, оператор вызова без следующих пробелов устанавливает %ERRORLEVEL% в 1
вызов
если %ERRORLEVEL% EQU 1 (
ПЕРЕЙТИ: подраздел
:подраздел
ECHO Это будет показано, так как 1 = 1 для оператора if
) еще (
:: Это будет отображаться, даже если это не должно
echo Это не должно отображаться, но будет отображаться, потому что GOTO в группе команд прерывает операторы if.
)
Демонстрация того, как группа команд с оператором GOTO прерывает оператор if
Как вы понимаете, это может иметь непредвиденные последствия! Если, например, вы включили команду удаления в инструкцию else
, которая не предназначалась для выполнения, эта инструкция goto
нарушит эту логику.
Дальнейшие действия
Несмотря на наличие новых языков автоматизации, таких как PowerShell, пакетные файлы по-прежнему находят применение во многих различных областях, таких как развертывание пакетов. Понимание того, как структурировать сценарий с помощью перейти к
операторам и управлять потоком скрипта становится бесценным для создания полезных автоматизаций!
Вызов — Windows CMD — SS64.com
Вызов — Windows CMD — SS64.com
- SS64
- CMD
- Инструкции
Вызвать одну пакетную программу из другой или вызвать подпрограмму.
Синтаксис CALL [ диск :] [ путь ] имя файла [ параметры ] ЗВОНИТЕ : метка [ параметры ] ЗВОНИТЕ internal_cmd Ключ: pathname Пакетная программа для запуска. параметры Любые аргументы командной строки. : метка Перейти к метке в текущем пакетном сценарии. internal_cmd Запустите внутреннюю команду, сначала расширив все переменные в аргументе.
В справке Microsoft для команды CALL указано: « Вызывает одну пакетную программу из другой без остановки родительской пакетной программы «, чтобы расширить это, это правда, что родитель не ОСТАНАВЛИВАЕТСЯ, но делает ПАУЗУ во время выполнения второго сценария.
Примеры
ВЫЗВАТЬ второй пакетный файл
Команда CALL запустит новый контекст пакетного файла вместе со всеми указанными параметрами. Когда будет достигнут конец второго пакетного файла (или если используется EXIT), управление вернется сразу после первоначального оператора CALL.
Аргументы могут передаваться либо в виде простой строки, либо с помощью переменной:
ВЫЗОВ MyScript.cmd «1234»
ВЫЗОВ OtherScript.cmd %_MyVariable%Пример
::———- start main. cmd————
@Эхо с
CALL function.cmd 10 первый
Эхо %_description% — %_number%ВЫЗОВ function.cmd 15 секунд
Эхо %_description% — %_number%
::———-end main.cmd————-::———-start function.cmd— ——
@Эхо выключено
:: Добавить 25 к %1
НАБОР/a_number=%1 + 25
:: Магазин %2
НАБОР _description=[%2]
::———-end function.cmd————Во многих случаях вы также захотите использовать SETLOCAL и ENDLOCAL, чтобы полностью разделить переменные в разных пакетных файлах, это позволит избежать возможных проблем, если два скрипта используют одно и то же имя переменной.
Если вы запускаете второй пакетный файл без с использованием CALL, вы можете столкнуться с некоторым ошибочным поведением: если оба пакетных файла содержат метку с одинаковым именем, и вы ранее использовали CALL для перехода к этой метке в первом скрипте, вы будете найти выполнение второго скрипта начинается с той же метки.
Даже если вторая метка не существует, это все равно вызовет ошибку 9.0310 «не удается найти этикетку партии» . Этой ошибки можно избежать, всегда используя CALL.
ВЫЗОВ подпрограммы (:метка)
Команда CALL передаст управление оператору после указанной метки вместе с любыми указанными параметрами.
Для выхода из подпрограммы укажите GOTO:e, чтобы передать управление в конец текущей подпрограммы.Метка определяется одним двоеточием, за которым следует имя:
:myShinyLabel
Если метка помещена в скобки, за ней должна следовать хотя бы одна допустимая команда, даже просто команда ECHO или REM.
Максимальная длина метки — 127 символов без пробелов.Это основа функции пакетного файла.
ВЫЗОВ: sub_display 123
ЗВОНИТЕ: sub_display 456
ЭХО Все готово
ПЕРЕЙТИ: eof:sub_display
ЭХО Результат: %1
ВЫХОД /BВ конце подпрограммы EXIT /B вернется в позицию, где вы использовали CALL
(Для этого также можно использовать GOTO :eof)
Звонок и, при желании, продолжение
В некоторых случаях может потребоваться вызвать второй пакетный файл (или подпрограмму) и продолжить работу только в случае успеха.
ВЫЗОВ SecondScript.cmd || перейти: eof
Это будет goto:eof, если SecondScript.cmd возвращает уровень ошибки больше нуля, вы можете принудительно установить уровень ошибки, используя Exit /b 1
Передача по ссылке
В дополнение к передаче числовых или строковых значений в командной строке также можно передать имя переменной, а затем использовать эту переменную для передачи данных между сценариями или подпрограммами. Передача по ссылке — это немного более продвинутый метод, но он может быть необходим, если строка содержит символы, которые являются разделителями CMD или кавычками, иначе передача строки, такой как Start & middle:»and & End , может что-то сломать.0005
@Эхо выключено Эхо: Установите "var1=Красный Пиппин" Установить "var2=Сент-Эдмундс Пиппин" Установите "var3=Egremont Russet" Эхо: до: var1=%var1% var2=%var2% var3=%var3% вызов : myGetFunc var1 var2 var3 Эхо: после: var1=%var1% var2=%var2% var3=%var3% Эхо:&пауза&перейти к:eof ::--------------------------------------------------------------------------- ::-- Раздел функций начинается ниже ::--------------------------------------------------------------------------- :myGetFunc - передача переменной по ссылке Установите "%~1=return64" Установите "%~3=return65" ВЫХОД /B
Ошибка при использовании CALL
Перенаправление через канал ‘|’ не всегда работает так, как ожидалось.
Это будет работать:
ВЫЗОВ: функция >file.txt
Это не удастся:
ВЫЗОВ :функция | еще
Более подробную информацию можно найти в этом вопросе SO: Почему отложенное расширение не работает, когда внутри блока кода с конвейером? 9ing», каретки будут удвоены.
Расширенное использование — вызов внутренних команд
ВЫЗОВ команда [ параметры_команды ]
CALL Команда может использоваться для запуска исполняемого файла или второго пакетного файла, но также может использоваться для запуска любой внутренней команды (SET, ECHO и т. д.), за исключением FOR и IF. CALL расширит любые переменные, переданные в той же строке.
CALL REM работает частично: операторы перенаправления, операторы условного выполнения и скобки не будут отмечены.
Это недокументированное поведение, фактически всякий раз, когда CALL запускается без префикса :, он всегда будет искать на диске пакетный файл/исполняемый файл с именем команда перед запуском внутренней команды. Эффект от этого дополнительного доступа к диску заключается в том, что CALL SET работает значительно медленнее, чем CALL, поэтому следует избегать его использования в циклах или с большим количеством переменных.
Пример
@Эхо выключено SETLOCAL установить _сервер = фродо установить _var=_сервер CALL SET _result= %% %_var% %% эхо %_result%В строке, выделенной жирным шрифтом, утроены символы «%», CALL расширит это до: SET _result=frodo
Каждый CALL выполняет одну замену переменных. (Вы также можете сделать CALL CALL… для нескольких замен)
Во многих случаях DelayedExpansion является лучшим/быстрым методом:
@Эхо выключено Setlocal EnableDelayedExpansion Установить _server=фродо Установить _var=_сервер Установите _result=! %_var% ! Эхо %_result%
Уровни ошибок
Если вы запустите CALL SET, это сбросит ERRORLEVEL = 0, даже если обычно SET . .. не сможет сбросить ERRORLEVEL
Если вы ВЫЗЫВАЕТЕ подпрограмму, ERRORLEVEL останется без изменений
Если вы ВЫЗЫВАЕТЕ подпрограмму с несуществующей меткой, ERRORLEVEL будет установлен на 1
.
(вызов) установит ERRORLEVEL на 0.
(вызов) установит ERRORLEVEL на 1.
Если вы ВЫЗЫВАЕТЕ исполняемый файл или утилиту набора ресурсов, убедитесь, что она доступна на машине, на которой будет выполняться пакет, проверьте ее существование с помощью команды IF и выдайте ошибку, если она отсутствует.
CALL — это внутренняя команда (внутренне она тесно связана с GOTO).
Если расширения команд отключены, команда CALL не будет принимать метки пакетов.
«Моя мать никогда не видела иронии в том, чтобы называть меня сукиным сыном» ~ Джек Николсон
Связанные команды
How To: Functions — Как упаковать блоки кода.
CMD — может использоваться для вызова последующего пакета и ВСЕГДА возврата, даже если возникают ошибки.