Выбор да нет в bat файле

Обновлено: 04.07.2024

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

Программа позволяет задать все стандартные типы значков (информация, вопрос, предупреждение, ошибка) и комбинации кнопок (ОК, ОК/Отмена, Да/Нет и т.д.).

По завершении программа возвращает код нажатой кнопки (IDOK и т.д.), по которому командный файл выполняет те или иные команды.

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

Загрузка nhmb

Прямая ссылка для скачивания nhmb

Программа не требует установки, работает в Windows XP SP3 и старше.

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

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

Вопрос с тайм-аутом в nhmb

Третий параметр задает значок-вопрос (Question)и кнопки Да/Нет, причем кнопка Нет будет кнопкой по умолчанию (DefButton2).

Четвертый параметр задает время ожидания 3 минуты (180 секунд). В заголовке окна будет идти отсчет оставшегося времени. Если пользователь нажмет Да или Нет, то программа вернет соответственно IDYES или IDNO. Если пользователь не в течение трех минут не нажмет никакую кнопку, то программа закроется сама и вернет IDNO.

Обработка кода нажатой кнопки

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

Командный файл сравнивает результат выполнения сначала с кодом IDNO (значение 7), затем IDYES (значение 6) и передает управление соответственно на завершение файла или на выполнение действий с базой данных.

Справочная информация

Описание параметров, коды кнопок можно посмотреть в описании функции MessageBox.

nhmb : 20 комментариев

Это потому что первое окно запускается через start , он здесь не нужен. И условия if у вас не в том порядке.
nhmb "Остановить программу?" "Stop" "YesNo"
if errorlevel 7 goto End
:Begin
nhmb "Программа остановлена" "Заголовок" "OK"
:End

выложил примеры на диск, запускайте скрипт.js , он запускает 1.bat с нужным параметром.

Здравствуйте. Подскажите, можно ли как-то сделать подавление командной строки? «@echo off» не срабатывает.

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

Это команды для запуска bat файла.

Скрипт my.js запускает bat файл, чтобы не показывалось окно:

Сам скрипт лучше запускать через wscript

Эту команду можно вставить, например, в ярлык или т.д.

кстати, в данном случае можно и проще сделать, если запускать через start

тогда перед выходом запустится nhmb в отдельном окне, а bat закроется. Это если нужно, чтобы окно закрылось сразу после выполнения xcopy, но до завершения nhmb.

Добрый день! Перезагрузку или выключение компьютера с запросом пользователя и с тайм-аутом можно сделать комбинацией nhmb и nhss, то есть по отмене выходить из bat файла, а по тайм-ауту или подтверждению запускать nhss -r.

Конфигурация компьютера
Процессор: Pentium(R) Dual-Core CPU E5200 @ 2.50Ghz
Материнская плата: ASRock G31M-S
Память: 1528 Mb DDR2, Samsung
HDD: IDE, ST325062A, 250GB
Видеокарта: Intel(R) G33/G31 Express Chipset
Звук: Realtek
Блок питания: 350W
CD/DVD: PIONER DVD-RW DVR-112D
ОС: Win XP SP3 Simple Edition
помогите написать скрипт, который при запуске будет выдавать ( нажмите 1 для включения защиты, 2 для выключения защиты )
1 включения добавляет в реестр значение .
2 удаляет это значение

-------
Сложность программы растет до тех пор, пока не превысит способности программиста.

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

Конфигурация компьютера
Процессор: Pentium(R) Dual-Core CPU E5200 @ 2.50Ghz
Материнская плата: ASRock G31M-S
Память: 1528 Mb DDR2, Samsung
HDD: IDE, ST325062A, 250GB
Видеокарта: Intel(R) G33/G31 Express Chipset
Звук: Realtek
Блок питания: 350W
CD/DVD: PIONER DVD-RW DVR-112D
ОС: Win XP SP3 Simple Edition
пишет ошибку!
choice.exe не является внутренней или внешней командой!
неудается найти указанную метку пакетного файла Labal9009

-------
Сложность программы растет до тех пор, пока не превысит способности программиста.

choice.exe не является внутренней или внешней командой! »

Отвык я как-то, что кто-то ещё работает на XP (помимо меня ). В отличие от Windows 7, в Windows XP «choice.exe» не входит в комплект поставки. Он есть в Resource Kit'е Windows 2000.

Попробуйте тогда так:

Конфигурация компьютера
Процессор: Pentium(R) Dual-Core CPU E5200 @ 2.50Ghz
Материнская плата: ASRock G31M-S
Память: 1528 Mb DDR2, Samsung
HDD: IDE, ST325062A, 250GB
Видеокарта: Intel(R) G33/G31 Express Chipset
Звук: Realtek
Блок питания: 350W
CD/DVD: PIONER DVD-RW DVR-112D
ОС: Win XP SP3 Simple Edition
Отвык я как-то, что кто-то ещё работает на XP (помимо меня ). »
Понимаю Вас, старая, добрая XP))
Спасибо, все заработало!

-------
Сложность программы растет до тех пор, пока не превысит способности программиста.

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

Как это можно осуществить в командной строке Windows .

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

Спасибо.

Phoenix

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

alex-s

Пользователь
Вот вы и приведите пример, а то как то догадываться неправильно. Спойлер: getops -Прием опций/аргументов, передаваемых сценарию, с помощью getopts Спойлер: список файлов текущей директории начинающиеся на s s*

Dragokas

Very kind Developer
Намёка на статью у меня нет, но достаточный минимум описан в справке choice /?
Доступна на ОС Vista и выше.

CHOICE [/C список] [/N] [/CS] [/T тайм-аут /D элемент] [/M текст]

Описание.
Эта программа позволяет выбирать элемент из списка элементов
и возвращает индекс выбранного элемента.

Параметры:
/C список Создаваемый список выбираемых элементов.
Список по умолчанию "YN".

/CS Включение учета регистра при выборе элементов.
По умолчание в программе регистр символов не учитывается.

/T тайм-аут Число секунд перед выбором элемента по умолчанию.
Допустимыми являются значения от 0 до 9999.
Если указан 0, отсутствует пауза перед выбором
элемента по умолчанию.

/D элемент Элемент, выбираемый по умолчанию через nnnn секунд.
Символ должен присутствовать в наборе элементов
в параметре /C; значение nnnn задается в параметре /T.

/? Вывод справки по использованию.

Примечание
Переменная среды ERRORLEVEL получает значение индекса
клавиши, соответствующей выбранному элементу. Первый элемент
в списке возвращает значение 1, второй - 2 и т.д.
Если пользователь нажимает клавишу, не соответствующую допустимому
выбору, подается звуковой сигнал. Если обнаруживается ошибка,
возвращается значение ERRORLEVEL 255. Если нажимаются клавиши
CTRL+BREAK или CTRL+C, программа возвращает значение ERRORLEVEL 0.
При использовании параметров ERRORLEVEL в пакетной программе их
следует перечислять по убыванию.

Примеры:
CHOICE /?
CHOICE /C YNC /M "Y - Да, N - Нет, C - Отмена."
CHOICE /T 10 /C ync /CS /D y
CHOICE /C ab /M "a" для выбора параметра 1 и "b" для выбора параметра 2.
CHOICE /C ab /N /M "a" для выбора параметра 1 и "b" для выбора параметра 2.

По истечению 5 секунд будет автоматически выбран вариант Y.
Порядковый номер выбранной буквы будет сохранён в виде кода возврата ошибки (errorlevel).

Учтите, что регистр символов (если не указан ключ /CS) игнорируется только в английском алфавите.

В статье рассматриваются примеры практического использования в bat-файлах команд for, echo, goto, определения функций, экранирования символов, определения каталога запуска и многое другое.

Однако в нашей повседневной деятельности встречаются и вещи, которые не так интересны и интеллектуальны. Мы не очень любим говорить об этом, делаем вид, что Это – грязно, нечистоплотно и недостойно нашего внимания. Однако, приходит день, приходит час и перст Судьбы находит нас – нам надо написать еще один батничек… Иногда это запускалка для построения проекта, которая должна при ошибке компиляции скопировать логи на сетевой диск, иногда – запуск обновления исходных текстов из SVN. Иногда – что-нибудь еще.

К чему я это все? А к тому, что поговорим мы о полезных хитростях при написании файлов сценариев на встроенном командном языке Windows. К счастью, это занятие не является доминирующим в профессиональной деятельности автора, так что я не обязуюсь заполнить абсолютно все пробелы в данной области. Кроме того, рожденный ползать летать не может, и из cmd.exe, увы, не получится ни /usr/bin/perl, ни даже /bin/sh. Так что, все нижеприведенное – просто некоторые интересные факты из жизни файлов с расширением bat, на которые автор обратил внимание во время решения различных практических задач автоматизации.

Наш урок будет построен по сугубо практическому принципу, известному в народе как Cookbook. Иными словами, я не буду вдаваться в синтаксические и семантические дебри командного языка Windows, а лишь продемонстрирую его возможности (хотел написать «мощь», но все-таки передумал). Именно поэтому большинство следующих заголовков будет начинаться со слова «Как». Впрочем, для полноты по ходу развития событий будут даваться подробные комментарии, в том числе и по языковым конструкциям.

Практически все описанные здесь рецепты подойдут только для Windows 2000 и старше. Bat-язык Windows 9x, к счастью, можно считать почившим, так что здесь он не рассматривается. Более того, диалекты cmd.exe операционных систем Windows 2000, Windows XP и Windows Server 2003 также немного различаются. Все приведенное ниже создано и проверено на компьютере под управлением операционной системы Windows XP. За подробной информацией по различиям в реализации той или иной команды обращайтесь к [1].

Как экранировать символ?

В командном языке Windows существует некоторый набор символов с высоким приоритетом, которые всегда трактуются как спецсимволы. К ним, в частности, относятся:

  • Операторы перенаправления ввода-вывода <, >, >>.
  • Оператор конвейера |.
  • Операторы объединения команд ||, & и &&.
  • Оператор разыменования переменной %…%.

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

символ процента будет «съеден» интерпретатором, который решит, что это попытка вывода значения какой-то переменной. В случае со знаком процента решение довольно хорошо известно и состоит в удвоении этого символа:

после чего все заработает так, как надо. Однако в других случаях все менее очевидно. Рассмотрим командный сценарий, который генерирует незатейливый HTML-файл:

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

К счастью, есть один малоизвестный способ, позволяющий добиться требуемого результата. Символ ^ позволяет экранировать любой другой символ с безусловным приоритетом. Таким образом, вышеприведенный пример генерации HTML может быть успешно записан так:

Таким же способом можно экранировать любой другой специальный символ. Очевидно, можно экранировать и сам ^. Не очень эстетично, зато дешево и практично. Слово «надежно» я пропустил умышленно…

Как перенести длинную строку?

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

Так вот долгое время *.bat-файлы портили мне жизнь тем, что иногда приходилось писать длинную строку – например, вызов какой-нибудь другой программы с кучей опций, и я не знал, что с этим делать. Происходило это нечасто, но всегда было неприятно. Но, к счастью, моя жизнь изменилась с тех пор, как я открыл для себя Супер-Символ ^:

Помните лишь, что чудо-символ должен быть последним в строке – скажите «Нет!» концевым пробелам.

Как определить имя каталога, в котором находится запущенный командный файл?

Иногда сценарию надо знать полный путь к себе самому и/или к каталогу, в котором он находится. Это может понадобиться по разным причинам. Например, он должен достать из системы контроля версий исходники в каталог/src рядом с собой. Или, запускаются тесты из каталога/tests, и перед их запуском надо добавить каталог/bin в переменную PATH.

Можно, конечно, рассчитывать на то, что командный файл был вызван из того же каталога, где он находится, и тогда в качестве вышеупомянутогоможно использовать переменную окружения %CD% - полный путь к текущему каталогу. Однако любые допущения в нашем деле недопустимы (хороший каламбур, однако!). Поэтому приведу более надежное решение.

Прежде всего, вспоминаем, что переменная %0 в bat-файле соответствует нулевому аргументу командной строки, т.е. имени самого файла. После этого читаем скудную документацию для команды call:

и обнаруживаем, что при использовании нумерованных переменных %0-%9 можно использовать некоторые модификаторы:

