Пакетные файлы. Синтаксис bat файлов


Язык интерпретатора Cmd.exe. Командные файлы .bat Windows Статьи

Вывод сообщений и дублирование команд

По умолчанию команды пакетного файла перед исполнением выводятся на экран, что выглядит не очень эстетично. С помощью команды ECHO OFF можно отключить дублирование команд, идущих после нее (сама команда ECHO OFF при этом все же дублируется). Например,

REM Следующие две команды будут дублироваться на экране … DIR C:\ ECHO OFF REM А остальные уже не будут DIR D:\

Для восстановления режима дублирования используется команда ECHO ON. Кроме этого, можно отключить дублирование любой отдельной строки в командном файле, написав в начале этой строки символ @, например:

ECHO ON REM Команда DIR C:\ дублируется на экране DIR C:\ REM А команда DIR D:\ — нет @DIR D:\

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

@ECHO OFF

то это решит все проблемы с дублированием команд.

В пакетном файле можно выводить на экран строки с сообщениями. Делается это с помощью команды

ECHO сообщение

Например,

@ECHO OFF ​ECHO Привет!

Команда ECHO. (точка должна следовать непосредственно за словом "ECHO") выводит на экран пустую строку.

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

Используя механизм перенаправления ввода/вывода (символы > и >>), можно направить сообщения, выводимые командой ECHO, в определенный текстовый файл. Например:

@ECHO OFF ECHO Привет! > hi.txt ECHO Пока! >> hi.txt

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

@ECHO OFF REM Попытка копирования XCOPY C:\PROGRAMS D:\PROGRAMS /s REM Добавление сообщения в файл report.txt в случае REM удачного завершения копирования IF NOT ERRORLEVEL 1 ECHO Успешное копирование >> report.txt

 

Использование параметров командной строки

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

Для доступа из командного файла к параметрам командной строки применяются символы %0, %1, …, %9 или %*. При этом вместо %0 подставляется имя выполняемого пакетного файла, вместо %1, %2, …, %9 — значения первых девяти параметров командной строки соответственно, а вместо %* — все аргументы. Если в командной строке при вызове пакетного файла задано меньше девяти параметров, то "лишние" переменные из %1 – %9 замещаются пустыми строками. Рассмотрим следующий пример. Пусть имеется командный файл copier.bat следующего содержания:

@ECHO OFF CLS ECHO Файл %0 копирует каталог %1 в %2 XCOPY %1 %2 /S

Если запустить его из командной строки с двумя параметрами, например

copier.bat C:\Programs D:\Backup

то на экран выведется сообщение

Файл copier.bat копирует каталог C:\Programs в D:\Backup

и произойдет копирование каталога C:\Programs со всеми его подкаталогами в D:\Backup.

При необходимости можно использовать более девяти параметров командной строки. Это достигается с помощью команды SHIFT, которая изменяет значения замещаемых параметров с %0 по %9, копируя каждый параметр в предыдущий, то есть значение %1 копируется в %0, значение %2 – в %1 и т.д. Замещаемому параметру %9 присваивается значение параметра, следующего в командной строке за старым значением %9. Если же такой параметр не задан, то новое значение %9 — пустая строка.

Рассмотрим пример. Пусть командный файл my.bat вызван из командной строки следующим образом:

my.bat p1 p2 p3

Тогда %0=my.bat, %1=p1, %2=p2, %3=p3, параметры %4 – %9 являются пустыми строками. После выполнения команды SHIFT значения замещаемых параметров изменятся следующим образом: %0=p1, %1=p2, %2=p3, параметры %3 – %9 – пустые строки.

При включении расширенной обработки команд SHIFT поддерживает ключ /n, задающий начало сдвига параметров с номера n, где n может быть числом от 0 до 9.Например, в следующей команде:

SHIFT /2

параметр %2 заменяется на %3, %3 на %4 и т.д., а параметры %0 и %1 остаются без изменений.

Команда, обратная SHIFT (обратный сдвиг), отсутствует. После выполнения SHIFT уже нельзя восстановить параметр (%0), который был первым перед сдвигом. Если в командной строке задано больше десяти параметров, то команду SHIFT можно использовать несколько раз.В командных файлах имеются некоторые возможности синтаксического анализа заменяемых параметров. Для параметра с номером n (%n) допустимы синтаксические конструкции (операторы), представленные в следующей таблице:

Таблица 2.1. Операторы для заменяемых параметров

Операторы

Описание

%~Fn

Переменная %n расширяется до полного имени файла

%~Dn

Из переменной %n выделяется только имя диска

%~Pn

Из переменной %n выделяется только путь к файлу

%~Nn

Из переменной %n выделяется только имя файла

%~Xn

Из переменной %n выделяется расширение имени файла

%~Sn

Значение операторов N и X для переменной %n изменяется так, что они работают с кратким именем файла

%~$PATH:n

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

 Данные синтаксические конструкции можно объединять друг с другом, например:

%~DPn — из переменной %n выделяется имя диска и путь,%~NXn — из переменной %n выделяется имя файла и расширение.

Рассмотрим следующий пример. Пусть мы находимся в каталоге C:\TEXT и запускаем пакетный файл с параметром Рассказ.doc (%1=Рассказ.doc). Тогда применение операторов, описанных в таблице выше, к параметру %1 даст следующие результаты:

%~F1=C:\TEXT\Рассказ.doc %~D1=C: %~P1=\TEXT\ %~N1=Рассказ %~X1=.doc %DP1=C:\TEXT\ %NX1=Рассказ.doc

frantsuzzz.com

"Урок bat-аники" - хорошая статья о создании bat-файлов

Есть хорошая статья в Сети, в которой приведены полезные советы по созданию все еще порой необходимых bat-файлов.Автор и источники в статье указаны.
Автор: Алексей АлександровИсточник: RSDN Magazine #2-2005
Опубликовано: 11.07.2005Исправлено: 27.10.2005Версия текста: 1.0

Введение

Мы все любим писать серьезные вещи на серьезных языках. Шаблоны, C++, Reflection, Perl и многое другое – вот то, что мы любим, то, чему посвящаем длинные сообщения в форумах, то, что снится нам по ночам.

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

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

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

echo The ratio should be up to 10%.

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

echo The ratio should be up to 10%%.

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

@echo offset OUTPUTFILE=%1

echo <html> >%OUTPUTFILE%echo <head> >>%OUTPUTFILE%echo <title>This is a greeting page</title> >>%OUTPUTFILE%echo </head> >>%OUTPUTFILE%echo <body> >>%OUTPUTFILE%echo Hello World! >>%OUTPUTFILE%echo </body> >>%OUTPUTFILE%echo </html> >>%OUTPUTFILE%

К сожалению, при попытке запуска этого "чуда инженерного разума" нас постигнет неудача в виде сообщения об ошибке

> was unexpected at this time.

Оно и понятно: командный интерпретатор не в силах разобраться, где его просят вывести на экран символ HTML-тега, а где перенаправить вывод. В нормальных языках программирования эта проблема обычно решается обрамлением строковых литералов кавычками. Отчасти это помогает и в bat-файлах. Но лишь отчасти. Выполнение строки

echo "<html>" >%OUTPUTFILE%

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

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

@echo offset OUTPUTFILE=%1

echo ^<html^> >%OUTPUTFILE%echo ^<head^> >>%OUTPUTFILE%echo ^<title^>This is a greeting page^</title^> >>%OUTPUTFILE%echo ^</head^> >>%OUTPUTFILE%echo ^<body^> >>%OUTPUTFILE%echo Hello World! >>%OUTPUTFILE%echo ^</body^> >>%OUTPUTFILE%echo ^</html^> >>%OUTPUTFILE%

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

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

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

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

packagebin.exe --recursive-search=yes --files-mask=exe,dll,pdb,obj ^--archive-type=zip --archive-level=max --deliver-method=ftp ^--deliver-target=ftp://ftp.site.com

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

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

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

Можно, конечно, рассчитывать на то, что командный файл был вызван из того же каталога, где он находится, и тогда в качестве вышеупомянутого <script-dir> можно использовать переменную окружения %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 в полное квалифицированное имя первого совпадения. Если имя перменной средыне определено, или если файл не найден, этот модификатор вернет пустую строку

и, более того:

Модификаторы можно объединять для получения сложных результатов:

%~dp1 - разворачивает %1 в букву диска и путь%~nx1 - разворачивает %1 в имя файла с расширением%~dp$PATH:1 – ищет %1 в каталогах, перечисленных в переменной среды PATH, и разворачивает в букву дискаи путь к первому найденному файлу.%~ftza1 - разворачивает %1 в строку, подобную DIR

Таким образом, правильным будет использовать в качестве тега <script-dir> сочетание %~dp0, которое будет раскрыто в полный путь к каталогу, где находится сценарий. Например,

"%~dp0\packagebin.exe" --recursive-search=yes --files-mask=exe,dll,pdb,obj ^--archive-type=zip --archive-level=max --deliver-method=ftp ^--deliver-target=ftp://ftp.site.com --deliver-source="%~dp0\bin"

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

ПРЕДУПРЕЖДЕНИЕ

Опасайтесь бездумного применения команды 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 можно использовать префикс

%~s1 - expanded path contains short names only

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

for /d %%i in ("%PROGRAMFILES%") do (set PROGRAMFILESSHORT=%%~si)

echo 8.3-имя для каталога "%PROGRAMFILES%" -^> "%PROGRAMFILESSHORT%"

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

Как перенаправить стандартный вывод в файл?

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

echo Cleaning up the target directory >>%LOGFILE%...echo The target directory has been cleaned >>%LOGFILE%

Гораздо проще было бы перенаправить стандартный вывод в файл, чтобы все команды echo и вообще, все, что выводится на экран, автоматически попадали в журнальный файл. Сделать это можно следующим образом (рассмотрим на знакомом примере генерации HTML-файла):

@echo offset OUTPUT=out.html

if "%STDOUT_REDIRECTED%" == "" (set STDOUT_REDIRECTED=yescmd.exe /c %0 %* >%OUTPUT%exit /b %ERRORLEVEL%)

echo ^<html^>echo ^<head^>echo ^<title^>This is a greeting page^</title^>echo ^</head^>echo ^<body^>echo Hello World!echo ^</body^>echo ^</html^>

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

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

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

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

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

@echo off

set ARG=1

rem Переменные окружения в выражении не обязательно заключать в %...%set /a RESULT=ARG + 2echo %RESULT%rem Если выражение содержит какие-либо из символов non grata, надоrem заключить его в кавычкиset /a RESULT="ARG << 2"echo %RESULT%rem Шестнадцатеричная арифметикаset /a RESULT=0x1234 + 0x6786echo %RESULT%rem И многое-многое другое...

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

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

call :метка аргументы

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

exit /b [опциональный код возврата]

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

За подробностями обращайтесь к:

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

@echo off

call :factorial %1echo %RESULT%exitrem Функция для подсчета значения факториалаrem Вход:rem %1 Число, для которого необходимо подсчитать факториалrem Выход:rem %RESULT% Значение факториала:factorial

if %1 == 0 (set RESULT=1exit /b)

if %1 == 1 (set RESULT=1exit /b)

set /a PARAM=%1 - 1

call :factorial %PARAM%

set /a RESULT=%1 * %RESULT%

exit /b

Пример работы:

> factorial.bat 103628800

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

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

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

if condition goto :THENrem Команды ветки ‘else’rem ...goto IF_END:THENrem Команды ветки ‘then’rem ...:IF_END

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

if condition (rem Команды ветки ‘then’ rem ...) else (rem Команды ветки ‘else’ rem ...)

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

@echo off

set BUILDMODE=%1

if "%BUILDMODE%" == "" (echo FAIL: Аргумент является обязательным ^(--debug, --release^)exit /b 1)

rem Удаляем из аргумента все дефисы для упрощения обработкиset BUILDMODE=%BUILDMODE:-=%

if "%BUILDMODE%" == "debug" (echo INFO: Устанавливаем debug-режим окруженияset CCFLAGS=/Od /MDd /Z7) else (echo INFO: Устанавливаем release-режим окруженияset CCFLAGS=/O2 /MD)

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

if "%BUILDMODE%" == "debug" (echo INFO: Устанавливаем debug-режим окружения set OPTFLAGS=/Odset CCFLAGS=%OPTFLAGS% /MDd /Z7) else (echo INFO: Устанавливаем release-режим окружения set OPTFLAGS=/O2set CCFLAGS=%OPTFLAGS% /MD)

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

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

setlocal enabledelayedexpansion

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

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

setlocal enabledelayedexpansion

rem ...if "%BUILDMODE%" == "debug" (echo INFO: Setting up debug mode environment set OPTFLAGS=/Odset CCFLAGS=!OPTFLAGS! /MDd /Z7) else (echo INFO: Setting up release mode environment set OPTFLAGS=/O2set CCFLAGS=!OPTFLAGS! /MD)

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

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

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

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

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

# Это простой файл с настройками# Режим сборкиbuildmode=release

# Компиляторcompiler=cl.exe

# Архитектураarch=x86

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

@echo off

rem Читаем настройки из файла settings.txt, который должен располагаться вrem том же каталоге, что и bat-файл. Если не удалось распарсить настройки -rem выходим с ненулевым кодом возврата.call :read_settings %~dp0\settings.txt || exit /b 1

rem Прочитанные настройки:echo Build mode : %BUILDMODE%echo Compiler : %COMPILER%echo Architecture: %ARCH%rem Выход из сценария. Дальше - только функции.exit /b 0

remrem Функция для чтения настроек из файла.rem Вход:rem %1 - Имя файла с настройками:read_settings

set SETTINGSFILE=%1

rem Проверка существования файлаif not exist %SETTINGSFILE% (echo FAIL: Файл с настройками отсутствуетexit /b 1)

rem Обработка файла c настройкамиrem Здесь:rem eol=# указывает на то, что содержимое строки начиная с символа #rem и до ее конца может быть пропущено как комментарий.remrem delims== указывает, что разделителем значений является символ =rem rem tokens=1,2 приводит к тому, что в переменную %%i будет занесен первыйrem токен, а в %%j - второй.rem for /f "eol=# delims== tokens=1,2" %%i in (%SETTINGSFILE%) do (rem В переменной i - ключ rem В переменной j - значение rem Мы транслируем это в переменные окружения set %%i=%%j)

exit /b 0

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

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

@echo off

for /f "tokens=* usebackq" %%i in (`cmd.exe /c ver`) do (set VERSION=%%i)

echo %VERSION%

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

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

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

command1 & command2command1 && command2command1 || command2

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

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

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

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

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

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

  • Perl
  • Python
  • Ruby
  • JScript / VBScript

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

Дай Бог, чтобы я ошибся…

Материалы по теме

  1. Windows Batch Files – Commands Reference.
  2. Windows 2000. Команды: Карманный справочник. Э. Фриш. – М.: Мир, 2003.

Эта статья опубликована в журналеRSDN Magazine #2-2005.

kvakusik.livejournal.com

Пакетные файлы BAT | RikoNw

Пакетные файлы имеют расширение .BAT и считаются особой категорией исполняемых программ. То есть, операционная система делает возможным запись последовательности команд в пакетный файл. Представляет он из себя набор команд. Использовать в пакетных файлах можно любые команды из операционной системы, а так же существуют специальные команды только для использования их в пакетных файлах. Осуществление запуска происходит так же, как и запуск других программ, имеющих расширение .EXE и .COM. Пакетные файлы или как их можно еще называть bat файлы необходимы для удобного взаимодействия пользователей с программными системами. В отличие от обычных программ, batch не содержит машинные коды, а только текст, интерпретируемый командным процессором DOS.

Текст этот может представлять собой:        В пакетных файлах могут фигурировать команды, которые предназначаются для того, чтобы создавать нетривиальные управляющие последовательности. Одно из самых важных свойств пакетных файлов – это возможность автоматизировать выполнение заданий, без вмешательства пользователей. Выполнены bat команды могут быть практически на любой стадии установки Windows. Вообще в пакетный файл можно поставить любую команду, а некоторые из них, например, goto и for дают возможность выполнить обработку в пакетных файлах условиях. Таким образом, команда if дает возможность управлять, как вводом, так и выводом и запускать некоторые другие bat файлы. Особое значение имеет файл autoexec.bat он предназначен для начальной настройки операционной среды при запуске. Можно сделать самостоятельно несложный пакетный файл. Для этого необходимо открыть блокнот и скопировать в него текст, приведенный ниже:title Batch File Testingecho Hello Worldecho.echo Starting Notepadstart notepadecho.echo Starting Wordpadstart Wordpadecho.pauseexitДалее нужно сохранить файл, подписав его в любым именем. Главное, назначить расширение “cmd” или “bat”. Далее необходимо запустить файл и он назначит окну имя "Batch File Testing", самостоятельно откроет WordPad и Блокнот и попросит нажать любую клавишу, после чего закроет окно.        Используются пакетные файлы программистами для выполнения различных операций, которые очень часто встречаются в повседневной работе. К самым популярным можно отнести работу с реестром, резервное копирование папок и файлов по заданному интервалу времени, их переименование, удаление, фоновую печать и много другое. Удобен автозапуск по расписанию при архивации, копировании, сканировании против вирусов и так далее. Для выполнения пакетным файлом многих системных действий нужно запускать файл с правами администратора.Некоторые примеры по использованию пакетных файлов:

Как в bat-файле создать паузу перед выполнением следующей команды?Паузу можно создать при помощи любой команды. Например, при помощи ping: ping -n 1 -w 100000 192.168.254.254 >nul -n 1 - выполнить один запрос-w 100000 - ждать ответа 100 секунд (значение указывается в миллисекундах)192.168.254.254 - IP адрес, который заведомо не существует в локальной сети, т.е. никогда не ответит на ping>nul - перенаправление всего вывода команды ping в никуда. Можно использовать утилиту sleep.exe из Ресурскита.в начало

