Командные или пакетные файлы (command/batch files)

Условные обозначения для синтаксиса программного кода:

  • | — вводится одно из нескольких возможных значений,
  • [ ] — необязательные параметры,
  • <информация, которая должна быть введена пользователем или программой>.

    Содержание

    Введение
    Вывод сообщений
    Обработка аргументов
    Комментарии
    Примеры
    Пример архивации WinRar
    Пример копирования
    Переменные
    Ветвление (If)
    Метки
    Цикл For
    Имена файлов и путь
    Меню
    Обработка текстовых строк
    Подпрограммы
    Дополнительный функционал
    Задание для разработки
    Ссылки

    Введение

    Предостережение! Данная тема должна осваиваться пользователем(!) именно в том объеме, который приведен здесь (IMHO), то есть — в единицах процентов. Максимум — еще пару «уровней» вглубь, если возникнет такая потребность. Углубление знаний до уровня, близкого к полному, заведет в тупик. Подобные задачи следует решать с помощью языков программирования высокого уровня, что упростит решения и значительно увеличит скорость, но относится к сфере профессионального выполнения.

    Речь идет о программировании, что не терпит единственного решения. Но в примерах, как правило, приводится именно одно. Это не означает, что нет более правильного, быстрого и логичного. Просто так требуется для конкретного описания. Советы и предложения приветствуются, но не неконструктивная критика.

    За несколько лет наполнения страница разрослась очень сильно (почти 100 КБ), но пока разделяться не будет. Приношу свои извинения за неудобство работы с ней.

    N.B.! ВСЕ примеры проходят тестирование и на 100% работоспособны, но я — не бог. Любые допущенные ошибки, например, при редактировании в процессе публикации на сайт, прошу озвучивать.

    По-прежнему, как 10, 20, 30 и 40 лет назад, у пользователя сохраняется возможность индивидуально оптимизировать свою работу, переложив часть интеллектуального труда на плечи компьютера.

    Для этого можно использовать так называемые командные или пакетные файлы, без преувеличений, от десятков до тысяч раз облегчающие работу с файловой системой. Никакой разработчик никогда не сделает этого за вас, так как у всех свои индивидуальные потребности.

    Без какого-либо сомнения, следует говорить, что сегодня в мире ежедневно запускаются миллиарды таких файлов. В том числе разработанные десятилетия назад. И никто ничего менять не собирается!

    Эти файлы являются текстовыми, имеют расширение bat или cmd и содержат простейшие команды, понимаемые операционной системой, которые могут быть выполнены в командной строке.

    Основные области применения:


    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


    Для меня будет крайне радостно, если вы воспользуетесь хотя бы вариантами 2–4. От вариантов 7 и 8 вам, скорее всего, не уйти.

    Какое из двух приведенных расширений использовать? Расширение bat использовалось для DOS (16-разрядный интерпретатор command.com), а cmd возникло для интерпретатора командной строки cmd.exe. Поэтому ряд действий может не производиться из bat-файла, либо исполняться медленнее, хотя большинство пользователей этого никогда не заметит. А bat-файлы рассматриваются Windows в качестве командных.

    Некоторые символы в командных файлах нельзя использовать в строках, не заключенных в кавычки, так как они имеют специальное назначение. Например: ( ) < > ^ & |.

    Внимание! Русский текст для корректного исполнения/отображения должен быть набран в кодировке DOS (ASCII), то есть CP866. В FAR вы должны видеть ANSI (Win) на месте подсказки к клавише F8. Последняя является переключателем кодировки. Либо переопределить ее вызовом списка кодировок клавишей Shift+F8. Поскольку Блокнот такой возможности напрямую или в принципе (ранние версии) не поддерживает, выводы можете сделать сами.

    Важный момент связан с запуском неправильно работающей и/или зависшей программой.


    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


    Пример (очень глупый, зато и очень наглядный):
    @echo off
    cls
    title Тестирование пакетного файла
    echo Интересно, заработает ли?
    echo.
    echo Запуск Блокнота
    start notepad
    echo.
    echo Запуск Wordpad
    Wordpad
    echo.
    pause
    exit
    

    Разберем программу построчно.

    @echo off (отключить вывод сообщений)

    cls (очистить экран, от CLear Screen)

    title Тестирование пакетного файла (Заголовок окна, о котором большинство в спешке и рутине забывает. Естественно, для сиюминутных задач это будет излишеством.)

    echo Интересно... (Просто бла-бла на экране)

    echo. (Точка означает вывод пустой строки, то есть зрительное отделение)

    echo Запуск Блокнота (Информация для пользователя)

    start notepad (Запуск программы)

    Wordpad (Запуск программы. Слово start опущено. Расширение (exe) не указано, как и для Блокнота, так как программы находятся в папках, описанных системной переменной PATH.)

    pause (выведет фразу "Press any key to continue..." и будет ожидать нажатия, чтобы вы все смогли прочитать.)

    exit (закроет окно, иначе придется печатать эту команду руками, либо жать крестик, что для DOS-сессии категорически НЕДОПУСТИМО). Обратите внимание, что в бухгалтерском деле до сих пор используются DOS-приложения. Если вы их закроете крестиком, то почти неизбежна потеря информации или даже разрушение базы данных.

    Вывод сообщений

    Возможно, что вам нравится, когда компьютер говорит сам с собой, а потом сообщает это же и вам. Мне — нет.

    Поэтому первой строкой командного файла следует указывать команду @echo off. Символ @ сообщает интерпретатору, что и о факте отключения эха не надо сообщать пользователю.

    Если надо всё же что-то вывести на экран, используется команда echo <информация>, что присутствует во многих приводимых примерах.

    Обработка аргументов

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

    Такая возможность предусмотрена и обозначается (считывается) внутри bat-файла:

    • %0 — имя запущенного пакетного файла с путем.
    • %1 — первый переданный аргумент.
    • %2 — второй переданный аргумент...
    • %* — все переданные аргументы одной строкой.

    Комментарии

    Для включения комментариев в текст вашей программы необходимо начать строку с :: (удвоенное двоеточие) или со слова rem.

    При этом сами комментарии могут отражаться на экране, давая вам необходимые пояснения, либо не отображаться совсем (зависит от настройки echo).

    Указание после команды знака амперсанда (&) позволяет использовать комментарий после него, то есть для данной строки. Важно, что двоеточия могут блокировать некоторые строки. В этих случаях лучше воспользоваться rem.

    Далее, комментарии, внесенные в текст программ для пояснения, будут окрашены.

    Некоторые полезные примеры

    Не надо пробовать сделать это ручками — замучаетесь. Зачастую проще скопировать строку из готового файла и отредактировать её. Надеюсь, что всё изложенное будет работать при прямом копировании, для чего предпринято множество действий, включая проверки.

    Пример архивации WinRar

    Конечно, это можно: 1) каждый раз набирать руками, 2) выполнить настройки в графическом интерфейсе. Но, кажется, глупость подобных действий должна быть очевидной.


    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


    Пример копирования


    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


    Переменные

    Чуть позже, хотя уже и не так мало написано...

    Единственное уточнение коснется того, что переменные используются (для считывания) с окружением их знаками процента (%), как это сделано в приведенных ниже примерах. Смотрите и/или копируйте внимательно.

    Задание значений переменной осуществляется командой set, например, команда

    SET var="корова"

    создаст переменную с именем var, содержащую строку "корова" вместе с кавычками.

    Использование ключа /P позволяет осуществить ввод пользователем.

    SET /P variable=[строка_подсказки]

    Ключ /A позволяет провести вычисления с использованием более двух десятков операторов.

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

    SET /?


    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


    Ветвление (If)

    Оператор условного выполнения команд IF позволяет производить те или иные действия в зависимости от имеющихся обстоятельств. Последние могут существовать (то есть анализироваться командным файлом), либо задаваться действиями пользователя.


    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


    Метки

    Поскольку язык достаточно примитивный и разрабатывался давно, он поддерживает так называемые безусловные переходы (переход к метке) для упрощения решений линейного программирования. Ряд ситуаций за счет этого решается на порядок быстрее и проще, чем в современных языках. Не надо следовать за безголовыми критиками данного подхода, это — данность, которой надо пользоваться, не перенося её в другие языки.


    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


    Поскольку метки постоянно используются в приводимых далее примерах, не вижу смысла углублять изложение.

    Цикл For

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

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

    FOR /?

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

    Для ясности, приведем основные направления использования команды FOR.

    • Обработка массива переменных памяти.
    • Обработка совокупности файлов в папке и/или подпапках.
    • Обработка файла, как совокупности строк.
    • Формирование числовой последовательности (близко к стандартному программному использованию).

    Процитируем Справку: «В пакетных файлах для команды FOR используется запись %%переменная вместо %переменная%. Имена переменных учитывают регистр букв (%i отличается от %I).»

    На данный момент отсутствует возможность полноценного описания. Рекомендуется обратить внимание на приводимые ниже примеры.

    ....

    Имена файлов и путь

    Имена, содержащие пробелы, могут интерпретироваться правильно, но это происходит далеко не всегда. Во избежа­ние проблем, следует всегда заключать их в кавычки:

    "C:\Documents and Settings\"

    Обработка списка файлов

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


    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


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

    Также не очень реалистично выглядит ситуация с выборочной обработкой, но данный механизм и не предназначен для такой цели, если она не формализуема. Наоборот, действия с файлами, например, содержащими в имени фрагмент «delay», именно при переборе сформулировать проще.


    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


    Результатом работы всего перечисленного так или иначе становится выделение единичного имени файла в виде строки (%%i) при каждой итерации цикла. Совершенно несложно представить себе интеллектуальную задачу, когда требуется проанализировать это имя для принятия решения о последующем действии. Для этого потребуется обработка полученной строки.

    Существует ли логический диск? Актуально для любых ситуаций с резервным копированием или синхронизацией.


    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


    Существует ли папка? Актуально для сетевых (надо подключиться) и локальных (надо создать) ресурсов. Сущностно полностью соответствует предыдущему случаю.


    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


    Позволю себе привести наиболее реалистичные варианты действий с конкретным файлом. Некоторые сообра­жения наводят на предположение, что для студентов это также может стать основой идей для разработки.


    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


    Считывание строк текстового файла лежит в основе работы множества профессиональных программ в разных областях знания. Без критики такого подхода заметим лишь, что это же можно сделать и в командных файлах.


    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


    Всё это, кстати, можно описать в переменных и не править 100 раз каждое место в коде. Но это не повлияет на буквенное обозначение, так что рано радоваться)))

    Переименовывание файлов также бывает нужно, но эти действия вызывают ряд затруднений.


    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


    Классический способ переименовывания файлов достаточно интересен с точки зрения прямо противоположной логики и намного проще. Для реализации воспользуемся тем же примером.
    :: ...
    SetLocal EnableDelayedExpansion
    set ext=".jpg"
    set pref="file_"
    set counter=1001
    for /f "usebackq" %%f in (`dir /b /o:-d /tc *%ext%`) ^
    do (ren "%%f" !pref!!counter:~1!.%ext% & set /a counter+=1)
    exit
    

    Следует обратить внимание на следующее:


    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


    ....

    Меню

    Я очень долго обдумывал необходимость включения этой темы в курс обучения в связи с ее противоречивостью. С одной стороны, это, как минимум, на порядок повышает сложность. С другой — на несколько порядков расширяет возможности и «интеллектуальность» создаваемых программ. Перелом произошел при очередной личной необходимости создания диалоговых возможностей для пользователей. Восстановление знаний и попытки разобраться с «записками сумасшедшего», равномерно рассеянными на просторах Интернета, перевесили. Описание будет, но не войдет в очный курс. (Вошло с 2021 г.)

    Некоторые теоретические предпосылки.

    1. Программа может выполняться очень долго, вплоть до нескольких часов. Пользователь не должен запустить эту процедуру случайно, требуется подтверждение.
    2. Для запуска может потребоваться выбор варианта, например, долгий (архивируем все) или краткий (только файлы *.doc). Суть: тонкая настройка процесса действиями, понятными для рядового пользователя.
    3. Программирование выбора фиксированных существующих мест, то есть, какую из 5 папок обработать типовой процедурой.
    4. Один из моих случаев: создать архив чего (то есть быстро/медленно) и где (локально, в сети или и в обоих расположениях, что также скажется на времени)?
    5. ...

    Суть меню сводится к формированию поясняющего текста и ожидания от пользователя нажатия на клавишу, результат которого считывается в переменную.

    В приведенном ниже примере создано примитивнейшее (но реальное) меню из двух пунктов, контролирующее факт запуска.


    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


    Обработка текстовых строк

    Можно до хрипоты пытаться меня переубедить (было неоднократно), но мой практический опыт свидетельствует, что данная тема относится к наиболее важным с точки зрения реального программирования. Командные файлы не являются исключением. Единственное видимое ограничение относится к тому, что чаще всего надо обрабатывать имена файлов.


    Доступ к размещенным в этом месте материалам ограничен и предоставляется следующим категориям:
    1. Студент I/II курса ВХК РАН.


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

    Дата, извлекаемая из переменной %DATE%, имеет по умолчанию формат "22.02.2022" (ДД.ММ.ГГГГ).


    Доступ к размещенным в этом месте материалам ограничен и предоставляется следующим категориям:
    1. Студент I/II курса ВХК РАН.


    Время, извлекаемое из переменной %TIME%, имеет формат " 9:50:36,79", то есть содержит:

    • пустой пробел в начале, если не достигнуто двузначное значение часа;
    • «лишние» знаки отделения элементов времени;
    • долю текущей секунды с точностью в два знака.

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


    Доступ к размещенным в этом месте материалам ограничен и предоставляется следующим категориям:
    1. Студент I/II курса ВХК РАН.


    Замена частей строк пока не выглядит актуальной для студенческих задач. Ищем сами, спрашиваем...

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

    ....

    Надеюсь, что приведенные примеры позволят не только решить связанные проблемы, но и помогут при идентичном анализе и разборке/сборке.

    ....

    Массивы в командных файлах

    Данная возможность абсолютно необходима для любого языка программирования, но здесь она реализовывалась далеко не сразу и немного «бесчеловечна», то есть, их как бы нет, но они есть. Именно эти обстоятельства заставляют приводить основы, но не погружаться в дебри. В разделе Ссылки можно найти более чем неплохие трактовки.

    Если значения элементов массива не задано, то оно будет равно 0. Для большинства ситуаций разумнее значение присвоить.

    ..............

    Подпрограммы

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


    Доступ к размещенным в этом месте материалам ограничен и предоставляется следующим категориям:
    1. Студент I/II курса ВХК РАН.


    ....

    Дополнительный функционал

    Сюда будет уходить всякая «экзотика», которая может пригодиться для реализации мелких идей. Это — почти готовые решения и в зачет заданий в чистом виде (без внедрения) они не пойдут.

    P.S.! Большинство идей приходят из студенческих работ.


    Доступ к размещенным в этом месте материалам ограничен и предоставляется следующим категориям:
    1. Студент I/II курса ВХК РАН.


    Задание для разработки


    Доступ к размещенным в этом месте материалам ограничен и предоставляется следующим категориям:
    1. Студент I/II курса ВХК РАН.


    Некоторые полезные ссылки

    К сожалению, часть ссылок на очень качественный материал отсюда убрана, так как ресурсы исчезли. Делайте выводы...

    Вместе с тем не могу не отметить, что ресурсов очень много, умных людей немало, дружелюбность на форумах откровенно греет душу.

    1. CMD/BAT — Форум программистов и сисадминов
    2. Описание основных возможностей сценариев командной строки
    3. Командная строка. Сайт посвящен именно этой теме. Не для рядовых пользователей, но есть много полезных советов.
    4. Командные файлы Windows. Страница значительно расширяет материал и содержит важную информацию.
    5. Работа с массивами в bat.
    6. Массивы (Array) в языке Batch. Примитивно, но очень неплохо для начинающих.
    7. Примеры работы со строками в bat/cmd файлах.
    8. Цикл cmd for – обработка текста.
    9. Алексей Александров Урок bat-аники. Много важных «тонкостей» с аккуратным оформлением и грамотным изложением.
    10. Операторы AND и OR в bat файлах.

  • Copyright © 1993–2024 Мацкявичюс Д.А. Все права защищены.
    Никакая часть сайта не может быть воспроизведена никаким способом без письменного разрешения правообладателя и явной ссылки на данный ресурс.