Разное

Программирование файлов bat: Практические приемы программирования в bat-файлах | windows

Содержание

Практические приемы программирования в bat-файлах | windows

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


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

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

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

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


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

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

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

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

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

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


echo The ratio should be up to 10%

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

echo The ratio should be up to 10%%

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

@echo off
set OUTPUTFILE=%1
echo <html>                                  >%OUTPUTFILE%
echo <head>                                 >>%OUTPUTFILE%
echo <title>This is a greeting page</title> >>%OUTPUTFILE%
echo </head>                                >>%OUTPUTFILE%
echo <body>                                 >>%OUTPUTFILE%
echo Hello World!                           >>%OUTPUTFILE%
echo </body>                                >>%OUTPUTFILE%
echo </html>                                >>%OUTPUTFILE%

К сожалению, при попытке запуска этого «чуда инженерного разума» нас постигнет неудача в виде сообщения об ошибке «was unexpected at this time».

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

echo "<html>"                                 >%OUTPUTFILE%


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

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

@echo off
set OUTPUTFILE=%1
echo ^<html^>                                    >%OUTPUTFILE%
echo ^<head^>                                   >>%OUTPUTFILE%
echo ^<title^>This is a greeting page^</title^> >>%OUTPUTFILE%
echo ^</head^>                                  >>%OUTPUTFILE%
echo ^<body^>                                   >>%OUTPUTFILE%
echo Hello World!                               >>%OUTPUTFILE%
echo ^</body^>                                  >>%OUTPUTFILE%
echo ^</html^>                                  >>%OUTPUTFILE%


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

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

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

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


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

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

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

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

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

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

call /?

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

%~1 — разворачивает %1, удаляя кавычки («)
%~f1 — разворачивает %1 в полный квалифицированный путь
%~d1 — разворачивает %1 в букву диска
%~p1 — разворачивает %1 в путь
%~n1 — разворачивает %1 в имя файла
%~x1 — разворачивает %1 в расширение файла
%~s1 — развернутый путь будет содержать только короткие имена
%~a1 — разворачивает %1 в атрибуты файла
%~t1 — разворачивает %1 в дату/время создания файла
%~z1 — разворачивает %1 в размер файла
%~$PATH:1 — Ищет в каталогах, перечисленных в переменной среды PATH, и разворачивает %1 в полное квалифицированное имя первого совпадения. Если имя переменной среды не определено, или если файл не найден, этот модификатор вернет пустую строку и, более того, модификаторы можно объединять для получения сложных результатов:

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

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


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

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


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

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

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

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

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


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

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

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

%~s1

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


for /d %%i in ("%PROGRAMFILES%") do (
set PROGRAMFILESSHORT=%%~si
)
echo 8.3-имя для каталога "%PROGRAMFILES%" -^> "%PROGRAMFILESSHORT%"

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

for /?

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

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


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

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

@echo off
set OUTPUT=out.html
if "%STDOUT_REDIRECTED%" == "" (
set STDOUT_REDIRECTED=yes
cmd.exe /c %0 %* >%OUTPUT%
exit /b %ERRORLEVEL%
)
echo ^<html^>
echo ^<head^>
echo ^<title^>This is a greeting page^</title^>
echo ^</head^>
echo ^<body^>
echo Hello World!
echo ^</body^>
echo ^</html^>


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

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

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

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

set /?

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


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

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

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

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

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

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

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

call /?
exit /?

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


@echo off
call :factorial %1
echo %RESULT%
exit
 
rem Функция для подсчета значения факториала
rem Вход: %1 Число, для которого необходимо подсчитать факториал
rem Выход: %RESULT% Значение факториала
:factorial
if %1 == 0 (
set RESULT=1
exit /b
)
if %1 == 1 (
set RESULT=1
exit /b
)
set /a PARAM=%1 - 1
call :factorial %PARAM%
set /a RESULT=%1 * %RESULT%
exit /b

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

> factorial.bat 10
3628800

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

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

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


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

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


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

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


@echo off
set BUILDMODE=%1
if "%BUILDMODE%" == "" (
echo FAIL: Аргумент является обязательным ^(--debug, --release^)
exit /b 1
)
rem Удаляем из аргумента все дефисы для упрощения обработки
set BUILDMODE=%BUILDMODE:-=%
if "%BUILDMODE%" == "debug" (
echo INFO: Устанавливаем debug-режим окружения
set CCFLAGS=/Od /MDd /Z7
) else (
echo INFO: Устанавливаем release-режим окружения
set CCFLAGS=/O2 /MD
)

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


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

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

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

setlocal enabledelayedexpansion

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

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


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

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

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

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

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

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

buildmode=release
compiler=cl.exe
arch=x86

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


@echo off
rem Читаем настройки из файла settings.txt, который должен располагаться в
rem том же каталоге, что и bat-файл. Если не удалось распарсить настройки -
rem выходим с ненулевым кодом возврата.
call :read_settings %~dp0\settings.txt || exit /b 1
rem Прочитанные настройки:
echo Build mode  : %BUILDMODE%
echo Compiler    : %COMPILER%
echo Architecture: %ARCH%
 
rem Выход из сценария. Дальше - только функции.
exit /b 0
 
rem Функция для чтения настроек из файла.
rem Вход: %1 - Имя файла с настройками
:read_settings
set SETTINGSFILE=%1
rem Проверка существования файла
if not exist %SETTINGSFILE% (
echo FAIL: Файл с настройками отсутствует
exit /b 1
)
 
rem Обработка файла c настройками
rem Здесь: eol=# указывает на то, что содержимое строки начиная с символа #
rem и до ее конца может быть пропущено как комментарий.
rem delims== указывает, что разделителем значений является символ =
rem tokens=1,2 приводит к тому, что в переменную %%i будет занесен первый
rem токен, а в %%j - второй.
for /f "eol=# delims== tokens=1,2" %%i in (%SETTINGSFILE%) do (
   rem В переменной i - ключ
   rem В переменной j - значение
   rem Мы транслируем это в переменные окружения
   set %%i=%%j
)
exit /b 0

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

for /?

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


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

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

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

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

command1 & command2
command1 && command2
command1 || command2

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

command1
command2

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

cd sources && make clean

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

cd sources || exit 1

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

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

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

  • Perl
  • Python
  • Ruby
  • JScript / VBScript

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

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

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

@echo off
 
if [%1]==[] goto usage
@echo Это не выполнится, если параметр %1 указан
@echo Done.goto :eof
 
:usage
@echo Usage: %0 ^<EnvironmentName^>
exit /B 1

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

Это можно сделать с помощью символа ^ (см. предыдущий пример).

Автор: Алексей Александров. Источник: RSDN Magazine #2-2005

[Ссылки]

1. Применение команды for в bat-файлах (technet.microsoft).
2. DOS Command Index site:earthlink.net.
3. О вреде оператора goto site:vspu.ac.ru.

Решаем практические задачи на батниках / Хабр

Батники это не мощный язык программирования, но, в то же время, на нем можно решить много рутинных задач. Цель статьи не просто рассказать о возможностях Windows-консоли, а показать их, решая практические задачи с которыми мне приходилось сталкиваться.

Подтверждение выполнения

set answer=
set /p answer="Выполнить? [y/n]:"
if not "%answer%" == "y" exit /b

Устанавливаем переменную answer в пустое значение (необходимо, для того чтобы затереть предыдущее значение, например, если батник исполняется несколько раз). set с ключом /p устанавливает значение переменной, которое вводится пользователем. Проверяем значение переменной и если оно не равно y завершаем выполнение батника.

Как получить текущий месяц, день, год и т.п.?

В батниках есть возможность получать подстроку используя синтаксис %variable:~m,n% Где variable это название переменной m – индекс первого символа, а n – количество символов подстроки.

Следовательно, если команда echo %date% (а формат даты может у вас отличатся) выведет 13.06.2009, то для того чтобы получить текущий месяц достаточно выполнить %date:~3,2% Таким образом, если нам необходимо, например, сформировать имя файла или директории, которое соответствует текущему месяцу и дню, мы это сделаем так:

set fname=%date:~3,2%%date:~0,2%

Лично мне такое понадобилось для задания ключа /d для xcopy.

Как вывести пустую строку в лог-файл?

Я не сразу догадался, что это можно делать вот так: 🙂

echo.>> %logfile%

Т.е. нужно поставить точку после echo.

Предыдущая команда выполнена успешно?

В большинстве случаев это:

if %errorlevel%==0 (
  echo OK>> %logfile%
) else (
  echo ERROR #%errorlevel% >> %logfile%
)

Архивирование файла с переменным именем

for %%i in (c:\dir\#fe*.*) do rar a -ep c:\other_dir\%%~ni.rar %%i

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

for %%i in (c:\dir\#fe*.*) do

мы выбираем все файлы по маске, исполняя команду rar a -ep c:\other_dir\%%~ni.rar %%i для каждого, где %%~ni это только имя файла.

Имя текущего исполняемого батника

%~n0

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

«Функция» в батниках

Если мы исполняем в одном батнике несколько повторяющихся команд, но с разными значениями переменных, то это можно реализовать так:

set thebat=c:\Program Files\The Bat!\thebat.exe
set action=SEND

set [email protected]
set subject=Subject_1
set attach=c:\dir\file????
call :mailit


set [email protected]
set subject=Subject_2
set attach=c:\dir\file*.rar
call :mailit

…

exit

:mailit
@echo on
"%thebat%" /MAILTO="%mailto%";SUBJECT="%subject%";ATTACH="%attach%";%action% >> %logfile%
@echo off
exit /b

Таким образом, у меня отсылается десяток разных файлов разным получателям, используя The Bat! Такой файл читать и редактировать намного удобнее, чем это было бы десять команд The Bat! подряд.

Получить последний по дате создание файл

Для начала получим список всех файлов, отсортированных по дате модификации:

dir /b /od /a-d c:\dir\file_*.xls

И пройдемся по нему циклом.

for /f "tokens=*" %%a in (' dir /b /od /a-d c:\dir\file_*.xls ') do set "lastfile=%%a"

Логично, что по завершению цикла в переменной %lastfile% у нас будет последний по дате модификации файл 😉

Выкачать файл по FTP

ftp -s:file_to_ftp.txt 127.0.0.1

Где файл file_to_ftp.txt будет у нас выглядеть следующим образом:

login
password
bin 
cd /files
put file.xls 
quit

Создаем нумерованные каталоги с инкрементом на единицу

set dir_last=
for /f "tokens=*" %%i in ('dir /ad /b') do set dir_last=%%i

if '%dir_last%'=='' (set dir_last=000)

set dir_last=1%dir_last%
set /a dir_last = %dir_last% - 1000
set /a dir_new=%dir_last% + 1

set dir_new=00%dir_new%
set dir_new=%dir_new:~-3%
md %dir_new%

Разобраться в коде предлагаю вам самим. 🙂 Основная возможность, которую я хотел показать данным примером, это использование ключа /a команды set для вычисления выражений. 😉

Урок bat-аники



Урок bat-аники

Автор: Алексей Александров
Источник: RSDN Magazine #2-2005
Опубликовано: 11.07.2005
Исправлено: 10.12.2016
Версия текста: 1.0

Введение


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

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

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

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

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

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

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


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

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

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


      echo
      The ratio should be up to 10%.
    

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


      echo
       The ratio should be up to 10%%.
    

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


      @echo
      
      off
      
      set OUTPUTFILE=%1

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

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


> was unexpected at this time.

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


      echo
      "<html>"                                 >%OUTPUTFILE%

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

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


      @echo off
set OUTPUTFILE=%1

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

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

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


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

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


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

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

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


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

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

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


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


        %~1         - разворачивает %1, удаляя кавычки (")
        %~f1        - разворачивает %1 в полный квалифицированный путь
        %~d1        - разворачивает %1 в букву диска
        %~p1        - разворачивает %1 в путь
        %~n1        - разворачивает %1 в имя файла
        %~x1        - разворачивает %1 в расширение файла
        %~s1        - развернутый путь будет содержать только короткие имена
        %~a1        - разворачивает %1 в атрибуты файла
        %~t1        - разворачивает %1 в дату/время создания файла
        %~z1        - разворачивает %1 в размер файла
        %~$PATH:1   - Ищет в каталогах, перечисленных в переменной среды PATH,
                       и разворачивает %1 в полное квалифицированное имя 
                       первого совпадения. Если имя перменной среды
                       не определено, или если файл не найден, этот 
                       модификатор вернет пустую строку

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


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

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

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


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

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

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

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

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

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


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

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

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

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


%~s1        - expanded path contains short names only

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


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

echo8.3-имя для каталога "%PROGRAMFILES%" -^> "%PROGRAMFILESSHORT%"

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


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


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


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

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


      @echo off
set OUTPUT=out.html

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

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

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

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

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


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


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


      @echo off

set ARG=1

remset /a RESULT=ARG + 2
echo%RESULT%
remremset /a RESULT="ARG << 2"
echo%RESULT%
remset /a RESULT=0x1234 + 0x6786
echo%RESULT%
rem

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


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


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

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


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

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

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


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


      @echo off

call :factorial %1
echo %RESULT%
exit
remremremremrem:factorial

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

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

set /a PARAM=%1 - 1

call :factorial %PARAM%

set /a RESULT=%1 * %RESULT%

exit /b

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


> factorial.bat 10
3628800

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


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

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


      if condition goto :THEN
remremgoto IF_END
:THEN
remrem:IF_END

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


      if condition (
    remrem) else (
    remrem)

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


      @echo off

set BUILDMODE=%1

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

remset BUILDMODE=%BUILDMODE:-=%

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

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


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

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

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


      setlocal enabledelayedexpansion

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

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


      setlocal enabledelayedexpansion

remif "%BUILDMODE%" == "debug" (
    echoINFO: Setting up debug mode environment
set OPTFLAGS=/Od
    set CCFLAGS=!OPTFLAGS! /MDd /Z7
) else (
    echoINFO: Setting up release mode environment
set OPTFLAGS=/O2
    set CCFLAGS=!OPTFLAGS! /MD
)

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

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

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


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

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


      
      buildmode=release

compiler=cl.exe

arch=x86

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


      @echo off

remremremcall :read_settings %~dp0\settings.txt || exit /b 1

remechoBuild mode  : %BUILDMODE%echoCompiler    : %COMPILER%
echoArchitecture: %ARCH%
remexit /b 0

remremremrem:read_settings

set SETTINGSFILE=%1

remif not exist %SETTINGSFILE% (
    echoFAIL: Файл с настройками отсутствуетexit /b 1
)

remremremremremremremremremremfor /f "eol=# delims== tokens=1,2" %%i in (%SETTINGSFILE%) do (
    remremremset %%i=%%j
)

exit /b 0

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


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


      @echo off

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

echo%VERSION%

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

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


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


command1 & command2
command1 && command2
command1 || command2

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


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


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


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

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


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

  • Perl
  • Python
  • Ruby
  • JScript / VBScript

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

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

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



  1. Windows Batch Files – Commands Reference.

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



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

#2-2005. Информацию о журнале можно найти здесь

Как создать bat-файл в Windows 7/10 – примеры команд и сохранение батника

Использование графического интерфейса в операционных системах сегодня представляется чем-то само собой разумеющимся и совершенно естественным, но так было не всегда. Первая операционная система MS DOS, разработанная компанией Microsoft, не имела GUI, а управление выполнялось посредством ввода текстовых команд. С тех пор минуло без малого 40 лет, однако скриптовый язык командной строки по-прежнему пользуется популярностью, причём не только в среде разработчиков.

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

Как создать файл с расширением BAT

Итак, как создать bat-файл в Windows 7/10? Очень просто. Для этого понадобится любой текстовый редактор и знание основ командной строки. Можно использовать Блокнот, а ещё лучше Notepad++, так как последний имеет подсветку синтаксиса. Создайте в редакторе новый файл, в меню «Файл» выберите «Сохранить как», дайте будущему скрипту имя, а в выпадающем списке «Тип файла» выберите «Batch file (*bat; *cmd; *nt)».

Если для создания bat-файла захотите использовать Блокнот, расширение нужно присвоить вручную, а в списке «Тип файла» выбрать «Все файлы».

Все о BAT файлах

Все о BAT файлах

   Пакетные или batch файлы это обычные текстовые файлы, содержащие наборы команд интерпритатора и имеющие расширение bat или cmd (cmd работают только в ОС семейства NT). Редактировать такие файлы можно при помощи блокнота или любого другого текстового редактора.
В этом FAQ собраны рекомендации, которые были протестированы на Windows 2000. Некоторые команды и переменные, использованные при написании примеров, отсутствуют в 9х.

Как создать batch файл? 

Откройте блокнот и наберите две следующих строки:

@echo This batch file
@pause

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

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

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

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

help

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

help AT

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

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

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

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

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

>

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

@echo Start file>C:\1.txt

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

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

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

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

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

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

MD FolderName

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

MD D:\FolderName

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

MD D:\%USERNAME%

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

MD %SYSTEMDRIVE%\%USERNAME%

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

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

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

Как перенаправить результат выполнения команд в файл

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

@echo off
echo Start %time%
echo Create test.txt
echo test>C:\test.txt
echo Copy Test.txt to Old_test.txt
copy C:\test.txt C:\Old_test.txt
echo Stop %time%

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

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

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

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

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

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

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

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

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

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

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

del C:\Folder

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

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

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

|

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

echo Y|del C:\Folder

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

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

echo Testing

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

@echo Testing

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

@echo off

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

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

call 2.bat

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

pause

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

start 2.bat

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

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

net send name Message text

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

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

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

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

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

netsh interface ip show address

Результат работы этой команды — отображение текущей конфигурации сетевого интерфейса. Нас интересует название интерфейса. Предположим, что он называется FASTNET.
Предположим, что нужно сменить IP адрес на 192.168.1.42, адресация в сети статическая, без использования DHCP, шлюз 192.168.1.1, маска 255.255.255.0 В этом случае, команда, которая должна быть выполнена из пакетного файла будет выглядеть следующим образом:

netsh interface ip set address name=»FASTNET» static 192.168.1.42 255.255.255.0 192.169.1.1 1

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

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

hostname

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

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

for /f «tokens=*» %%a in (‘dir /b PATH\*.*’) do ren PATH\%%a Prefix%%a

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

Второй вариант:

set thePATH=C:\test
for %%I in (*.txt) do ren «%thePATH%\%%~nxI» «%%~nI.dat»

Как использовать в пакетном файле символ процент 

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

echo 50%%

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

Как из пакетного файла сделать экспорт реестра 

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

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

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

Как из пакетного файла импортировать значения переменных реестра 

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

regedit.exe -s C:\environment.reg

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

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

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

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

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

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

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

:test
if exist c:\1.txt goto go
sleep 10
goto test
:go
notepad

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

:test
if exist c:\1.txt goto go
sleep 10
goto test
:go
rename c:\1.txt 1.txt
if not errorlevel 0 goto go
del c:\1.txt

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

Как добавить комментарии в bat-файл

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

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

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

rem Этот блок устанавливает соединение с удаленным сервером

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

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

Автоматическое создание резервной копии данных 

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

Скрипт архивирует папку файлопомойки (\\SERVER\e$ \Exchange)
и папку с данными юзеров (домашнюю Данные пользователей (\\SERVER\e$ \Departments))
Скрипт не архивирует медиафайлы, так как они занимают вагон места и их потеря у меня не критична 

rem *******************
rem задаём винты где лежат папки для архивирования и винт куда будем бэкапить
rem *******************
SET DRIVE1ST=d:
SET DRIVE2ND=e:

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

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

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

rem ******************************
rem *** Backup \\SERVER\e$ \Exchange
rem ******************************
SET DIRNAME=Exchange
SET FILENAME=SERVER_Exchange
SET SOURCEDIR=e:\Exchange
rar a -r -m5 -dh -x*.mp3 -x*.fcd -x*.avi -x*.zip -x*.rar -x*.exe -w%DRIVE2ND%\ -p%PASSWD% %DIRNAME%\%FILENAME%_new %SOURCEDIR%\*.*
if not exist %DIRNAME%\%FILENAME%_new.rar goto next2
del %DIRNAME%\%FILENAME%_old.rar
ren %DIRNAME%\%FILENAME%.rar %FILENAME%_old.rar
ren %DIRNAME%\%FILENAME%_new.rar %FILENAME%.rar
copy %DIRNAME%\%FILENAME%.rar %COPYTO%\%DIRNAME%

:next2
rem ***************************
rem *** Backup \\SERVER\e$ \Users
rem ***************************
SET DIRNAME=Departments
SET FILENAME=SERVER_Departments
SET SOURCEDIR=e:\Departments
if not exist %DIRNAME%\%FILENAME%_new.rar goto next3
del %DIRNAME%\%FILENAME%_old.rar
ren %DIRNAME%\%FILENAME%_4.rar %FILENAME%_old.rar
ren %DIRNAME%\%FILENAME%_3.rar %FILENAME%_4.rar
ren %DIRNAME%\%FILENAME%_2.rar %FILENAME%_3.rar
ren %DIRNAME%\%FILENAME%_new.rar %FILENAME%_2.rar
:next3
rem *******************
rem это если архив будет большим — кусками бить -v357888k
rem *******************
rem rar a -r -m5 -v357888k -dh -x*.mp3 -x*.fcd -x*.avi -x*.exe -w%DRIVE2ND%\ -p%PASSWD% %DIRNAME%\%FILENAME%_new %SOURCEDIR%
rem *******************
rem архивирование пошло, не берём мультимедиа файлы
rem *******************
rar a -r -dh -x*.mp3 -x*.fcd -x*.avi -x*.exe -x*.jpg -x*.tif -p%PASSWD% %DIRNAME%\%FILENAME%_new %SOURCEDIR%
goto next4

:next4
rem **********************************
rem *** Create repair disk on \\SERVER
rem **********************************
SET DIRNAME=MEDEA_rdisk
SET FILENAME=MEDEA_rdisk
SET SOURCEDIR=%windir%\repair
%windir%\system32\rdisk.exe /s-
rar a -r -m5 -dh -w%DRIVE2ND%\ -p%PASSWD% %DIRNAME%\%FILENAME%_new %SOURCEDIR%\*.*
if not exist %DIRNAME%\%FILENAME%_new.rar goto next5
del %DIRNAME%\%FILENAME%_old.rar
ren %DIRNAME%\%FILENAME%.rar %FILENAME%_old.rar
ren %DIRNAME%\%FILENAME%_new.rar %FILENAME%.rar
copy %DIRNAME%\%FILENAME%.rar %COPYTO%\%DIRNAME%

:next5

В итоге имеем 3 папки: 

Departments, в ней:
SERVER_Departments_2.rar — 2х дневной давности
SERVER_Departments_3.rar — 3х дневной давности
SERVER_Departments_4.rar — 4х дневной давности
SERVER_Departments_new.rar — НОВЫЙ
SERVER_Departments_old.rar — СТАРЫЙ 

Exchange
Так как архивируем обменник — он нам сильно то и не нужен храним только сегодняшний и вчерашний архивы
SERVER_Exchange.rar
SERVER_Exchange_old.rar 

ну и систему на всякий в папке
SERVER_rdisk
SERVER_rdisk.rar
SERVER_rdisk_old.rar

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

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

pslist.exe -e «процесс»
if %errorlevel%==1 start «» «программа» 

pslist — бесплатная утилита, которую можно скачать здесь.

Как создать папку с именем равным текущей дате 

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

MD %SYSTEMDRIVE%\%date:~-10% 

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

md %systemdrive%\%date:~0,2%_%date:~3,2%_%date:~6,4% 

или 

md %systemdrive%\%date:~6,4%_%date:~3,2%_%date:~0,2% 

Во втором случае, папки будут сортироваться по алфавиту. 

Как вариант, можно рассмотреть добавление к имени файла текущей даты: 

@echo off
for /F «tokens=1-4 usebackq delims=. » %%1 in (`date /t`) do set mydate=%%4.%%3.%%2
ren test.txt test%mydate%.txt 

Имя файла test.txt будет переименовано в test2005.03.05.txt

Можно ли зациклить в bat-файле выполнение команды? 

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

Цикл организуется при помощи следующих команд: 

:loop
… goto loop 

Паузу можно создать при помощи любой команды. Например, при помощи ping: 

ping -n 1 -w 100000 192.168.254.254 >nul 

-n 1 — выполнить один запрос
-w 100000 — ждать ответа 100 секунд (значение указывается в миллисекундах)
192.168.254.254 — IP адрес, который заведомо не существует в локальной сети, т.е. никогда не ответит на ping
>nul — перенаправление всего вывода команды ping в никуда.

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

Паузу можно создать при помощи любой команды. Например, при помощи ping: 

ping -n 1 -w 100000 192.168.254.254 >nul 

-n 1 — выполнить один запрос
-w 100000 — ждать ответа 100 секунд (значение указывается в миллисекундах)
192.168.254.254 — IP адрес, который заведомо не существует в локальной сети, т.е. никогда не ответит на ping
>nul — перенаправление всего вывода команды ping в никуда.

Можно использовать утилиту sleep.exe из Ресурскита.

Создание bat файлов

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

Создать BAT файл очень просто. Достаточно открыть блокнот и сохранить пустой лист с расширением .bat, выбрав опцию Сохранить как… и написав в поле Имя файла что-нибудь оканчивающееся на .bat, например test.bat.
Тип файла указываете как на скриншоте ниже — Все файлы. Сохраняете и получаете BAT файл.

Редактировать BAT файл можно в блокноте или любом другом текстовом редакторе, ориентированным на работу с кодом.

Теперь перейдем непосредственно к практической информации. В сети многие ищут ответ на вопрос Как быть с пробелами в BAT файлах?. В путях к папкам и исполняемым файлам наличие пробела вызывает ошибку. Самый распространенный ответ: Заключи путь в кавычки. И этот ответ не верен. Правда некоторые будут с пеной у рта утверждать, что он работает. Итак, появилось два почемупочему не верен и почему некоторые будут.

На Windows (как, впрочем, и на UNIX) установленные в системе программы соответствующим образом регистрируются системой. Поэтому некоторые из установленных программ могут запускаться одной простой командой из BAT файла или из апплета Выполнить панели Пуск. Одной из таких программ является Firefox:

start firefox

Если после этой команды писать путь к исполняемому файлу, то происходит следующее: запускается обозреватель Firefox и пробует обработать запрос, то есть файл, путь к которому указан. То есть, если указать следующее:

start firefox C:\Program Files\Mozilla Firefox\firefox.exe

Обозреватель откроется, чтобы не было написано после start firefox. Именно поэтому некоторые товарищи будут уверять что все прекрасно работает. Однако, если взять портативную программу, то ситуация окажется совсем иная. Рассмотрим в качестве примера ftp-клиент Filezilla. Поскольку система не знает о программе, вышеупомянутая строчка

start filezilla

работать не будет. Чтобы запустить неизвестную системе программу, надо указать к ней путь:

start D:\FileZilla\FileZilla.exe

Длинныe имена в bat-файлах

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

start C:\Program Files\Sound Club\scw.exe

В примере два имени с пробелами. Заменим их короткими. Правила создания коротких имен следующие: в коротком имени используются первые шесть символов имени без учета пробелов, после имени указывают порядковый номер папки с помощью символа ~. Так как папки Program Files и Sound Club у меня в единственном числе, получится следующее:

Program Files - Progra~1
Sound Club - SoundC~1
start C:\Progra~1\SoundC~1\scw.exe

Если рядом будут присутствовать две папки, например Sound Club и Sound Clown, то следуя правилам, в примере выше надо будет указать SoundC~2, так как в этом случае Sound Club окажется вторым именем (имена считаются в алфавитном порядке).

Но этот способ неудобен тем, что приходится указывать порядковые номера. Ситуация с Program files более менее нормальная. Мало у кого встретится две подобные папки на системном диске. Но если вы решили установить несколько продуктов Mozilla на свой компьютер. У вас получится несколько папок, например:

Mozilla Firefox
Mozilla Thunderbird
Mozilla Sunbird

Короткими именами для них будут

Mozill~1
Mozill~2
Mozill~3

А теперь представьте, что вы написали BAT файл с упоминанием этих программ. Если удалить Firefox, оставшиеся записи перестанут работать, а если удалить Thunderbird, перестанет работать запись для Sunbird. Короче, способ с короткими именами — не наш способ.

Пробелы и кавычки в bat-файлах

Кавычки на самом деле работают, но не с теми способами, которые обычно советуют. Советуют обычно следующее:

start "C:\Program Files\Sound Club\scw.exe"

Так команда не сработает, поскольку если посмотреть справку по ней (start /?), то в справке вы увидите следующее:

START ["заголовок"] [/D путь] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/NODE узел NUMA] [/AFFINITY маска сходства] [/WAIT] [/B]
      [команда/программа] [параметры]

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

start "" "C:\Program Files\Sound Club\scw.exe"

Также сработает и вариант с заключением в кавычки всех имён с пробелами по отдельности:

start C:\"Program Files"\"Sound Club"\scw.exe

Однако, в ряде случаев не работает ничего из вышеописанного. В таких случаях я могу посоветовать использовать команду cd. Переходим на системный раздел, затем с помощью cd в папку Program Files и запускаем программу (start):

%SystemDrive%
cd \Program Files\Sound Club\
start scw.exe

Я думаю, что такой способ будет работать везде. Теперь еще пара важных моментов. Допустим вы создали батник, запускающий три программы и вам нужно на время исключить запуск одной из трех. Это можно сделать удалением строки или ее комментированием. Первый способ — вандальный, а второй смотрите ниже.

start firefox
start jetaudio

В данном случае отключен запуск установленной в системе программы Defraggler.exe. Комментируют строки, указывая команду rem в начале строки. Все BAT файлы выполняются в окне консоли. Чтобы оно исчезало по окончании выполнения команд, не забывайте в конце писать команду на выход exit.

start firefox
start jetaudio

exit

Запуск приложений из bat-файла

В первой части статьи я в общих чертах рассказал о BAT файлах. Теперь стало понятно — что это такое и с чем его едят. Во второй части речь пойдет уже о более конкретных вещах. Например, о том, как при помощи BAT файла запустить несколько приложений с определенными настройками или в автоматическом режиме установить программу, чтобы не тратить время на ответы типа Вы согласны с условиями лицензионного соглашения? и не нажимать лишние кнопки.

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

start firefox

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

start C:\"Program Files"\"Mozilla Firefox"\firefox.exe

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

start C:\"Program Files"\"Mozilla Firefox"\firefox.exe
exit

Запуск программ в bat-файлах с параметрами (ключами)

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

start /min D:\FileZilla\FileZilla.exe
exit

Скомандовать в данном случае — значит указать ключ. Ключ указывается через слэш после основной команды (команда /ключ). Основной командой в данном случае является start. Правда ключ min работает только в половине случаев, потому как относится именно к команде запуска start, а не к программам, которые эта команда запускает.

Вообще ключей существует очень много и наборы ключей разных программ могут существенно различаться. Есть, правда, несколько общих. Например, ключ справки (/? или /help). Чтобы проследить работу этого ключа, рассмотрим практический пример. Откройте консоль (Жмёте      + R, вводите cmd, далее Enter) и набираете в консоли следующее:

start /?

Консоль выведет на экран перечень допустимых ключей c комментариями для команды start.

Обратите внимание на ключ /wait. В некоторых случаях он бывает просто незаменим. Например, вы решили с помощью BAT файла распаковать архив с программой и эту самую программу запустить. В батнике получится две команды — на распаковку и на запуск. Поскольку команды при запуске BAT файла выполнятся почти одновременно, архив распаковаться не успеет и запускать будет нечего. Поэтому будет ошибка. В этом случае на помощь придет ключ /wait:

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

start Sleep.exe 15

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

/S
/s
/q
/silent
и ряд других

В ряде случаев бывает очень удобно. Антивирус Avast имеет опцию тихой установки в корпоративной версии. В бесплатной (домашней) версии тихой установки якобы нет. Однако, если вы в курсе как работает инсталятор InstallShield, вы поймете, что это утка, так как этот инсталятор сам по себе поддерживает ключ тихой установки /S. А значит все продукты, выполненные на его базе — тоже. И Avast не исключение. Просто создаете в папке с Avast’ом BAT файл с содержанием

start avast.exe /S
exit

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

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


start /min D:\FileZilla\FileZilla.exe "ftp://логин:пароль@сервер"


start C:\"program files"\"mozilla firefox"\firefox.exe "http://localhost/папка_сайта/index.php"


start /min C:\"Program Files"\текстовой_редактор.exe "E:\сервер\папка_сайта\index.html"


start /min E:\сервер\папка_с_сайтом


exit

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

start /min /wait program.exe /m /S
start C:\Directory\program2.exe "C:\Files\file.odt"
exit

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

start C:\"program files"\"mozilla firefox"\firefox.exe "http://localhost/папка_сайта/index.php"

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

Наткнулся ещё на один конвертер BAT в EXE, можете рассмотреть в качестве альтернативы предыдущей программе: Advanced Bat To Exe Converter

На этом всё.

Если материалы сайта оказались для вас полезными, можете поддержать дальнейшее развитие ресурса, оказав ему (и мне ) моральную и материальную поддержку.

Использование bat файлов для создания «Заданий по расписанию» / Хабр

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

Наверняка многие сталкивались с задачей, когда для каких-либо целей в ОС Windows необходимо создать задание, выполняемое по расписанию (scheduled task).

Для этих целей имеется простой графический интерфейс. Однако как поступить, если задание должно создаваться автоматически?

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


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

:: Имя локального пользователя, под которым будем работать
set user_name=test_user

:: Пароль для локального пользователя
set user_passw=test_passw

А как известно пользователь должен находиться в группе с определенными правами. Вот тут и возникает определенная сложность, т.к. если в скрипте четко задать имя группы, то могут возникнуть проблемы на машине с другой локализацией, например китайской. И как будет называться на китайском группа «Пользователи» узнать будет не очень просто. К счастью, в ОС Windows группы привязаны к так называемому Group SID. Зная, к примеру, Group SID группы «Администраторы», мы можем использовать его в скрипте. Например, S-1-5-32-545 — это локальные пользователи, а S-1-5-32-544 — администраторы.

Теперь нужно определить имя для заданного Group SID, используемого в данной локализации. Тут нам на помощь придет WMIC (WMI command-line).

:: S-1-5-32-545 — локальные пользователи

Set GroupSID=S-1-5-32-545

Set GroupName=

For /F «UseBackQ Tokens=1* Delims==» %%I In (`WMIC Group Where «SID = ‘%GroupSID%'» Get Name /Value ^| Find «=»`) Do Set GroupName=%%J

Set GroupName=%GroupName:~0,-1%

Нужно знать еще один нюанс. При создании пользователя, в зависимости от системных настроек, задается время истечения пароля. И если пароль нужно будет поменять, то задание по расписанию не будет выполняться. Для этого нам нужно создать пользователя, у которого никогда не истекает пароль. Задать это в стандартной команде net user нельзя (expires:never — задает, что пользователь не может поменять пароль), поэтому опять прибегнем к помощи WMIC:

:: Создание пользователя

net user %user_name% %user_passw% /add  /comment:»User for works with application» /expires:never /fullname:%user_name% /passwordchg:no

:: Устанавливаем, чтобы пароль не истекал никогда

:: Либо так — wmic path Win32_UserAccount where Name=’%user_name%’ set PasswordExpires=false

wmic USERACCOUNT where Name=’%user_name%’ set PasswordExpires=false

:: Добавление локального пользователя в заданную локальную группу

net localgroup %GroupName% %user_name% /ADD

Обратите внимание, что если вы удаляете пользователя командой net user test_user /DELETE, то вам нужно будет вручную удалить его каталог по пути %USERS%\test_user\ либо предусмотреть его удаление в скрипте.

Ну а далее создаем само задание, выполняемое по расписанию:

:: Имя запланированного задания, под которым будет работать приложение
set task_name=Test_task_bat

:: Путь к приложению
set my_app_path=»d:test.bat»

:: Интервал работы приложения во временном задании

::  Valid schedule types: MINUTE, HOURLY, DAILY, WEEKLY, MONTHLY, ONCE, ONSTART, ONLOGON, ONIDLE.

:: ЕЖЕМИНУТНО, ЕЖЕЧАСНО, ЕЖЕДНЕВНО, ЕЖЕНЕДЕЛЬНО, ЕЖЕМЕСЯЧНО ПРИ ЗАПУСКЕ ВХОДЕ В СИСТЕМУ ПРИ ПРОСТОЕ
set schtasks_time=MINUTE

:: Начальное время старта приложения во временном задании
set schtasks_start=08:00:00

 

:: Создание запланированного задания

schtasks /create /tn «%task_name%» /tr %my_app_path% /sc %schtasks_time% /st %schtasks_start% /ru %user_name% /rp %user_passw%

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

P.S.

Предвижу подобные вопросы и комментарии: есть же более удобные инструменты, почему именно bat?

Just for fun!

Программирование пакетных файлов — (Введение и Учебное пособие)

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

Учебное пособие по программированию пакетных файлов

Программирование пакетных файлов — Введение


Пакетный файл — это неформатированный текстовый файл или файл сценария, который содержит несколько команд для выполнения определенной задачи.Он содержит серию команд, выполняемых интерпретатором командной строки.

Расширения: .bat или .cmd

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

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

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

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

Звучит весело, правда?

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

Как создать командный файл?


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

Просто откройте встроенный текстовый редактор для Windows.

После написания команд все, что вам нужно сделать, это сохранить его как файл .bat или .cmd .

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

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

Как запустить командный файл?


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

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

Давайте создадим простой пакетный сценарий для отображения «Это мой первый сценарий».

  • Скопируйте и вставьте приведенный выше код и щелкните этот файл, чтобы запустить сценарий.

    Он сгенерирует такой вывод.

Расшифровка программы

Строка 1:

  @ выкл. Эхо  

Если мы не поместим @echo off в начало скрипта, он выдаст вывод, в котором также будет отображаться само «echo».И результат будет таким:

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

Строка 2:

  echo Это мой первый скрипт  

Строка 2 просто повторяет «Это мой первый сценарий» на консоли.

Строка 3: Пауза используется для удержания экрана, пока мы не нажмем клавишу. Если pause не используется, экран вывода исчезнет в мгновение ока, и мы не сможем увидеть вывод.

Программирование пакетных файлов — что можно и что нельзя делать


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

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

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

ДО

НЕЛЬЗЯ

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

  • Избегайте однострочных кодов (несколько командных строк объединяются в одну с помощью операторов И и ИЛИ) и используйте блок кода.
  • Избегайте вложенных блочных кодов (вложенных в противном случае) и используйте вместо них подпрограммы.
  • Не используйте имена переменных в качестве имен команд
Несколько заключительных советов перед тем, как начать играть с пакетными командами

Теперь, когда вы узнали о пакетных файлах, в следующих руководствах вы узнаете о расширенных концепциях программирования пакетных файлов.

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



.

команд пакетного файла (A – Z) | Пояснения и примеры

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

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

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

Команды командного файла: Windows / DOS

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

Список команд командного файла

Примечание: Команды пакетного файла не чувствительны к регистру

АССОК

Пакетная команда ASSOC связывает расширение файла с типом файла или перечисляет все ассоциации.

Пример

  @ эхо ВЫКЛ.
АССОК | найти ".txt"
пауза  

Выход

  .txt = текстовый файл  

Как показано в выходных данных выше, он отображает ассоциацию файлов для .txt с расширением .

Если записано и выполнено только ASSOC , отобразятся все ассоциации файлов для каждого расширения, а не только .txt .

Нажмите здесь, чтобы вернуться к списку команд

АТРИБ

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

Пример

Теперь предположим, что у нас есть файл note.txt в нашем рабочем каталоге. Мы отобразим его атрибуты файла, а затем сделаем его скрытым и доступным только для чтения, добавив к нему атрибутов 'ah' и 'r' . И, наконец, мы удалим некоторые добавленные атрибуты.

  @ эхо ВЫКЛ.
:: Для отображения атрибута note.txt
ATTRIB note.txt

:: Чтобы сделать его только для чтения, добавив 'r'
ATTRIB + r примечание.текст
ATTRIB note.txt

:: Чтобы скрыть его, добавив "ах"
ATTRIB + ah note.txt
ATTRIB note.txt

:: Чтобы удалить атрибут только для чтения
ATTRIB -r note.txt
ATTRIB note.txt  

Выход

  Примечание.txt
A R note.txt
A R AH note.txt
AH note.txt  

Здесь, в этом выводе, A означает Архивный , R означает Только для чтения и AH означает Скрытый файл .

Нажмите здесь, чтобы вернуться к списку команд

CD

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

Пример

  @ эхо ВЫКЛ.
:: CD без каких-либо параметров отображает текущий рабочий каталог
CD
:: Переход к родительскому каталогу на один уровень выше
CD..
CD
:: Изменение пути к программам
CD \ Программы
CD
пауза  

Выход

  C: \ Пользователи \ abc
C: \ Пользователи
C: \ Программы
  

Нажмите здесь, чтобы вернуться к списку команд

ЧКДСК

Пакетная команда CHKDSK используется для проверки ошибок на диске.

Пример

  @ эхо ВЫКЛ.
ЧКДСК  

Нажмите здесь, чтобы вернуться к списку команд

ВЫБОР

Пакетная команда CHOICE предоставляет пользователю список опций.

Пример

  @ эхо ВЫКЛ.
ЭХО Хочешь кофе?
ECHO Введите Y для да
ECHO Введите N, если нет
ВЫБОР / c ДН / м «Да или Нет»  

Выход

Теперь этот сценарий выдаст следующий результат.

  Хотите кофе?
Введите Y для да
Введите N, если нет
Да или Нет [Д, Н]?  

Теперь консоль ждет вашего ввода, и как только вы введете свой ответ, она прекратит работу.

Нажмите здесь, чтобы вернуться к списку команд

CLS

Пакетная команда CLS очищает экран.

Пример

  @ эхо ВЫКЛ.
CLS
пауза  

Эта команда просто очищает все журналы на экране командной строки.

Нажмите здесь, чтобы вернуться к списку команд

CMD

Пакетная команда CMD вызывает новое окно командной строки.

Пример

  @ эхо ВЫКЛ.
CMD  

Нажмите здесь, чтобы вернуться к списку команд

КОМП

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

Пример

  @ эхо ВЫКЛ.
КОМП C: \ abc.txt C: \ xyz.txt  

Нажмите здесь, чтобы вернуться к списку команд

ПРЕОБРАЗОВАТЕЛЬ

Пакетная команда ПРЕОБРАЗОВАЕТ томов или дисков из одного формата в другой, то есть из FAT в NTFS.

Пример

  @ эхо ВЫКЛ.
ПРЕОБРАЗОВАТЬ D: \  

Нажмите здесь, чтобы вернуться к списку команд

КОПИЯ

Пакетная команда COPY используется для копирования файлов из одного места в другое.

Пример

  @ эхо ВЫКЛ.
:: Для копирования с одного диска на другой -xyz.txt из D: \ в E: \
КОПИЯ D: \ xyz.txt E: \

:: Если в имени файла есть пробелы - используйте двойные кавычки
КОПИРОВАТЬ "D: \ my file.txt" E: \  

Нажмите здесь, чтобы вернуться к списку команд

ДАТА

Пакетная команда DATE отображает текущую дату в системе.

Пример

  @ эхо ВЫКЛ.
echo% DATE%  

Выход

  Пт 07.07.2017  

Эта команда DATE отображает системную дату в командной строке, как показано выше.

Нажмите здесь, чтобы вернуться к списку команд

DEL

Пакетная команда DEL используется для удаления файлов.

Пример

  @ эхо ВЫКЛ.
:: Чтобы удалить отдельный файл xyz.txt
DEL D: \ xyz.txt

:: Удалить все файлы с расширениями .txt и запросить подтверждение перед удалением
DEL / p / s D: \ *. Txt

:: Remove \ p для удаления без подтверждения
DEL / с D: \ *. Txt  

Примечание. Команда DEL удаляет только файлы, но не каталоги.

Нажмите здесь, чтобы вернуться к списку команд

DIR

Пакетная команда DIR отображает все содержимое каталогов.

Пример

  @ эхо ВЫКЛ.
:: Чтобы вывести все содержимое текущего каталога
DIR

:: Вывести список всех скрытых файлов рабочего каталога
DIR / ах

:: Вывести список всех файлов с расширениями .php
DIR * .php
  
ДИСКОВАЯ ЧАСТЬ

Пакетная команда DISKPART показывает свойства раздела диска.

Пример

  @ эхо ВЫКЛ.
DISKPART
  

Этот сценарий запросит у пользователей разрешение на проверку свойств раздела диска и, если это разрешено, отобразит следующий вывод в консоли в зависимости от свойств диска.

Нажмите здесь, чтобы вернуться к списку команд

ЗАПРОС ВОДИТЕЛЯ

Пакетная команда DRIVERQUERY отображает все установленные драйверы и их свойства.

Пример

  @ эхо ВЫКЛ.
ЗАПРОС ВОДИТЕЛЯ
  

Выход

Этот вывод показывает часть списка драйверов с их свойствами и датой установки. Команда DRIVERQUERY показывает весь список драйверов, который огромен.

Нажмите здесь, чтобы вернуться к списку команд

ECHO

Пакетная команда ECHO используется для вывода команд включения / выключения и вывода сообщения на консоль.

Пример

  @ эхо ВЫКЛ.
эхо Привет  

Выход

  Привет  

Эта команда ECHO отображает Hello в консоли, как показано выше.

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

Если бы это эхо не было выключено, то результат был бы таким:

  C: \> echo Привет
Привет  

Нажмите здесь, чтобы вернуться к списку команд

ВЫХОД

Пакетная команда EXIT завершает работу и закрывает консоль.

Пример

  @ эхо ВЫКЛ.
эхо HI
ВЫХОД  

В этом примере, как только HI будет напечатано в консоли, команда EXIT завершит программу и закроет консоль вывода.

Нажмите здесь, чтобы вернуться к списку команд

РАСШИРЯТЬ

Пакетная команда EXPAND извлекает содержимое файла .cab .

Пример

  @ эхо ВЫКЛ.
РАСШИРЯТЬ xyz.такси
  

Этот сценарий извлечет все содержимое файла xyz.cab в то же место, где находится xyz.cab .

Нажмите здесь, чтобы вернуться к списку команд

FC

Пакетная команда FC находит разницу между двумя файлами и отображает их на консоли.

Пример

  @ эхо ВЫКЛ.
FC D: \ a.txt D: \ b.txt
  

Этот сценарий найдет разницу в содержании обоих файлов и выведет список всех из них.

Нажмите здесь, чтобы вернуться к списку команд

НАЙТИ

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

Пример

  @ эхо ВЫКЛ.
НАЙТИ "найди меня" example.txt
  

Этот сценарий будет искать строку «найди меня» в файле example.txt и, если она существует в файле example.txt, отобразит соответствующую строку на консоли.

Нажмите здесь, чтобы вернуться к списку команд

ФОРМАТ

Пакетная команда FORMAT используется для форматирования диска формата FAT 16/32 или NTFS в Windows.

Пример

  @ эхо ВЫКЛ.
ФОРМАТ E: \
  

Этот сценарий отформатирует диск E и перезапишет предыдущее содержимое.

Нажмите здесь, чтобы вернуться к списку команд

ПОМОЩЬ

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

Пример

  @ эхо ВЫКЛ.
ПОМОГИТЕ
  

Теперь это отобразит все доступные команды с их функциями в консоли.

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

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

  @ эхо ВЫКЛ.

:: Просто введите help и команду, о которой хотите узнать.
ПОМОЩЬ копия
  

Теперь это отобразит подробную информацию о команде копирования.

Как видите, HELP COPY отображает все подробности о команде COPY .

Нажмите здесь, чтобы вернуться к списку команд

IPCONFIG

Пакетная команда IPCONFIG отображает конфигурацию IP Windows.

Пример

  @ эхо ВЫКЛ.
IPCONFIG
  

Этот сценарий сгенерирует следующий вывод.

стр.S: Мы скрыли адрес iPV6 в приведенном выше выводе.

Нажмите здесь, чтобы вернуться к списку команд

ТАБЛИЧКА

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

Пример

  @ эхо ВЫКЛ.
ЭТИКЕТКА
  

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

Например, мой рабочий каталог — D :, и на нем есть ярлык «приложения». Таким образом, он выдаст следующий результат:

Нажмите здесь, чтобы вернуться к списку команд

MD

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

Пример

  @ эхо ВЫКЛ.
MD abc
  

Эта программа создаст новый каталог abc в текущем рабочем месте.

Нажмите здесь, чтобы вернуться к списку команд

БОЛЬШЕ

Пакетная команда MORE последовательно отображает содержимое файла.

Пример

  @ эхо ВЫКЛ.
БОЛЬШЕ D: \ example.txt
  

Эта программа будет отображать содержимое example.txt построчно, по очереди.

Нажмите здесь, чтобы вернуться к списку команд

ПЕРЕМЕЩЕНИЕ

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

Пример

  @ эхо ВЫКЛ.
:: Чтобы переместить xyz.txt из dir1 в dir2
ПЕРЕМЕСТИТЬ C: \ dir1 \ xyz.txt C: \ dir2

:: Чтобы переименовать каталог dir1 в dir2
ПЕРЕМЕСТИТЬ C: \ Program \ dir1 C: \ Program \ dir2

:: Чтобы переместить каталог dir1 из D: \ в D: \ music
ПЕРЕМЕСТИТЬ D: \ dir1 D: \ music \
  

Таким образом, команда MOVE может использоваться для перемещения файлов, каталогов и переименования каталогов.

Нажмите здесь, чтобы вернуться к списку команд

НЕТТО

Пакетная команда NET используется для многих сетевых функций в зависимости от используемых команд.

Пример

Для отображения пользователей:

  @ эхо ВЫКЛ.
NET пользователей
  

Это даст следующий результат:

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

  • чистые счета
  • чистый компьютер
  • чистая конфигурация
  • нетто продолжить
  • net файл
  • чистая группа
  • чистая помощь
  • сетевое имя
  • чистая пауза
  • чистая печать
  • чистая отправка
  • чистая сессия
  • чистая доля
  • чистый старт
  • чистая статистика
  • чистый стоп
  • чистое время
  • чистое использование
  • чистый вид

Нажмите здесь, чтобы вернуться к списку команд

ПУТЬ

Пакетная команда PATH отображает переменную пути или ее можно использовать для установки переменной пути.

Пример

  @ эхо ВЫКЛ.
ECHO% PATH%
  

Эта программа отобразит путь к текущему рабочему каталогу.

Нажмите здесь, чтобы вернуться к списку команд

ПАУЗА

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

Пример

  @ эхо ВЫКЛ.
ЭХО привет
Пауза
  

Эта программа напечатает hi в консоли и покажет сообщение «Нажмите любую клавишу, чтобы продолжить.. ’И дождитесь ввода от пользователя.

Нажмите здесь, чтобы вернуться к списку команд

ПИНГ

Пакетная команда PING используется для отправки пакетов ICMP / IP на указанный адрес по сети.

Пример

  @ эхо ВЫКЛ.
ПИНГ 127.0.1.1
  

Выход

Этот сценарий отправит пакеты на адрес 127.0.1.1, и результат будет отображаться следующим образом:

  Пинг 127.0.1.1 с 32 байтами данных:
Ответ от 127.0.1.1: байты = 32, время <1 мс TTL = 128
Ответ от 127.0.1.1: байты = 32, время <1 мс TTL = 128

Статистика пинга для 127.0.1.1:
Пакеты: отправлено = 2, принято = 2, потеряно = 0 (потеря 0%),
Приблизительное время в оба конца в миллисекундах:
Минимум = 0 мс, максимум = 0 мс, средний = 0 мс  

Нажмите здесь, чтобы вернуться к списку команд

РД

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

Пример

  @ эхо ВЫКЛ.
:: Чтобы удалить каталог xyz из C: \>
RD C: \ xyz

:: Чтобы удалить несколько каталогов из рабочего места
RD dir1 dir2  

Нажмите здесь, чтобы вернуться к списку команд

REM

Пакетная команда REM обозначает комментарии в пакетном сценарии.

Пример

  @ эхо ВЫКЛ.
REM Это комментарий
  

Все, что написано после REM , интерпретируется как комментарий и не выполняется в пакетных программах.

Нажмите здесь, чтобы вернуться к списку команд

REN

Пакетная команда REN используется для переименования файлов и каталогов.

Пример

  @ эхо ВЫКЛ.
:: Чтобы переименовать x.php в y.php
REN C: \ x.php C: \ y.php  

Нажмите здесь, чтобы вернуться к списку команд

НАБОР

Пакетная команда SET отображает список переменных среды системы.

Пример

  @ эхо ВЫКЛ.
НАБОР  

Нажмите здесь, чтобы вернуться к списку команд

ВЫКЛЮЧЕНИЕ

Пакетная команда SHUTDOWN при вызове выключает компьютер.

Пример

  @ эхо ВЫКЛ.
ВЫКЛЮЧЕНИЕ  

Нажмите здесь, чтобы вернуться к списку команд

СОРТ

Пакетная команда SORT используется для сортировки содержимого файла по алфавиту.

Пример

  @ эхо ВЫКЛ.
СОРТИРОВАТЬ D: \ example.txt  

Этот скрипт сортирует содержимое example.txt в алфавитном порядке в возрастающем или убывающем порядке.

Нажмите здесь, чтобы вернуться к списку команд

СТАРТ

Пакетная команда START используется для открытия файла или запуска новой программы.

Пример

  @ эхо ВЫКЛ.
ЗАПУСК paint.exe  

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

Нажмите здесь, чтобы вернуться к списку команд

СИСТЕМИНФО

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

Пример

  @ эхо ВЫКЛ.
SYSTEMINFO  

В зависимости от компьютера в результате будет получен следующий результат:

Конечно, подробностей будет гораздо больше, но, пожалуйста, попробуйте посмотреть на своем ПК.

Нажмите здесь, чтобы вернуться к списку команд

ТАСККИЛЛ

Пакетная команда TASKKILL используется для завершения запущенной задачи

Пример

Если вы должны были прервать работу блокнота на вашем ПК, то используется следующий сценарий.

  @ эхо ВЫКЛ.
TASKKILL / им notepad.exe  

Нажмите здесь, чтобы вернуться к списку команд

СПИСОК ЗАДАЧ

Пакетная команда TASKLIST выводит список всех запущенных задач в консоли.

Пример

  @ эхо ВЫКЛ.
СПИСОК ЗАДАЧ  

Нажмите здесь, чтобы вернуться к списку команд

ВРЕМЯ

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

Пример

  @ эхо ВЫКЛ.
ЭХО% ВРЕМЯ%  

Выход

  18: 01: 22: 06  

Текущее время отображается в консоли.

Нажмите здесь, чтобы вернуться к списку команд

НАЗВАНИЕ

Пакетная команда TITLE устанавливает новый заголовок для консоли вывода.

Пример

  @ эхо ВЫКЛ.
TITLE Новая консоль
  

Этот скрипт установит заголовок консоли вывода на «Новая консоль». Таким образом, консоль вывода будет выглядеть так:

Нажмите здесь, чтобы вернуться к списку команд

ДЕРЕВО

Пакетная команда TREE отображает древовидную диаграмму подкаталогов до последнего уровня.

Пример

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

  @ эхо ВЫКЛ.
ДЕРЕВО D: \ movies  

Выход

Этот сценарий сгенерирует следующий вывод.

Нажмите здесь, чтобы вернуться к списку команд

ТИП

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

Пример

  @ эхо ВЫКЛ.
ТИП C: \ notes.txt
Пауза
  

Эта программа выведет на консоль все содержимое файла notes.txt .

Нажмите здесь, чтобы вернуться к списку команд

VER

Пакетная команда VER отображает версию Windows или MS-DOS.

Пример

  @ эхо ВЫКЛ.
VER
пауза  

Выход

  Microsoft Windows [Версия 10.0,14393]  

Нажмите здесь, чтобы вернуться к списку команд

ТОМ

Пакетная команда VOL отображает текущую метку тома Windows.

Пример

  @ эхо ВЫКЛ.
ОБЪЕМ  

Выход

  Microsoft Windows [Версия 10.0.14393]  

Нажмите здесь, чтобы вернуться к списку команд

XCOPY

Пакетная команда XCOPY похожа на команду COPY , но команда COPY копирует отдельный файл, тогда как команда XCOPY копирует целые каталоги, включая подкаталоги.

Пример

  @ эхо ВЫКЛ.
XCOPY D: \ test.txt в E: \
  

Этот сценарий скопирует test.txt с диска D на диск E.

Нажмите здесь, чтобы вернуться к списку команд

Итак, это команды пакетного файла вместе с примерами.

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



.

Как создать пакетный файл (BAT) за пять простых шагов

Хотите создать командный файл? Это просто.

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

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

Как создать пакетный файл в Windows

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

  1. Откройте текстовый файл, например документ «Блокнот» или WordPad.
  2. Добавьте свои команды, начиная с @echo [off], за которым следует — каждая в новой строке — title [название вашего пакетного скрипта], echo [первая строка] и пауза.
  3. Сохраните файл с расширением .bat , например test.bat .
  4. Чтобы запустить командный файл, дважды щелкните только что созданный BAT-файл.
  5. Чтобы отредактировать командный файл, щелкните правой кнопкой мыши BAT-файл и выберите Изменить .

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

Test Bat File written in Notepad

А вот соответствующее командное окно для примера выше:

Test Bast file command line output

Если это было слишком быстро или вы хотите узнать больше о командах и их использовании, читайте дальше!

Шаг 1. Создайте BAT-файл

Допустим, у вас часто возникают проблемы с сетью; вы постоянно попадаете в командную строку, набираете ipconfig и отправляете эхо-запрос в Google для устранения сетевых проблем.Через некоторое время вы понимаете, что было бы немного эффективнее, если бы вы просто написали простой файл BAT, вставили его на USB-накопитель и использовали его на машинах, на которых вы устраняете неполадки.

Command Prompt with flexing artm


Лучшие уловки и подсказки для командной строки

Командная строка

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

Создать новый текстовый документ

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

new_text_file

Добавить код

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

  @echo off 
title Это ваш первый пакетный скрипт!
echo Добро пожаловать в пакетный сценарий!
пауза

Сохранить как файл BAT

Приведенный выше сценарий повторяет текст «Добро пожаловать в пакетный сценарий!».Сохраните файл, выбрав File , Save As , а затем назовите свой файл, как хотите. Завершите имя файла добавленным расширением .bat — например, welcome.bat — и нажмите OK . Это завершит пакетный процесс. Теперь дважды щелкните созданный командный файл, чтобы активировать его.

welcome_to_batch

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

Шаг 2. Изучение основ пакетного сценария

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

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

title: Предоставляя большую часть той же функции, что и тег в HTML, он предоставит заголовок для вашего пакетного сценария в окне командной строки.</p><p> <strong> cls: </strong> Очищает вашу командную строку, лучше всего использовать, когда посторонний код может сделать то, к чему вы обращаетесь, нужно найти.</p><p> <strong> rem: </strong> Сокращение для <strong> примечания </strong> обеспечивает ту же функциональность, что и тег <strong> <! - </strong> в HTML.Операторы Rem не вводятся в ваш код. Вместо этого они используются для объяснения и предоставления информации о коде.</p><p> <strong> %% a: </strong> Каждый файл в папке.</p><p> <strong> («.\ «): </strong> Корневая папка. При использовании командной строки необходимо направить приглашение в конкретный каталог перед изменением имени файла, удалением файла и т. Д. Для пакетных файлов вам нужно только вставить ваш .bat файл в каталог по вашему выбору.</p><p> <strong> pause: </strong> Позволяет разорвать логическую цепочку вашего файла.bat файл. Это позволяет пользователям читать командные строки перед продолжением кода. Фраза «Нажмите любую клавишу, чтобы продолжить …» будет обозначать паузу.</p><p> <strong> start «» [website]: </strong> Перейдет на выбранный вами веб-сайт с помощью браузера по умолчанию.</p><p> <strong> ipconfig: </strong> Это классический параметр командной строки, который раскрывает информацию, касающуюся сетевой информации.Эта информация включает MAC-адреса, IP-адреса и маски подсети.</p><p> <strong> ping: </strong> Пингует IP-адрес, отправляя пакеты данных по маршрутам сервера, чтобы измерить их местоположение и задержку (время ответа).</p><p> Библиотека пакетных переменных, мягко говоря, огромна.К счастью, в Викибуке есть запись, содержащая обширную библиотеку параметров и переменных пакетного сценария.</p><h3><span class="ez-toc-section" id="_3_BAT"> Шаг 3. Запишите и запустите свой BAT-файл </span></h3><p> Мы создадим два примера пакетных сценариев, которые могут упростить вашу повседневную работу в сети и офлайн.</p><h4><span class="ez-toc-section" id="i-66"> Новостной скрипт </span></h4><p> Давайте создадим сразу полезный пакетный скрипт.Что, если бы вы захотели открыть все свои любимые новостные сайты сразу после пробуждения? Поскольку в пакетных сценариях используются параметры командной строки, мы можем создать сценарий, который открывает все средства массовой информации в одном окне браузера.</p><p> Чтобы повторить процесс создания партии: сначала создайте пустой текстовый файл.<strong> Щелкните правой кнопкой мыши </strong> в пустом месте в папке по вашему выбору и выберите <strong> Новый </strong>, затем <strong> Текстовый документ </strong>. Открыв текстовый файл, введите следующий сценарий. Наш пример предоставит основные американские средства массовой информации, доступные в Интернете.</p><pre> <code> @echo off <br/> start "" http://www.cnn.com <br/> start "" http: // www.abc.com <br/> start "" http://www.msnbc.com <br/> start "" http://www.bbc.com <br/> start "" http://www.huffingtonpost.com <br/> start "" http: // www.aljazeera.com <br/> start "" https://news.google.com/ </code> </pre><p> В приведенном выше сценарии один параметр <strong> start «» </strong> накладывается поверх другого, чтобы открыть несколько вкладок.Вы можете заменить предоставленные ссылки на любые по вашему выбору. После того, как вы вошли в сценарий, перейдите к <strong> File </strong>, затем <strong> Save As </strong>. В окне «Сохранить как» сохраните файл с расширением <strong> .bat </strong> и измените параметр <strong> Сохранить как тип </strong> на <strong> Все файлы (*. *) </strong>.</p><p> <img class="lazy lazy-hidden" alt="save_as_bat"/><noscript><img alt="save_as_bat"/></noscript></p><p> После того, как вы сохранили свой файл, все, что вам нужно сделать, это <strong> дважды щелкнуть ваш BAT-файл </strong>.Мгновенно откроются ваши веб-страницы. Если хотите, можете разместить этот файл на своем рабочем столе. Это позволит вам получить доступ ко всем вашим любимым веб-сайтам одновременно.</p><h4><span class="ez-toc-section" id="i-67"> Организатор файлов </span></h4><p> Вы загружали несколько файлов в день, но сотни файлов забивали вашу папку загрузки? Создайте пакетный файл с помощью следующего сценария, который упорядочивает файлы по типу файлов.Поместите файл .bat в свою неорганизованную папку и дважды щелкните, чтобы запустить.</p><pre> <code> @echo off <br/> rem Для каждого файла в вашей папке <br/> для %% a in (". \ *") Do (<br/> rem проверьте, имеет ли файл расширение, и если это не наш сценарий <br/>, если "%% ~ xa "NEQ" "if" %% ~ dpxa "NEQ"% ~ dpx0 "(<br/> rem проверьте, существует ли папка расширения, если нет, то создается <br/>, если не существует" %% ~ xa "mkdir" %% ~ xa "<br/> rem Переместить файл в каталог <br/> move "%% a" "%% ~ dpa %% ~ xa \" <br/>)) </code> </pre><p> Вот пример моего прежнего рабочего стола, разрозненный набор файлов изображений.</p><p> <img class="lazy lazy-hidden" alt="assorted_files"/><noscript><img alt="assorted_files"/></noscript></p><p> Вот те самые файлы потом.</p><p> <img class="lazy lazy-hidden" alt="ordered_files"/><noscript><img alt="ordered_files"/></noscript></p><p> Это так просто.Этот пакетный сценарий также будет работать с любым типом файла, будь то документ, видео или аудиофайл. Даже если ваш компьютер не поддерживает формат файла, сценарий создаст для вас папку с соответствующей меткой. Если у вас уже есть папка JPG или PNG в вашем каталоге, скрипт просто переместит ваши типы файлов в соответствующее место.</p><h3><span class="ez-toc-section" id="i-68"> Автоматизируйте простые вещи с помощью пакетных скриптов </span></h3><p> Это лишь часть того, что могут предложить пакетные скрипты.Если вам нужно делать что-то простое снова и снова — будь то заказ файлов, открытие нескольких веб-страниц, массовое переименование файлов или создание копий важных документов — вы можете упростить утомительные задачи с помощью пакетных сценариев.</p><p> Сделайте еще больше, включив операторы IF в свои пакетные сценарии.А если вы также используете Linux, ознакомьтесь с лучшими способами использования команды <strong> df </strong>.</p><p> <img class="lazy lazy-hidden" alt="9 Android pranks to mess with your friends-Featured"/><noscript><img alt="9 Android pranks to mess with your friends-Featured"/></noscript></p><p> <strong> 9 Android-розыгрышей, чтобы общаться с друзьями </strong></p><p> Хотите обмануть своих друзей? Используйте эти приложения для Android-шуток, чтобы обмануть их и посмеяться.</p><p> <strong> Об авторе </strong></p><p> <strong> Ян Бакли<br /> (Опубликовано 143 статей) </strong></p><p> Ян Бакли, журналист-фрилансер, музыкант, исполнитель и видеопродюсер, живет в Берлине, Германия.Когда он не пишет или не на сцене, он возится с электроникой или кодом своими руками в надежде стать безумным ученым.</p><p> Ещё от Ian Buckley</p><h5><span class="ez-toc-section" id="i-69"> Подпишитесь на нашу рассылку новостей </span></h5><p> Подпишитесь на нашу рассылку, чтобы получать технические советы, обзоры, бесплатные электронные книги и эксклюзивные предложения!</p><h5><span class="ez-toc-section" id="i-70"> Еще один шаг…! </span></h5><p> Подтвердите свой адрес электронной почты в только что отправленном вам электронном письме.</p><p> .</p><h2><span class="ez-toc-section" id="BAT-_cmd"> BAT-файл: откройте новое окно cmd и выполните в нем команду </span></h2><p> Переполнение стека</p><ol role="presentation"><li> Около</li><li><p> Продукты</p></li><li> Для команд</li></ol><ol><li><p> Переполнение стека<br /> Общественные вопросы и ответы</p></li><li><p> Переполнение стека для команд<br /> Где разработчики и технологи делятся частными знаниями с коллегами</p></li><li><p> Вакансии<br /> Программирование и связанные с ним технические возможности карьерного роста</p></li><li><p> Талант<br /> Нанимайте технических специалистов и создавайте свой бренд работодателя</p></li><li><p> Реклама<br /> Обратитесь к разработчикам и технологам со всего мира</p></li><li> О компании</li></ol><p> Загрузка…</p><ol/>.</p><div class='yarpp-related yarpp-related-none'><p>No related posts.</p></div></div><div class="entry-footer is-start"> <b>Share :</b><ul class="post-share"><li><a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://wwwoldi.ru/raznoe/programmirovanie-fajlov-bat-prakticheskie-priemy-programmirovaniya-v-bat-fajlah-windows.html"><i class="fab fa-facebook-f"></i></a></li><li><a target="_blank" href="http://twitter.com/share?text=Программирование%20файлов%20bat:%20Практические%20приемы%20программирования%20в%20bat-файлах%20|%20windows&url=https://wwwoldi.ru/raznoe/programmirovanie-fajlov-bat-prakticheskie-priemy-programmirovaniya-v-bat-fajlah-windows.html"><i class="fab fa-twitter"></i></a></li><li><a target="_blank" href="http://pinterest.com/pin/create/button/?url=https://wwwoldi.ru/raznoe/programmirovanie-fajlov-bat-prakticheskie-priemy-programmirovaniya-v-bat-fajlah-windows.html&media=&description=Программирование%20файлов%20bat:%20Практические%20приемы%20программирования%20в%20bat-файлах%20|%20windows"><i class="fab fa-pinterest"></i></a></li><li> <a target="_blank" href="http://www.linkedin.com/shareArticle?mini=true&title=Программирование%20файлов%20bat:%20Практические%20приемы%20программирования%20в%20bat-файлах%20|%20windows&url=https://wwwoldi.ru/raznoe/programmirovanie-fajlov-bat-prakticheskie-priemy-programmirovaniya-v-bat-fajlah-windows.html"><i class="fab fa-linkedin"></i></a></li></ul></div></div></article></div><nav class="navigation post-navigation" aria-label="Записи"><h2 class="screen-reader-text">Навигация по записям</h2><div class="nav-links"><div class="nav-previous"><a href="https://wwwoldi.ru/raznoe/sli-1050-kakie-videokarty-mozhno-obedinit-v-sli.html" rel="prev"><span class="nav-subtitle">Previous:</span> <span class="nav-title">Sli 1050: какие видеокарты можно объединить в SLI</span></a></div><div class="nav-next"><a href="https://wwwoldi.ru/raznoe/kak-napisat-m2-na-klaviature-kak-vstavit-kvadratnyj-simvol-na-iphone.html" rel="next"><span class="nav-subtitle">Next:</span> <span class="nav-title">Как написать м2 на клавиатуре: Как вставить квадратный символ на iPhone</span></a></div></div></nav><aside class="related-posts"><h2 class="section-heading">Related Post</h2><div class="row"><div class="rpl-xl-4 rpl lg-6"><article class="related-post hentry post"><div class="post-wrapper"><div class="main-entry-content"><header class="entry-header"><h4><a href="https://wwwoldi.ru/raznoe/fizika-fizicheskoe-telo-chto-takoe-fizicheskie-tela-i-chto-takoe-veshhestva-urok-himiya-8-9-klass.html">Физика физическое тело: Что такое физические тела и что такое вещества — урок. Химия, 8–9 класс.</a></h4></header></div></div></article></div><div class="rpl-xl-4 rpl lg-6"><article class="related-post hentry post"><div class="post-wrapper"><div class="main-entry-content"><header class="entry-header"><h4><a href="https://wwwoldi.ru/jquery/jquery-plavnoe-poyavlenie-elementa-plavnoe-poyavlenie-bloka-div-v-jquery.html">Jquery плавное появление элемента: Плавное появление блока (div) в Jquery</a></h4></header></div></div></article></div><div class="rpl-xl-4 rpl lg-6"><article class="related-post hentry post"><div class="post-wrapper"><div class="main-entry-content"><header class="entry-header"><h4><a href="https://wwwoldi.ru/raznoe/postrojte-grafik-klassifikaczii-v-russkom-yazyke-po-sleduyushhemu-opisaniyu-sobirajte-griby-i-yagody-znaniya-site.html">Постройте график классификации в русском языке по следующему описанию: «собирайте грибы и ягоды!». — Знания.site</a></h4></header></div></div></article></div></div></aside></main><div id="comments" class="comments-area"><div id="respond" class="comment-respond"><h3 id="reply-title" class="comment-reply-title">Добавить комментарий <small><a rel="nofollow" id="cancel-comment-reply-link" href="/raznoe/programmirovanie-fajlov-bat-prakticheskie-priemy-programmirovaniya-v-bat-fajlah-windows.html#respond" style="display:none;">Отменить ответ</a></small></h3><form action="https://wwwoldi.ru/wp-comments-post.php" method="post" id="commentform" class="comment-form" novalidate><p class="comment-notes"><span id="email-notes">Ваш адрес email не будет опубликован.</span> <span class="required-field-message">Обязательные поля помечены <span class="required">*</span></span></p><p class="comment-form-comment"><label for="comment">Комментарий <span class="required">*</span></label><textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required></textarea></p><p class="comment-form-author"><label for="author">Имя <span class="required">*</span></label> <input id="author" name="author" type="text" value="" size="30" maxlength="245" autocomplete="name" required /></p><p class="comment-form-email"><label for="email">Email <span class="required">*</span></label> <input id="email" name="email" type="email" value="" size="30" maxlength="100" aria-describedby="email-notes" autocomplete="email" required /></p><p class="comment-form-url"><label for="url">Сайт</label> <input id="url" name="url" type="url" value="" size="30" maxlength="200" autocomplete="url" /></p><p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Отправить комментарий" /> <input type='hidden' name='comment_post_ID' value='2557' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /></p></form></div></div></div><div class="rpl-lg-4 secondary" id="sidebar-secondary"><aside id="secondary" class="sidebar"><section id="categories-3" class="widget sidebar-widget widget_categories"><div class="sidebar-title"><h3 class="widget-title">Рубрики</h3></div><ul><li class="cat-item cat-item-8"><a href="https://wwwoldi.ru/category/jquery">Jquery</a></li><li class="cat-item cat-item-5"><a href="https://wwwoldi.ru/category/mysql">Mysql</a></li><li class="cat-item cat-item-4"><a href="https://wwwoldi.ru/category/php">Php</a></li><li class="cat-item cat-item-9"><a href="https://wwwoldi.ru/category/dlya-chajnikov">Для чайников</a></li><li class="cat-item cat-item-3"><a href="https://wwwoldi.ru/category/raznoe">Разное</a></li><li class="cat-item cat-item-7"><a href="https://wwwoldi.ru/category/server">Сервер</a></li><li class="cat-item cat-item-1"><a href="https://wwwoldi.ru/category/sovety">Советы</a></li><li class="cat-item cat-item-6"><a href="https://wwwoldi.ru/category/ustanovka">Установка</a></li></ul></section><section id="calendar-5" class="widget sidebar-widget widget_calendar"><div id="calendar_wrap" class="calendar_wrap"><table id="wp-calendar" class="wp-calendar-table"><caption>Декабрь 2024</caption><thead><tr><th scope="col" title="Понедельник">Пн</th><th scope="col" title="Вторник">Вт</th><th scope="col" title="Среда">Ср</th><th scope="col" title="Четверг">Чт</th><th scope="col" title="Пятница">Пт</th><th scope="col" title="Суббота">Сб</th><th scope="col" title="Воскресенье">Вс</th></tr></thead><tbody><tr><td colspan="6" class="pad"> </td><td>1</td></tr><tr><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td></tr><tr><td>9</td><td>10</td><td>11</td><td>12</td><td>13</td><td>14</td><td>15</td></tr><tr><td>16</td><td>17</td><td>18</td><td>19</td><td>20</td><td>21</td><td>22</td></tr><tr><td id="today">23</td><td>24</td><td>25</td><td>26</td><td>27</td><td>28</td><td>29</td></tr><tr><td>30</td><td>31</td><td class="pad" colspan="5"> </td></tr></tbody></table><nav aria-label="Предыдущий и следующий месяцы" class="wp-calendar-nav"> <span class="wp-calendar-nav-prev"><a href="https://wwwoldi.ru/2024/11">« Ноя</a></span> <span class="pad"> </span> <span class="wp-calendar-nav-next"> </span></nav></div></section><section id="archives-11" class="widget sidebar-widget widget_archive"><div class="sidebar-title"><h3 class="widget-title">Архивы</h3></div><ul><li><a href='https://wwwoldi.ru/2024/11'>Ноябрь 2024</a></li><li><a href='https://wwwoldi.ru/2024/10'>Октябрь 2024</a></li><li><a href='https://wwwoldi.ru/2021/11'>Ноябрь 2021</a></li><li><a href='https://wwwoldi.ru/2021/10'>Октябрь 2021</a></li><li><a href='https://wwwoldi.ru/2021/09'>Сентябрь 2021</a></li><li><a href='https://wwwoldi.ru/2021/08'>Август 2021</a></li><li><a href='https://wwwoldi.ru/2021/07'>Июль 2021</a></li><li><a href='https://wwwoldi.ru/2021/06'>Июнь 2021</a></li><li><a href='https://wwwoldi.ru/2021/05'>Май 2021</a></li><li><a href='https://wwwoldi.ru/2021/04'>Апрель 2021</a></li><li><a href='https://wwwoldi.ru/2021/03'>Март 2021</a></li><li><a href='https://wwwoldi.ru/2021/02'>Февраль 2021</a></li><li><a href='https://wwwoldi.ru/2021/01'>Январь 2021</a></li><li><a href='https://wwwoldi.ru/2020/12'>Декабрь 2020</a></li><li><a href='https://wwwoldi.ru/2020/11'>Ноябрь 2020</a></li><li><a href='https://wwwoldi.ru/2020/10'>Октябрь 2020</a></li><li><a href='https://wwwoldi.ru/2020/09'>Сентябрь 2020</a></li><li><a href='https://wwwoldi.ru/2020/08'>Август 2020</a></li><li><a href='https://wwwoldi.ru/2020/07'>Июль 2020</a></li><li><a href='https://wwwoldi.ru/2020/06'>Июнь 2020</a></li><li><a href='https://wwwoldi.ru/2020/05'>Май 2020</a></li><li><a href='https://wwwoldi.ru/2020/04'>Апрель 2020</a></li><li><a href='https://wwwoldi.ru/2020/03'>Март 2020</a></li><li><a href='https://wwwoldi.ru/2020/02'>Февраль 2020</a></li><li><a href='https://wwwoldi.ru/2020/01'>Январь 2020</a></li><li><a href='https://wwwoldi.ru/2019/12'>Декабрь 2019</a></li><li><a href='https://wwwoldi.ru/2019/11'>Ноябрь 2019</a></li><li><a href='https://wwwoldi.ru/2019/10'>Октябрь 2019</a></li><li><a href='https://wwwoldi.ru/2019/09'>Сентябрь 2019</a></li><li><a href='https://wwwoldi.ru/2019/08'>Август 2019</a></li><li><a href='https://wwwoldi.ru/2019/07'>Июль 2019</a></li><li><a href='https://wwwoldi.ru/2019/06'>Июнь 2019</a></li><li><a href='https://wwwoldi.ru/2019/05'>Май 2019</a></li><li><a href='https://wwwoldi.ru/2019/04'>Апрель 2019</a></li><li><a href='https://wwwoldi.ru/2019/03'>Март 2019</a></li><li><a href='https://wwwoldi.ru/2019/02'>Февраль 2019</a></li><li><a href='https://wwwoldi.ru/2019/01'>Январь 2019</a></li><li><a href='https://wwwoldi.ru/2018/12'>Декабрь 2018</a></li><li><a href='https://wwwoldi.ru/2018/11'>Ноябрь 2018</a></li><li><a href='https://wwwoldi.ru/2018/10'>Октябрь 2018</a></li><li><a href='https://wwwoldi.ru/2018/09'>Сентябрь 2018</a></li><li><a href='https://wwwoldi.ru/2018/08'>Август 2018</a></li><li><a href='https://wwwoldi.ru/2018/07'>Июль 2018</a></li><li><a href='https://wwwoldi.ru/2018/06'>Июнь 2018</a></li><li><a href='https://wwwoldi.ru/2018/05'>Май 2018</a></li><li><a href='https://wwwoldi.ru/2018/04'>Апрель 2018</a></li><li><a href='https://wwwoldi.ru/2018/03'>Март 2018</a></li><li><a href='https://wwwoldi.ru/2018/02'>Февраль 2018</a></li><li><a href='https://wwwoldi.ru/2018/01'>Январь 2018</a></li><li><a href='https://wwwoldi.ru/1970/02'>Февраль 1970</a></li><li><a href='https://wwwoldi.ru/1970/01'>Январь 1970</a></li></ul></section></aside></div></div></div></div><footer class="site-footer is-bg"><div class="footer-in"><div class="container"><div class='row'><div class="rpl-xl-12 rpl-md-6 rpl-sm-12 footer-widget-item"></div></div></div></div><div class="site-info"><div class="container"><div class="siteinfo-text"> 2024 © Все права защищены. Карта сайта</div></div></div></footer> <noscript><style>.lazyload{display:none}</style></noscript><script data-noptimize="1">window.lazySizesConfig=window.lazySizesConfig||{};window.lazySizesConfig.loadMode=1;</script><script async data-noptimize="1" src='https://wwwoldi.ru/wp-content/plugins/autoptimize/classes/external/js/lazysizes.min.js'></script> <!-- noptimize --> <style>iframe,object{width:100%;height:480px}img{max-width:100%}</style><script>new Image().src="//counter.yadro.ru/hit?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();</script> <!-- /noptimize --></div> <script defer src="https://wwwoldi.ru/wp-content/cache/autoptimize/js/autoptimize_4ec849326303dc135eb2ade0194eb357.js"></script></body></html><script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="5ba05b126d137ec9eb4c0771-|49" defer></script><script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>