Bat и cmd в чем отличие
Перейти к содержимому

Bat и cmd в чем отличие

  • автор:

CMD/BAT: Различия между .cmd и .bat в Windows

Когда-то давно я задался вопросом «в чем разница между этими расширениями в последних версиях Windows«. Делаю акцент именно на этом, потому что встречаются весьма частые ответы о том, что
— .bat для COMMAND.COM, а .cmd для CMD.EXE
— .bat это в Windows, а .cmd — это в OS/2

Все это далеко от ответов на поставленный вопрос. А ответ есть — https://stackoverflow.com/a/148991/3627676:

The differences between .CMD and .BAT as far as CMD.EXE is concerned are: With extensions enabled, PATH/APPEND/PROMPT/SET/ASSOC in .CMD files will set ERRORLEVEL regardless of error. .BAT sets ERRORLEVEL only on errors.

Различия между .CMD и .BAT в CMD.EXE следующие: при включенной опции ENABLEEXTENSIONS, встроенные команды PATH/APPEND/PROMPT/SET/ASSOC в .CMD файлах выставляют собственный код ошибки в ERRORLEVEL независимо от ошибки. .BAT файлы выставляют код ошибки в ERRORLEVEL только в случае ошибки.

Проиллюстрирую сказанное простым примером — скрипт вызывает несуществующую команду (естественно, не находит ее) и печатает строку подсказки. После первой команды выставляется код ошибки 9009, который мы отображаем сразу после вызова и после встроенной команды

 @echo off non-existing-command echo:After wrong command : %errorlevel% prompt echo:After prompt command : %errorlevel% 

Вывод .bat файла: команда prompt оказалась «прозрачной» для %ERRORLEVEL%

 'non-existing-command' is not recognized as an internal or external command, operable program or batch file. After wrong command : 9009 After prompt command : 9009 

Вывод .cmd файла: здесь очевидно, что команда вернула свой код ошбки (ноль) и затерла код ошибки предыдущей команды

 'non-existing-command' is not recognized as an internal or external command, operable program or batch file. After wrong command : 9009 After prompt command : 0 

Различия незначительные, но могут попортить нервов на поиски решения проблемы в случае скрипта, аналогичном примеру. Этот пример лишний раз говорит в пользу первичной инициализации состояния и переменных.

Посмотрел описание команд — туманно и рекурсивно (сепульки и сепулькарии), а про код ошибки — ни слова.

setlocal /? пишет:

 . . . ENABLEEXTENSIONS / DISABLEEXTENSIONS enable or disable command processor extensions. These arguments takes precedence over the CMD /E:ON or /E:OFF switches. See CMD /? for details. . . . 

cmd /? пишет:

 . . . See SETLOCAL /? for details. . . . To get specific details, type commandname /? to view the specifics. 

prompt /? пишет:

 Changes the cmd.exe command prompt. . . . If Command Extensions are enabled the PROMPT command supports the following additional formatting characters: . . . 

В чем разница между файлами CMD и BAT

В чем разница между файлами .cmd и .bat ? Есть ли конкретные рекомендации по использованию? Если .cmd более современный формат, почему мы до сих пор используем .bat чаще (включая «батники» в разговорах)?

Отслеживать
задан 3 июн 2020 в 22:03
3,261 3 3 золотых знака 11 11 серебряных знаков 22 22 бронзовых знака
3 июн 2020 в 22:47
3 июн 2020 в 22:52
ну включайте в разговор цэмэдэщьник
4 июн 2020 в 6:27
@Sergey если по делу нечего сказать, не надо писать пустые комментарии.
4 июн 2020 в 9:14

0

Сортировка: Сброс на вариант по умолчанию

Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.

  • cmd
  • bat
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.9.3159

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Какие задачи не решаются bat-файлами?

Бат-файлы ведут свою историю со времен MS-DOS. Новые фичи добавлялись с сохранением обратной совместимости. Из-за этого многое в языке bat-файлов, как мы увидим далее, нелогично и неудобно.

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

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

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

Для сравнения, Java, .NET и Python для выполнения этой простой задачи требуют подключить библиотеку/сборку/модуль и вызвать метод.

Язык C++ сам по себе вообще не определяет для этого стандартный и независимый от платформы способ. Тут вам понадобится библиотека целевой операционной системы. В Windows это windows.h и функция CreateProcess() , а в Linux надо вызвать fork() , а затем exec() .

Второе место по простоте вызова команд операционной системы занимает Perl – в нем достаточно заключить команду в обратные кавычки ( « ).

Первое место с bat-файлами делят PowerShell и bash.

Зачем же разбирать командный интерпретатор, а не Power Shell, который, кроме всего прочего, дает доступ ко всему богатству возможностей .NET Framework?

Прежде всего, ради искусства. Разные люди делают интересные вещи чисто на bat-файлах именно потому, что это сложно. Т.е. можно рассматривать язык командного интерпретатора как эзотерический язык программирования.

Кроме того, как-то раз в реальном проекте мне пришлось поддерживать bat-скрипты. Так что рано их списывать со счетов как морально устаревшую технологию.

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

Переменные

Переменные в bat-файлах – это переменные окружения. Это значит, что все переменные, установленные скриптом, доступны процессам, которые он запускает. Это надо иметь ввиду при работе с паролями.

Переменные создаются и изменяются командой set :

Создали переменную с именем hello и значением world.

Команда set без параметров выводит список всех переменных.

Следующая строка выведет слово «world»:

Имена переменных нечувствительны к регистру. Следующая строка тоже выведет слово «world»:

Значения переменных могут содержать знак равенства:

set equation=x=y echo %equation%

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

Специальные переменные

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

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

%1, %2%9 – параметры. Командная строка разделяется на токены по пробелам. При этом каждая часть, заключенная в кавычки, считается одним токеном. Кавычки, если есть, тоже попадают в эти переменные.

%* – все параметры, т.е. всё, что идет в командной строке после имени bat-файла, со всеми кавычками и пробелами, какие есть.

%errorlevel% — код возврата последней команды

%CD% — текущая директория

%DATE% и %TIME% — текущие дата и время

%RANDOM% — случайное число

Преобразование параметров при подстановке

%~1 – первый параметр без кавычек. Как вы помните, параметр может быть указан либо в кавычках, либо без них, и кавычки, если они есть, будут и в переменной. От того, есть ли кавычки в переменной, зависит, будет ли содержащее ее выражение синтаксически правильным. Проверить наличие кавычек с помощью оператора if не получится, потому что в одном из двух случаев выполнение скрипта прервется из-за синтаксической ошибки. Однако, тильда перед именем переменной гарантирует, что кавычек на месте этой переменной не будет.

%~dp0 – полный путь к папке текущего bat-файла, без имени самого файла.

%~nx0 – имя и расширение текущего bat-файла, без пути

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

Цикл FOR

Это единственный вид цикла. Если нужно что-то типа while или until, то придется использовать операторы if и goto.

Зато цикл FOR имеет несколько опций, выходящих за рамки того, что обычно делает цикл

Итерирование по словам

@echo off FOR %%a in (one two three) do echo %%a

Выводит каждое слово в новой строке:

one two three

@echo off отключает вывод команд. @ перед командой отключает вывод данной команды

Этот пример необходимо записать в bat-файл и запустить файл. Если вводить цикл в командной строке, то он должен выглядеть слегка иначе:

FOR %a in (one two three) do @echo %a

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

Цикл разбирает строку в скобках по тем же правилам, что параметры командной строки: строка в кавычках – это один параметр. Пример:

@echo off FOR %%a in ("twenty one" "twenty two") do echo %%~a

Выводит две строки:

twenty one twenty two

Строки выводятся без кавычек, потому что использована переменная %%~a. %%a содержит кавычки.

Цикл по файлам или папкам

Следующая команда выводит список файлов в текущем каталоге:

FOR %%a in (*.*) do echo %%a

А так можно получить список папок:

FOR /D %%a in (*.*) do echo %%a

Параметр /R включает обход всех подкаталогов. При этом в переменной цикла полные пути:

FOR /R %%a in (*.*) do echo %%a

FOR /D /R %%a in (*.*) do echo %%a

Вместо » *.* » можно писать просто » * «. Результат абсолютно такой же: в обоих случаях выбираются файлы как с расширениями, так и без.

Цикл по числам с заданным шагом

Используем параметр /L, а в скобках указываем начало, шаг и конец (включительно) через запятую. Обратите внимание, что для числа, указанного как конец интервала, команда тоже будет вызвана, если длина интервала делится на шаг. Шаг может быть отрицательным.

FOR /L %%a in (10,-1,5) do @echo %%a

10 9 8 7 6 5

Разбор файлов и строк

FOR /F %%a in (список.txt список2.txt) do echo %%a

Каждый файл открывается, каждая строка читается и разбивается на одну или более подстрок. Подстроки записываются в отдельные переменные. Например, если переменная цикла — %%a, то будут созданы переменные %%a, %%b, %%c и т.д.

При разборе строки разделителями по умолчанию считаются пробелы и табуляции.

Вот так можно разобрать строку, указанную непосредственно:

FOR /F %%a in (“строка”) do echo %%a

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

FOR /F %%a (‘dir /B’) do echo %%a

Выводит список файлов, разбирая вывод команды dir .

Наберите help for , чтобы узнать все опции.

Вызов подпрограмм и других скриптов

Очередная контринтуитивная фича bat-файлов в том, что, если из одного bat-файла вызвать другой, выполнение первого файла не продолжится, если только не использовать ключевое слово call. То есть, мы должны разбираться, чем является команда, которую мы хотим вызвать. Если это bat-файл, то надо перед его именем написать call. Если это exe-файл или встроенная команда, то это слово не нужно. Кроме того, если вызываемый скрипт использует команду exit , то выполнение также не вернется к нам. Чтобы завершить только текущий скрипт, надо писать exit /B .

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

В следующем примере a.bat вызывает b.bat . Этот пример также демонстрирует работу с кодом завершения процесса.

@echo off echo Before call call b.bat echo b.bat returned %errorlevel%
echo Inside b.bat exit /B 1
Before call Inside b.bat b.bat returned 1

Командой call также можно вызвать код, находящийся в том же файле:

@echo off echo Before call call :b echo b returned %errorlevel% goto :eof :b echo Inside b.bat exit /B 1

Работает аналогично предыдущему примеру, но это один файл.

С двоеточия начинаются метки. На них можно переходить командами call и goto . В языке bat-файлов нет понятия подпрограммы. Мы будем так называть код, который вызывается через call и возвращает управление через exit /B или goto :eof . Метка :eof не определена, и это не ошибка. Эта метка не нуждается в определении. Она всегда означает конец файла. Т.е. переход на :eof – это выход – то же, что и exit /B , но без кода завершения.

Условия

Ничего не выводит.

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

Вот такой способ проверить параметр командной строки работает и при отсутствии параметра, и если в нем спецсимволы:

if «%~1″==»help» echo This is a test script && exit /B

Оператор && — это один из способов выполнить несколько команд под условием. На самом деле это ленивое «и», т.е. если первая команда вернет ненулевой errorlevel, то вторая уже не выполнится.

Другой способ – скобки:

if "%~1"=="help" ( echo This is help exit /B ) else ( Echo This is the main part )

Как видите, со скобками можно использовать слово else.

Насчет скобок нужно помнить одну вещь. Условие или цикл с блоком команд в скобках – это одна команда. Значения переменных в ней подставляются один раз в самом начале.

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

При таких сценариях приходится выносить код в подпрограммы.

Есть еще поздняя подстановка переменных. Ее надо включать командой SETLOCAL ENABLEDELAYEDEXPANSION , а вместо символа » % » использовать » ! «.

Разыменование переменных

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

Допустим, переменная A содержит ключ:

Записать значение по ключу можно так:

Следующая команда выведет «bbb»:

А вот читать по ключу не так просто. Подстановка переменных не рекурсивна. То есть, нельзя, используя только знак « % », подставить «aaa» вместо «A», а затем, «bbb» вместо «aaa».

Тут нам поможет поздняя подстановка. Она тоже не рекурсивна. Однако, используя сразу оба вида подстановок, можно выполнить замену в два этапа:

SETLOCAL ENABLEDELAYEDEXPANSION echo !%A%!

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

for /F «tokens=1,2 delims==» %%a in (‘set %A%’) do if «%%a»==»%A%» echo %%b

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

Арифметика

Команда set /A вычисляет выражения

SET /A A=2+3 ECHO %A%

Замена подстрок

SET A=abcdefgh ECHO %A:c=C%

Заменяет строчную букву C на заглавную. Выводит:

Выводит 2 символа, начиная с 5-го, в данном случае » ef «.

Ввод пользователя

SET /P A=Enter something:

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

Заключение

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

  • Блог компании Аурига
  • Ненормальное программирование
  • Программирование
  • Оболочки
  • Разработка под Windows

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

Предостережение! Данная тема должна осваиваться пользователем(!) именно в том объеме, который приведен здесь (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 , что присутствует во многих приводимых примерах.

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

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

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

Комментарии

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

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

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

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

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

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

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

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

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

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

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

Переменные

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

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

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

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

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

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

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

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

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

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

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

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

Метки

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

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

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

Цикл 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 курса ВХК РАН.

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

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

Доступ к размещенным в этом месте материалам ограничен и предоставляется следующим категориям:
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-аники. Много важных «тонкостей» с аккуратным оформлением и грамотным изложением.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *