Windows 10

Как создать командный файл. Проверка условий и выбор вариантов

Как создать командный файл. Проверка условий и выбор вариантов

В данной статейки мы рассмотрим такую полезную вещь как «батник ». Давайте сначала дадим определение, что такое bat файл. Пакетные или batch файлы - это простые текстовые файлы, содержащие наборы команд (инструкцию ) интерпретатора и имеющие расширение bat или cmd (cmd работают только в ОС семейства NT ). Создавать и редактировать такие файлы можно при помощи обычного блокнота или любого другого текстового редактора.

Теперь Вы спросите, зачем нужно уметь писать такие бат файлы? И зачем они нужны? Попытаюсь объяснить.

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

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

Теперь перейдем непосредственно к основам этих батников. Как же они создаются, Вам нужно просто создать простой текстовый документ открыть его и сразу на вкладке «Файл->сохранить как », вписать вместо расширения «Текстовый документ.txt », например «Текстовый документ.bat » и сохранить, вот и получится у нас батник с расширением.bat, но он пока ничего не делает.

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

"C:\Program Files\WinRAR\winrar.exe" a -r -dh -ed -agYYYY-mm-dd E:\arhaccounts\ d:\accounts\*.doc "C:\Program Files\WinRAR\winrar.exe" a -r -dh -ed -agYYYY-mm-dd E:\arhaccounts\ d:\accounts\*.xls "C:\Program Files\WinRAR\winrar.exe" a -r -dh -ed -agYYYY-mm-dd E:\arhaccounts\ d:\accounts\*.txt

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

  • a - это добавить в архив;
  • -r - обрабатывать вложенные папки;
  • -dh - открывать совместно используемые файлы;
  • -ed - не добавлять пустые папки;
  • YYYY-mm-dd - добавляем к имени архива текущую дату (формат даты );
  • E:\arhaccounts\ - путь, где будет лежать конечный архив;
  • d:\accounts\*.doc - путь и маска файлов, какие нужно заархивировать.

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

Copy E:\arhaccounts\*.rar \\namecomp\arhiv\

Примеры команд для bat файлов

Теперь рассмотрим основные команды, которые Вы можете использовать.

Если Вам нужно удалить файл пропишите следующие:

Del d:\file\test.doc


Для того чтобы удалить весь каталог пропишите:

Rd d:\file\

Вдруг Вам нужно удалять каждый раз все из какого-нибудь каталога, то используйте вот что:

Echo Y| del d:\file\

  • del d:\file\ - это как раз и есть удаление всех файлов;
  • echo Y| - команда подтверждает удаление т.к. если не прописать эту команду, то Вы увидите сообщение о подтверждение удаления – «Продолжить », и Вам нужно будет каждый раз отвечать на этот вопрос.

Сейчас давайте рассмотрим пример посложней, в котором уже выполняется условие:

@echo off "C:\Program Files\WinRAR\winrar.exe" x -O+ -IBCK d:\test\test.rar d:\test IF not EXIST d:\test\123.rar GOTO 1 IF EXIST d:\test\123.rar GOTO 2:2 "C:\Program Files\WinRAR\winrar.exe" x -O+ -IBCK d:\test\123.rar c:\ del d:\test\123.rar:1 del d:\test\test.rar end

Теперь объясняю, допустим, Вам нужно разархивировать архив test.rar, в котором будет много файлов, но если там окажется файл 123.rar его нужно будет разархивировать в корень диска C, а остальные файлы чтобы остались в том же каталоге не тронутыми.

По порядку, команда @echo off нужна, для того чтобы на экране у нас ничего не отражалось (в принципе, если не нужно можете не писать эту строку ). Далее у нас запускается винрар и распаковывает архив test.rar в папку test. Затем идет условие, если в папке test (после распаковки test.rar ) у нас не окажется файла 123.rar, то у нас просто выполнение батника переходит к строке:1 и потом просто удаляется файл test.rar за не надобностью т.к. все что нам нужно мы уже распаковали. Но если там оказывается файл 123.rar, то выполнение батника переходит к строке:2, после которой уже идет распаковка файла 123.rar в корень диска C. Другими словами у нас выполняется условие, если есть файл то делать это, если нет файла, делать вот это. Допустим, если не прописать условие в данном примере, то у нас батник выдаст ошибку, тогда когда у нас не окажется файла 123.rar в данной папке.

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

Move "D:\catalog\*.doc" G:\catalognaflehe\

И все файлы с расширением doc, которые находятся в каталоге D:\catalog будут перемещаться на флешку. Теперь хочу сказать, что в батниках можно использовать сценарии (скрипты ) при помощи Windows Scripting Host и если нужно, например чтобы выводилось сообщение, после того как файлы скопированы (предыдущий пример ) вставьте вот это:

Echo var WSHShell = WScript.CreateObject("WScript.Shell"); > %temp%\mes.js echo WSHShell.Popup("Файлы Скопированы"); >> %temp%\mes.js start %temp%\mes.js deltree /y %temp%\mes.js

На самом деле про написание батников можно разговаривать много и в одну статью это, конечно же, не уместить, здесь я показал всего лишь принципы, которые используются при написании bat файлов, так сказать основу. Если Вы хотите узнать больше команд для написания батников, Вы можете легко посмотреть их, набрав в командной строке (Пуск - Выполнить – cmd ) команду help, но там, конечно же, не все команды, что можно использовать в батниках. Удачи в написание BAT файлов (батников ).

Продолжение темы в статье -

Bat-файлы Windows являются удобным способом выполнения различных задач на ПК, которым активно пользуются компьютерные умельцы. Они позволяют автоматизировать повседневные задачи, сократить время их выполнения и превратить сложный процесс во что-то посильное рядовому пользователю. В данной статье представлены базовые возможности командных файлов и рекомендации по самостоятельному их написанию.

Автоматизация - это просто

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

  1. В любом текстовом редакторе, например, в Notepad или WordPad, создать текстовый документ.
  2. Записать в нем свои команды, начиная с @echo , а затем (каждый раз в новой строке) - title [название пакетного скрипта], echo [сообщение, которое будет выведено на экран] и pause.
  3. Сохранить текст в электронном документе с расширением.bat (например, test.bat).
  4. Для запуска следует дважды щелкнуть по только что созданному пакетному файлу.
  5. Чтобы его отредактировать, необходимо кликнуть на нем правой кнопкой мыши и из контекстного меню выбрать пункт «Изменить».

Необработанный файл будет выглядеть примерно так:

title Это ваш первый скрипт bat-файла!

echo Добро пожаловать в сценарий пакетной обработки!

Более подробно о командах bat-файлов и их использовании речь пойдет ниже.

Шаг 1: создание программного скрипта

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

Создание нового текстового документа

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

Добавление кода

Двойной щелчок на этом новом текстовом документе откроет принятый по умолчанию текстовый редактор. Можно скопировать и вставить приведенный выше пример кода в текстовую запись.

Сохранение

Вышеупомянутый скрипт выводит на экран текст «Добро пожаловать в сценарий пакетной обработки!». Электронный документ необходимо записать, выбрав пункт меню текстового редактора «Файл», «Сохранить как», а затем указать желаемое имя bat-файла. Его следует завершить расширением.bat (например, welcome.bat) и нажать «ОК». Для правильного отображения кириллицы в некоторых случаях следует удостовериться в правильном выборе кодировки. Например, при использовании консоли русифицированной системы Windows NT документ необходимо сохранить в CP866. Теперь следует дважды щелкнуть на ярлыке bat-файла, чтобы активировать его.

Но экране появится надпись:

"Добро пожаловать в сценарий пакетной обработки! Для продолжения нажмите любую клавишу..."

В случае если bat-файл не запускается, пользователи рекомендуют зайти в регистр и удалить ключ:

"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.BAT\UserChoice".

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

Шаг 2: знакомство с некоторыми командами

Если пользователь ПК знаком с тем, как следует выполнять команды консоли DOS, то он будет мастером создания программных скриптов, потому что это один и тот же язык. Строки в bat-файлах сообщат интерпретатору cmd.exe все, что от него требуется. Это экономит время и силы. Кроме того, есть возможность задать некоторую логику (например, простые циклы, условные предписания и т. д., которые концептуально схожи с процедурным программированием).

Встроенные команды

1. @echo - это команда bat-файлов, которая позволит увидеть работу скрипта в командной строке. Она используется для просмотра хода выполнения рабочего кода. Если у пакетного файла возникают какие-либо проблемы, то данная команда позволит быстро локализировать проблемы. Добавление off дает возможность быстро завершить выполнение кода, избегая вывода ненужной информации на экран.

2. Title предоставляет те же возможности, что и тег в HTML, т. е. создает заголовок для пакетного скрипта в окне командной строки.</p><p>3. Call вызывает один bat-файл из другого или подпрограмму внутри одного сценария. Например, функция power вычисляет степень %2 числа %1:</p><p>if %counter% gtr 1 (</p><p>set /a counter-=1</p><p>endlocal & set result=%prod%</p><p><img src='https://i1.wp.com/syl.ru/misc/i/ai/324915/1862019.jpg' width="100%" loading=lazy></p><p>4. Cls очищает командную строку. Используется для того, чтобы предыдущий вывод <a href="/blokirovka-ekrana-dlya-android-blokirovka-ekrana-na-android-kak.html">постороннего кода</a> на помешал просмотру хода выполнения текущего скрипта.</p><p>5. Color задает цвет шрифта и фона. Например, <a href="/zamenit-chernyi-cvet-na-sinii-v-fotoshope-komanda-zamenit-cvet.html">команда color</a> f9 задает белые буквы на <a href="/chto-znachit-grustnyi-smailik-na-vindovs-fon-sinii-ekran-smerti-bsod.html">синем фоне</a>. Команда без параметра восстанавливает установки по умолчанию.</p><p>6. Echo служит для вывода информации, а также включения (echo on) или выключения (echo off) такого вывода. Например, команда echo. выводит <a href="/kak-izmenit-i-zapolnit-tablicu-v-vorde-vstavka-neskolko.html">новую строку</a> без точки, а echo . - точку. Без параметров команда выводит на экран информацию о своем текущем статусе - echo on или echo off.</p><p>7. Rem обеспечивает ту же функциональность, что и тег <! в HTML. Такая строка не является частью выполняемого кода. Вместо этого она служит для пояснения и предоставления информации о нем.</p><p>8. Pause позволяет прервать выполнение команд bat-файла. Это дает возможность прочесть выполненные строки перед продолжением программы. При этом на экран выводится сообщение «Для продолжения нажмите любую клавишу...».</p><p>9. Set позволяет просмотреть или установить переменные окружения. С ключом /p команда запрашивает у пользователя ввод и сохраняет его. С параметром /а она дает возможность выполнять простые <a href="/chto-budem-ispolzovat-arifmeticheskie-operacii-nad-celymi.html">арифметические операции</a>, также присваивая их результат переменной. При операциях со строками не должно быть пробелов ни до, ни после знака равенства. Например, команда set выводит на дисплей список переменных окружения, set HOME - значения аргументов, начинающихся с “HOME”, а set /p input=введите целое: запрашивает ввод целого числа и присваивает его соответствующей переменной.</p><p>10. Start "" [веб-сайт] запустит заданный веб-сайт в веб-браузере, используемом по умолчанию.</p><p>11. If служит для проверки определенного условия. Если оно истинно, то выполняется следующая за ним команда. Условия бывают 3 видов:</p><ul><li>ERRORLEVEL число - проверка кода завершения последней выполненной инструкции на соответствие или превышение указанного числа. При этом 0 обозначает успешное выполнение задачи, а любое другое число, обычно положительное, сообщает об ошибке. Например, можно использовать вложенные команды для <a href="/samye-tochnye-gps-navigatory-tochnost-opredeleniya-koordinat-v-gps-navigacii-i.html">точного определения</a> кода завершения: if errorlevel 3 if not errorlevel 4 echo произошла ошибка №3.</li><li>Строка1 == строка2 - проверка совпадения двух строк. Например, при отсутствии внешнего параметра команда if "%1"= ="" goto ERROR передаст управление метке ERROR.</li><li>EXIST имя - проверка существования файла с указанным именем. Например, if not exist A:\program.exe COPY C:\PROJECTS\program.exe A: копирует программу program.exe на диск А, если ее там нет.</li> </ul><p>12. Else должна находиться в одной строке с командой If. Указывает на необходимость выполнения <a href="/ispolzovanie-smartfona-kak-veb-kameru-chtoby-podklyuchit.html">следующей инструкции</a>, если выражение окажется ложным.</p><p><img src='https://i2.wp.com/syl.ru/misc/i/ai/324915/1862021.jpg' width="100%" loading=lazy></p><p>13. For используется для повторения определенных действий с каждым членом списка. Имеет формат for %%аргумент in (список) do команда. Аргументом может быть любая буква от A до Z. Список представляет собой последовательность строк, разделенных пробелами или запятыми. Подстановочные знаки также могут использоваться. Например:</p><ul><li>for %%d in (A, C, D) do DIR %%d - последовательно выводит на экран директории дисков А, С и D;</li><li>for %%f in (*.TXT *.BAT *.DOC) do TYPE %%f - печатает содержимое всех.txt-, .bat- и.doc-файлов в текущей директории;</li><li>for %%P in (%PATH%) do if exist %%P\*.BAT COPY %%P\*.BAT C:\ВАТ - копирует все пакетные файлы, которые существуют во всех каталогах маршрута поиска в папку С:\ВАТ.</li> </ul><p>14. Двоеточие (:) перед словом образует из него ссылку, которая позволяет пропускать часть <a href="/sovremennyi-yazyk-programmirovaniya-vysokogo-urovnya-primery.html">программного кода</a> или возвращаться назад. Используется с командами Call и Goto, указывая, с какого места следует продолжать выполнение bat-файла, например, при выполнении определенного условия:</p><p>15. Переменные:</p><ul><li>%%a обозначает каждый файл в папке;</li><li>%CD% - текущая директория;</li><li>%DATE% - системная дата, формат которой зависит от локализации;</li><li>%TIME% - <a href="/sistemnoe-programmnoe-obespechenie-ppt-sistemnoe-po-vozmozhnye-vremena.html">системное время</a> в виде ЧЧ:ММ:СС.мм.;</li><li>%RANDOM% - сгенерированное <a href="/kak-ya-mogu-vyrovnyat-parallelnyi-lineinyi-kongruentnyi-generator.html">псевдослучайное число</a> в диапазоне от 0 до 32767;</li><li>%ERRORLEVEL% - код завершения, возвращаемый последней выполненной командой или bat-скриптом.</li> </ul><p>Извлечь часть строки, которая содержится в переменной, при известном ее положении и длине можно так:</p><p>%[переменная]:~[начало],[длина]%. Например, показать дату в формате ДД/ММ/ГГГГ как ГГГГ-ММ-ДД можно так: echo %DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%.</p><p>16. (". \") - корневая папка. При работе с консолью перед изменением имени файла, его удалением и т. д. необходимо направить действие команды в конкретный каталог. При использовании пакетного файла достаточно запустить его в любом нужном каталоге.</p><p>17. %цифра - принимает значения параметров, <a href="/perevodit-golosa-v-kontakte-peredaem-golosa-drugim-polzovatelyam-v.html">передаваемых пользователем</a> в bat-файл. Могут разделяться пробелами, запятыми или двоеточиями. «Цифра» представляет собой число от 0 до 9. Например, %0 принимает значение текущей команды. %1 соответствует первому параметру и т. д.</p><p>18. Shift - команда, используемая для смещения входных параметров на одну позицию. Применяется, когда пакетному файлу передаются внешние аргументы. Например, следующий bat-файл копирует на диск D файлы, заданные в качестве параметров в командной строке:</p><p>if not (%1)==() goto next</p><p>Кроме того, с аргументами можно производить следующие манипуляции:</p><ul><li>%~ - удалить окружающие кавычки;</li><li>%~f - расширить параметр до полного имени пути вместе с именем диска;</li><li>%~d - показать имя диска;</li><li>%~p - отобразить только путь;</li><li>%~n - выделить из параметра только имя файла;</li><li>%~x - оставить лишь расширение;</li><li>%~s - преобразовать путь в представление с короткими именами;</li><li>%~a - извлечь атрибуты файла;</li><li>%~t - вывести дату и время создания;</li><li>%~z - отобразить размер файла;</li><li>%~$PATH: - производит поиск в директориях, перечисленных в <a href="/peremennye-okruzheniya-chto-nasch-t-javascript.html">переменной окружения</a> PATH, и расширяет параметр до первого найденного соответствующего полного имени или же выдает пустую строку в случае неудачи.</li> </ul><p><img src='https://i2.wp.com/syl.ru/misc/i/ai/324915/1862020.jpg' width="100%" loading=lazy></p><h2>Подстановочные знаки</h2><p>Многие команды принимают шаблоны имен файлов - знаков, которые позволяют установить соответствие с группой имен файлов. К подстановочным знакам относятся:</p><ul><li>* (звездочка) - обозначает любую последовательность символов;</li><li>? (знак вопроса) - заменяет один (или 0) знак, отличный от точки (.).</li> </ul><p>Например, <a href="/spravka-po-komande-dir-i-ee-parametram-komandy-dlya-raboty-v-srede-ms-dos.html">команда dir</a> *.txt выводит список txt-файлов, а dir ???.txt - перечень <a href="/novyi-tekstovyi-dokument-bloknot-kak-otkryt-tekstovyi.html">текстовых документов</a>, длина имени которых не превышает 3 букв.</p><h2>Функции</h2><p>Как и подпрограммы, они эмулируются с помощью команд call, setlocal, endlocal и меток. Следующий пример демонстрирует возможность определения переменной, в которой сохраняется результат, в строке вызова:</p><p>call:say result=world</p><p><img src='https://i1.wp.com/syl.ru/misc/i/ai/324915/1862022.jpg' width="100%" loading=lazy></p><h2>Вычисления</h2><p>В bat-файлах можно выполнять простые арифметические операции с целыми 32-битными числами и битами с помощью команды set /a. Максимальным поддерживаемым числом является 2^31-1 = 2147483647, а минимальным - -(2^31) = -2147483648. Синтаксис напоминает язык программирования Си. К арифметическим операторам относятся: *, /, %, +, -. В bat-файле % (остаток <a href="/php-celochislennoe-delenie-obrabotka-chisel-i-matematicheskie.html">целочисленного деления</a>) должен вводиться как “%%”.</p><p>Операторы с <a href="/chisla-iz-dvoichnoi-v-desyatichnuyu-sistemy-schisleniya-pozicionnaya-sistema-schisleniya.html">двоичными числами</a> интерпретируют число как 32-битную последовательность. К ним относятся: ~ (побитовое НЕ или дополнение), & (И), | (ИЛИ), ^ (исключающее ИЛИ), << (сдвиг влево), >> (сдвиг вправо). <a href="/vse-operatory-pitona-i-ih-deistviya-logicheskie-operatory-v-python.html">Логическим оператором</a> отрицания является! (восклицательный знак). Он изменяет 0 в 1 и ненулевое значение в 0. Оператором комбинирования служит, (запятая), которая позволяет производить <a href="/cifry-ot-10-do-50-nazvaniya-bolshih-chisel-osobennosti-obrazovaniya-desyatkov-na.html">большее число</a> операций в одной команде set. Комбинированные операторы присваивания += и -= в выражениях a+=b и a-=и соответствуют выражениям a=a+b и a=a-b. Так же работают и *=, %=, /=, &=, |=, ^=, >>=, <<=. Приоритет операторов следующий:</p><p>(); %+-*/; >>, <<; &; ^; |; =, %=, *=, /=, +=, -=, &=, ^=, |=, <<=, >>=; ,</p><p>Литералы можно вводить в виде десятичных, шестнадцатеричных (с ведущими 0x) и восьмеричных чисел (с ведущим нулем). Например, set /a n1=0xffff присваивает n1 шестнадцатеричное значение.</p><h2>Внешние команды</h2><ul><li>Exit используется для выхода из консоли DOS или (с опцией /b) только текущего bat-файла или подпрограммы.</li><li>Ipconfig - это классическая консольная команда, которая выводит информацию о сети. Она включает MAC- и IP-адреса, и маски подсети.</li><li>Ping пингует IP-адрес, отправляя к нему пакеты данных, чтобы оценить его удаленность и время ожидания (отклика). Также используется для задания паузы. Например, команда ping 127.0.01 -n 6 приостанавливает выполнение кода на 5 с.</li> </ul><p>Библиотека команд bat-файлов огромна. К счастью, в Сети есть множество страниц, в которых все они перечислены, наряду с переменными пакетного скрипта.</p><p><img src='https://i2.wp.com/syl.ru/misc/i/ai/324915/1862017.jpg' width="100%" loading=lazy></p><h2>Шаг 3: запись и запуск bat-файла</h2><p>Следующий скрипт намного упростит ежедневную онлайн-активность. Что делать, если есть желание мгновенно открыть все свои любимые новостные сайты? Поскольку скрипты используют команды консоли, то можно создать сценарий, который открывает каждую новостную ленту в одном окне браузера.</p><p>Далее следует повторить процесс создания bat-файла, начав с пустого текстового документа. Для этого необходимо щелкнуть правой кнопкой мыши на пустом месте в какой-либо папке и выбрать пункт «Создать», а затем - «Текстовый документ». После открытия файла требуется ввести следующий скрипт, который запускает основные русскоязычные средства массовой информации, доступные в Интернете:</p><p>start "" http://fb.ru</p><p>start "" http://www.novayagazeta.ru</p><p>start "" http://echo.msk.ru</p><p>start "" http://www.kommersant.ru</p><p>start "" http://www.ng.ru</p><p>start "" http://meduza.io</p><p>start "" https://news.google.com/news/?ned=ru_ru&hl=ru</p><p>Данный скрипт содержит команды start “”, которые открывают несколько вкладок. Можно заменить предложенные ссылки любыми другими на выбор. После ввода скрипта следует зайти в меню редактора «Файл», а затем в «Сохранить как...» и записать документ с расширением.bat, изменив параметр «Тип файла» на «Все файлы» (*. *).</p><p>После сохранения для запуска скрипта достаточно дважды щелкнуть на нем. Веб-страницы мгновенно начнут загружаться. При желании можно разместить этот файл на своем рабочем столе. Это позволит получить мгновенный доступ ко всем любимым сайтам.</p><h2>Организатор</h2><p>Если загружать по несколько файлов в день, то в скором времени в папке «Загрузки» их скопятся сотни. Можно создать скрипт, который упорядочит их по типу. Достаточно поместить.bat-файл с программой в папку с неорганизованными данными и дважды щелкнуть для запуска:</p><p>rem Каждый файл в папке</p><p>for %%a in (".\*") do (</p><p>rem проверить на наличие расширения и непринадлежность к данному скрипту</p><p>if "%%~xa" NEQ "" if "%%~dpxa" NEQ "%~dpx0" (</p><p>rem проверить наличие папки для каждого расширения, и если ее нет, то создать</p><p>if not exist "%%~xa" mkdir "%%~xa"</p><p>rem переместить файл в папку</p><p>move "%%a" "%%~dpa%%~xa\"</p><p>В итоге файлы в директории «Загрузки» сортируются по папкам, названия которых соответствуют их расширению. Это так просто. Данный пакетный скрипт работает с любым типом данных, будь то документ, видео или аудио. Даже если ПК не поддерживает их, сценарий все равно создаст папку с соответствующей меткой. Если уже есть каталог JPG или PNG, то программа просто переместит туда файлы с данным расширением.</p><p>Это простая демонстрация того, на что способны пакетные скрипты. Если какую-то несложную задачу необходимо выполнять снова и снова, будь то упорядочение файлов, открытие нескольких веб-страниц, массовое переименование или создание копий важных документов, пакетный сценарий поможет выполнить утомительную работу за пару кликов.</p> <p>У многих технических писателей время от времени возникает необходимость автоматизировать обработку файлов. Когда-то речь идет об однократной обработке <a href="/chistka-organizma-kogda-ona-nuzhna-i-kak-pravilno-e-delat.html">большого количества</a> файлов, когда-то о систематическом выполнении одних и тех же действий, например, при использовании технологий DocBook или DITA). Обработка каждого файла отдельной командой, подаваемой вручную, не только отнимает время, но и приводит к трудно определяемым ошибкам, возникающим из-за естественной невнимательности оператора.</p> <p>В операционной системе MS-DOS и во всех операционных системах семейства Microsoft Windows простейшим средством автоматизации обработки файлов (и каталогов) служат так называемые командные файлы. Скажем сразу, что командные файлы — не единственное средство автоматизации работы пользователя даже из числа встроенных. В операционных системах семейства Microsoft Windows, начиная с версии 98, имеется еще Windows Script(ing) Host. Кроме того, никто не запрещает нам использовать в этих целях какой-нибудь интерпретируемый язык, скажем, Perl, Python или Ruby. Однако перечисленные средства, хотя и мощны, требуют умения программировать, т.е. составлять и, что немаловажно, отлаживать программы, хотя бы на неплохом любительском уровне. Использование же командных файлов доступно всякому без особенной подготовки, вполне достаточно внимательности и здравого смысла.</p> <p>Важное замечание. Полный справочник или даже добросовестно составленный учебник по командам MS-DOS и разработке командных файлов должен был бы описывать многочисленные нюансы, связанные с использованием различных параметров, особенностями работы командных файлов в разных версиях Microsoft Windows и т.д. и т.п. Предлагаемая статья не претендует на полноту изложения, в частности:</p> <ul><li>мы не будем описывать разные способы достижения одного и того же результата;</li> <li>мы не будем описывать все возможности и варианты применения упоминаемых команд.</li> </ul><p>Сейчас наша задача в том, чтобы помочь начать осваивать командные файлы тем, кто полностью или почти незнаком с этим инструментом. Обо всех деталях потом можно будет прочитать в фирменной документации или в справочниках.</p> <h2>Командный процессор</h2> <p>В состав многих операционных систем, в том числе, разработанных <a href="/kogda-vyidet-novaya-windows-uskorennaya-klaviatura-quicktype-pochemu-mnogie-hotyat-chtoby.html">корпорацией Microsoft</a>, входит командный процессор. Так называется программа, которая инициирует выполнение всевозможных действий в ответ на команды, вводимые пользователем с клавиатуры. В основном эти действия заключаются в запуске <a href="/kakie-programmy-nuzhny-dlya-risovaniya-programma-dlya-sozdaniya-artov.html">нужных программ</a> с теми или иными параметрами. Но не только; дальше мы увидим, что некоторые команды выполняются непосредственно командным процессором. В основном это те команды, которые служат для управления контекстом и последовательностью выполнения команд. Однако мы не будем особенно глубоко задумываться о природе команд, во всяком случае, без необходимости. Важнее другое: любая программа, которую технически возможно запустить из командной строки, рассматривается командным процессором как команда. Он не делает различий между «родными» командами, изначально встроенными в операционную систему, и программами, которые были установлены поверх нее.</p> <p>Для того чтобы запустить командный процессор:</p> <ol><li>Нажмите на кнопку <b>Пуск </b>. На экран будет выведено главное меню.</li> <li>Выберите в главном меню пункт Выполнить. На экран будет выведено диалоговое окно <b>Запуск программы </b>.</li> <li>В поле Открыть введите строку <b>cmd </b>.</li> <li>Нажмите на кнопку <b>OK </b>. На экран будет выведено окно командного процессора.</li> </ol><h2>Командная строка и команды</h2> <p>Окно командного процессора в первозданном виде выглядит мрачно, и работать с ним большинству людей не очень удобно. Намного проще пользоваться <a href="/failovye-menedzhery-poyasnenie-i-primery-failovyi-menedzher.html">файловыми менеджерами</a> в стиле Norton Commander. В них предусмотрены как средства для быстрой навигации по файловой системе, так и срока для ввода команд.</p> <p>Для того чтобы ввести команду:</p> <ol><li>Наберите текст команды в командной строке.</li> <li>Нажмите на клавишу <b>Enter </b>.</li> </ol><p>Командный процессор и команды <a href="/chto-takoe-operativnaya-sistema-kompyutera-svobodnye-operacionnye-sistemy.html">операционной системы</a> описаны в эксплуатационной документации на последнюю. Эта документация частично содержится внутри самой операционной системы. Для доступа к ней предназначена команда <b>help </b>. По этой команде на экран выводится список <a href="/nastroika-i-ustanovka-servera-predpriyatiya-opisanie-dostupnyh-komand-server.html">доступных команд</a>. Для того чтобы получить описание конкретной команды, в качестве параметра команда <b>help </b>следует указать ее имя. Командная строка, показанная на следующем листинге, выводит на экран описание команды <b>for </b>.</p><p>Help for </p><p>Если вы попробовали ввести команду <b>help </b>, то наверно обратили внимание, что результат ее работы (т.н. выдача) не умещается на один экран. Та же проблема возникает с текстом описания команды <b>for </b>. Хорошая новость состоит в том, что выдачу можно перенаправить в файл. Командная строка, показанная на следующем листинге, формирует файл <b>commands.txt </b>, содержащий список всех команд MS-DOS.</p><p>Help > commands.txt </p><p>Для того чтобы сформировать файл с описанием команды <b>for </b>, надо дать такую команду (имя выходного файла можете сделать любым).</p><p>Help for > for.txt </p><p>Всего в современных операционных системах корпорации Microsoft чуть меньше 80 команд, и описать их в одной статье невозможно. Здесь мы можем только упомянуть о нескольких командах, полезных для автоматизации обработки файлов и показать, как ими пользоваться. Эти команды будут в дальнейшем использоваться в примерах. Детали вы всегда сможете уточнить по команде <b>help </b>или в справочнике.</p> <p><b>copy </b>— копирование одного или нескольких файлов;</p> <p><b>del </b>— удаление одного или нескольких файлов;</p> <p><b>move </b>— перемещение одного или нескольких файлов или каталогов;</p> <p><b>rename </b>(сокращенно <b>ren </b>) — переименование одного или нескольких файлов или каталогов;</p> <p><b>xcopy </b>— копирование дерева подкаталогов;</p> <p><b>mkdir </b>(сокращенно <b>md </b>) — создание каталога;</p> <p><b>rmdir </b>(сокращенно <b>rd </b>) — удаление каталога.</p> <p>Одно из <a href="/vynesenie-obshchego-mnozhitelya-vynesenie-za-skobki-obshchego-mnozhitelya.html">общих правил</a> синтаксиса команд MS-DOS состоит в том, что при указании параметров сначала указывается источник, а котом результат. Например, если мы хотим переместить файл <b>beer.txt </b>из каталога <b>box </b>в каталог <b>table </b>, мы должны ввести команду, приведенную на следующем листинге.</p><p>Move box\beer.txt table </p><p>Сначала что переместить, потом куда переместить.</p> <p>Если мы хотим переименовать файл <b>lena.txt </b>в файл <b>natasha.txt </b>, то команда должна быть записана так, как показано ниже.</p><p>Ren lena.txt natasha.txt </p><p>Сначала что переименовать, потом во что переименовать.</p> <h2>Текущий каталог. Абсолютные и относительные пути</h2> <p>При работе с файловыми командами исключительную важность приобретает понятие текущего каталога. Дело в том, что при указании файла в качестве параметра команды мы всегда используем один из двух <a href="/pochemu-ne-ustanavlivayutsya-prilozheniya-na-android-vozmozhnye-prichiny-ne.html">возможных способов</a> указания на них: либо абсолютный путь, либо относительный путь. В полном пути мы указываем все, начиная с диска (или сетевого <a href="/gde-nahoditsya-imya-kompyutera-uznat-imya-kompyutera-po-ip-adresu.html">имени компьютера</a>), например <b>d:\misha\box\beer.txt </b>. Какой бы каталог ни оказался текущим в момент ввода команды, полный путь будет соответствовать одному и тому же файлу. Для относительного пути текущий каталог служит отправной точкой. Простейший случай <a href="/v-chem-raznica-mezhdu-absolyutnoi-i-otnositelnoi-prigodnostyu-v-chem-raznica-mezhdu.html">относительного пути</a> — имя файла. В контексте выполнения команды оно означает файл с таким именем, расположенный в текущем каталоге.</p> <p>Для записи относительного пути к текущему каталогу существует условная запись <b>. </b> (точка). Для записи относительного пути к каталогу, в котором содержится текущий каталог, существует условная запись <b>.. </b> (две точки). Команда, показанная на следующем листинге, копирует все файлы из текущего каталога в каталог <b>neighbour </b>, расположенный рядом с ним.</p><p>Copy *.* .\neighbour </p><h2>Командные файлы</h2> <p>До сих пор, приводя примеры, мы считали, что всякий раз вводим команды вручную. При обработке большого количества файлов или при систематическом выполнении одних и тех же команд это становится обременительно. Поэтому в командном процессоре предусмотрена возможность выполнения командных файлов. Командный файл — это <a href="/zapis-v-fail-si-rabota-s-tekstovymi-failami.html">текстовый файл</a>, в котором набраны команды (или хотя бы одна команда). Пример командного файла показан на следующем листинге. Попробуйте догадаться, что делает этот <a href="/zapusk-faila-iz-komandnoi-stroki-rabota-s-failami-v.html">командный файл</a>.</p><p>Help copy > copy.help help move > move.help md msdos-help move *.help msdos-help </p><p>Если назначение этого файла остается для вас загадкой, то попробуйте в действительности создать и выполнить его. Командным файлам принято давать расширение <b>bat </b>. По нему файлы этого типа опознаются командным процессором. Этот файл можно назвать, например, <b>make-help.bat </b>.</p> <p>Для того чтобы запустить командный файл:</p> <ol><li>Введите его имя в качестве команды. После этого командный файл будет выполнен.</li> </ol><p>В командном файле каждая команда занимает одну строку. Точнее, существует способ расположить одну команду на нескольких подряд идущих строках, для этого непосредственно перед каждым переводом строки следует поставить символ «крышка» <b>^ </b>. (Необходимо, чтобы каждая «крышка» была последним символом в своей строке; после нее не должно быть пробелов и табуляций). Пример такой команды показан на следующем листинге.</p><p>If exist disser.txt ^ copy disser.txt ^ d:\science\papers\drafts\sources </p><p>Но для простоты, чтобы каждый раз не делать оговорок, мы будем считать, что в некотором смысле это одна длинная «логическая» строка.</p> <p>При выполнении командного файла командный процессор просматривает его сверху вниз от первой строки к последней и выполняет команды в том порядке, в котором их обнаруживает. Выполняет он в целом их так, как если бы мы каждую из них вводили вручную. В целом, потому что некоторые команды при вводе вручную и при выполнении из командного файла ведут себя немного по-разному.</p> <p>Забегая вперед, скажем, что при необходимости последовательность выполнения команд можно изменить с помощью управляющих команд (с чем может быть связана такая необходимость, вопрос отдельный).</p> <p>Не путайте текущий каталог с каталогом, в котором находится запускаемый командный файл. Предположим, текущим каталогом является <b>work </b>, в нем находится каталог <b>tools </b>, а в каталоге tools хранятся командные файлы. Вы запускаете один из них командой <b>tools\collect-images.bat </b>. Так вот, «с точки зрения» этого командного файла, текущим каталогом все равно окажется <b>work </b>, а не <b>tools </b>.</p> <h2>Комментирование командного файла и его выдачи. Команды echo и rem</h2> <p>Командный файл, по существу, представляет собой программу, написанную на языке командного процессора операционной системы. Текст программы полагается снабжать комментариями, чтобы, вернувшись к нему некоторое время спустя, не вспоминать мучительно, для чего эта программа нужна, и как она устроена.</p> <p>В системе команд MS-DOS для оформления комментариев предусмотрена команда <b>rem </b>. Это фиктивная команда, которая не предполагает выполнения каких бы то ни было действий, но позволяет написать в строке после своего имени произвольный текст. Причем командный процессор не воспринимает его как синтаксическую ошибку. Пример оформления командного файла комментариями показан на следующем листинге.</p><p>Rem ***************************************************** rem Формирование файлов справки по командам copy и move rem ***************************************************** rem Формируем файлы справки help copy > copy.help help move > move.help rem Создаем каталог для хранения файлов справки md msdos-help rem Перемещаем файлы справки в подготовленный каталог move *.help msdos-help </p><p>Обратите внимание на пустые строки, которыми командный файл разбит на «абзацы». Этот простой прием позволяет сделать командный файл более читабельным.</p> <p>При выполнении приведенного выше командного файла все команды будут выводиться на экран по мере их выполнения, что не всегда удобно. Выдачу команд можно отключить с помощью команды <b>@echo off </b>. Символ «собака» перед командой <b>echo </b>означает, то и сама эта команда должна выполняться в «молчаливом» режиме. С таким же успехом мы могли бы не пользоваться командной <b>echo off </b>, а поместить «собаку» перед каждой командой.</p> <p>Во многих случаях требуется, чтобы командный файл выводил на экран (или в файл) те или иные сообщения. В одних случаях это могут быть сообщения об ошибках, в других информационные сообщения, объясняющие пользователю командного файла, что происходит в <a href="/zablokirovan-profil-v-odnoklassnikah-chto-delat-posledstviya-lozhnoi.html">данный момент</a>, когда-то мы формируем командным файлом какой-нибудь другой <a href="/fail-s-rasshireniem-xls-soderzhit-kak-v-eksel-rasshirenie-faila-vybrat.html">полезный файл</a>. Для вывода сообщений применяется та же самая команда echo. В качестве параметра ей передают текст выводимого сообщения. Листинг усовершенствованного командного файла приведен ниже.</p><p> @echo off rem ***************************************************** rem Формирование файлов справки по командам copy и move rem ***************************************************** @echo Формируем файлы справки. Одну секундочку... rem Формируем файлы справки help copy > copy.help help move > move.help rem Создаем каталог для хранения файлов справки md msdos-help rem Перемещаем файлы справки в подготовленный каталог move *.help msdos-help echo Готово! </p><h2>Передача командному файлу параметров</h2> <p>Предположим, мы хотим создать командный файл, который сначала формирует справку с описанием заданной пользователем команды, а потом загружает его для просмотра в блокнот. Фокус в том, чтобы при очередном запуске командного файла каким-то образом сообщить ему, какая именно команда нас интересует на этот раз.</p> <p>Для решения этой задачи предусмотрен механизм обработки параметров. Работает он довольно просто. Если при запуске командного файла пользователь указал несколько параметров, то в тексте командного файла первый из них мы обозначаем записью <b>%1 </b>, второй записью <b>%2 </b>, третий записью <b>%3 </b> и т.д. Этими обозначениями мы пользуемся в тексте командного файла примерно так же, как в естественной речи местоимениями.</p> <p>Текст командного файла, решающего поставленную задачу, приведен на следующем листинге. Обратите внимание на команду <b>help </b>. В качестве ее параметра ей передается первый параметр командного файла.</p><p> @echo off rem Формируем файл с описанием команды, rem имя которой передано параметром help %1 > help.tmp rem Загружаем файл описания в редактор Блокнот notepad help.tmp </p><p>Предположим, что мы присвоили этому командному файлу имя <b>show-help.bat </b>. Для того чтобы загрузить в блокнот описание команды, например, <b>dir </b>, мы должны ввести команду следующим образом.</p><p>Show-help.bat dir </p><p>Следующий командный файл создает каталог с именем, указанным в первом параметре, и записывает в него файл с текстом описания команды, указанной во втором параметре.</p><p>Rem Пример командного файла с двумя параметрами rem Создаем каталог с именем, заданным первым параметром md %1 rem Создаем в нем файл с описанием команды, rem заданной вторым параметром help %2 > %1\%2.help </p><p>Что произойдет, если пользователь при запуске этого командного файла укажет не два, а четыре параметра? Ничего страшного, они ничему не помешают, просто не будут использованы. А что будет, если пользователь укажет только первый параметр? Второй параметр окажется пустым. Эффект получится такой: командный файл будет выполнен, но так, как будто на месте записи <b>%2 </b> ничего нет. Команда help сформирует список всех команд и поместит его в файл с пустым именем и расширением.help. Если же пользователь запустить этот файл, не указав ни одного параметра, то при попытке командного процессора выполнить команду <b>md </b>(напомним, она предназначена для создания каталога), мы получим сообщение о <a href="/chto-delat-esli-sintaksicheskaya-oshibka-kak-ustranit-sintaksicheskuyu.html">синтаксической ошибке</a>, поскольку у команды md обязательно должен быть параметр.</p> <p>Таким образом, использование параметров создает <a href="/kak-delat-skrin-na-androide-7-otlichitelnye-priznaki-nekotoryh.html">большие возможности</a>, но может существенно усложнить дело. Для того чтобы командный файл всегда работал корректно, необходимо проверять корректность указания пользователем параметров и каким-то образом реагировать на неполные или неверные входные данные. Можно, конечно, этого и не делать, но некорректно работающий командный файл может наломать дров, особенно, если он предусматривает удаление или перезапись данных.</p> <h2>Переменные. Команда set</h2> <p>Переменной называется поименованное значение. В учебниках по программированию переменную обычно сравнивают с конвертом, на котором написано имя. Внутрь конверта можно положить нечто, например, определенную сумму денег — это ее значение. Как и в случае с конвертом, значение переменной можно изменить.</p> <p>Для объявления переменной и одновременно для присвоения ей значения применяется команда <b>set </b>. Пример записи этой команды показан на следующем листинге.</p><p>Rem Компилятор хелп-файлов в формате CHM set help_compiler=c:\HTML Help Workshop\hcc.exe </p><p>Для извлечения значения переменной ее имя помещают между двумя знаками процента, как показано ниже.</p><p>Rem Компилятор хелп-файлов в формате CHM set help_compiler=c:\HTML Help Workshop\hcc.exe rem Проект хелп-файла модуля "Склад" set store_hpj=help\sources\store\store.hpj rem Проект хелп-файла модуля "Продажи" set sales_hpj=help\sources\sales\sales.hpj rem Компилируем хелп-файлы %help_compiler% %store_hpj% %help_compiler% %sales_hpj% </p><p>Приведенный листинг показывает, в чем польза переменных.</p> <p>Во-первых, они позволяют вместо длинного фрагмента (например, пути к компилятору хелп-файлов) использовать внутри командного файла синонимичный ему короткий. Как минимум, это удобно.</p> <p>Во-вторых, они позволяют избежать повторения в тексте командного файла фрагментов, которые в дальнейшем могут меняться. Представьте себе, что мы переустановили Microsoft HTML Workshop в другой каталог. Если в командном файле для записи пути к нему применяется переменная, то будет достаточно исправить в командном файле только одну строку, а именно, ту в которой присваивается значение переменной <b>help_compiler </b>. Если бы мы писали путь к компилятору всякий раз, когда его необходимо взывать, то после изменения пути нам пришлось бы исправить каждую такую строку. В приведенном примере их две, но в реальном проекте их с таким же успехом может оказаться пять или пятнадцать, по числу хелп-файлов, которые мы хотим скомпилировать. Проблема не в том, что исправлять вручную каждую строчку тяжело (в конце концов, команды “copy” и “paste” никто не отменял), а в том, что это сильно повышает вероятность случайной ошибки.</p> <p>Параметры командного <a href="/mp4-rasshirenie-faila-mpeg4-i-mp4---eto-odno-i-tozhe-vyyasnyaem-nyuansy-fail-mp.html">файла тоже</a> являются переменными, но от обычных переменных отличаются тем, что их значения задаются при запуске командного файла. В дальнейшем, говоря о переменных, в особенности о работе с их значениями, мы будем иметь в виду и параметры командного файла тоже, во всяком случае, в отсутствие явных оговорок на это счет.</p> <p>При написании командных файлов часто применяют следующий прием: несколько значений переменных указывают рядом (или перемежая их какими-либо символами или строками), так, чтобы получить некоторое новое осмысленное значение. Пример приведен на следующем листинге.</p><p>Rem Путь к компилятору хелп-файлов set help_compiler="c:\Program Files\HTML Help Workshop\hhc.exe" rem Путь к каталогу, в котором находятся проекты хелп-файлов set project_path=e:\work\projects\help-projects rem Вызываем компилятор для обработки конкретного проекта, rem имя которого передаем в первом параметре %help_compiler% %project_path%\%1.hpj </p><h2>Проверка условий и выбор вариантов. Команды if и goto</h2> <p>Команда if позволяет выделять в командном файле группы команд, которые выполняются или не выполняются в зависимости от определенных условий. Для чего это нужно?</p> <p>Проверка условия — почти необходимая мера при создании командных файлов, использующих параметры. Перед тем, как начинать работу, командный файл, вообще говоря, должен удостовериться в том, что ему передан корректный набор параметров. В противном случае велик риск, что он выполнится неверно или безрезультатно, а пользователю останется только гадать, в чем же проблема. Более того, если командный файл удаляет, перемещает или перезаписывает какие-либо данные, то при некорректных параметрах он может даже нанести ущерб.</p> <p>На следующем листинге показан уже знакомый вам командный файл компиляции хелп-файла. В начало командного файла добавлена проверка первого параметра на непустоту. Обратите внимание на такую особенность синтаксиса: для операции сравнения используется сдвоенный знак равенства. Если первый параметр оказывается непустым, срабатывает команда goto, которая «перебрасывает» командный процессор к указанной метке. В данном случае имя этой метки compile. Обратите внимание, что там, где метка находится, ее имя предваряется двоеточием, а в команде goto нет. При пустом первом параметре командный процессор переходит к <a href="/kak-sdelat-krasnuyu-stroku-v-dokumente-chtoby-sdelat-krasnuyu-stroku.html">следующей строке</a>, которая выдает сообщение об ошибке. А потом к следующей, которая перебрасывает его в самый конец файла к метке с именем <b>finish </b>.</p><p> @echo off rem Проверяем, задан ли параметр if not "%1"=="" goto compile rem Если параметр пуст, выдаем сообщение об ошибке echo Не указано имя проекта хелп-файла rem и переходим в конец командного файла rem к метке finish goto finish rem Это метка с именем compile:compile rem Ниже расположены команды компиляции rem Путь к компилятору хелп-файлов set help_compiler="c:\Program Files\HTML Help Workshop\hhc.exe" rem Путь к каталогу, в котором находятся проекты хелп-файлов set project_path=e:\work\projects\help-projects rem Вызываем компилятор для обработки конкретного проекта, rem имя которого передаем в первом параметре %help_compiler% %project_path%\%1.hpj rem Это метка с именем finish:finish </p><p>Скажем прямо, предложенный способ проверки параметра не самый удачный.</p> <p>Во-первых, если пользователь по ошибке укажет в качестве параметра имя несуществующего файла, командный файл этим удовлетворится и предпримет попытку компиляции. Более правильный способ — проверить, существует ли такой файл в действительности. Для этого в языке команд MS-DOS предусмотрено специальное слово <b>exist </b>. Поэтому лучше было бы написать: <b>if exist %1.hpj goto compile </b>.</p> <p>Во-вторых, <a href="/aktivnyi-damp-pamyati-ispolzovanie-dampa-pamyati-dlya-diagnostiki.html">активное использование</a> команды <b>goto </b>(т.н. безусловного перехода) и меток сильно запутывают код. Технически они ничем не плохи, но отлаживать и сопровождать командный файл, написанный в таком стиле, довольно неудобно. Поэтому программисты издавна считают безусловный переход приемом нежелательным. Ниже показан более правильный, с точки зрения стиля программирования, структурированный вариант, в котором используется конструкция <b>if…else </b>. Работает она так: если условие истинно, выполняются команды в скобках после <b>if </b>, а если ложно, то в скобках после <b>else </b>.</p><p> @echo off rem Проверяем, задан ли параметр if not exist %1.hpj (rem Если параметр пуст, выдаем сообщение об ошибке echo Такого проекта хелп-файла не существует.) else (rem Ниже расположены команды компиляции rem Путь к компилятору хелп-файлов set help_compiler="c:\Program Files\HTML Help Workshop\hhc.exe" rem Путь к каталогу, в котором находятся проекты хелп-файлов set project_path=e:\work\projects\help-projects rem Вызываем компилятор для обработки конкретного проекта, rem имя которого передаем в первом параметре %help_compiler% %project_path%\%1.hpj) </p><p>Обратите внимание на отступы от левого края. Они необязательны, но делают текст командного файла более читабельным.</p> <p>Приведем еще один пример работы с проверками. Следующий командный файл создает каталог с именем <b>help-files </b> (предположим, для выгрузки в него скомпилированных хелп-файлов). При этом, если каталог с таким именем уже существует (и в нем, вероятно, находятся старые хелп-файлы, которые не хотелось бы терять: вдруг новые окажутся хуже?), командный файл присваивает ему <a href="/fail-bak-v-avtokade-rasshirenie-faila-bak.html">расширение bak</a>. Но если каталог <b>help-files.bak </b> уже существовал, то командный файл его удаляет (будем считать, что одной <a href="/chto-takoe-rezervnaya-kopiya-iphone-dlya-chego-nuzhna-chto-ona.html">резервной копии</a> нам хватит).</p><p>If exist help-files.bak rd help-files.bak if exist help-files ren help-files help-files.bak md help-files </p><h2>Массовая обработка файлов. Команда for</h2> <p>Команда for позволяет организовать выполнение повторяющихся <a href="/slishkom-mnogo-odnotipnyh-deistvii-flood-control-oshibki-server-error-vkontakte.html">однотипных действий</a>. Можно использовать ее для того, чтобы вывести на экран числа от одного до десяти, как показано на следующем листинге.</p><p>For /l %%i in (1,1,10) do echo %%i </p><p>Переменная <b>i </b> называется счетчиком цикла. В силу своеобразия синтаксиса команды <b>for </b>, имя счетчика цикла должно состоять из одной буквы. Причем, если мы пишем командный файл, то перед именем счетчика цикла надо поставить сдвоенный знак процента, если же мы просто набираем команду в командной строке, то одиночный.</p> <p>Логика работы этой команды такова. После слова <b>in </b> указан диапазон изменения счетчика цикла. В <a href="/kak-otformatirovat-fleshku-s-failovoi-sistemoi-raw-kak-vosstanovit.html">данном варианте</a> команды это тройка чисел: <a href="/kak-v-vorde-postavit-snosku-vnizu-stranicy-kak-izmenit-nachalnoe-znachenie.html">начальное значение</a> счетчика, шаг счета, предельное значение счетчика. При выполнении команды командный процессор сначала присвоит переменной <b>i </b> значение <b>1 </b>, а потом на каждом шаге цикла будет увеличивать его на <b>1 </b>, пока оно не превысит <b>10 </b>. Очевидно, таких шагов получится десять. Если бы в качестве шага счета мы указали число <b>2 </b>, то цикл выполнился бы пять раз. На каждом шаге цикла выполняется тело цикла, написанное после слова <b>do </b>. В приведенном примере это команда echo, которая выводит на экран текущее значение счетчика цикла.</p> <p>Наверно можно придумать ситуацию, когда что-то подобное на самом деле требуется, но обычно команда <b>for </b>используется для перебора и обработки файлов. Надо сказать, что в достаточно простых случаях <a href="/massovaya-obrabotka-fotografii-paketnaya-obrabotka-fotografii-izobrazhenii.html">массовая обработка</a> файлов выполняется с помощью подстановочных символов. Если, мы хотим всем файлам в текущем каталоге заменить расширение <b>.htm </b> на <b>.html </b>, мы вводим команду <b>ren *.htm *.html </b>. Но если то же самое надо сделать не в одном каталоге, а в дереве каталогов, то без команды for не обойтись. Приведенный ниже командный файл выполняет эту операцию для всех htm-файлов в подкаталоге website текущего каталога. Точнее, во всем дереве каталогов, которое находится внутри <b>website </b>.</p><p>For /r website %%i in (*.htm) do ren %%i %%~ni.html </p><p>Ключ <b>/r </b> указывает на необходимость обхода каталога <b>website </b> и всех его внутренностей. Если его не указать (но тогда и каталог указывать не разрешается), то обработаны будут только файлы в текущем каталоге. Диапазоном значений счетчика цикла в данном варианте команды является множество всех файлов с расширением <b>.htm </b>, находящихся внутри каталога (точнее, дерева) <b>website </b>. Странная на первый взгляд запись <b>~ni </b> означает, что из значения переменной <b>i </b> требуется выделить только имя файла. В языке команд MS-DOS предусмотрено несколько таких модификаторов, например, запись <b>~хi </b> обозначает расширение файла. Все модификаторы описаны в справке по команде <b>for </b>.</p> <p>Тело цикла может состоять из нескольких команд, заключенных в скобки.</p><p> @echo off for /r website %%i in (*.htm) do (rem Выводим имя файла echo %%i rem Переименовываем файл ren %%i %%~ni.html) </p><h2>Передача управления другому командному файлу. Команда call</h2> <p>Существует возможность вызвать из одного командного файла другой командный файл. Для этого служит команда <b>call </b>. Замечательно, переменные, заданные в вызывающем командном файле «видны» вызванному. И наоборот, после того, как вызванный файл закончит работу и вернет управление вызвавшему, последний будет «видеть» переменные, оставленные ему вызванным «в наследство». Это позволяет разработчику командных файлов действовать, например, следующим образом. Если несколько командных файлов должны пользоваться одними и теми же значениями, допустим, путями к каким-то файлам, их можно вынести в отдельный командный файл, который будет играть роль конфигурационного файла. Каждый рабочий командный файл будет начинаться вызовом конфигурационного. Выигрыш в том, что при изменении путей вносить изменения придется только в один <a href="/bezdiskovaya-zagruzka-windows-10-po-seti-kak-rabotaet-pxe-izmenenie.html">конфигурационный файл</a>, а не во множество рабочих.</p> <p>«Конфигурационный» командный файл <b>config.bat </b>.</p><p>Rem Путь к компилятору хелп-файлов set help_compiler="c:\Program Files\HTML Help Workshop\hhc.exe" rem Путь к каталогу, в котором находятся проекты хелп-файлов set project_path=e:\work\projects\help-projects </p><p>«Рабочий» командный файл.</p><p> @echo off rem Настраиваем переменные call config.bat rem Проверяем, задан ли параметр if not exist %1.hpj (rem Если параметр пуст, выдаем сообщение об ошибке echo Такого проекта хелп-файла не существует.) else (rem Ниже расположены команды компиляции rem Вызываем компилятор для обработки конкретного проекта, rem имя которого передаем в первом параметре %help_compiler% %project_path%\%1.hpj) </p> <p><b>Писать bat-файлы может каждый! </b></p><p><b>Командный процессор </b></p><p>В состав многих операционных систем, в том числе, разработанных корпорацией Microsoft, входит командный процессор. Так называется программа, которая инициирует выполнение всевозможных действий в ответ на команды, вводимые пользователем с клавиатуры. В основном эти действия заключаются в запуске нужных программ с теми или иными параметрами. Но не только; дальше мы увидим, что некоторые команды выполняются непосредственно командным процессором. В основном это те команды, которые служат для управления контекстом и последовательностью выполнения команд. Однако мы не будем особенно глубоко задумываться о природе команд, во всяком случае, без необходимости. Важнее другое: любая программа, которую технически возможно запустить из командной строки, рассматривается командным процессором как команда. Он не делает различий между «родными» командами, изначально встроенными в операционную систему, и программами, которые были установлены поверх нее.</p><p>Для того чтобы запустить командный процессор:</p><ol><p>Нажмите на кнопку <b>Пуск </b>. На экран будет выведено главное меню.</p><p>Выберите в главном меню пункт Выполнить. На экран будет выведено диалоговое окно <b>Запуск программы </b>.</p><p>В поле Открыть введите строку <b>cmd </b>.</p><p>Нажмите на кнопку <b>OK </b>. На экран будет выведено окно командного процессора.</p> </ol><p><b>Командная строка и команды </b></p><p>Окно командного процессора в первозданном виде выглядит мрачно, и работать с ним большинству людей не очень удобно. Намного проще пользоваться файловыми менеджерами в стиле <a href="/failovyi-menedzher-norton-commander-menedzher-norton-commander-alternativnaya-zamena.html">Norton Commander</a>. В них предусмотрены как средства для быстрой навигации по файловой системе, так и срока для ввода команд.</p><p>Для того чтобы ввести команду:</p><ol><p>Наберите текст команды в командной строке.</p><p>Нажмите на клавишу <b>Enter </b>.</p> </ol><p>Командный процессор и команды операционной системы описаны в эксплуатационной документации на последнюю. Эта документация частично содержится внутри самой операционной системы. Для доступа к ней предназначена команда <b>help </b>. По этой команде на экран выводится список доступных команд. Для того чтобы получить описание конкретной команды, в качестве параметра команда <b>help </b>следует указать ее имя. Командная строка, показанная на следующем листинге, выводит на экран описание команды <b>for </b>.</p><p>Если вы попробовали ввести команду <b>help </b>, то наверно обратили внимание, что результат ее работы (т.н. выдача) не умещается на один экран. Та же проблема возникает с текстом описания команды <b>for </b>. Хорошая новость состоит в том, что выдачу можно перенаправить в файл. Командная строка, показанная на следующем листинге, формирует файл <b>commands.txt </b>, содержащий список всех команд MS-DOS.</p><p>help > commands.txt</p><p>Для того чтобы сформировать файл с описанием команды <b>for </b>, надо дать такую команду (имя выходного файла можете сделать любым).</p><p>help for > for.txt</p><p>Всего в современных операционных системах корпорации Microsoft чуть меньше 80 команд, и описать их в одной статье невозможно. Здесь мы можем только упомянуть о нескольких командах, полезных для автоматизации обработки файлов и показать, как ими пользоваться. Эти команды будут в дальнейшем использоваться в примерах. Детали вы всегда сможете уточнить по команде <b>help </b>или в справочнике.</p><p><b>copy </b>- копирование одного или нескольких файлов;</p><p><b>del </b>- удаление одного или нескольких файлов;</p><p><b>move </b>- перемещение одного или нескольких файлов или каталогов;</p><p><b>rename </b>(сокращенно <b>ren </b>) - переименование одного или нескольких файлов или каталогов;</p><p><b>xcopy </b>- копирование дерева подкаталогов;</p><p><b>mkdir </b>(сокращенно <b>md </b>) - создание каталога;</p><p><b>rmdir </b>(сокращенно <b>rd </b>) - удаление каталога.</p><p>Одно из общих правил синтаксиса команд MS-DOS состоит в том, что при указании параметров сначала указывается источник, а потом результат. Например, если мы хотим переместить файл <b>beer.txt </b>из каталога <b>box </b>в каталог <b>table </b>, мы должны ввести команду, приведенную на следующем листинге.</p><p>move box\beer.txt table</p><p>Сначала что переместить, потом куда переместить.</p><p>Если мы хотим переименовать файл <b>lena.txt </b>в файл <b>natasha.txt </b>, то команда должна быть записана так, как показано ниже.</p><p>ren lena.txt natasha.txt</p><p>Сначала что переименовать, потом во что переименовать.</p><p><b>Текущий каталог. Абсолютные и относительные пути </b></p><p>При работе с файловыми командами исключительную важность приобретает понятие текущего каталога. Дело в том, что при указании файла в качестве параметра команды мы всегда используем один из двух возможных способов указания на них: либо абсолютный путь, либо относительный путь. В полном пути мы указываем все, начиная с диска (или <a href="/titany-klasternogo-fronta-resheniya-dlya-postroeniya-klasterov-ot.html">сетевого имени</a> компьютера), например <b>d:\misha\box\beer.txt </b>. Какой бы каталог ни оказался текущим в момент ввода команды, полный путь будет соответствовать одному и тому же файлу. Для относительного пути текущий каталог служит отправной точкой. Простейший случай относительного пути - имя файла. В контексте выполнения команды оно означает файл с таким именем, расположенный в текущем каталоге.</p><p>Для записи относительного пути к текущему каталогу существует условная запись <b>. </b> (точка). Для записи относительного пути к каталогу, в котором содержится текущий каталог, существует условная запись <b>.. </b> (две точки). Команда, показанная на следующем листинге, копирует все файлы из текущего каталога в каталог <b>neighbour </b>, расположенный рядом с ним.</p><p>copy *.* .\neighbour</p><p><b>Командные файлы </b></p><p>До сих пор, приводя примеры, мы считали, что всякий раз вводим команды вручную. При обработке большого количества файлов или при систематическом выполнении одних и тех же команд это становится обременительно. Поэтому в командном процессоре предусмотрена возможность выполнения командных файлов. Командный файл - это текстовый файл, в котором набраны команды (или хотя бы одна команда). Пример командного файла показан на следующем листинге. Попробуйте догадаться, что делает этот командный файл.</p><p>help copy > copy.help</p><p>help move > move.help</p><p>move *.help msdos-help</p><p>Если назначение этого файла остается для вас загадкой, то попробуйте в действительности создать и выполнить его. Командным файлам принято давать расширение <b>bat </b>. По нему файлы этого типа опознаются командным процессором. Этот файл можно назвать, например, <b>make-help.bat </b>.</p><p>Для того чтобы запустить командный файл:</p><ol><p>Введите его имя в качестве команды. После этого командный файл будет выполнен.</p> </ol><p>В командном файле каждая команда занимает одну строку. Точнее, существует способ расположить одну команду на нескольких подряд идущих строках, для этого непосредственно перед каждым переводом строки следует поставить символ «крышка» <b>^ </b>. (Необходимо, чтобы каждая «крышка» была последним символом в своей строке; после нее не должно быть пробелов и табуляций). Пример такой команды показан на следующем листинге.</p><p>if exist disser.txt ^</p><p>copy disser.txt ^</p><p>d:\science\papers\drafts\sources</p><p>Но для простоты, чтобы каждый раз не делать оговорок, мы будем считать, что в некотором смысле это одна длинная «логическая» строка.</p><p>При выполнении командного файла командный процессор просматривает его сверху вниз от первой строки к последней и выполняет команды в том порядке, в котором их обнаруживает. Выполняет он в целом их так, как если бы мы каждую из них вводили вручную. В целом, потому что некоторые команды при вводе вручную и при выполнении из командного файла ведут себя немного по-разному.</p><p>Забегая вперед, скажем, что при необходимости последовательность выполнения команд можно изменить с помощью управляющих команд (с чем может быть связана такая необходимость, вопрос отдельный).</p><p>Не путайте текущий каталог с каталогом, в котором находится запускаемый командный файл. Предположим, текущим каталогом является <b>work </b>, в нем находится каталог <b>tools </b>, а в каталоге tools хранятся командные файлы. Вы запускаете один из них командой <b>tools\collect-images.bat </b>. Так вот, «с точки зрения» этого командного файла, текущим каталогом все равно окажется <b>work </b>, а не <b>tools </b>.</p><p><b>Комментирование командного файла и его выдачи. Команды echo и rem </b></p><p>Командный файл, по существу, представляет собой программу, написанную на языке командного процессора операционной системы. Текст программы полагается снабжать комментариями, чтобы, вернувшись к нему некоторое время спустя, не вспоминать мучительно, для чего эта программа нужна, и как она устроена.</p><p>В системе команд MS-DOS для оформления комментариев предусмотрена команда <b>rem </b>. Это фиктивная команда, которая не предполагает выполнения каких бы то ни было действий, но позволяет написать в строке после своего имени произвольный текст. Причем командный процессор не воспринимает его как синтаксическую ошибку. Пример оформления командного файла комментариями показан на следующем листинге.</p><p>rem *****************************************************</p><p>rem Формируем файлы справки</p><p>help copy > copy.help</p><p>help move > move.help</p><p>move *.help msdos-help</p><p>Обратите внимание на пустые строки, которыми командный файл разбит на «абзацы». Этот простой прием позволяет сделать командный файл более читабельным.</p><p>При выполнении приведенного выше командного файла все команды будут выводиться на экран по мере их выполнения, что не всегда удобно. Выдачу команд можно отключить с помощью команды <b>@echo off </b>. Символ «собака» перед командой <b>echo </b>означает, то и сама эта команда должна выполняться в «молчаливом» режиме. С таким же успехом мы могли бы не пользоваться командной <b>echo off </b>, а поместить «собаку» перед каждой командой.</p><p>Во многих случаях требуется, чтобы командный файл выводил на экран (или в файл) те или иные сообщения. В одних случаях это могут быть сообщения об ошибках, в других информационные сообщения, объясняющие пользователю командного файла, что происходит в данный момент, когда-то мы формируем командным файлом какой-нибудь другой полезный файл. Для вывода сообщений применяется та же самая команда echo. В качестве параметра ей передают текст выводимого сообщения. Листинг усовершенствованного командного файла приведен ниже.</p><p>rem *****************************************************</p><p>rem Формирование файлов справки по командам copy и move</p><p>rem *****************************************************</p><p>@echo Формируем файлы справки. Одну секундочку...</p><p>rem Формируем файлы справки</p><p>help copy > copy.help</p><p>help move > move.help</p><p>rem Создаем каталог для хранения файлов справки</p><p>rem Перемещаем файлы справки в подготовленный каталог</p><p>move *.help msdos-help</p><p>echo Готово!</p><p><b>Передача командному файлу параметров </b></p><p>Предположим, мы хотим создать командный файл, который сначала формирует справку с описанием заданной пользователем команды, а потом загружает его для просмотра в блокнот. Фокус в том, чтобы при очередном запуске командного файла каким-то образом сообщить ему, какая именно команда нас интересует на этот раз.</p><p>Для решения этой задачи предусмотрен механизм обработки параметров. Работает он довольно просто. Если при запуске командного файла пользователь указал несколько параметров, то в тексте командного файла первый из них мы обозначаем записью <b>%1 </b>, второй записью <b>%2 </b>, третий записью <b>%3 </b> и т.д. Этими обозначениями мы пользуемся в тексте командного файла примерно так же, как в естественной речи местоимениями.</p><p>Текст командного файла, решающего поставленную задачу, приведен на следующем листинге. Обратите внимание на команду <b>help </b>. В качестве ее параметра ей передается первый параметр командного файла.</p><p>rem Формируем файл с описанием команды,</p><p>rem имя которой передано параметром</p><p>help %1 > help.tmp</p><p>rem Загружаем файл описания в редактор Блокнот</p><p>notepad help.tmp</p><p>Предположим, что мы присвоили этому командному файлу имя <b>show-help.bat </b>. Для того чтобы загрузить в блокнот описание команды, например, <b>dir </b>, мы должны ввести команду следующим образом.</p><p>show-help.bat dir</p><p>Следующий командный файл создает каталог с именем, указанным в первом параметре, и записывает в него файл с текстом описания команды, указанной во втором параметре.</p><p>rem Пример командного файла с двумя параметрами</p><p>rem Создаем каталог с именем, заданным первым параметром</p><p>rem Создаем в нем файл с описанием команды,</p><p>rem заданной вторым параметром</p><p>help %2 > %1\%2.help</p><p>Что произойдет, если пользователь при запуске этого командного файла укажет не два, а четыре параметра? Ничего страшного, они ничему не помешают, просто не будут использованы. А что будет, если пользователь укажет только первый параметр? Второй параметр окажется пустым. Эффект получится такой: командный файл будет выполнен, но так, как будто на месте записи <b>%2 </b> ничего нет. Команда help сформирует список всех команд и поместит его в файл с пустым именем и расширением.help. Если же пользователь запустить этот файл, не указав ни одного параметра, то при попытке командного процессора выполнить команду <b>md </b>(напомним, она предназначена для создания каталога), мы получим сообщение о синтаксической ошибке, поскольку у команды md обязательно должен быть параметр.</p><p>Таким образом, использование параметров создает большие возможности, но может существенно усложнить дело. Для того чтобы командный файл всегда работал корректно, необходимо проверять корректность указания пользователем параметров и каким-то образом реагировать на неполные или неверные входные данные. Можно, конечно, этого и не делать, но некорректно работающий командный файл может наломать дров, особенно, если он предусматривает удаление или перезапись данных.</p><p><b>Переменные. Команда set </b></p><p>Переменной называется поименованное значение. В учебниках по программированию переменную обычно сравнивают с конвертом, на котором написано имя. Внутрь конверта можно положить нечто, например, определенную сумму денег - это ее значение. Как и в случае с конвертом, значение переменной можно изменить.</p><p>Для объявления переменной и одновременно для присвоения ей значения применяется команда <b>set </b>. Пример записи этой команды показан на следующем листинге.</p><p>Для извлечения значения переменной ее имя помещают между двумя знаками процента, как показано ниже.</p><p>rem Компилятор хелп-файлов в формате CHM</p><p>set help_compiler=c:\HTML Help Workshop\hcc.exe</p><p>rem Проект хелп-файла модуля "Склад"</p><p>set store_hpj=help\sources\store\store.hpj</p><p>rem Проект хелп-файла модуля "Продажи"</p><p>set sales_hpj=help\sources\sales\sales.hpj</p><p>rem Компилируем хелп-файлы</p><p>%help_compiler% %store_hpj%</p><p>%help_compiler% %sales_hpj%</p><p>Приведенный листинг показывает, в чем польза переменных.</p><p>Во-первых, они позволяют вместо длинного фрагмента (например, пути к компилятору хелп-файлов) использовать внутри командного файла синонимичный ему короткий. Как минимум, это удобно.</p><p>Во-вторых, они позволяют избежать повторения в тексте командного файла фрагментов, которые в дальнейшем могут меняться. Представьте себе, что мы переустановили Microsoft HTML Workshop в другой каталог. Если в командном файле для записи пути к нему применяется переменная, то будет достаточно исправить в командном файле только одну строку, а именно, ту в которой присваивается значение переменной <b>help_compiler </b>. Если бы мы писали путь к компилятору всякий раз, когда его необходимо взывать, то после изменения пути нам пришлось бы исправить каждую такую строку. В приведенном примере их две, но в реальном проекте их с таким же успехом может оказаться пять или пятнадцать, по числу хелп-файлов, которые мы хотим скомпилировать. Проблема не в том, что исправлять вручную каждую строчку тяжело (в конце концов, команды “copy” и “paste” никто не отменял), а в том, что это сильно повышает вероятность случайной ошибки.</p><p>Параметры командного файла тоже являются переменными, но от обычных переменных отличаются тем, что их значения задаются при запуске командного файла. В дальнейшем, говоря о переменных, в особенности о работе с их значениями, мы будем иметь в виду и параметры командного файла тоже, во всяком случае, в отсутствие явных оговорок на это счет.</p><p>При написании командных файлов часто применяют следующий прием: несколько значений переменных указывают рядом (или перемежая их какими-либо символами или строками), так, чтобы получить некоторое новое осмысленное значение. Пример приведен на следующем листинге.</p><p><b>Проверка условий и выбор вариантов. Команды if и goto </b></p><p>Команда if позволяет выделять в командном файле группы команд, которые выполняются или не выполняются в зависимости от определенных условий. Для чего это нужно?</p><p>Проверка условия - почти необходимая мера при создании командных файлов, использующих параметры. Перед тем, как начинать работу, командный файл, вообще говоря, должен удостовериться в том, что ему передан корректный набор параметров. В противном случае велик риск, что он выполнится неверно или безрезультатно, а пользователю останется только гадать, в чем же проблема. Более того, если командный файл удаляет, перемещает или перезаписывает какие-либо данные, то при некорректных параметрах он может даже нанести ущерб.</p><p>На следующем листинге показан уже знакомый вам командный файл компиляции хелп-файла. В начало командного файла добавлена проверка первого параметра на непустоту. Обратите внимание на такую особенность синтаксиса: для операции сравнения используется сдвоенный знак равенства. Если первый параметр оказывается непустым, срабатывает команда goto, которая «перебрасывает» командный процессор к указанной метке. В данном случае имя этой метки compile. Обратите внимание, что там, где метка находится, ее имя предваряется двоеточием, а в команде goto нет. При пустом первом параметре командный процессор переходит к следующей строке, которая выдает сообщение об ошибке. А потом к следующей, которая перебрасывает его в самый конец файла к метке с именем <b>finish </b>.</p><p>if not "%1"=="" goto compile</p><p>rem Если параметр пуст, выдаем сообщение об ошибке</p><p>echo Не указано имя проекта хелп-файла</p><p>rem и переходим в конец командного файла</p><p>rem к метке finish</p><p>rem Это метка с именем compile</p><p>rem Ниже расположены команды компиляции</p><p>rem Путь к компилятору хелп-файлов</p><p>set help_compiler="c:\Program Files\HTML Help Workshop\hhc.exe"</p><p>rem Путь к каталогу, в котором находятся проекты хелп-файлов</p><p>set project_path=e:\work\projects\help-projects</p><p>rem Вызываем компилятор для обработки конкретного проекта,</p><p>rem имя которого передаем в первом параметре</p><p>%help_compiler% %project_path%\%1.hpj</p><p>rem Это метка с именем finish</p><p>Скажем прямо, предложенный способ проверки параметра не самый удачный.</p><p>Во-первых, если пользователь по ошибке укажет в качестве параметра имя несуществующего файла, командный файл этим удовлетворится и предпримет попытку компиляции. Более правильный способ - проверить, существует ли такой файл в действительности. Для этого в языке команд MS-DOS предусмотрено специальное слово <b>exist </b>. Поэтому лучше было бы написать: <b>if exist %1.hpj goto compile </b>.</p><p>Во-вторых, активное использование команды <b>goto </b>(т.н. безусловного перехода) и меток сильно запутывают код. Технически они ничем не плохи, но отлаживать и сопровождать командный файл, написанный в таком стиле, довольно неудобно. Поэтому программисты издавна считают безусловный переход приемом нежелательным. Ниже показан более правильный, с точки зрения стиля программирования, структурированный вариант, в котором используется конструкция <b>if…else </b>. Работает она так: если условие истинно, выполняются команды в скобках после <b>if </b>, а если ложно, то в скобках после <b>else </b>.</p><p>rem Проверяем, задан ли параметр</p><p>if not exist %1.hpj (</p><p>rem Путь к компилятору хелп-файлов</p><p>set help_compiler="c:\Program Files\HTML Help Workshop\hhc.exe"</p><p>rem Путь к каталогу, в котором находятся проекты хелп-файлов</p><p>set project_path=e:\work\projects\help-projects</p><p>rem Вызываем компилятор для обработки конкретного проекта,</p><p>%help_compiler% %project_path%\%1.hpj</p><p>Приведем еще один пример работы с проверками. Следующий командный файл создает каталог с именем <b>help-files </b> (предположим, для выгрузки в него скомпилированных хелп-файлов). При этом, если каталог с таким именем уже существует (и в нем, вероятно, находятся старые хелп-файлы, которые не хотелось бы терять: вдруг новые окажутся хуже?), командный файл присваивает ему расширение bak. Но если каталог <b>help-files.bak </b> уже существовал, то командный файл его удаляет (будем считать, что одной резервной копии нам хватит).</p><p>if exist help-files.bak rd help-files.bak</p><p>if exist help-files ren help-files help-files.bak</p><p><b>Массовая обработка файлов. Команда for </b></p><p>Команда for позволяет организовать выполнение повторяющихся однотипных действий. Можно использовать ее для того, чтобы вывести на экран числа от одного до десяти, как показано на следующем листинге.</p><p>for /l %%i in (1,1,10) do echo %%i</p><p>Переменная <b>i </b> называется счетчиком цикла. В силу своеобразия синтаксиса команды <b>for </b>, имя счетчика цикла должно состоять из одной буквы. Причем, если мы пишем командный файл, то перед именем счетчика цикла надо поставить сдвоенный знак процента, если же мы просто набираем команду в командной строке, то одиночный.</p><p>Логика работы этой команды такова. После слова <b>in </b> указан диапазон изменения счетчика цикла. В данном варианте команды это тройка чисел: начальное значение счетчика, шаг счета, предельное значение счетчика. При выполнении команды командный процессор сначала присвоит переменной <b>i </b> значение <b>1 </b>, а потом на каждом шаге цикла будет увеличивать его на <b>1 </b>, пока оно не превысит <b>10 </b>. Очевидно, таких шагов получится десять. Если бы в качестве шага счета мы указали число <b>2 </b>, то цикл выполнился бы пять раз. На каждом шаге цикла выполняется тело цикла, написанное после слова <b>do </b>. В приведенном примере это команда echo, которая выводит на экран текущее значение счетчика цикла.</p><p>Наверно можно придумать ситуацию, когда что-то подобное на самом деле требуется, но обычно команда <b>for </b>используется для перебора и обработки файлов. Надо сказать, что в достаточно простых случаях массовая обработка файлов выполняется с помощью подстановочных символов. Если, мы хотим всем файлам в текущем каталоге заменить расширение <b>.htm </b> на <b>.html </b>, мы вводим команду <b>ren *.htm *.html </b>. Но если то же самое надо сделать не в одном каталоге, а в дереве каталогов, то без команды for не обойтись. Приведенный ниже командный файл выполняет эту операцию для всех htm-файлов в подкаталоге website текущего каталога. Точнее, во всем дереве каталогов, которое находится внутри <b>website </b>.</p><p>for /r website %%i in (*.htm) do ren %%i %%~ni.html</p><p>Ключ <b>/r </b> указывает на необходимость обхода каталога <b>website </b> и всех его внутренностей. Если его не указать (но тогда и каталог указывать не разрешается), то обработаны будут только файлы в текущем каталоге. Диапазоном значений счетчика цикла в данном варианте команды является множество всех файлов с расширением <b>.htm </b>, находящихся внутри каталога (точнее, дерева) <b>website </b>. Странная на первый взгляд запись <b>~ni </b> означает, что из значения переменной <b>i </b> требуется выделить только имя файла. В языке команд MS-DOS предусмотрено несколько таких модификаторов, например, запись <b>~хi </b> обозначает расширение файла. Все модификаторы описаны в справке по команде <b>for </b>.</p><p>Тело цикла может состоять из нескольких команд, заключенных в скобки.</p><p>for /r website %%i in (*.htm) do (</p><p>rem Выводим имя файла</p><p>rem Переименовываем файл</p><p>ren %%i %%~ni.html</p><p><b>Передача управления другому командному файлу. Команда call </b></p><p>Существует возможность вызвать из одного командного файла другой командный файл. Для этого служит команда <b>call </b>. Замечательно, переменные, заданные в вызывающем командном файле «видны» вызванному. И наоборот, после того, как вызванный файл закончит работу и вернет управление вызвавшему, последний будет «видеть» переменные, оставленные ему вызванным «в наследство». Это позволяет разработчику командных файлов действовать, например, следующим образом. Если несколько командных файлов должны пользоваться одними и теми же значениями, допустим, путями к каким-то файлам, их можно вынести в отдельный командный файл, который будет играть роль конфигурационного файла. Каждый рабочий командный файл будет начинаться вызовом конфигурационного. Выигрыш в том, что при изменении путей вносить изменения придется только в один конфигурационный файл, а не во множество рабочих.</p><p>«Конфигурационный» командный файл <b>config.bat </b>.</p><p>rem Путь к компилятору хелп-файлов</p><p>set help_compiler="c:\Program Files\HTML Help Workshop\hhc.exe"</p><p>rem Путь к каталогу, в котором находятся проекты хелп-файлов</p><p>set project_path=e:\work\projects\help-projects</p><p>«Рабочий» командный файл.</p><p>rem Настраиваем переменные</p><p>rem Проверяем, задан ли параметр</p><p>if not exist %1.hpj (</p><p>rem Если параметр пуст, выдаем сообщение об ошибке</p><p>echo Такого проекта хелп-файла не существует.</p><p>rem Ниже расположены команды компиляции</p><p>rem Вызываем компилятор для обработки конкретного проекта,</p><p>rem имя которого передаем в первом параметре</p><p>%help_compiler% %project_path%\%1.hpj</p> <p>Теперь пришло время рассмотреть <b>bat команды </b>. В основном тут используются команды вводимые в cmd, но есть и такие, которые нет смысла использовать в командной строке.</p><h2>Как получить полный список bat команд</h2><p>Для описания всех команд потребуется написать целый ряд статей, чтобы Вас сильно не нагружать ограничимся в рамках одной статьи и рассмотрим компактную информацию. Как известно, команды bat файла и cmdодни и те же, чтобы получить их список или . Введите команду справки, которая по-английски пишется как help, нажмите Enter. В результате компьютер в интерфейсе cmd пропишет все команды с <a href="/operacionnaya-sistema-semeistva-windows-nt-kratkoe-opisanie-operacionnoi-sistemy.html">кратким описанием</a>.</p><p>Ознакомившись с данным списком, Вы захотите узнать поподробнее, что представляет собой определенная bat команда. Например, выберем команду for, для ее описания введем help for или for /? и кликнем энтер. В результате Вы получите оперативную справку по команде, она объемная, поэтому потребуется нажать несколько раз любую клавишу, чтобы ознакомиться с последующим описанием. Таким образом, можно изучить синтаксис той или иной команды.</p><h2>Команды bat файла</h2><p>Сейчас познакомимся с командами, используемыми в пакетном файле, с кратким описанием. Они не чувствительны к регистру, тем не менее, Мы их перечислили в верхнем регистре, чтобы помочь с идентификацией.</p><table><tbody><tr><td width="319">@ </td><td width="319">Все выполняемые bat команды выводятся на экран, чтобы убрать лишнее, перед командой ставится «собака». Часто используется с @echo off. </td> </tr><tr><td width="319">set </td><td width="319">Задает переменные. Например, setper=c:\windows здесь per присваиваем путь. В переменную можно записать громоздкое значение и указать ее в сценарии, что сделает код компактнее. Если ее содержание изменится, тогда не придется менять везде значения, где предусмотрена эта переменная. </td> </tr><tr><td width="319">:: </td><td width="319">Один из двух методов комментирования в bat файле без вывода этой строки на экран. </td> </tr><tr><td width="319">:LABEL </td><td width="319">При добавлении к слову двоеточия, создается метка, которая позволяет перейти к разным разделам батника. Метка может носить другое название, LABEL это пример. </td> </tr><tr><td width="319">CALL </td><td width="319">Bat команда, вызывающая один пакетный файл в другом. Все параметры, описанные в одном из файлов, могут быть переданы друг другу. </td> </tr><tr><td width="319">CHOICE </td><td width="319">Команда выбора. </td> </tr><tr><td width="319">CLS </td><td width="319">Очищает содержимое <a href="/interpretator-komandnoi-stroki-shell-vybor-interpretatora-komandnoi-stroki.html">командного интерпретатора</a>, что выведено на экран выше CLS. </td> </tr><tr><td width="319">ECHO </td><td width="319">Выводит сообщение на экран. Например, «ECHO Привет!» выведет «Привет!». Если не использовать @ECHO off в начале пакетного файла, тогда Вы увидите путь к bat файлу и два сообщения, что является излишним. Вы можете создать пустую строку введите ECHO. с точкой в конце. </td> </tr><tr><td width="319">EXIT </td><td width="319">Завершает текущий пакетный сценарий. </td> </tr><tr><td width="319">GOTO LABEL </td><td width="319">Используется для перехода к определенной метки, в данном случае к LABEL и исполняет сценарий после нее. </td> </tr><tr><td width="319">IF </td><td width="319">Как и в языках программирования batкоманда ifолицетворяет выполнение условия, в зависимости от которого сценарий пойдет по тому или иному пути. С синтаксисом знакомьтесь в справке. </td> </tr><tr><td width="319">for </td><td width="319">Цикл, используемый для организации выполнения одних и тех же действий. </td> </tr><tr><td width="319">PAUSE </td><td width="319">Если необходимо ознакомиться с результатом сценария, а он выполняется, и окно быстро закрывается, тогда используйте PAUSE. Она позволит посмотреть результат и завершить сценарий по нажатию любой кнопки. </td> </tr><tr><td width="319">REM </td><td width="319">Второй способ комментирования. В отличии от:: печатается на экране, если нет конструкции @ECHO off. </td> </tr><tr><td width="319">SHIFT </td><td width="319">Изменяет положение <a href="/paketnaya-ustanovka-msu-obnovlenii-parametry-komandnoi-stroki-dism-cab-ili-msu-dlya.html">пакетных параметров</a> в bat файле. </td> </tr><tr><td width="319">START </td><td width="319">Запускает программы, окна и т.д. Имеет множество атрибутов (смотрите справку). </td> </tr></tbody></table><p>Это является основой bat команд. Синтаксис некоторых элементов сложен для новичков и требует определенные знания. Все <i>команды bat файла </i>, описанные выше, рассмотрены поверхностно, с целью узнать их предназначение, а полный синтаксис Вы найдете в справке Windows.</p> <script type="text/javascript"> <!-- var _acic={dataProvider:10};(function(){var e=document.createElement("script");e.type="text/javascript";e.async=true;e.src="https://www.acint.net/aci.js";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})() //--> </script><br> <br> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy>");</script> </div> <div class="vce-share-bar"> <ul class="vce-share-items"> <li><a class="fa fa-facebook" href="javascript:void(0);" data-url="http://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fpypad.ru%2Fkak-sozdat-komandnyi-fail-proverka-uslovii-i-vybor-variantov-komandy-if-i.html"></a></li> <li><a class="fa fa-twitter" href="javascript:void(0);" data-url="http://twitter.com/intent/tweet?url=https%3A%2F%2Fpypad.ru%2Fkak-sozdat-komandnyi-fail-proverka-uslovii-i-vybor-variantov-komandy-if-i.html"></a></li> <li><a class="fa fa-google-plus" href="javascript:void(0);" data-url="https://plus.google.com/share?url=https%3A%2F%2Fpypad.ru%2Fkak-sozdat-komandnyi-fail-proverka-uslovii-i-vybor-variantov-komandy-if-i.html"></a></li> <li><a class="fa fa-pinterest" href="javascript:void(0);" data-url="http://pinterest.com/pin/create/button/?url=https%3A%2F%2Fpypad.ru%2Fkak-sozdat-komandnyi-fail-proverka-uslovii-i-vybor-variantov-komandy-if-i.html"></a></li> <li><a class="fa fa-whatsapp no-popup" href="whatsapp://send?text=https%3A%2F%2Fpypad.ru%2Fkak-sozdat-komandnyi-fail-proverka-uslovii-i-vybor-variantov-komandy-if-i.html"></a></li> </ul> </div> </article> </main> <div class="main-box vce-related-box"> <h3 class="main-box-title">Возможно вас заинтересует</h3> <div class="main-box-inside"> <article class="vce-post vce-lay-d post-273 post type-post status-publish format-standard has-post-thumbnail hentry category-stroitelstvo category-fundament tag-gazobeton tag-dom tag-kak-vybrat tag-stroitelstvo tag-fundament"> <div class="meta-image"> <a href="/obzor-garnitury-creative-aurvana-in-ear3-plus-obzor-creative-aurvana-in-ear3-plus-velikolepnye.html" title="Обзор: creative aurvana in-ear3 plus — великолепные арматурные наушники с двойными излучателями Впечатления от прослушивания"> <img width="145" height="71" src="/uploads/ea8b9e2edac089e5abde0feedccbf389.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Обзор: creative aurvana in-ear3 plus — великолепные арматурные наушники с двойными излучателями Впечатления от прослушивания"sizes="(max-width: 145px) 100vw, 145px" / loading=lazy> </a> </div> <header class="entry-header"> <span class="meta-category"><a href="" class="category">Windows 8</a> </span> <h2 class="entry-title"><a href="/obzor-garnitury-creative-aurvana-in-ear3-plus-obzor-creative-aurvana-in-ear3-plus-velikolepnye.html" title="Обзор: creative aurvana in-ear3 plus — великолепные арматурные наушники с двойными излучателями Впечатления от прослушивания">Обзор: creative aurvana in-ear3 plus — великолепные арматурные наушники с двойными излучателями Впечатления от прослушивания</a></h2> </header> </article> <article class="vce-post vce-lay-d post-273 post type-post status-publish format-standard has-post-thumbnail hentry category-stroitelstvo category-fundament tag-gazobeton tag-dom tag-kak-vybrat tag-stroitelstvo tag-fundament"> <div class="meta-image"> <a href="/stabilnye-programmy-dlya-sozdaniya-zagruzochnoi-fleshki-legkaya.html" title="Легкая запись образа на флешку"> <img width="145" height="71" src="/uploads/4e086932c2eef2a59774913b28a9163b.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Легкая запись образа на флешку"sizes="(max-width: 145px) 100vw, 145px" / loading=lazy> </a> </div> <header class="entry-header"> <span class="meta-category"><a href="" class="category">Windows 7, XP</a> </span> <h2 class="entry-title"><a href="/stabilnye-programmy-dlya-sozdaniya-zagruzochnoi-fleshki-legkaya.html" title="Легкая запись образа на флешку">Легкая запись образа на флешку</a></h2> </header> </article> <article class="vce-post vce-lay-d post-273 post type-post status-publish format-standard has-post-thumbnail hentry category-stroitelstvo category-fundament tag-gazobeton tag-dom tag-kak-vybrat tag-stroitelstvo tag-fundament"> <div class="meta-image"> <a href="/rukovodstvo-po-bystromu-startu-platformy-orange-pi-one-s-operacionnoi.html" title="Orange Pi Lite - обзор, установка и настройка операционной системы Распаковываем Orange Pi One"> <img width="145" height="71" src="/uploads/c7297f77b3182fcda78e2e6d98a52faa.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Orange Pi Lite - обзор, установка и настройка операционной системы Распаковываем Orange Pi One"sizes="(max-width: 145px) 100vw, 145px" / loading=lazy> </a> </div> <header class="entry-header"> <span class="meta-category"><a href="" class="category">Гаджеты</a> </span> <h2 class="entry-title"><a href="/rukovodstvo-po-bystromu-startu-platformy-orange-pi-one-s-operacionnoi.html" title="Orange Pi Lite - обзор, установка и настройка операционной системы Распаковываем Orange Pi One">Orange Pi Lite - обзор, установка и настройка операционной системы Распаковываем Orange Pi One</a></h2> </header> </article> <article class="vce-post vce-lay-d post-273 post type-post status-publish format-standard has-post-thumbnail hentry category-stroitelstvo category-fundament tag-gazobeton tag-dom tag-kak-vybrat tag-stroitelstvo tag-fundament"> <div class="meta-image"> <a href="/sertifikaty-android-prestigio-4322-duo-proshivka-ili-pereproshivka.html" title="Прошивка или перепрошивка телефона Prestigio MultiPhone"> <img width="145" height="71" src="/uploads/b4d22fce8e20e61308eabc35d5a17953.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Прошивка или перепрошивка телефона Prestigio MultiPhone"sizes="(max-width: 145px) 100vw, 145px" / loading=lazy> </a> </div> <header class="entry-header"> <span class="meta-category"><a href="" class="category">Телевизоры</a> </span> <h2 class="entry-title"><a href="/sertifikaty-android-prestigio-4322-duo-proshivka-ili-pereproshivka.html" title="Прошивка или перепрошивка телефона Prestigio MultiPhone">Прошивка или перепрошивка телефона Prestigio MultiPhone</a></h2> </header> </article> </div> </div> </div> <aside id="sidebar" class="sidebar right"> <div id="search-2" class="widget widget_search"> <form class="vce-search-form" action="/" method="get"> <input name="s" class="vce-search-input" size="20" type="text" value="Поиск" onfocus="(this.value == 'Поиск') && (this.value = '')" onblur="(this.value == '') && (this.value = 'Поиск')" placeholder="Поиск" /> <button type="submit" class="vce-search-submit"><i class="fa fa-search"></i></button> </form> </div> <div id="recent-posts-2" class="widget widget_recent_entries"> <h4 class="widget-title">Свежие записи</h4> <ul> <li> <a href="/obzor-garnitury-creative-aurvana-in-ear3-plus-obzor-creative-aurvana-in-ear3-plus-velikolepnye.html">Обзор: creative aurvana in-ear3 plus — великолепные арматурные наушники с двойными излучателями Впечатления от прослушивания</a> </li> <li> <a href="/stabilnye-programmy-dlya-sozdaniya-zagruzochnoi-fleshki-legkaya.html">Легкая запись образа на флешку</a> </li> <li> <a href="/rukovodstvo-po-bystromu-startu-platformy-orange-pi-one-s-operacionnoi.html">Orange Pi Lite - обзор, установка и настройка операционной системы Распаковываем Orange Pi One</a> </li> <li> <a href="/sertifikaty-android-prestigio-4322-duo-proshivka-ili-pereproshivka.html">Прошивка или перепрошивка телефона Prestigio MultiPhone</a> </li> <li> <a href="/kak-zashchitit-faily-na-usb-fleshke-kak-postavit-parol-na.html">Как поставить пароль на флешку — простые и эффективные варианты Можно ли ставить пароль на флешку</a> </li> <li> <a href="/chto-takoe-vebinar-i-kak-on-prohodit-chto-takoe-vebinary-i-kak-oni-prohodyat.html">Что такое вебинары и как они проходят?</a> </li> <li> <a href="/kak-zakryt-papku-parolem-v-windows-7-kak-ustanovit-parol-na-papku-bez.html">Как установить пароль на папку без дополнительных программ</a> </li> <li> <a href="/sis-fail-s-versiei-programmy-x-plore-x-plore-failovyi-menedzher-dlya-android-failovyi.html">X-plore: файловый менеджер для Android</a> </li> <li> <a href="/xiaomi-mi-drone-pervye-realnye-testy-novogo-kvadrokoptera-kvadrokoptery.html">Квадрокоптеры Xiaomi Mi drone от компании xiaomi</a> </li> </ul> </div> <div id="categories-2" class="widget widget_categories"> <h4 class="widget-title">Рубрики</h4> <ul> <li class="cat-item cat-item-16"><a href="/category/internet/" title="Интернет"><span class="category-text">Интернет</span><span class="count"><span class="count-hidden"></span></span></a> </li> <li class="cat-item cat-item-16"><a href="/category/gadgets/" title="Гаджеты"><span class="category-text">Гаджеты</span><span class="count"><span class="count-hidden"></span></span></a> </li> <li class="cat-item cat-item-16"><a href="/category/tips/" title="Советы"><span class="category-text">Советы</span><span class="count"><span class="count-hidden"></span></span></a> </li> <li class="cat-item cat-item-16"><a href="/category/program/" title="Программы"><span class="category-text">Программы</span><span class="count"><span class="count-hidden"></span></span></a> </li> <li class="cat-item cat-item-16"><a href="/category/security/" title="Безопасность"><span class="category-text">Безопасность</span><span class="count"><span class="count-hidden"></span></span></a> </li> <li class="cat-item cat-item-16"><a href="/category/tv/" title="Телевизоры"><span class="category-text">Телевизоры</span><span class="count"><span class="count-hidden"></span></span></a> </li> <li class="cat-item cat-item-16"><a href="/category/windows-10/" title="Windows 10"><span class="category-text">Windows 10</span><span class="count"><span class="count-hidden"></span></span></a> </li> <li class="cat-item cat-item-16"><a href="/category/windows-8/" title="Windows 8"><span class="category-text">Windows 8</span><span class="count"><span class="count-hidden"></span></span></a> </li> <li class="cat-item cat-item-16"><a href="/category/configuring-wi-fi/" title="Настройка Wi-Fi"><span class="category-text">Настройка Wi-Fi</span><span class="count"><span class="count-hidden"></span></span></a> </li> <li class="cat-item cat-item-16"><a href="/category/dll-files/" title="Файлы DLL"><span class="category-text">Файлы DLL</span><span class="count"><span class="count-hidden"></span></span></a> </li> <li class="cat-item cat-item-16"><a href="/category/windows7xp/" title="Windows 7, XP"><span class="category-text">Windows 7, XP</span><span class="count"><span class="count-hidden"></span></span></a> </li> <li class="cat-item cat-item-16"><a href="/category/different/" title="Разное"><span class="category-text">Разное</span><span class="count"><span class="count-hidden"></span></span></a> </li> </ul> </div> </aside> </div> <footer id="footer" class="site-footer"> <div class="container"> <div class="container-fix"> <div class="bit-3"> </div> <div class="bit-3"> </div> <div class="bit-3"> </div> </div> </div> <div class="container-full site-info"> <div class="container"> <div class="vce-wrap-left"> <p>Copyright © 2024. Портал о компьютерной технике</p> </div> </div> </div> </footer> </div> </div> <a href="javascript:void(0)" id="back-top"><i class="fa fa-angle-up"></i></a> <div id="vk_api_transport"></div> <script type="text/javascript"> jQuery(document).ready(function($) { if ($('.social-likes')) { $('.social-likes').each(function() { var p = $(this).parent(); if (p.data('url')) { $(this).data({ 'url': p.data('url'), 'title': p.data('title') }); } if ($(this).find('.pinterest').length) { if (p.data('media')) { $($(this).find('.pinterest')[0]).data({ 'media': p.data('media') }); } else $($(this).find('.pinterest')[0]).remove(); } }); $('.social-likes').socialLikes({ zeroes: 0 }); } }); </script> <script type='text/javascript' src='/assets/evc-share.js'></script> <script type='text/javascript' src='/assets/social-likes.min.js'></script> <script type='text/javascript' src='/assets/scripts.js'></script> <script type='text/javascript' src='/assets/main.js'></script> <script type='text/javascript'> /* <![CDATA[ */ var vce_js_settings = { "sticky_header": "1", "sticky_header_offset": "700", "sticky_header_logo": "", "logo_mobile": "", "logo_mobile_retina": "", "rtl_mode": "0", "ajax_url": "\/wp-admin\/admin-ajax.php", "ajax_mega_menu": "1", "mega_menu_slider": "", "mega_menu_subcats": "", "lay_fa_grid_center": "", "full_slider_autoplay": "", "grid_slider_autoplay": "", "fa_big_opacity": { "1": "0.5", "2": "0.7" } }; /* ]]> */ </script> <script type='text/javascript' src='/assets/min.js'></script> <script type='text/javascript' src='/assets/wp-embed.min.js'></script> <script type="text/javascript"> /* <![CDATA[ */ jQuery(document).ready(function($) { if (typeof VKWidgetsComments !== 'undefined' && VKWidgetsComments.length && evc_post_id) { if ($('#vk-widget-' + evc_post_id).length) { if ($('#respond').length) { $('#respond form').hide(); $('#respond').append($('#vk-widget-' + evc_post_id)); } } cClose = false; if ($("#comments .comment-list").length) { $("#comments .comment-list").wrap('<div class = "evc-comments-wrap"></div>'); docViewHeight = $(window).height(); $(document).scroll(function() { var docViewTop = $(window).scrollTop(); var elemTop = $('.evc-comments-wrap').offset().top; //var elemBottom = elemTop + $('.evc-comments-wrap').height(); if (elemTop * 3 / 4 <= docViewTop && !cClose) { cClose = true; $(".evc-comments-wrap").animate({ "height": 0 }, 800); } }); } } // Rresponsive VK Comments Widget Width if ($('.vk_widget_comments').length) { responsiveVkWidget(); $(window).on('resize', function() { responsiveVkWidget(); }); } function responsiveVkWidget() { var vkParentWidth = parseInt($('.vk_widget_comments').parent().width()); $('.vk_widget_comments, .vk_widget_comments iframe').css({ width: vkParentWidth }); $('.vk_widget_comments, .vk_widget_comments iframe').attr('width', vkParentWidth); } // END Rresponsive VK Comments Widget Width }); // End jQuery /* ]]> */ </script> </body> </html>