Введение
Мы все любим писать серьезные вещи на серьезных языках. Шаблоны, 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. За подробной информацией по различиям в реализации той или иной команды обращайтесь к . |
Как обработать текстовый файл?
Иногда в командном файле необходимо получить доступ к содержимому некоторого текстового файла и некоторым образом это содержимое обработать. Например, прочитать файл настроек программы.
Для привнесения еще большей конкретики в процесс изучения зададимся целью прочитать файл с настройками следующего содержания:
# Это простой файл с настройками # Режим сборки 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 Прочитанные настройки: echoBuild mode : %BUILDMODE%echoCompiler : %COMPILER% echoArchitecture: %ARCH% rem Выход из сценария. Дальше - только функции. exit /b 0 remrem Функция для чтения настроек из файла. rem Вход: rem %1 - Имя файла с настройками :read_settings set SETTINGSFILE=%1 rem Проверка существования файла if not exist %SETTINGSFILE% ( echoFAIL: Файл с настройками отсутствуетexit /b 1 ) rem Обработка файла c настройками rem Здесь: rem eol=# указывает на то, что содержимое строки начиная с символа # rem и до ее конца может быть пропущено как комментарий. remrem delims== указывает, что разделителем значений является символ = remrem tokens=1,2 приводит к тому, что в переменную %%i будет занесен первый rem токен, а в %%j - второй. remfor /f "eol=# delims== tokens=1,2" %%i in (%SETTINGSFILE%) do ( rem В переменной i - ключ rem В переменной j - значение rem Мы транслируем это в переменные окружения set %%i=%%j ) exit /b 0 |
Обильные комментарии должны помочь легко разобраться, что к чему. За подробностями, как обычно, отошлю к:
for /? |
Кстати, возможности команды for не ограничиваются чтением из файла. Возможно также чтение вывода другой команды. Например, так:
@echo off for /f "tokens=* usebackq" %%i in (`cmd.exe /c ver`) do ( set VERSION=%%i ) echo%VERSION% |
Особенно меня умиляет наличие опции “usebackq”, которая делает синтаксис отдаленно похожим на юниксовый. И в стенах царства Билла есть граждане, скучающие по /bin/sh и пытающиеся хоть как-то скрасить существование свое и окружающих. Следующий совет это также косвенно подтверждает.
Встроенные команды
1. @echo – это команда bat-файлов, которая позволит увидеть работу скрипта в командной строке. Она используется для просмотра хода выполнения рабочего кода. Если у пакетного файла возникают какие-либо проблемы, то данная команда позволит быстро локализировать проблемы. Добавление off дает возможность быстро завершить выполнение кода, избегая вывода ненужной информации на экран.
2. Title предоставляет те же возможности, что и тег в HTML, т. е. создает заголовок для пакетного скрипта в окне командной строки.
3. Call вызывает один bat-файл из другого или подпрограмму внутри одного сценария. Например, функция power вычисляет степень %2 числа %1:
if %counter% gtr 1 (
endlocal & set result=%prod%
4. Cls очищает командную строку. Используется для того, чтобы предыдущий вывод постороннего кода на помешал просмотру хода выполнения текущего скрипта.
5. Color задает цвет шрифта и фона. Например, команда color f9 задает белые буквы на синем фоне. Команда без параметра восстанавливает установки по умолчанию.
6. Echo служит для вывода информации, а также включения (echo on) или выключения (echo off) такого вывода. Например, команда echo. выводит новую строку без точки, а echo . – точку. Без параметров команда выводит на экран информацию о своем текущем статусе – echo on или echo off.
7. Rem обеспечивает ту же функциональность, что и тег > (сдвиг вправо). Логическим оператором отрицания является ! (восклицательный знак). Он изменяет 0 в 1 и ненулевое значение в 0. Оператором комбинирования служит , (запятая), которая позволяет производить большее число операций в одной команде set. Комбинированные операторы присваивания += и -= в выражениях a+=b и a-=и соответствуют выражениям a=a+b и a=a-b. Так же работают и *=, %=, /=, &=, |=, ^=, >>=, >, >=; ,
Литералы можно вводить в виде десятичных, шестнадцатеричных (с ведущими 0x) и восьмеричных чисел (с ведущим нулем). Например, set /a n1=0xffff присваивает n1 шестнадцатеричное значение.
Как создать «батник» в операционной системе Windows 7
Сделать этот файлик может любой пользователь на компьютере, который имеет достаточно прав для создания и сохранения файлов. На счет выполнения немного сложнее — выполнение «батника» должно быть разрешено как и отдельно взятому пользователю, так и операционной системе в целом (запрет иногда накладывается в целях безопасности, ведь исполняемые файлы не всегда создаются для благих дел).
Способ 1: использование расширенного текстового редактора Notepad++
Программа Notepad++ является аналогом стандартного Блокнота в операционной системе Windows, значительно превосходя его в количестве и тонкости настроек.
- Файл можно создать на любом диске или в папке. Для примера будет использован рабочий стол. На свободном месте нажмите правую кнопку мыши, наведите курсор на надпись «Создать», в выпавшем сбоку окошке щелчком левой кнопки мыши выберите «Текстовый документ»
На рабочем столе появится текстовый файл, который желательно назвать так, как в итоге будет называться наш батник. После того, как имя для него определено, нажмите на документе левой кнопкой мыши, и в контекстном меню выберите пункт «Edit with Notepad++». Созданный нами файл откроется в расширенном редакторе.
Очень важна роль кодировки, в которой будет исполнена команда. По умолчанию используется кодировка ANSI, которую нужно заменить на OEM 866. В шапке программы нажимаем на кнопку «Кодировки», нажимаем на аналогичную кнопку в выпавшем меню, затем выбираем пункт «Кириллица» и нажимаем на «OEM 866». Как подтверждение смены кодировки справа внизу в окне появится соответствующая запись.
Тот код, который вы уже нашли в интернете или написали сами для выполнения определенной задачи, необходимо просто скопировать и вставить в сам документ. На примере ниже будет использована элементарная команда:
После запуска этот батник перезагрузит компьютер. Сама команда означает запуск перезагрузки, а цифры 00 — задержку ее выполнения в секундах (в данном случае она отсутствует, то есть перезапуск выполнится незамедлительно).
Когда команда будет записана в поле, наступает самый важный момент — превращение обычного документа с текстом в исполняемый. Для этого в окошке Notepad++ слева вверху выберите пункт «Файл», затем нажмите на «Сохранить как».
Появится стандартное окно Проводника, позволяющее задать два основных параметра для сохранения — место и имя самого файла. Если с местом мы уже определились (по умолчанию будет предложен Рабочий стол), то именно в названии заключается последний шаг. Из выпадающего меню выберите пункт «Batch file».
К уже заданному ранее слову или фразе без пробела допишется «.BAT», и получится так, как на скриншоте ниже.
После нажатия на кнопку «OK» в предыдущем окне, на рабочем столе появится новый файл, который будет выглядеть как белый прямоугольник с двумя шестеренками.
Способ 2: использование стандартного текстового редактора Блокнот
Он обладает элементарными настройками, которых вполне хватает для создания самых простых «батников». Инструкция абсолютно аналогична предыдущему способу, программы лишь немного отличаются в интерфейсе.
- На рабочем столе двойным щелчком откройте ранее созданный текстовый документ — от откроется в стандартном редакторе.
Команду, которую использовали ранее, скопируйте и вставьте в пустое поле редактора.
В окошке редактора слева вверху нажмите на кнопку «Файл» — «Сохранить как…». Откроется окно Проводника, в котором необходимо указать место сохранения конечно файла. Здесь отсутствует способ задания необходимого расширения с помощью пункта в выпадающем меню, поэтому просто нужно дописать к названию «.BAT» без кавычек, чтобы получилось так, как на скриншоте ниже.
Оба редактора отлично справляются с созданием батников. Стандартный блокнот больше подходит для простых кодов, в которых используются несложные одноуровневые команды. Для более серьезной автоматизации процессов на компьютере необходимы продвинутые батники, которые с легкостью создаются расширенным редактором Notepad++.
Рекомендуется запускать файл .BAT от имени администратора, чтобы не возникало проблем с уровнями доступа к определенным операциям или документам. Количество задаваемых параметров зависит от сложности и назначения задачи, которую необходимо автоматизировать.
Опишите, что у вас не получилось.
Наши специалисты постараются ответить максимально быстро.
Как создать пакетный файл BAT для выполнения в командной строке CMD
Batch (.bat) файл — это инструмент, который сэкономит вам не один десяток часов рабочего времени. Узнайте сейчас как использовать пакетный файл на практике.
Пакетный (BAT, batch) файл представляет собой инструмент, с которым сталкивался практически каждый пользователь Windows. Документ помогает выполнить ряд действий буквально парой кликов, а их список ограничивается лишь силой воображения и кодовым функционалом. Давайте разберем инструмент подробнее.
Что такое BAT файл?
Вы, должно быть, уже в курсе о существовании такой утилиты как “Командная строка” Windows, или CMD.
Она работает путем ввода команд в качестве входных данных и обрабатывает их, проводя нужные операции с компьютером.
Тем не менее, несмотря на всю полезность инструмента, командная строка устраивает далеко не всех. Сложность утилиты и высокий порог вхождения делают ее “последним средством спасения Windows”.
Доступные форматы BAT файла:
Вне зависимости от того какой формат выбран при создании документа, функции от этого не изменятся.
В чем польза bat файла?
Автоматизация. Если раньше вам приходилось долго и нудно “вбивать” сложные коды в окно командной строки, пришло время расслабиться! BAT файл экономит время пользователя не только при работе с CMD, но и при взаимодействии с другими системами ПК.
Например, вы можете запланировать выключение компьютера через определенный промежуток времени. Этот способ применения пакетного файла хорошо подойдет геймерам, ставящим установку игру на ночь.
Запланируйте отключение системы к моменту завершения установки и не опасайтесь за перерасход электроэнергии.
Если же вы разработчик программного обеспечения, обратите внимание на возможность автоматизации при установке вашего приложения. Таким образом повысится не только удобство для конечного пользователя, но популярность вашего софта
При создании BAT файла используется петля (for), условный оператор (if) и оператор управления (goto). Документ запускается либо с помощью командной строки, либо с помощью другого пакетного файла при использовании команды CALL.
Режимы BAT файла
Несмотря на то, что пакетный файл по умолчанию выполняет работу автоматически, вы можете настроить его так, что при выполнении конкретной операции он будет запрашивать подтверждение. Например, при вводе команды на отключение службы Windows, BAT файл спросит вас, уверены ли вы в своем решении. Этот режим называется интерактивным (interactive).
Другой режим называется пакетным (batch mode). Он работает в классическом стиле и самостоятельно выполняет запрограммированные функции.
Режимы пакетного файла:
- Интерактивный.Полуавтоматический режим. Программа может запрашивать подтверждение операций.
- Пакетный.Полная автоматизация работы.
Используйте разные режимы в зависимости от ситуации.
Как запустить BAT файл в Windows 10?
Основной способ запуска пакетного файла — двойной щелчок по его иконке. Тем не менее, вы можете его и открыть и другим методом — с помощью командной строки.
Чтобы открыть BAT файл с помощью командной строки, выполните следующее:
- Откройте директорию в которой лежит пакетный файл.
- Определите название файла.
- Откройте командную строку.
- Введите название документа с его расширением.Например: HelloWorld.bat
Способ запуска через командную строку приобретает ценность с ростом количества пакетных файлов. Если вы помните название и расширение нужного документа, вы откроете его даже когда забыли точную директорию.
Как создать BAT файл?
Эта тема разбита на 2 раздела, каждый из которых — ключевой при создании пакетного документа. Не зная основ и команд, нужных для формирования структуры, автоматизировать процесс работы невозможно.
Основы создания BAT файлов
Вы не сможете создать пакетный файл без изучения базовых команд. Каким бы он не был полезным и не помогал автоматизировать работу на ПК, непонимание основ станет серьезным препятствием. В этом разделе мы рассмотрим 5 базовых команд, которые вас в курс дела.
Базовые команды:
titleИспользуется для создания заголовка. Отображается в верхней части окна командной строки.
echoРежим вывода команд на экран. При включении, командная строка выведет на экран сообщение о совершенном действии. При отключении, соответственно, сообщения пропадут
Обратите внимание, что вам придется контролировать статус echo. Если команда активирована на строке 2 и вы решили отключить ее на строке 22, 20 промежуточных строк будут содержать включенный режим вывода команд.
pauseИспользуется для остановки процесса.
exitПозволяет закрыть командную строку.
clsИспользуется для очистки окна командной строки.
::
Цикл в командной строке for /l
Всем привет. Подскажите, как можно сделать цикл что бы передавал по очередно файлы для aerender.exe ? Вот тут примеры есть https://helpx.adobe.com/ru/after-effects/using/automated-rendering-network-rendering.html
Пытаюсь написать вот так
Но ничего не запускается даже. Командная строка открыта в директории c:Program FilesAdobeAdobe After Effects CC 2021Support Files и два файла проекта лежат там же 1.aep и 2.aep . Если так вообще можно сделать, позже хотел бы сделать. что бы файлы проекта искал не там же а в другой директории? И хотел бы написать батник что бы не лазить постоянно в директорию с aerender.exe, что то типо Вот такого
Да, я понимаю, что это не правильно, подскажите как правильно написать ?
Разделители полей
Причина вышеописанной особенности заключается в специальной переменной окружения, которая называется
(Internal Field Separator) и позволяет указывать разделители полей. По умолчанию оболочка bash считает разделителями полей следующие символы:
- Пробел
- Знак табуляции
- Знак перевода строки
Если bash встречает в данных любой из этих символов, он считает, что перед ним — следующее самостоятельное значение списка.
Для того, чтобы решить проблему, можно временно изменить переменную среды IFS. Вот как это сделать в bash-скрипте, если исходить из предположения, что в качестве разделителя полей нужен только перевод строки:
После добавления этой команды в bash-скрипт, он будет работать как надо, игнорируя пробелы и знаки табуляции, считая разделителями полей лишь символы перевода строки.
Массовая обработка файлов. Команда for
Команда for позволяет организовать выполнение повторяющихся однотипных действий. Можно
использовать ее для того, чтобы вывести на экран числа от одного до десяти, как показано на
следующем листинге.
for /l %%i in (1,1,10) do echo %%i
Переменная i называется счетчиком цикла. В силу своеобразия синтаксиса
команды for, имя счетчика цикла должно состоять из одной буквы. Причем, если
мы пишем командный файл, то перед именем счетчика цикла надо поставить сдвоенный знак
процента, если же мы просто набираем команду в командной строке, то одиночный.
Логика работы этой команды такова. После слова in указан диапазон изменения
счетчика цикла. В данном варианте команды это тройка чисел: начальное значение счетчика, шаг
счета, предельное значение счетчика. При выполнении команды командный процессор сначала
присвоит переменной i значение 1, а потом на каждом шаге
цикла будет увеличивать его на 1, пока оно не превысит 10.
Очевидно, таких шагов получится десять. Если бы в качестве шага счета мы указали число
2, то цикл выполнился бы пять раз. На каждом шаге цикла выполняется тело
цикла, написанное после слова do. В приведенном примере это команда echo,
которая выводит на экран текущее значение счетчика цикла.
Наверно можно придумать ситуацию, когда что-то подобное на самом деле требуется, но обычно
команда for используется для перебора и обработки файлов. Надо сказать, что в
достаточно простых случаях массовая обработка файлов выполняется с помощью подстановочных
символов. Если, мы хотим всем файлам в текущем каталоге заменить расширение
.htm на .html, мы вводим команду ren *.htm
*.html. Но если то же самое надо сделать не в одном каталоге, а в дереве каталогов,
то без команды for не обойтись. Приведенный ниже командный файл выполняет эту операцию для
всех htm-файлов в подкаталоге website текущего каталога. Точнее, во всем дереве каталогов,
которое находится внутри website.
for /r website %%i in (*.htm) do ren %%i %%~ni.html
Ключ /r указывает на необходимость обхода каталога website и
всех его внутренностей. Если его не указать (но тогда и каталог указывать не разрешается), то
обработаны будут только файлы в текущем каталоге. Диапазоном значений счетчика цикла в данном
варианте команды является множество всех файлов с расширением .htm,
находящихся внутри каталога (точнее, дерева) website. Странная на первый
взгляд запись ~ni означает, что из значения переменной i
требуется выделить только имя файла. В языке команд MS-DOS предусмотрено несколько таких
модификаторов, например, запись ~хi обозначает расширение файла. Все
модификаторы описаны в справке по команде for.
Тело цикла может состоять из нескольких команд, заключенных в скобки.
@echo off for /r website %%i in (*.htm) do ( rem Выводим имя файла echo %%i rem Переименовываем файл ren %%i %%~ni.html )
Параметры
- {%переменная|%%переменная}
-
Обязательный параметр. Замещаемый параметр. Используйте %переменная для
выполнения команды for из командной строки. Используйте %%переменная
для выполнения команды for в пакетном файле. Переменные учитывают регистр и могут
быть представлены со значением альфа, например, %A, %B или %C. - (множество)
-
Обязательный параметр. Задает один или несколько файлов, каталогов, диапазон значений или
текстовых строк, подлежащих обработке заданной командой. Скобки являются обязательными. - команда
-
Обязательный параметр. Задает команду, которая будет выполнена для каждого файла, каталога
диапазона значений или текстовой строки, включенной в указанный параметр
(множество). - ПараметрыКоманднойСтроки
- Задает параметры командной строки, которые используются с указанной командой.
- /?
- Отображение справки в командной строке.
Урок 6 по cmd — обзор цикла for командной строки |
В этой статье мы рассмотрим использование цикла for в командной строке, который, в отличии от аналогичных конструкций в других языках программирования, тут носит немного другой характер. Сперва, немного лирики…
В былые времена программирование носило совсем другие цели нежели теперь. Это теперь царит разнообразие различных языков: хочешь, пиши на php, хочешь, постигай вершины Delphi, в общем, все в изобилии и на любой вкус. Столь стремительный рост возможностей и средств для программирования затронул структуру и характер новых языков. Так, когда я еще проходил в школе на уроках информатики язык Pascal, то цикл использовался в основном для выполнения групповых математических задач: нахождение суммы чисел n-количества и групповое умножение. Теперь, ситуация немного другая, ведь помимо простой математики приходится работать с файлами, папками, объектами и коллекциями. И тут рождаются новые разновидности цикла:
В командной строке цикл един, но с помощью ключей можно менять структуру его применения: работа с файлами, с каталогами, банальный перебор значений или текстовых строк.
В этой статье мы рассмотрим общую структуру цикла командной строки, так сказать – сделаем краткий обзор. По ходу материала я буду давать ссылки на остальные статьи с описанием, уже узких примеров применения, и так, начнем…
Основной синтаксис применения следующий:
for итератор do (оператор)
Итератор – отвечает за ход выполнения. Тут определяется и условия и количество выполнения заданных операторов. Тут могут находиться как одна, так и несколько команд, которые можно объединить в одну цепочку, конвейер или группу (внутри скобок). Как и в стальных языках программировать, итератор содержит переменную инициализации (начальное значение), или же набор различных элементов – диапазон значений, группа файлов или папок.
На переменные инициализации распространяются следующие правила:
- Они существуют только в теле цикла командной строки
- В качестве имени нельзя использовать слово, например, myVar, а только латинские буквы в диапазоне от а до z или от А до Z, например %%А, %%В или %%С. Если вы используете цикл не в сценарии, а в окне консоли, то ставится только один символ %.
- Названия переменных итератора чувствительны к регистру символов, то есть, %%a и %%A будут отличаться.
Как я уже сказал, цикл в командной строке может изменять логику работы с помощью ключей, а именно:
for/D %%имя_переменной in (набор_каталогов) do оператор – как вы уже догадались, данный синтаксис применяется для групповой работы с каталогами. Об этом свидетельствует ключ /D (directory). Как и в случае с файлами, тут можно указывать шаблонный формат или список.
for /R %%имя_переменной in (набор_файлов) do оператор – данный синтаксис используется для групповой работы с подкаталоги, о чем говорит параметр /R. С его помощью можно задать путь к папке, а потом задать список и шаблон для файлов, в результате, мы можем обработать все документы заданного типа в заданном диске или папке.
Примеры работы с корневыми и вложенными папками рассмотрены в статье «Урок 8 по CMD«
for /L %%имя_переменной in (начало, шаг, конец) do оператор – отвечает за перебор значений. Параметры в круглых скобках задают начальное значение, шаг (может быть как положительным, так и отрицательным) и конечное значение.
for /F %%имя_переменной in (источник) do оператор – анализ текстовых файлов, строк и вывод команд. Данный синтаксис позволяет анализировать как содержимое файла, так и заданный текст. Плюс, можно задать параметры для анализа, например, число обрабатываемых строк, разделители и комментарии.
Примеры обработки текстовых строк рассмотрены в статье «Урок 9 по CMD«
for %%имя_переменной in (набор_файлов) do оператор – данный синтаксис применяется для групповой работы с файлами. Тут %%имя_переменной является переменной инициализации, которой будет присваиваться значение, заданное в “набор_файлов”, например, путь к заданному файлу. Так, набор_файлов может быть одной строкой определяющей группу документов по шаблону, или списком строк, разделенных пробелами.
Примеры работы с файлами и данными рассмотрены в статье «Урок 7 по CMD«
Спасибо за внимание. Автор блога
5- Переменные среды Windows
Windows позволяет вам создать переменные среды, данные переменные будут глобальными переменными, которые можно использовать в любых файлах batch.
В Windows выберите:
Здесь вы можете создать переменную среды для текущего user, или переменную среды системы (system environment variable), который можно использовать любым user.
Например, я создаю переменную среды с названием MY_ENVIRONMENT_VARIABLE и значением “My Environment Variable Value!”.
И можно использовать только что созданную переменную среду в файле batch.
testEnvVariable.bat
@echo off
echo %MY_ENVIRONMENT_VARIABLE%
pause
Операторы перехода
Командный файл может содержать метки и команды GOTO перехода к этим меткам. Любая строка, начинающаяся с двоеточия :, воспринимается при обработке командного файла как метка. Имя метки задается набором символов, следующих за двоеточием до первого пробела или конца строки. Приведем пример.
Пусть имеется командный файл следующего содержания:
После того, как в этом файле мы доходим до команды
его выполнение продолжается со строки
В команде перехода внутри файла GOTO можно задавать в качестве метки перехода строку :EOF, которая передает управление в конец текущего пакетного файла (это позволяет легко выйти из пакетного файла без определения каких-либо меток в самом его конце).
Также для перехода к метке внутри текущего командного файла кроме команды GOTO можно использовать и рассмотренную выше команду CALL:
При вызове такой команды создается новый контекст текущего пакетного файла с заданными аргументами, и управление передается на инструкцию, расположенную сразу после метки. Для выхода из такого пакетного файла необходимо два раза достичь его конца. Первый выход возвращает управление на инструкцию, расположенную сразу после строки CALL, а второй выход завершает выполнение пакетного файла. Например, если запустить с параметром «Копия-1» командный файл следующего содержания:
то на экран выведутся три строки:
Таким образом, подобное использование команды CALL очень похоже на обычный вызов подпрограмм (процедур) в алгоритмических языках программирования.
Как экранировать символ?
В командном языке Windows существует некоторый набор символов с высоким приоритетом, которые всегда трактуются как спецсимволы. К ним, в частности, относятся:
- Операторы перенаправления ввода-вывода <, >, >>.
- Оператор конвейера |.
- Операторы объединения команд ||, & и &&.
- Оператор разыменования переменной %…%.
В случае если символ, относящийся к одному из таких операторов, должен быть включен в вашу команду в его литеральном смысле, вас ждут определенные неожиданности. Например, при выполнении вот такой строки
echo The ratio should be up to 10%. |
символ процента будет «съеден» интерпретатором, который решит, что это попытка вывода значения какой-то переменной. В случае со знаком процента решение довольно хорошо известно и состоит в удвоении этого символа:
echo The ratio should be up to 10%%. |
после чего все заработает так, как надо. Однако в других случаях все менее очевидно. Рассмотрим командный сценарий, который генерирует незатейливый HTML-файл:
@echo off set OUTPUTFILE=%1 echo<html> >%OUTPUTFILE% echo<head> >>%OUTPUTFILE% echo<title>This is a greeting page</title> >>%OUTPUTFILE% echo</head> >>%OUTPUTFILE% echo<body> >>%OUTPUTFILE% echoHello World! >>%OUTPUTFILE% echo</body> >>%OUTPUTFILE% echo</html> >>%OUTPUTFILE% |
К сожалению, при попытке запуска этого «чуда инженерного разума» нас постигнет неудача в виде сообщения об ошибке
> was unexpected at this time. |
Оно и понятно: командный интерпретатор не в силах разобраться, где его просят вывести на экран символ HTML-тега, а где перенаправить вывод. В нормальных языках программирования эта проблема обычно решается обрамлением строковых литералов кавычками. Отчасти это помогает и в bat-файлах. Но лишь отчасти. Выполнение строки
echo "<html>" >%OUTPUTFILE% |
приведет к тому, что в выходной файл будут записаны и сами кавычки. Это явно не совсем то, что требуется.
К счастью, есть один малоизвестный способ, позволяющий добиться требуемого результата. Символ ^ позволяет экранировать любой другой символ с безусловным приоритетом. Таким образом, вышеприведенный пример генерации HTML может быть успешно записан так:
@echo off set OUTPUTFILE=%1 echo^<html^> >%OUTPUTFILE% echo^<head^> >>%OUTPUTFILE% echo^<title^>This is a greeting page^</title^> >>%OUTPUTFILE% echo^</head^> >>%OUTPUTFILE% echo^<body^> >>%OUTPUTFILE% echoHello World! >>%OUTPUTFILE% echo^</body^> >>%OUTPUTFILE% echo^</html^> >>%OUTPUTFILE% |
Таким же способом можно экранировать любой другой специальный символ. Очевидно, можно экранировать и сам ^. Не очень эстетично, зато дешево и практично. Слово «надежно» я пропустил умышленно…
Как получить короткое (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 ) echo8.3-имя для каталога "%PROGRAMFILES%" -^> "%PROGRAMFILESSHORT%" |
Этот и другие модификаторы можно использовать и с любой другой формой цикла for, подробнее о которых можно узнать из:
for /? |