Можно ли зациклить в bat-файле выполнение команды?Иногда необходимо создать bat-файл, который будет запускать некую команду через определённый интервал времени. Для решения этой задачи можно воспользоваться Планировщиком и часто запускать bat-файл из него, а можно создать в bat-файле цикл с паузой. Цикл организуется при помощи следующих команд: :loop... <- здесь команда для создания паузы и другие команды, которые необходимо выполнять в циклеgoto loop Паузу можно создать при помощи любой команды. Например, при помощи ping: ping -n 1 -w 100000 192.168.254.254 >nul -n 1 - выполнить один запрос-w 100000 - ждать ответа 100 секунд (значение указывается в миллисекундах)192.168.254.254 - IP адрес, который заведомо не существует в локальной сети, т.е. никогда не ответит на ping>nul - перенаправление всего вывода команды ping в никуда.в начало

Как создать папку с именем равным текущей дате?Достаточно часто необходимо создавать папку с именем равным текущей дате и затем копировать в нее, например, бэкап. Есть насколько вариантов создания такой папки: MD %SYSTEMDRIVE%\%date:~-10% Такая команда создаст в корне системного диска папку с именем равным текущей дате. Эта команда не сработает, если региональные установки отличны от русского и в разделителях даты используется слеш. В таком случае, поможет один из следующих скриптов: md %systemdrive%\%date:~0,2%_%date:~3,2%_%date:~6,4% или md %systemdrive%\%date:~6,4%_%date:~3,2%_%date:~0,2% Во втором случае, папки будут сортироваться по алфавиту. Как вариант, можно рассмотреть добавление к имени файла текущей даты: @echo offfor /F "tokens=1-4 usebackq delims=. " %%1 in (date /t) do set mydate=%%4.%%3.%%2ren test.txt test%mydate%.txt Имя файла test.txt будет переименовано в test2005.03.05.txtв начало

Как запретить повторный запуск приложения?Если приложение запускается bat-файлом, то отследить (и запретить) его повторный запуск можно таким образом: pslist.exe -e "процесс"if %errorlevel%==1 start "" "программа" pslist - бесплатная утилита, которую можно скачать здесь  .в начало

Автоматическое создание резервной копии данных.Скрипт архивирует папку файлопомойки (\\SERVER\e$\Exchange)и папку с данными юзеров (домашнюю Данные пользователей (\\SERVER\e$\Departments))Скрипт не архивирует медиафайлы, так как они занимают вагон места и их потеря у меня не критична  rem *******************rem задаём винты где лежат папки для архивирования и винт куда будем бэкапитьrem *******************SET DRIVE1ST=d:SET DRIVE2ND=e:

rem *******************rem пароль на архивrem *******************SET PASSWD=qmsdhgsdfgsdfhdsfhsdhf

rem *******************rem если копировать для надёжности куданить на сеткуrem *******************rem SET COPYTO=\\shpakk\c$\!backup

rem ********************rem *** Проверим путь назначения архиваrem ********************%DRIVE1ST%if not exist \!backup md \!backupif not exist \!backup\Departments md \!backup\Departmentsif not exist \!backup\Exchange md \!backup\Exchangeif not exist \!backup\MEDEA_rdisk md \!backup\MEDEA_rdiskcd \!backup

rem ******************************rem *** Backup \\SERVER\e$\Exchangerem ******************************SET DIRNAME=ExchangeSET FILENAME=SERVER_ExchangeSET SOURCEDIR=e:\Exchangerar a -r -m5 -dh -x*.mp3 -x*.fcd -x*.avi -x*.zip -x*.rar -x*.exe -w%DRIVE2ND%\ -p%PASSWD% %DIRNAME%\%FILENAME%_new %SOURCEDIR%\*.*if not exist %DIRNAME%\%FILENAME%_new.rar goto next2del %DIRNAME%\%FILENAME%_old.rarren %DIRNAME%\%FILENAME%.rar %FILENAME%_old.rarren %DIRNAME%\%FILENAME%_new.rar %FILENAME%.rarcopy %DIRNAME%\%FILENAME%.rar %COPYTO%\%DIRNAME%

:next2rem ***************************rem *** Backup \\SERVER\e$\Usersrem ***************************SET DIRNAME=DepartmentsSET FILENAME=SERVER_DepartmentsSET SOURCEDIR=e:\Departmentsif not exist %DIRNAME%\%FILENAME%_new.rar goto next3del %DIRNAME%\%FILENAME%_old.rarren %DIRNAME%\%FILENAME%_4.rar %FILENAME%_old.rarren %DIRNAME%\%FILENAME%_3.rar %FILENAME%_4.rarren %DIRNAME%\%FILENAME%_2.rar %FILENAME%_3.rarren %DIRNAME%\%FILENAME%_new.rar %FILENAME%_2.rar:next3rem *******************rem это если архив будет большим - кусками бить -v357888krem *******************rem rar a -r -m5 -v357888k -dh -x*.mp3 -x*.fcd -x*.avi -x*.exe -w%DRIVE2ND%\ -p%PASSWD% %DIRNAME%\%FILENAME%_new %SOURCEDIR%rem *******************rem архивирование пошло, не берём мультимедиа файлыrem *******************rar a -r -dh -x*.mp3 -x*.fcd -x*.avi -x*.exe -x*.jpg -x*.tif -p%PASSWD% %DIRNAME%\%FILENAME%_new %SOURCEDIR%goto next4

:next4rem **********************************rem *** Create repair disk on \\SERVERrem **********************************SET DIRNAME=MEDEA_rdiskSET FILENAME=MEDEA_rdiskSET SOURCEDIR=%windir%\repair%windir%\system32\rdisk.exe /s-rar a -r -m5 -dh -w%DRIVE2ND%\ -p%PASSWD% %DIRNAME%\%FILENAME%_new %SOURCEDIR%\*.*if not exist %DIRNAME%\%FILENAME%_new.rar goto next5del %DIRNAME%\%FILENAME%_old.rarren %DIRNAME%\%FILENAME%.rar %FILENAME%_old.rarren %DIRNAME%\%FILENAME%_new.rar %FILENAME%.rarcopy %DIRNAME%\%FILENAME%.rar %COPYTO%\%DIRNAME%

:next5 В итоге имеем 3 папки: Departments, в ней:SERVER_Departments_2.rar - 2х дневной давностиSERVER_Departments_3.rar - 3х дневной давностиSERVER_Departments_4.rar - 4х дневной давностиSERVER_Departments_new.rar - НОВЫЙSERVER_Departments_old.rar - СТАРЫЙ ExchangeТак как архивируем обменник - он нам сильно то и не нужен храним только сегодняшний и вчерашний архивыSERVER_Exchange.rarSERVER_Exchange_old.rar ну и систему на всякий в папкеSERVER_rdiskSERVER_rdisk.rarSERVER_rdisk_old.rarв начало

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

goto start--------------------------------------Этот пакетный файл предназначендля автоматизации рутинных операций,выполняемых ночью для синхронизациисодержимого корпоративного ftp-серверас ftp-серверами филиалов--------------------------------------Пакетный файл написан 01/01/2004Последнее исправление внесено 10/02/2004--------------------------------------И т.д.:start

Такое написание комментария при запуске пакетного файла передаст управление сразу к команде, следующей за меткой start. За это отвечает оператор перехода goto.Более простые комментарии можно добавить, начиная строки с команды rem или с двух двоеточий, идущих друг за другом.

rem Этот блок устанавливает соединение с удаленным сервером:: Этот блок проверяет дату изменения файлов

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

Как в bat файле дождаться появления определенного файла?Иногда необходимо при появлении определенного файла в папке выполнить какое-то действие. Чтобы организовать проверку появления файла в папке можно использовать следующий пакетный файл

:testif exist c:\1.txt goto gosleep 10goto test:gonotepad

Такой пакетный файл будет проверять с интервалом 10 секунд наличие в корне диска С файла 1.txt и когда файл 1.txt появится, будет выполнено действие, указанное после метки go, т.е. в этом примере будет запущен Блокнот.Утилита sleep свободно распространяется в составе Resource Kit.Если файл 1.txt большого размера и копируется откуда-то, то может получится так, что пакетный файл проверит его наличие в то время, как файл еще не скопировался или занят другим приложением. В таком случае, попытка выполнить какие-то действия с файлом 1.txt приведет к ошибке. Чтобы этого не произошло пакетный файл можно модифицировать следующим образом

:testif exist c:\1.txt goto gosleep 10goto test:gorename c:\1.txt 1.txtif not %errorlevel% == 0 goto godel c:\1.txt

Когда файл 1.txt скопировался на диск С не полностью, либо занят другим приложением, попытка его переименовать вызовет ошибку и цикл будет повторяться до тех пор, пока файл не скопируется полностью либо не будет освобожден. После того, как команда rename c:\1.txt 1.txt будет выполнена без ошибки (т.е. файл свободен), то с ним можно выполнять любые действия. В последнем примере это его удаление.в начало

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

set tempdate=%date:~-10%date 01-01-04notepad.exedate %tempdate%

В данном примере текущая системная дата сначала сохраняется в переменной, затем (во второй строке) системная дата устанавливается на 1-е января 2004 года, а потом вызывается программа, которая проверяет системную дату. В данном примере это Блокнот. До тех пор, пока открыт Блокнот, пакетный файл находится в ожидании, не завершаясь и не переводя системную дату обратно. Как только Блокнот будет закрыт, пакетный файл продолжит свое выполнение и установит системную дату на сохраненное в переменной tempdate значение, т.е. на то, которое было до запуска пакетного файла.Не забывайте, что если путь до файла, которым запускается программа, содержит пробелы, то его (путь) необходимо заключить в кавычки. Если путь содержит кириллицу, то при написании пакетного файла необходимо использовать текстовый редактор, поддерживающий кодировку DOS (например, FAR). В противном случае, при запуске пакетного файла будет выведено сообщение о том, что "указанный файл не является внутренней или внешней коммандой...".Если программа проверяет текущую системную дату только при своем запуске и во время работы больше этого не делает, то пакетный файл можно модифицировать, добавив перед именем исполняемого файла программы оператор start, т.е. наш пример будет выглядеть так:

set tempdate=%date:~-10%date 01-01-04start notepad.exedate %tempdate%

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

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

regedit.exe -s C:\environment.reg

Эта команда импортирует в реестр данные из файла environment.reg без запросов на подтверждение за счет использования ключа -s.в начало

Как из пакетного файла сделать экспорт реестра?Иногда возникает необходимость сохранить в файл определенный куст (ветку) реестра со всеми параметрами в качестве бэкапа или для других целей. Сделать это из пакетного файла можно при помощи такой команды:

regedit.exe -ea C:\environment.reg "HKEY_CURRENT_USER\Environment"

Данная команда при выполнении пакетного файла выгрузит ветку HKEY_CURRENT_USER\Environment в файл C:\environment.reg Когда потребуется восстановить значения параметров в HKEY_CURRENT_USER\Environment, будет достаточно запустить файл environment.reg. Эту команду можно использовать для ежедневного бэкапа настроек программного обеспечения и системы, которые хранятся в реестре.Не забывайте, что если в пути, по которому должен быть сохранен выходной файл или в имени ветки реестра есть пробел, то их необходимо заключить в кавычки.в начало

Как использовать в пакетном файле символ процент?Чтобы использовать символ процент (%) в пакетном файле его надо написать дважды. Например

echo 50%%

Эта команда в bat-файле выведет на экран 50%. Если же использовать команду echo 50%, то на экран будет выведено только число 50.Учитывайте эту особенность при использовании символа % в написании пакетных файлов.в начало

Как переименовать файлы по маске из пакетного файла?Иногда возникает необходимость переименовать все файлы в папке по шаблону из пакетного файла. Сделать это можно при помощи следующей команды в bat-файле:

for /f "tokens=*" %%a in ('dir /b PATH\*.*') do ren PATH\%%a Prefix%%a

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

Второй вариант (спасибо Кирилл-у):

set thePATH=C:\testfor %%I in (*.txt) do ren "%thePATH%\%%~nxI" "%%~nI.dat"в начало

Как узнать имя компьютера из bat файла?Чтобы узнать имя компьютера при выполнении bat файла (чтобы использовать это значение в дальнейшем) используйте команду

hostname

Эта команда возвращает имя компьютера, на котором она запущена.в начало

Как изменить IP адрес компьютера из пакетного файла?IP адрес можно изменить при помощи команды netsh.Чтобы правильно сменить IP адрес, сначала надо выяснить текущую конфигурацию. Сделать это можно в командной строке при помощи команды

netsh interface ip show address

Результат работы этой команды - отображение текущей конфигурации сетевого интерфейса. Нас интересует название интерфейса. Предположим, что он называется FASTNET.Предположим, что нужно сменить IP адрес на 192.168.1.42, адресация в сети статическая, без использования DHCP, шлюз 192.168.1.1, маска 255.255.255.0 В этом случае, команда, которая должна быть выполнена из пакетного файла будет выглядеть следующим образом:netsh interface ip set address name="FASTNET" static 192.168.1.42 255.255.255.0 192.169.1.1 1

После выполнения этой команды у интерфейса FASTNET IP адрес сменится на 192.168.1.42.Команда netsh предоставляет широкие возможности по управлению сетевыми настройками из командной строки. Для ознакомления с другими ее функциональными возможностями пользуйтесь справкой при помощи netsh /?в начало

Как автоматизировать удаление файлов по типу?Чтобы очистить диск от временных файлов можно использовать команду

del /f /s /q C:\*.tmp

Где/f - удаляет все файлы, даже если у них установлен атрибут только чтение/s - удаляет файлы из всех подкаталогов/q - отключает запрос на подтверждение удаления файлаC: - диск, на котором будут найдены и удалены файлы. Можно указать не весь диск, а папку, например, C:\WinNT*.tmp - тип файлов, которые будут удаленыБудьте аккуратны с ключем /q и типами удаляемых файлов. Команда удаляет, не спрашивая разрешения и при указании неправильного типа файлов может удалить лишнего.в начало

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

net send name Message text

Где name имя машины или пользователя, которому адресуется сообщение, а Message text - текст сообщения. После выполнения этой команды пользователю name будет отправлено сообщение.Обратите внимание на то, что при использовании в тексте сообщения кириллицы текст должен быть набран в кодировке MS-DOS (866 кодовая страница). Иначе сообщение придет в виде нечитаемых символов. Набрать текст в кодировке DOS можно при помощи любого текстового редактора, поддерживающего эту кодировку. Это может быть, например, FAR. Откройте в FAR пакетный файл на редактирование (F4) и нажмите кнопку F8. В верхней строке редактора должна быть указана кодировка DOS, а снизу, у подсказки о быстрых клавишах, у клавиши F8 должна быть надпись Win, говорящая о том, что текущая кодировка DOS и для переключения в кодировку Win надо нажать F8.в начало

Как из одного bat-файла запустить другой?Иногда, при выполнении пакетного файла, возникает необходимость запустить другой пакетный файл. Причем, в некоторых случаях, выполнение основного пакетного файла должно быть приостановлено, пока выполняется вспомогательный файл, а в других вспомогательный файл должен работать параллельно с основным.Для примера создадим два bat файла. Один с именем 1.bat и содержащий всего одну команду

call 2.bat

Второй с именем 2.bat и также содержащий одну команду

pause

Теперь запустим файл 1.bat Откроется окно, в котором будет предложено нажать любую клавишу для продолжения, после нажатия которой окно закроется. Таким образом, вызов из одного пакетного файла другого при помощи команды call останавливает исполнение пакетного файла до тех пор, пока не завершится выполнение пакетного файла, вызванного командой call.В другом случае, надо запустить из bat файла либо приложение, либо другой пакетный файл, не прерывая выполнения основного пакетного файла. Такое нередко бывает нужно сделать, например, принудительно открыв лог работы пакетного файла, запланированного на ночь, чтобы с утра, пользователь мог проконтролировать правильность его выполнения. Для этого используется команда start Исправим в файле 1.bat строку на

start 2.bat

и запустим файл 1.bat Теперь открылось окно, в котором для продолжения надо нажать любую кнопку, а окно основного пакетного файла (1.bat) отработав закрылось.Таким образом, для вызова из одного пакетного файла другого, без остановки работы первого пакетного файла, нужно применять команду start.Рассмотренные команды start и call могут использоваться не только для запуска других пакетных файлов, но и для запуска любых приложений или открытия файлов.Например, команда start log.txt, находящаяся в теле пакетного файла, откроет файл log.txt в Notepad без остановки работы пакетного файла.в начало

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

echo Testing

Эта команда выведет на экран команду echo Testing, а на следующую строку - результат ее работы, слово Testing.

@echo Testing

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

@echo off

Эта команда отключит вывод команд на экран на протяжении выполнения всего пакетного файла. Чтобы сама команда не выводилась, она начинается с символа @.в начало

Как автоматически ответить на запрос о подтверждении?Некоторые команды при выполнении требуют подтверждения потенциально опасного действия. Например, такие команды как format или del предварительно запросят подтверждения на дальнейшее выполнение. Если одна из этих команд выполняется в пакетном файле, то запрос на подтверждение остановит выполнение пакетного файла и он будет ожидать от пользователя выбора одного из предложенных вариантов. Причем, если результат выполнение пакетного файла перенаправлен в лог-файл, то пользователь не увидит запроса на подтверждение и batch файл будет выглядеть зависшим.Для исправления таких неприятностей можно перенаправить нужный ответ в команду. Т.е. выполнить обратное действие для перенаправления вывода результатов работы команды в файл.Посмотрим на примере как выглядит запрос на подтверждение потенциально опасного действия. Создадим на диске С, например, папку Folder. Создадим в ней или скопируем в нее два любых файла. Далее, откроем командную строку и выполним следующую команду:

del C:\Folder

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

C:\Folder\*, Продолжить [Y(да)/N(нет)]?

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

|

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

echo Y|del C:\Folder

На экране будет показан запрос на подтверждение удаления всех файлов в папке Folder, но уже с положительным ответом (Y). Все файлы из папки Folder будут удалены.Будьте осторожны с этой командой.в начало

Как перенаправить результат выполнения команд в файл?Часто, при выполнении сложного bat файла в автоматическом режиме проверить результаты его работы бывает затруднительно по многим причинам. Поэтому проще записывать результаты работы команд batch файла в текстовый файл (лог-файл). а потом анализировать правильность работы bat файла по этому логу.Перенаправить результат работы команд bat файла в лог-файл достаточно просто. Далее будет показано, как это можно сделать.Создайте bat-файл следующего содержания (скопируйте эти строки в Блокнот и сохраните файл с расширением bat):

@echo offecho Start %time%echo Create test.txtecho test>C:\test.txtecho Copy Test.txt to Old_test.txtcopy C:\test.txt C:\Old_test.txtecho Stop %time%

Первая строка отключает вывод самих команд. Таким образом, в лог-файл будут записаны только результаты их выполнения.Вторая строка записывает в лог-файл время начала работы пакетного файла.Третья строка записывает в лог-файл пояснение того, что следующая команда создаст файл test.txtКоманда из четвертой строки создает файл test.txt с корне диска С. Файл создается для примера. Эта команда записывает в файл C:\test.txt слово testПятая строка выводит в лог-файл пояснение, что следующая команда выполняет копирование файла из одного места в другое.Команда в шестой строке копирует созданный файл C:\test.txt в файл C:\Old_test.txt, т.е. создается копия файла под новым именем.Последняя, седьмая строка содержит команду вывода времени завершения работы пакетного файла. В сумме с записью в лог-файл времени начала работы пакетного файла эти два значения времени дают возможность оценить время работы пакетного файла.

Сохраните этот пакетный файл под именем, например, 1.batПредположим, что отчет о работе пакетного файла мы бы хотели хранить в отдельной папке и каждый день записывать отчет с новым именем файла, чтобы была возможность в любой из дней обратиться к логам за предыдущие дни. Причем, имя лог-фала хотелось бы иметь в виде даты работы пакетного файла. Чтобы все это реализовать создадим на диске С (например) папку с именем LOG, т.е. полный путь к ней будет выглядеть C:\LOG. Созданный пакетный файл 1.bat будем запускать следующей командой:

1.bat>C:\LOG\%date~-10%.txt

Если пакетный файл будет запускаться из Планировщика, то нужно указать полный путь с bat-файлу. Помните, что если в пути есть пробелы, то надо использовать либо кавычки, либо формат 8.3. Т.е., если путь к bat-файлу C:\Program Files\1.bat, например, то в командной строке Планировщика для запуска bat-файла нужно указать одну из следующих строк:

"C:\Program Files\1.bat">C:\LOG\%date~-10%.txtC:\Progra~1\1.bat>C:\LOG\%date~-10%.txt

После запуска файла 1.bat в папке C:\LOG будет создан файл с именем, равным дате запуска bat-файла, например, 13.01.2004.txt Это и будет отчет о работе пакетного файла 1.batЗапуск bat-файла, пример которого показан в первом листинге вверху страницы, указанной выше командой, приведет к созданию лог-файла такого содержания:

Start 19:03:27,20Create test.txtCopy Test.txt to Old_test.txtСкопировано файлов: 1.Stop 19:03:27,21

Таким образом, для выполнения перенаправления результатов работы bat-файла в лог-файл нужно использовать символ перенаправления > Синтаксис таков:

Путь\ИмяФайла.bat>Путь\ИмяЛогФайла.txt

Расширение лог-файла может быть любым. При желании, отчет о выполнении пакетного задания можно оформить даже в виде страницы html (соответствующие теги могут быть выведены в лог-файл так, как выводились комментарии в примере 1.bat) и скопировать его на корпоративный сервер.в начало

Как создать папку из bat файла?Для создания папки используется команда MKDIR или ее сокращенный аналог MD. Для создания папки из bat файла нужно использовать следующую команду:

MD FolderName

После выполнения такой команды будет создана папка FolderName в папке, откуда запущен bat файл. Чтобы создать файл в отличном от запуска bat файла месте, например в корне диска D, используйте явное указание расположения новой папки. Команда будет выглядеть так:

MD D:\FolderName

При создании папок можно пользоваться системными переменными. Например, можно создать в корне диска D папку с именем текущего пользователя. Для этого понадобится переменная %USERNAME%, а команда будет выглядеть следующим образом:

MD D:\%USERNAME%

Можно еще более усложнить команду и создать папку с именем текущего пользователя на системном диске его компьютера. Команда для этого будет выглядеть так:

MD %SYSTEMDRIVE%\%USERNAME%

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

set datetemp=%date:~-10%MD %SYSTEMDRIVE%\%datetemp%

Эта конструкция работает следующим образом.Первая команда создает в памяти переменную datetemp, которая будет уничтожена по окончании работы bat файла. То тех пор, пока bat файл не закончил свою работу есть возможность оперировать со значением этой переменной. Переменной datetemp присваивается 10 символов справа налево от системной переменной DATE, т.е. от текущей даты. Переменная DATE имеет формат Дн ДД.ММ.ГГГГ. Первые символы слева - имя дня недели и поэтому мы их отбрасываем и присваиваем временной переменной datetemp только текущую дату.Этим не ограничивается список возможностей при создании папок. Вы можете опрерировать переменными так, как удобно Вам, создавая папки с уникальными, легко читаемыми названиями. Получить список всех переменных можно при помощи команды SET.в начало

Как создать файл с произвольным именем из bat файла?Для создания файла в процессе выполнения пакетного файла используется символ перенаправления. Он выглядит так:

>

Т.е. чтобы создать файл нужно перенаправить поток с экрана в файл. Сделать это можно при помощи следующей команды:

@echo Start file>C:\1.txt

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

set datetemp=%date:~-10%@echo .>%SYSTEMDRIVE%\%DATETEMP%.txt

Эти две строки работают следующим образом. Сначала в памяти создаем переменную datetemp, которой присваиваем 10 символов справа налево от системной переменной DATE. Таким образом, теперь во временной переменной datetemp содержится только текущая дата. Следующией строкой перенаправляем вывод символа точка в файл, имя которого берем из переменной datetemp, а расширение txt указываем явно. Файл будет создан на системном диске компьютера, где выполняется bat файл.При сборе администратором информации о компьютерах в сети будет удобнее добавить к имени файла имя компьютера. Это легко можно сделать при помощи следующей команды:

@echo .>C:\FolderName\%COMPUTERNAME%.txt

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

Как автоматизировать запуск bat файлов?Очень часто необходимо автоматизировать запуск bat файлов для выполнения ими рутинных операций. Для запуска bat файлов по расписанию наиболее подходит Планировщик, входящий в стандартную поставку Windows. С это помощью можно очень гибко настроить запуск пакетного файла в определенные дни или часы, с определенным интервалом. Можно создать несколько расписаний и т.д.Для локального запуска batch файлов можно пользоваться решениями от третьих фирм, благо платных и бесплатных альтернатив стандартному Планировщику великое множество.Batch файлы так же могут использоваться как логин-скрипты в доменах. При таком их использовании они будут исполняться при каждом входе пользователя в сеть не смотря на его желание. С их помощью можно автоматизировать сбор информации о машинах или о программном обеспечении, установленном на компьютерах пользователей, принудительно менять настройки Windows, устанавливать незаметно для пользователя программное обеспечение и автоматизировать решение других задач, ручное исполнение которых заняло бы очень много времени.в начало

Команды, используемые в bat файлах.Список команд, которые можно использовать в bat файлах, можно просмотреть, введя в командной строке (Пуск - Выполнить - cmd для Windows семейтва NT или Пуск - Выполнить - command для линейки 9х) команду

help

Результат работы help - список доступных команд с краткими пояснениями к ним. Чтобы получить более подробную информацию по интересующей команде введите в командной строке help имя_команды. Например, чтобы получить подробную справку по ключам команды AT выполните следующую команду:

help AT

В результате, на экран будет выведен список ключей для запуска команды AT из bat файла.Если bat файл исполняется под управлением Windows (не в чистом DOS-е), то из него можно запускать любые приложения или открывать файлы. Например, нужно автоматически открыть лог-файл работы bat файла по завершении его работы. Для этого достаточно включить в bat файл последней строкой следующую команду:

start имя_файла.txt

Результатом выполнения этой команды станет открытие файла имя_файла.txt, а сам bat файл завершит свою работу. Такой способ хорош, если лог-файл небольшого размера, иначе Блокнот откажется его открывать, предложив использовать WordPad. Но эта проблема так же решаема, что и будет показано в дальнейших примерах.в начало

Как создать batch файл?Откройте блокнот и наберите две следующих строки:

@echo This batch file@pause

Выберите Файл - Сохранить как, выберите Тип файла - Все файлы, в поле Имя файла введите 1.bat и сохраните его в корне диска С, например. Теперь откройте диск С и запустите файл 1.bat. На экран будет выведено две строки.

This batch fileНажмите любую клавишу для продолжения...

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

rikonw.ru

Синтаксис BAT-файлов - 3 Декабря 2012

Синтаксис BAT-файлов и командная строка в

BAT-файлы (файлы с расширением .bat, от английского batch - "пакетные") - это обычные текстовые файлы с набором инструкций командному процессору command.com для автоматического выполнения всех содержащихся в таком файле команд. С помощью пакетных файлов возможно создание довольно мощных средств для облегчения выполнения трудоемких операций, например, копирования, создания больших архивов, проверки каких-либо внешних условий и условная обработка данных. Особенно широкий простор здесь открывается для тех, кто знает хотя бы один язык программирования - используя и свои программы, можно создавать прямо-таки гигантские программные комплексы. При описании команд использовались принятые в DOS обозначения:

  • <параметр> - обязательный параметр.
  • [параметр] - необязательный параметер.
  • | - оператор "или".

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

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

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

  • > - Переназначает вывод.
  • < - Переназначает ввод.
  • >> - Добавляет переназначенный вывод к существующим данным.
  • | - Конвейер – вывод первой команды непосредственно на ввод другой.

Приведем пример. КомандаDIR>abc.txtвыведет результаты не на экран, а в файл abc.txt, предварительно создав или перезаписав его. В дальнейшем можно использовать его для более удобной обработки полученной информации (например, если список слишком большой).DIR>>abc.txtданная команда также запишет результат не на экран, а в файл abc.txt, но она не удалит его содержимое, а добавляет результат в конец файла. Если файл не существует, он будет создан.DIR | MOREЭто пример использования результатов выполнения команды (piping) DIR фильтром MORE, который делает паузу после каждого экрана листинга. Еще один полезный пример:ECHO Y | DEL *.*Сама команда DEL *.* должна удалить все файлы в каталоге. Однако, она предусмотрительно запрашивает подтверждение на подобное действие. Для того, чтобы автоматически (например, из пакетного файла) удалять все файлы, мы используем передачу результатов выполнения команды ECHO Y, которая должна вывести символ Y, в команду DEL *.*, которой требуется один символ: Y или N. Похожее действие выполнит командаprogram.exe <file.inпередаст программе program.exe данные из файла file.in таким образом, как будто они были введены с клавиатуры. Однако, нужно быть осторожным с таким способом передачи, так как программа может в какой-нибудь момент времени запросить совсем другой ввод. Также перенаправить вывод можно и в порт, например, в COM1, COM2, LPT и т.д.Для перенаправления самой консоли используется файл ввода-вывода con. Например, чтобы набрать какой-нибудь текстовый файл, наберите:copy con file.txtи далее построчно набирайте текст файла. В конце нажмите . Файл готов. А если набратьcopy file.txt conна экран выведется содержимое нашего файла.Для уничтожения вывода программы используется файл ввода-вывода NULL (аналогично устройству /dev/null в Unix).

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

REM [текст]Команда REM служит для ввода комментариев. Любой текст, расположенный в строке после нее, будет считаться комментарием и не выполняется. Это бывает полезно при отладке программы или временном "выключении" некоторых строк файла. REM Эта строка не будет выполняться командным процессором.

ECHO [ON | OFF | Текст]Команда ECHO используется для управления эхо-режимом, то есть режимом отображения на экране служебной информации. ECHO OFF запрещает этот вывод, а ECHO ON - разрешает. ECHO <Текст> используется для вывода текста на устройство (на экран, COM или LPT-порты). То есть, командаECHO Привет!выведет на экран "Привет!". А командаECHO ATDP 21435 > COM2пошлет на устройство на порте COM2 (например, на модем) команду ATDP 21435, то есть, набор номера 21435.

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

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

%<цифра 0-9>Как и в любом языке, в языке пакетных файлов возможно использование переменных. Всего может быть 10 одновременно существующих независимых переменных. Для написания сложных программ это довольно мало, хотя для обычной работы часто хватает и 3-4. Значение переменной равно значению соответствующего параметра из командной строки. Переменная %0 будет содержать имя .bat-файла и, если вы указали, путь к нему. То есть, если вы запустили файл abc.bat со следующими параметрами:abc.bat a bc defто переменная %0 будет содержать значение abc.bat, %1 будет содержать значение a, %2 будет содержать bc, а %3 - def. Это свойство широко используется для создания универсальных пакетных файлов при работе с повторяющимися операциями.

SHIFTКоманда SHIFT позволяет использовать число параметров командной строки далее 10. Однако, при этом теряются соответственно более ранние параметры. Иными словами, команда SHIFT сдвигает все значения переменных на один влево. То есть, переменная %0 будет содержать значение, содержавшееся до этого в переменной %1, а переменная %1 - значение переменной %2 до сдвига. Однако, данная операция является необратимой, то есть, невозможно сдвинуть переменные обратно.

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

IF <условие> <следствие>Оператор IF проверяет истинность какого-либо <условия> и в зависимости от этого выполняет или не выполняет команду <следствие>. Возможны следующие условные конструкции:IF EXIST ABC.BAT GOTO workесли существует файл ABC.BAT, то перейти на метку work.IF NOT EXIST ABC.BAT GOTO exitесли не существует файл ABC.BAT, то перейти на метку exit.IF %1==ASDF GOTO asdflabelесли переменная %1 равна ASDF, то - переход на метку asdflabel.IF ERRORLEVEL 1 GOTO err1если ошибка (возвращаемое значение) выполнения предыдущей команды равно 1, то перейти на метку err1.

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

FOR %<параметр> IN () DO <команда>С помощью оператора FOR возможно выполнение одной и той же команды несколько раз для различных параметров. Рассмотрим следующий пример для большей ясности:FOR %%P IN (file1 file2 file3) DO DEL %%PЗнак процента используется в операторе FOR удвоенным для обозначения пустой переменной в пакетном файле. Если оператор FOR используется из командной строки, знак процента должен быть одинарным.В результате выполнения будут удалены файлы file1, file2 и file3. Можно записать и с использованием маски файлов:FOR %%P IN (file?) DO DEL %%PВ результате будут удалены все файлы, подпадающие под данную маску. Если в последовательности VAR нет символов маски файла, эта последовательность может обозначать любые текстовые строки. Иначе - это должны быть имена файлов на диске. В строке цикла FOR нельзя использовать переадресацию и перенаправление потоков.

SET <Имяпеременной>=<Значениепеременной>Оператор SET представляет собой расширение возможностей работы с параметрами в операционной системе. Он задает переменную, значение которой подставляется вместо ее имени при любом использовании этого имени между знаками процента. Так, если задано (переменная, которую требуют многие игры, использующие звуковую карту компьютера): SET BLASTER=A220 I5 D1 P330то при использовании в пакетном файле следующей конструкции:ECHO %BLASTER%на экран будет выведено "A220 I5 D1 P330". Переменные, определенные с помощью оператора SET называются переменными окружения среды (environment) и являются видимыми после выполнения до перезапуска DOS (если не изменять ее вручную в памяти). То есть, ее можно использовать из одного пакетного файла или программы после задания в другом. Наиболее известной является переменная PATH, представляющая собой набор путей для быстрого поиска файлов. Она задается в файле autoexec.bat.

PROMPT [текст][спецификатор]Команда PROMPT хоть и не является командой пакетного файла, так как является командой операционной системы в целом, однако, заслуживает упоминания, ибо почти всегда присутствует в файле autoexec.bat.Данная команда управляет видом приглашения командной строки. Обычно оно выглядит примерно следующим образом:C:\DOS>Этому соответствует спецификатор команды PROMPT, равный $P$G То есть, Диск:\Путь>. Это задается использованием знака доллара "$" и символа, означающего определенную последовательность.Предусмотрены следующие варианты:

  • $ - символ "знак доллара".
  • _ - перевод строки.
  • B - символ "|".
  • D - текущая дата.
  • E - символ #27 (Esc).
  • G - символ "больше".
  • H - "backspace"-символ.
  • L - символ "меньше".
  • N - текущий диск.
  • P - текущий каталог на текущем диске.
  • Q - символ "равно".
  • T - текущее время.
  • V - номер версии DOS.

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

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

Вы можете перенаправлять потоки, используя фильтры. Фильтры пропускают только часть получаемой информации, соответствующей запросу. В DOS самые используемые фильтры - это FIND, MORE и SORT.

FIND [/V] [/C] [/N] [/I] "строка" [[диск:][путь]имя_файла[ ...]]Поиск текстовой строки в одном или нескольких файлах.Параметры:

  • /V - Вывод всех строк, НЕ содержащих заданную строку.
  • /C - Вывод только общего числа строк, содержащих заданную строку.
  • /N - Снабжение отображаемых строк номерами.
  • /I - Поиск без учета регистра символов.
  • "строка" - Искомая текстовая строка.
  • [диск:][путь]имя_файла - Файл либо файлы, в которых производится поиск.

Если путь не задан, FIND производит поиск в тексте, введенном с клавиатуры, либо переданном по конвейеру другой командой. Пример: DIR A: | FIND /V "компьютер"Выведет имена всех файлов, не содержащих слово "компьютер".Вы можете использовать параметр /V вместе с /C ИЛИ /N, но /N не будет работать с /C.

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

  • [диск:][путь]имя_файла - Задает файлы, отображаемые по фрагментам.
  • имя_команды - Команда, вывод которой отображается на экране.

Пример: DIR | MOREВыведет список файлов постранично.Для выхода из режима просмотра используйте сочетание клавиш , а для просмотра - любую клавишу.

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

  • /R - Изменение порядка сортировки на обратный, от Z к A и затем от 9 до 0.
  • /+n - Сортировка файла по символам в столбце n.
  • [диск1:][путь1]имя_файла1 - Сортируемые файлы/
  • [диск2:][путь2]имя_файла2 - Файл, в который направляется сортированный ввод.
  • команда - Команда, вывод которой следует отсортировать.

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

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

Любая программа при завершении своей работы возвращает операционной системе код своего завершения. Принято при успешном завершении возвращать ноль, иначе - код ошибки. Иногда, или, вернее, часто, программа "сознательно" возвращает ненулевое значение для того, чтобы в пакетном файле можно было "узнать" некоторые подробности ее работы. Например, программа возвращает код нажатой клавиши, а .bat-файл по нему выполняет различные действия. Каким же образом пакетный файл может узнать код завершения выполненной программы? Для этого предусмотрено ключевая переменная ERRORLEVEL.Пример пакетного файла с errorlevel'ами:@ECHO OFFREM Запускаем программу prg1.exePRG1.EXEREM Анализ кода завершенияIF ERRORLEVEL 2 GOTO FILENOTFOUNDIF ERRORLEVEL 1 GOTO WRITEERRORIF ERRORLEVEL 0 GOTO EXITOKGOTO ONEXIT:FILENOTFOUNDECHO Ошибка! Файл не найден!GOTO ONEXIT:WRITEERRORECHO Ошибка записи!GOTO ONEXIT:EXITOKECHO Программа завершена благополучно.GOTO ONEXIT:ONEXITОбратите внимание - анализ кода завершения начинается не с нуля, а с максимально возможного значения. Дело в том, что подобная проверка означает: "если errorlevel больше или равен значению, то...". То есть, если мы будем проверять, начиная с нуля, любое значение будет истинным на первой же строке, что неверно. Это самая распространенная ошибка в подобного рода программах.

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

append(.exe) - Указание порядка поиска файлов данных в каталогах и вывод на экран установленных путей поиска.assign(.com) - Переназначение диска.attrib(.exe) - Изменение или вывод состояния флагов атрибутов файла.backup(.com/.exe[5.0]) - Создание резервных копий.break - Управление прерыванием программы.chcp - Смена кодовой страницы.cd (chdir) - Смена текущего каталога.chkdsk(.com/.exe[5.0]) - Проверка диска и вывод информации о его состоянии.cls - Очистка экрана.command(.com) - Активизация второго командного процессора.comp(.com/.exe[5.0]) - Сравнение содержимого двух файлов или комплектов файлов.copy - Копирование файлов в другой каталог.ctty - Смена консоли.date - Изменение или отображение текущей даты.del - Удаление файлов.dir - Вывод на экран листинга каталога.diskcomp(.com) - Сравнение содержимого двух дискет.diskcopy(.com) - Копирование содержимого с одной дискеты на другую.diskcomp - Сравнение содержимого двух дискет.doskey(.com) - Расширение возможностей командной строки.erase - Удаление файлов.exe2bin(.com/.exe[5.0]) - Преобразование файлов .exe в файлы .bin или .com.exit - Выход из вторичного командного процессора.expand [5.0] - Развёртывание файлов DOS в процессе установки системы.fastopen(.exe) - Ускоренное открытие файлов.fc [4.0,5.0] - Сравнение содержимого двух файлов или комплектов файлов.fdisk(.com[3.0]/.exe) - Разбиение жесткого диска на разделы.find(.exe) - Поиск заданной символьной фразы.format(.com) - Форматирование диска.graftabl(.com) - Загрузка в память таблицы дополнительного набора символов для вывода на экран через цветной графический адаптер.graphics(.com) - Обеспечение вывода на принтер содержимого экрана в графическом режиме.join(.exe) - Объединение каталогов.keyb(.com) - Изменение символов и назначения клавиш клавиатуры.label(.com/.exe[5.0] - Создание, замена и удаление метки тома.loadhigh / lh [5.0] - Загрузка расширений DOS в блоки старшей памяти.mem(.exe [4.0,5.0]) - Вывод информации о распределении памяти между программами.mirror(.com[5.0]) - Сохранение информации об удалённыхфайлах и разделах диска.mkdir / md - Создание каталога.mode(.com) - Изменение режимов работы периферийных устройств.more(.com) - Вывод информации поэкранно.nlsfunc(.exe) - Поддержка национальных форматов.path - Вывод или установка путей поиска исполнимых файлов.print(.com/.exe[5.0]) - Печать текста в фоновом режиме.promt - Изменение приглашения командной строки.recover(.com/.exe[5.0]) - Восстановление восстановимой информации с повреждённого диска.ren (rename) - Переименование файлов или каталогов.replace(.exe) - Замена одних файлов другими.restore(.com/.exe[5.0]) - Восстановление файлов с резервных копий.rd (rmdir) - Удаление каталогов.select(.com) [3.x] - Выбор национальных форматов.select(.com) [4.0] - Установка DOS.set - Вывод, изменение и удаление переменных окружения.setver(.exe[5.0]) - Объявление версии операционной системы.share(.exe) - Проверка разделяемых файлов.sort(.exe) - Сортирует входной поток данных.subst(.exe) - Подстановка виртуального диска.sys(.com) - Копирование файлов DOS.time - Изменение текущего системного времени.tree(.com) - Наглядно отображает структуру директории или диска.type - Вывод содержимого текстового файла.undelete(.exe [5.0]) - Восстановление удалённых файлов.unformat(.com [5.0]) - Расформатирование случайно отформатированного диска.ver - Вывод версии DOS.verify - Проверка правильности записи файлов на диск.vol - Выводит метку тома и серийный номер диска.xcopy(.exe) - Копирование файлов и дерева каталогов.

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

help - Список команд с кратким описанием.help имя_команды - Описание и синтаксис команды.команда /? - Описание и синтаксис команды.

nod32.moy.su

Пакетные файлы

Главная / Ассемблер / Для чайников / Быстрый старт / MASM, TASM и WASM /

ПРИМЕЧАНИЕ Рисунки на этой странице не отображаются, но вы можете найти их в книге.

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

Существенно упростить эту процедуру можно с помощью старых добрых BAT-файлов (их ещё называют пакетные файлы). BAT-файл (или пакетный файл) – это обычный текстовый файл с расширением BAT, в котором записываются команды для выполнения операционной системой. Точно также, как вы это делаете в командной строке. Только в BAT-файле можно записать сразу несколько команд, и все эти команды затем можно выполнить щелчком мыши. Для любопытных рекомендую ознакомиться с контрольной работой по BAT-файлам, где приведены примеры создания относительно сложных файлов. Набравшись немного опыта, вы можете создать универсальный BAT-файл, который позволит вам быстро ассемблировать и компоновать ваши исходные тексты на языке ассемблера. Отсюда следует, что создание BAT-файла сводится к созданию обычного текстового файла.

Но здесь мы создадим простейший BAT-файл, с помощью которого «лёгким движением руки» мы выполним ассемблирование и компоновку, и создадим исполняемый файл типа COM с помощью ассемблера MASM. Итак, откроем наш любимый текстовый редактор (у меня это PSPad, вы можете воспользоваться блокнотом). Создадим новый файл и напишем там следующий текст: C:\MASM611\BIN\ml /c atest.asm PAUSE C:\MASM611\BINR\link /TINY atest.obj,,NUL,,, PAUSE Здесь команда PAUSE приостанавливает выполнение команд BAT-файла и выводит сообщение «Для продолжения нажмите ENTER…». Само собой, что команды продолжат выполняться после нажатия на ENTER.

Сохраним этот файл с расширением BAT в том же каталоге, где у нас находится исходный файл atest.asm. Назовём его, например, com_create.bat. В результате папка с исходными файлами в проводнике будет выглядеть примерно так, как показано на рис. 1.10.

Если в вашем случае в графе «Тип» написано не «Пакетный файл MS-DOS», а что-то другое (например, текстовый файл), то это значит, что вы плохо представляете себе, что такое расширение файла. В этом случае настоятельно рекомендую ознакомиться с книгой Компьютер для чайников.

Теперь выполним этот BAT-файл обычным для Windows способом, то есть дважды щёлкнем по нему левой кнопкой мыши. Что же произойдёт? Операционная система начнёт поочерёдно выполнять команды, записанные в пакетном файле. Сначала выполнится ассемблирование (создание объектного файла). Затем выполнится команда PAUSE. Эта команда здесь для того, чтобы вы могли посмотреть результат ассемблирования. После нажатия клавиши ENTER выполнится компоновка (создание исполняемого файла типа COM, то есть создание готовой программы). Затем снова будет пауза, чтобы вы могли увидеть результат. На экране это будет выглядеть примерно так, как показано на рис. 1.11.

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

Assembling: attest.asm Затем выполняется команда PAUSE: ПутьКВАТФайлу>PAUSE После нажатия ENTER выполняется компоновка: LINK: warning L4045: name of output file is ‘atest.com’ Здесь нам сообщают, что компоновщик создал выходной файл attest.com. В чем мы и можем убедиться, заглянув снова в наш каталог с исходными файлами.

Как видите, ассемблирование и компоновка исходных кодов на ассемблере становится не таким уж сложным делом, если подойти к этому творчески. Созданный нами BAT-файл вы можете скопировать в другую папку с другими исходными кодами. Вам останется только заменить имя исходного файла (в тексте выше выделено красным) и файл будет готов к работе с другими исходными кодами.

В Интернете часто можно увидеть такие запросы, как программа для создания bat-файлов или редактор bat-файлов. Теперь, надеюсь, всем понятно, что создание BAT-файла выполняется с помощью обычного текстового редактора (и редактирование, разумеется, тоже). Однако удобнее для этих целей использовать специальные текстовые редакторы, такие как PSPad, где имеются такие полезные вещи, как подсветка синтаксиса (то есть ключевые слова, такие как PAUSE, будут выделяться другим цветом и шрифтом, что очень удобно).

av-assembler.ru

Описание комманд. - CMD \ BAT \ batch файлы - Статьй

echo off - запрещение вывода на экран исполняемых команд (on - вкл.)

deltree /y %файл% - удалить файл (/y означает "удалить без вопросов").

copy %путь\файл% %куда\файл% - копировать файло

mkdir %название_диры% - создать директорию

echo %текст% - вывести текст на экран

echo %текст% > %путь\файл% - создать файл и вписать в него текст

echo %текст% >> %путь\файл% - добавить текст в уже существующий файл

if exist %путь\файл% %команда% - если существует файл, выполнить команду

attrib %атрибут% %путь\файл% - поставить\убрать атрибуты файлу (+-h скрытый, +-s системный, +-r только чтение)

start %путь\файл% - запустить файло

cls - отчистить экран

pause - выводит сообщение "Нажмите любую кнопку..."

label %новая_метка% - поставить новую метку системного диска (диск С)

format %диск%: /q - быстрое форматирование диска Несколько секунд

ren %путь\файл% %новое_название_файла% - переименовать файло goto %метка%

Color - Изменение цвета текста и фона в окне командной строки для текущего сеанса. Выполненная без параметров команда color восстанавливает стандартные цвета текста и фона в окне командной строки. Синтаксис: color [тф]

Assoc - Вывод или изменение связи между расширениями имени и типами файлов. Запущенная без параметров команда assoc выводит список текущих связей между расширениями имени и типами файлов. Синтаксис: assoc [ . рсш[ =[ тип_файла]]], где . рсш - Задание расширения имени файла, тип_файла - Задание типа файла, с которым сопоставляется указанное расширение имени файла.

Заметки: - Чтобы удалить связь между расширением имени и типом файла, введите пробел после знака равенства. - Чтобы просмотреть текущие типы файлов, выполните команду ftype без параметров. - Чтобы направить вывод команды assoc в текстовый файл, воспользуйтесь оператором перенаправления.

Примеры: Чтобы вывести текущий тип файла, соответствующий расширению имени файла .txt, введите: assoc .txt Чтобы удалить тип файла, соответствующий расширению имени файла .txt, введите: assoc . txt = Чтобы просмотреть текущие сопоставления типов файлов, введите: assoc | more Чтобы отправить результаты выполнения команды assoc в файл Assoc.cfg, введите: assoc>assoc.cfg

Xcopy - Копирует файлы и каталоги, включая подкаталоги. Синтаксис: xcopy источник [ результат] [ /w] [ /p] [ /c] [ /v] [ /q] [ /f] [ /l] [ /g] [ /d[ : мм-дд-гггг]] [ /u] [ /i] [ /s [ /e]] [ /t] [ /k] [ /r] [ /h] [{ /a| /m}] [ /n] [ /o] [ /x] [ /exclude: файл1[ +[ файл2]][ +[ файл3]] [{ /y| /-y}] [ /z]

Taskkill - Завершает одно или несколько заданий или процессов. Процессы могут быть уничтожены кодом процесса или именем образа. Синтаксис: taskkill [ /s компьютер] [ /u доменпользователь [ /p пароль]]] [ /fi имя_фильтра] [ /pid код_процесса]|[ /im имя_образа] [ /f][ /t]

Shutdown - Позволяет выключать или перезапускать локальный или удаленный компьютер. Использование без параметров команды shutdown приведет к выходу из системы текущего пользователя. Синтаксис: shutdown [{ -l| -s| -r| -a}] [ -f] [ -m [ \ имя_компьютера]] [ -t xx] [ -c " сообщение "] [ -d[ u][ p] : xx : yy]

Fsutil - является служебной программой командной строки, которая используется для выполнения связанных задач файловых систем FAT и NTFS, таких как управление точками повторной обработки, управление разреженными файлами, отключение тома или расширение тома. Поскольку программа fsutil является весьма мощной, ее должны применять только опытные пользователи, имеющие опыт работы с Microsoft Windows XP. Для использования программы fsutil необходимо войти в систему с помощью учетной записи администратор или члена группы администраторов. В следующей таблице перечислены подкоманды команды fsutil.

behavior - Запрашивает, изменяет, включает или отключает настройки для создания имен файлов с длиной 8.3 символа, для возможности отображения расширенных символов в имена файлов длиной 8.3 символа в томах NTFS, для обновления штампа времени последнего доступа к томам NTFS, частоты событий, записанных в системных журнал, и количества места на диске, зарезервированного зоной основной таблицы файлов.

dirty - Запрос установки «грязного» бита тома. Задает «грязный» бит тома. Когда установлен «грязный» бит тома, autochk автоматически проверит том на наличие ошибок при следующей перезагрузке компьютера.

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

fsinfo - Обычно используется специалистами по технической поддержке. Перечисляет все диски, запрашивает тип диска, сведения о томе, специальные сведения о томе NTFS или статистику файловой системы.

hardlink - Cоздает жесткую связь. Жесткая связь представляет запись каталога для файла. Каждый файл можно рассматривать как имеющий по крайней мере одну жесткую связь. В томах NTFS каждый файл имеет несколько жестких связей, следовательно один файл может отображаться во многих каталогах (или даже в одном каталоге под различными именами). Поскольку ссылки на все связи находятся в одном файле, программы могут открывать любую из связей и изменять файл. Файл удаляется из файловой системы только после удаления всех связей. После создания жесткой связи, программы могут использовать ее как любое другое имя файла.

objectid - Обычно используется специалистами по технической поддержке. Управляет идентификаторами объектов, которые используются Windows XP для отслеживания объектов, таких как файлы и каталоги. Управляет дисковыми квотами в томах NTFS для предоставления более точного контроля за сетевым носителем. Дисковые квоты внедрены в тома и включают внедрение ограничений жестких и съемных носителей в тома.

reparsepoint - Обычно используется специалистами по технической поддержке. Запрашивает или удаляет точки повторной обработки, являющиеся объектами файловой системы NTFS, которые имеют определяемый атрибут, содержащий контролируемые пользователем данные, и используются для расширения функциональности подсистемы ввода/вывода. Точки повторной обработки используют как точки соединения каталогов и точки подключения томов. Они также используются драйверами фильтров файловой системы, чтобы пометить определенные файлы как специфические для этого драйвера.

sparse - Управление разреженными файлами. Разреженным файлом называют файл, внутри которого имеется одна или несколько областей, незанятые данными. Программа будет рассматривать эти незанятые области как содержащие байты с нулевыми значениями, но не будет использовать пространство на диске для представления этих нулей. Другими словами, место выделяется для значимых (ненулевых) данных, тогда как место под незначимые данные (длинные строки, состоящие из нулей) не выделяется. При чтении разреженного файла выделенные данные возвращаются в том виде, в котором они сохранены, а невыделенные данные по умолчанию возвращаются в виде нулей, согласно требованиям спецификации безопасности C2. Поддержка разреженного файла позаоляет освобождать данные из любого места в файле.

usn - Обычно используется специалистами по технической поддержке. Управление журналом изменения номеров последовательных обновлений (USN), в котором сохраняется архив всех изменений файлов в томе.

volume - Управление томом. Отсоединяет том или запросы для отображения количества свободного места на диске.

ocb.ucoz.ru