1 - разворачивает %1, удаляя кавычки (")
%

f1 - разворачивает %1 в полный квалифицированный путь
%

d1 - разворачивает %1 в букву диска
%

p1 - разворачивает %1 в путь
%

n1 - разворачивает %1 в имя файла
%

x1 - разворачивает %1 в расширение файла
%

s1 - развернутый путь будет содержать только короткие имена
%

a1 - разворачивает %1 в атрибуты файла
%

t1 - разворачивает %1 в дату/время создания файла
%

z1 - разворачивает %1 в размер файла
%

$PATH:1 - Ищет в каталогах, перечисленных в переменной среды PATH, и разворачивает %1 в полное квалифицированное имя первого совпадения. Если имя переменной среды не определено, или если файл не найден, этот модификатор вернет пустую строку и, более того, модификаторы можно объединять для получения сложных результатов:

Таким образом, правильным будет использовать в качестве тега сочетание %

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

Обратите внимание на использование кавычек – потенциально каталог может иметь в своем пути пробел. Кавычки избавят от проблем в этом случае.

Опасайтесь бездумного применения команды cd %

dp0 без проверки результата выполнения. Теоретически, эта команда должна сменить текущий каталог на каталог, в котором расположен командный файл. Как правило, это работает. Однако возможны неожиданности. Однажды был написан простой командный сценарий, задача которого была просто удалить все каталоги рядом с собой. В «свою» директорию он переходил как раз через cd %

dp0. Все было проверено на локальной машине – работало замечательно. После этого сценарий был помещен на файл-сервер, где ему и полагалось быть. Я зашел с помощью Far в сетевой каталог, и для контрольной проверки решил запустить файл еще раз. Дальнейшее словно в тумане. cmd.exe правильно определил местонахождение bat-файла: \\servername\sharename\directory. Однако при попытке сделать туда cd, он сказал, что UNC-пути в качестве текущих каталогов не поддерживаются и лучше он сменит текущий каталог на C:\WINDOWS… Это было действительно мудрое решение… Часть сценария, отвечавшая за удаление всех каталогов, сработала отлично – хорошо, что я успел вовремя остановить это безумие.

В тот день я узнал, что такое System Restore…

Как получить короткое (8.3) имя файла?

«А зачем? – спросите вы – Ведь мы живем в мире Интернета, Web-сервисов и NTFS с длинными именами файлов». Это действительно так, но иногда встречаются программы, которые отчаянно сопротивляются прогрессу, и в частности, не любят имен файлов и полных путей с пробелами. Одной из таких программ, кстати, является утилита build.exe из Windows DDK… В таких ситуациях спасает использование короткого, «беспробельного» DOS-имени для файла.

Доступ к файлу по короткому имени может быть не всегда возможен. На файловой системе NTFS создание коротких псевдонимов для файлов может быть отключено путем установки в единицу значения «NtfsDisable8dot3NameCreation» в ключе реестра «HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem».

Итак, все же (в предположении, что надругательства над NTFS не было) – как? Внимательный читатель должен был заметить в предыдущем разделе, что при обращении к переменным %0 - %9 можно использовать префикс (расширенный путь будет содержать только короткие имена)

который нам как раз мог бы помочь. Но есть засада – все эти полезные префиксы нельзя использовать с произвольной переменной окружения, а присваивание переменным %0 - %9 не поддерживается. К счастью, описываемые префиксы можно еще использовать с переменными цикла for, и это дает нам способ достичь требуемого результата. Например, вот так можно получить 8.3-путь к “Program Files”:

Этот и другие модификаторы можно использовать и с любой другой формой цикла for, подробнее о которых можно узнать из (см. также статью [1]):

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

Здесь делается то же, что и раньше, но с перенаправлением стандартного вывода в файл out.html. Делается это простым способом – перезапуском сценарием самого себя. Сначала проверяется, не установлена ли переменная окружения STDOUT_REDIRECTED. Если она установлена, значит, сценарий уже перезапущен с перенаправленным выводом и можно просто продолжить работу. Если же переменная не установлена, то мы ее устанавливаем и перезапускаем скрипт (cmd.exe /c %0) с таким же набором параметров, что и исходная команда (%*) и перенаправленным в файл стандартным выводом (>%OUTPUT%). После завершения выполнения «перенаправленной» команды выходим.

Такое «единовременное» перенаправление имеет и еще один неочевидный плюс: файл открывается и закрывается только один раз, и всем командам и дочерним процессам передается дескриптор уже открытого файла. Во-первых, это чуть-чуть улучшит производительность (жизнь удалась – сроду бы не подумал, что буду когда-нибудь писать о производительности в bat-файлах). Во-вторых, это поможет избежать проблемы с невозможностью открыть файл для записи. Такое может случиться, если после выполнения одной из команд останется «висеть» какой-нибудь процесс. Он будет держать дескриптор интересующего нас файла и перенаправление вывода в этот файл для всех последующих команд провалится. Проблема может показаться надуманной, но однажды она украла у меня 2 часа жизни…

Как сложить два числа?

Краткий ответ – смотри:

Длинный ответ таков. В bat-файлах можно производить довольно-таки продвинутые вычисления – продвинутые не в сравнении с другими языками, а в сравнении с отсутствием возможности что-либо вычислить вообще. Вычисление осуществляется командой set, если она выполняется с ключом /a. Поддерживается практически полный набор операторов языка C, включая шестнадцатеричный модификатор 0x. Переменные окружения в выражении не обязательно заключать в знаки процента – все, что не является числом, считается переменной. Подробнее – все-таки в man set, тьфу, то есть в set /?. А здесь напоследок – просто несколько примеров.

А можно создать в bat-файле функцию?

Да, можно. Более того, иногда даже нужно. Правда, функциями это можно назвать условно. Есть особый синтаксис команды call, который позволяет перейти на метку в этом же bat-файле с запоминанием места, откуда был произведен этот вызов:

Возврат из функции производится командой:

Ключ /b здесь очень важен: без него будет произведен выход не из функции, а из сценария вообще. За подробностями обращайтесь к:

Что интересно, команда call с таким синтаксисом поддерживает рекурсивные вызовы с автоматическим созданием нового фрейма для переменных аргументов %0-%9. Иногда это может быть полезным. Вот классический пример рекурсивного подсчета факториала на командном языке:

Как можно избежать использования goto?

Любой хоть сколько-то осмысленный *.bat-файл длиной больше 50 строк является ярким лозунгом в поддержку работы Дейкстры [3]. Мешанина из переходов вперед и назад действительно является кодом «только для записи». Можно ли что-то предпринять по этому поводу?

На самом деле можно. Как правило, большинство меток и переходов используются для организации ветвлений при проверке условий, т.е. банальных if-then-else блоков. В оригинале, bat-язык поддерживал только одну команду в блоке then, что автоматически приводило к идиомам вида:

Но к счастью, командный интерпретатор cmd.exe современных ОС Windows 2000 и старше поддерживает блоки команд в конструкциях ветвления, что устраняет необходимость применения меток. Блоки команд заключаются в круглые скобки. Выглядит это так (имитируя C/C++ indentation style):

Конкретный пример использования:

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

Загвоздка в том, что в обоих блоках подстановка переменной OPTFLAGS произойдет до того, как она будет изменена в процессе выполнения этого блока. Соответственно, в CCFLAGS будет подставлено то значение, которое OPTFLAGS имела на момент начала выполнения данного if-блока.

Решается эта проблема путем использования отложенного раскрытия переменных. Переменные, заключенные в !…! вместо %…%, будут раскрыты в их значения только в момент непосредственного использования. Данный режим по умолчанию отключен. Включить его можно либо использованием ключа /V:ON при вызове cmd.exe, либо использованием команды

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

С учетом сказанного предыдущий «неправильный» пример может быть исправлен так:

Вот теперь это почти полноценный if-then-else блок. Почти, потому что если в одной из команд echo у вас встретится закрывающая круглая скобка, то вам необходимо заэкранировать ее символом ^, иначе синтаксический анализатор путается…

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

Как обработать текстовый файл?

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

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

Ничего сверхъестественного – простой key=value формат с возможностью вставки Unix-style комментариев. Помочь в чтении и обработке этого файла нам сможет команда for. Ее дополнительные опции позволяют задать и разделители, и символ начала комментария, и кое-что еще. Вот командный файл, который выполняет поставленную задачу:

Обильные комментарии должны помочь легко разобраться, что к чему. За подробностями, как обычно, отошлю к:

Кстати, возможности команды for не ограничиваются чтением из файла. Возможно также чтение вывода другой команды. Например, так:

Особенно меня умиляет наличие опции “usebackq”, которая делает синтаксис отдаленно похожим на юниксовый. И в стенах царства Билла есть граждане, скучающие по /bin/sh и пытающиеся хоть как-то скрасить существование свое и окружающих. Следующий совет это также косвенно подтверждает.

Что это за упомянутые ранее операторы объединения команд?

Это операторы &, && и ||. Они практически совсем не освещены в документации, но полезны в повседневности. Они позволяют объединять несколько команд в одну, т.е. примерно так:

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

Оператор && гарантирует, что вторая команда будет выполнена только, если первая была выполнена успешно, т.е. с нулевым кодом возврата (он же %errorlevel%). Такие конструкции очень популярны в мире shell-сценариев Unix. Например:

Я был приятно удивлен, узнав, что cmd.exe тоже умеет выполнять такие конструкции. Это безопаснее и правильнее, нежели простое последовательное выполнение этих команд, и короче и проще, чем строгая проверка и обработка кодов возврата. Очень удобно при написании на скорую руку. Не менее полезен иногда и оператор ||. Суть его тоже логична – выполнить вторую команду, если первая дала сбой. Часто встречается в таких идиомах:

Если перейти в каталог sources не удастся, то будет произведен выход с кодом ошибки 1. Если же первая команда отработает нормально, то вторая выполнена не будет. Например, такая простейшая защита помогла бы в случае с cd по UNC-адресу, описанному ранее.

Можно ли написать на bat-языке серьезную программу?

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

  • Perl
  • Python
  • Ruby
  • JScript / VBScript

Последние, кстати, присутствуют в Windows 2000/XP по умолчанию (с некоторыми функциональными различиями) и в целом могут считаться заменой *.bat языку. Однако сдается мне, что *.bat-файлы проживут еще очень долго.

Как проверить, указан ли определенный аргумент в bat-файле?

Проверить наличие определенного параметра в bat-файле можно оператором if [%1]==[] goto, пример:

Как можно отменить (экранировать) действие специальных символов (< и >)?

Все команды и операторы языка являются регистронезависимыми, то есть, команды echo off, ECHO OFF и EcHo oFf являются абсолютно идентичными.

Перенаправление потоков ввода/вывода.

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

Основные команды и операторы пакетных файлов.

@<команда>
Оператор @. позволяет не выводить следующую за ним команду на экран. Это аналог оператора ECHO OFF только для одной строки. Часто используется следующим образом в начале многих пакетных файлов:
@ECHO OFF
Это позволяет не выводить и саму запрещающую строку ECHO OFF при выполнении пакетных файлов.

GOTO <метка>
Оператор GOTO осуществляет безусловный переход на метку внутри этого же файла. Метка обозначается следующим образом:
:label
то есть, со знаком двоеточия в начале. Для перехода к такой метке будет служить команда
GOTO label
в любом месте BAT-файла.

CALL <имя bat-файла>
Команда CALL позволяет вызвать один пакетный файл из другого, не прекращая выполнения предыдущего. Пример:
CALL ABC.BAT
То есть, при выполнении команды CALL выполнение текущего пакетного файла прекратится и управление будет передано пакетному файлу с именем ABC.BAT. При использовании команды CALL ABC.BAT, после завершения работы файла ABC.BAT управление будет возвращено на следующую после команды вызова строку.

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

Используя сочетания этих символов можно изменить вид приглашения DOS по своему вкусу. Не забывайте ставить перед каждым из этих символьв знак доллара.
Если использовать какой-либо текст в строке команды PROMPT, он также будет выведен в соответствующие позиции.

Фильтры в командных файлах.

MORE [диск:][путь]имя_файла MORE < [диск:][путь]имя_файла имя_команды | MORE [диск:][путь][имя_файла]
Последовательный вывод данных по частям размером в один экран. Параметры:

SORT [/R] [/+n] [[диск1:][путь1]имя_файла1] [> [диск2:][путь2]имя_файла2] [команда |] SORT [/R] [/+n] [> [диск2:][путь2]имя_файла2]
Сортировка ввода с выводом результатов в файл, на экран или другое устройство.
Параметры:

Пример:
SORT /R < BOOK1 > REV
Сортирует файл BOOK1 в обратном порядке и записывает результат в файл REV.
Буквы нижнего регистра соответствуют буквам верхнего (a=A, z=Z).

Использование возвращаемых значений.

Основные команды разных версий DOS.

Справочные команды

Читайте также: