Копирование файлов через bat и быстрое и надежное резервное копирование облачных данных 2

Для ежедневных работ по архивации баз данных 1С Предприятия в файловом варианте я использую программу Handy Backup.

Конечно, данная тема также подымается и на курсе: Администратор 1С!

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

Альтернативой всегда были батники (скрипты), которые пользователи в основном запускают либо руками, когда требуется создать резервную копию базы, или, зарядив скрипт в «планировщик заданий windows», который по расписанию запускает уже эти скрипты.

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

И хоть на практике бэкап сделанный выгрузкой в *dt (на малых файловых базах) меня еще не подводил, но тем не менее существует небольшой риск что Вы из такого бэкапа можете не восстановить потом базу 1С. (Так пишет 1С).

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

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

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

И так первый скрипт это VBS.

Он быстро упакует Вашу файловую базу 1С в *zip архив и создаст его на диске что Вы укажете.

Работает быстро и просто.

Из настроек, что нужно сделать:

MyTarget = “E:\DemoTrade.zip”   -Куда поместить «бэкап».

Во втором варианте мы используем *bat файл который выполнит «бэкап» нашей базы в нужное место и упакует его в *rar архив.

Особенность скрипта в том что во первых он копирует только сам файл 1Cv8.1CD (без логов и прочего, другими словами делает «бэкап» довольно быстро и с отображением прогресса выполнения работы + дает понятное имя архиву в виде текущий даты).

05-10-2017 17-01-42

Конечно, здесь требуется архиватор WinRAR.

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

И вот еще один вариант бэкапа.

Этот способ нравиться мне больше всего, так как работает очень быстро и что главное безопасно! (очень надежный).

Им можно «забэкапить» сразу все нужные базы.

Вместе с «бэкапом» создается подробный лог файл, 

05-10-2017 17-48-30

Так Вы точно будете знать, если что-то пошло не так при его создании!

Чтоб скрипт заработал у Вас:

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

05-10-2017 17-10-39

05-10-2017 17-12-59

2. Нужно установить архиватор 7Zip.

Кстати вот расшифровка параметров:

u — Обновление файлов в архиве. Если файла нет, создает новый.

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

-mx0 —Не используем сжатие (Для скорости создания бэкапа!).

-mmt2 — использовать два потока (пригодится при обновлении архива).

-ms=off — по дефолту создаются solid-архивы. отключаем ибо они работают медленнее. возможно, для mx0 — некритично, но для mx1 и т.д. — оптимальнее.

-r — рекурсивно обрабатывать поддиректории.

e:\Backup_Base1S.7z — результирующий файл архива.

>> e:\m_backup_%date%.log — все (удачные и неудачные) результаты пишем в лог с датой.

Абсолютно все скрипты можно модернизировать, например написать команду для “выгона” пользователей из базы 1С.

(Тот же TASKKILL и другие.)

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

Всегда нужно предварительно завершить работу пользователей и только потом делать копию!

Если Вы хотите больше узнать о технической стороне 1С, тогда регистрируйтесь на первый бесплатный модуль курса: Администратор 1С >>>

Изображение

Хотим рассказать о простом способе организовать автоматический перенос файлов из директории в операционной системе Windows с одного сервера на другой. Логически, конфигурацию можно поделить на 3 этапа:

  1. Создание и шаринг сетевой папки;
  2. Формирование batch (cmd) скрипта;
  3. Настройка компоненты Task Scheduler для выполнения задач и раз в минуту;

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


Создание сетевой папки (шаринг)

Итак, дано: есть сервер А (источник файлов) и сервер Б (получатель файлов). На сервере А мы создали директорию, из которой мы будем забирать файлы. Мы назвали ее source, а на сервере Б, который является сервером назначения, мы создали директорию Destination, в которую мы будем складывать файлы. Разобрались.

Сетевая папка в Windows | Шаринг

Шаринг папки в Windows

На скриншоте выше красным цветом отмечен Network Path (сетевой путь). Это путь, по которому мы будем обращаться к этой папке. Сохраните его.

Важно! Обратите внимание, что в Network Path, как правило, будет указан путь вида %ИМЯ_ХОСТА%/Destination, где %ИМЯ_ХОСТА% – это имя компьютера, на котором расположена папка Destination. Важно, чтобы это имя резолвилось (разрешалось в IP – адрес) на хосте, где будет размещена папка Source (это сервер А). Можете добавить это имя и IP – адрес в локальный файл C:\Windows\System32\drivers\etc в Windows.


Батник – batch скрипт

В самом начале статьи мы озвучили небольшой roadmap (дорожную карту) по нашим работам. На сервере А (источник файлов) создайте файл с названием movefiles.bat.

Важно! Расширение файла movefiles должно быть именно bat

В созданный файл добавляем следующий код:

robocopy C:\Source \\%ИМЯ_ХОСТА%\Destination *.* /E /XD \\%ИМЯ_ХОСТА%\Destination /move

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

Сохраняем скрипт в корневом каталоге диска С, например.


Планировщик задач | Task Scheduler

Открываем Task Scheduler в Windows. После открытия, нажимаем на Create Basic Task в меню справа. Даем имя и описание нашему заданию:

Шаринг папки в Windows

В меню далее выбираем ежедневное выполнение нашего скрипта:

Task Scheduler Daily задача

Ставим выполнение задачи на 00:00:00:

Время выполнения задачи

В Action выбираем Start a program:

Вид действия | Start a program

Далее, указываем путь до нашего скрипта, который создавали ранее – movefiles.bat:

Выполнение батника через планировщик в виндоуз

В финальном окне смотрим, что у нас получилось. Если все ОК, как у нас, то нажимаем Finish:

Задача в Task Scheduler создана успешно

Run whether user is logged on or not

Далее, там же, в свойствах, переходим во вкладку Triggers, двойным нажатием открываем свойства уже созданного там триггера (Daily) и делаем вот что:

  • Отмечает чекбокс Repeat task every;
  • В поле, сразу после Repeat task every вписываем 1 mnute;

Repeat task every 1 minute


Тестируем

Итак, давайте протестируем, что у нас получилось. На сервере А в папку Source кладем тестовый текстовый файл:

Автоматический перенос тестового файла batch

Проверяем на сервере Б в директории Destination:

Автоматический перенос тестового файла батником работает



Рекомендуем

Копирование одного или нескольких файлов из одного расположения в другое.

Синтаксис

copy [/d]  [/v]  [/n]  [{/y|
/-y
}]  [/z]  [{/a|/b}]  источник [{
/a
|/b}]  [+ источник
[{/a|/b}] [
+
 …]]  [назначение [{/a|/b}]]

Параметры

/d
Сохранение копируемых шифрованных файлов как расшифрованных в месте назначения.
/v
Проверка правильности копирования путем сравнения копий файлов.
/n
Использование короткого имени (при наличии) копируемого файла, если его имя превышает 8
символов или его расширение превышает 3 символа.
/y
Отмена вывода запроса на подтверждение перезаписи существующего конечного файла.
/-y
Вывод запроса на подтверждение перезаписи существующего конечного файла.
/z
Копирование файлов по сети в режиме перезапуска.
/a
Указание текстового файла в формате ASCII.
/b
Указание двоичного файла.
источник
Обязательный параметр. Задание расположение файла или набора файлов, которые требуется
скопировать. Параметр источник может состоять из имени диска с двоеточием, имени
папки, имени файла или их комбинации.
назначение
Обязательный параметр. Задание расположения, в которое требуется скопировать файл или набор
файлов. Параметр назначение может состоять из имени диска с двоеточием, имени папки,
имени файла или их комбинации.
/?
Отображение справки в командной строке.

Примеры

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

copy memo.doc letter.doc /a

Чтобы скопировать файл Robin.typ с текущего каталога на текущем диске в существующий каталог
Birds на диске C, введите следующую команду:

copy robin.typ c:\birds

Если каталог Birds не существует, файл Robin.typ будет скопирован в файл с именем Birds в
корневой каталог диска C.

Чтобы скопировать несколько файлов в один, перечислите несколько файлов в параметре
источник, разделяя их имена значком плюс (+), и укажите в параметре назначение
файл, который должен содержать результат объединения этих файлов. Например, чтобы объединить
файлы Mar89.rpt, Apr89.rpt и May89.rpt из текущего каталога на текущем диске и поместить их в
файл Report в текущем каталоге на текущем диске, введите следующую команду:

copy mar89.rpt + apr89.rpt + may89.rpt report

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

copy report + mar89.rpt + apr89.rpt + may89.rpt

Кроме того, несколько файлов можно объединить в один с помощью символов подстановки (* или
?). Например, чтобы объединить все файлы с расширением .txt в текущем каталоге на текущем
диске в файл Combin.doc, введите следующую команду:

copy *.txt combin.doc

Если требуется объединить несколько двоичных файлов в один с использованием подстановочных
знаков, воспользуйтесь параметром /b. В результате CTRL+Z не будет рассматриваться как
символ конца файла в Windows XP. Например, введите следующую команду:

copy /b *.exe combin.exe

  • Если объединяются двоичные файлы, результат может оказаться непригодным из-за нарушения
    внутреннего форматирования.
:/>  Что такое LBA (логическая блочная адресация)? (Объяснение)

В следующем примере команда copy объединяет каждый файл с расширением .txt с
соответствующим ему файлом с расширением .ref. Результатом является файл с тем же именем, но
с расширением .doc. Таким образом, команда copy объединит файлы File1.txt и File1.ref
в файл File1.doc, затем файлы File2.txt и File2.ref в файл File2.doc и т. д. Например,
введите следующую команду:

copy *.txt + *.ref *.doc

Чтобы объединить сначала все файлы с расширением .txt, а затем все файлы с расширением .ref в
файл Combin.doc, введите следующую команду:

copy *.txt + *.ref combin.doc

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

Что такое bat-файлы?

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
расширения имен

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

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

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

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

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

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

выполнение команды cmd

Для запуска интерпретатора командной строки необходимо открыть меню Выполнить сочетанием клавиш 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 Files\123"
cd C:\”Program Files”\123

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

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

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

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

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

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

<первые шесть символов имени>~<порядковый номер>

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

Progra~1

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

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

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

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

Обновление 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

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

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

:/>  Запуск powershell из bat файла и выполнение команды

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

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

Заключение

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

  • 04.02.2020
  • 34 049
  • 01.11.2020
  • 7

COPY - описание команды и примеры использования

Описание

COPY – Копирование одного или нескольких файлов из одного расположения в другое.

Синтаксис

copy [/d] [/v] [/n] [{/y|/-y}] [/z] [{/a|/b}] источник [{/a|/b}] [+ источник [{/a|/b}] [+ ...]] [назначение [{/a|/b}]]

Параметры

Примечания

Примеры использования

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

copy memo.doc letter.doc /a

Чтобы скопировать файл Robin.typ с текущего каталога на текущем диске в существующий каталог Birds на диске C, введите следующую команду:

copy robin.typ c:\birds

Если каталог Birds не существует, файл Robin.typ будет скопирован в файл с именем Birds в корневой каталог диска C.

Чтобы скопировать несколько файлов в один, перечислите несколько файлов в параметре источник, разделяя их имена значком плюс (+), и укажите в параметре назначение файл, который должен содержать результат объединения этих файлов. Например, чтобы объединить файлы Mar89.rpt, Apr89.rpt и May89.rpt из текущего каталога на текущем диске и поместить их в файл Report в текущем каталоге на текущем диске, введите следующую команду:

copy mar89.rpt + apr89.rpt + may89.rpt report

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

copy report + mar89.rpt + apr89.rpt + may89.rpt

Кроме того, несколько файлов можно объединить в один с помощью символов подстановки (* или ?). Например, чтобы объединить все файлы с расширением .txt в текущем каталоге на текущем диске в файл Combin.doc, введите следующую команду:

copy *.txt combin.doc

Если требуется объединить несколько двоичных файлов в один с использованием подстановочных знаков, воспользуйтесь параметром /b. В результате CTRL+Z не будет рассматриваться как символ конца файла в Windows XP. Например, введите следующую команду:

copy /b *.exe combin.exe

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

В следующем примере команда copy объединяет каждый файл с расширением .txt с соответствующим ему файлом с расширением .ref. Результатом является файл с тем же именем, но с расширением .doc. Таким образом, команда copy объединит файлы File1.txt и File1.ref в файл File1.doc, затем файлы File2.txt и File2.ref в файл File2.doc и т. д. Например, введите следующую команду:

copy *.txt + *.ref *.doc

Чтобы объединить сначала все файлы с расширением .txt, а затем все файлы с расширением .ref в файл Combin.doc, введите следующую команду:

copy *.txt + *.ref combin.doc

Справочная информация

Копирование файлов через bat и быстрое и надежное резервное копирование облачных данных 2


XCOPY

COPY

Формат командной строки:

Параметры командной строки:

источник – Копируемые файлы.

целевой_объект – Расположение или имена новых файлов.

/A – Копирование только файлов с установленным архивным атрибутом; сам атрибут при этом не изменяется.

/M – Копирование только файлов с установленным архивным атрибутом; после копирования атрибут снимается.

/D:m-d-y – Копирование файлов, измененных не ранее указанной даты. Если дата не указана, заменяются только конечные файлы, более старые, чем исходные.

/P – Вывод запросов перед созданием каждого нового файла.

/S – Копирование только непустых каталогов с подкаталогами.

/E – Копирование каталогов с подкаталогами, включая пустые. Эквивалентен сочетанию ключей /S /E. Совместим с ключом /T.

/V – Проверка размера каждого нового файла.

/W – Вывод запроса на нажатие клавиши перед копированием.

/C – Продолжение копирования вне зависимости от наличия ошибок.

/I – Если целевой объект не существует и копируется несколько файлов, считается, что целевой объект задает каталог.

/Q – Запрет вывода имен копируемых файлов.

/F – Вывод полных имен исходных и целевых файлов.

/L – Вывод имен копируемых файлов.

/G – Копирование зашифрованных файлов в целевой каталог, не поддерживающий шифрование.

/H – Копирование, среди прочих, скрытых и системных файлов.

/R – Перезапись файлов, предназначенных только для чтения.

/T – Создание структуры каталогов без копирования файлов. Пустые каталоги и подкаталоги не включаются в процесс копирования. Для
создания пустых каталогов и подкаталогов используйте сочетание ключей /T /E.

/U – Копирование только файлов, уже имеющихся в целевом каталоге.

/K – Копирование атрибутов. При использовании команды XСOPY обычно сбрасываются атрибуты “Только для чтения”.

/N – Использование коротких имен при копировании.

/O – Копирование сведений о владельце и данных ACL.

/X – Копирование параметров аудита файлов (подразумевает ключ /O).

/Y – Подавление запроса подтверждения на перезапись существующего целевого файла.

/-Y – Запрос подтверждения на перезапись существующего целевого файла.

/Z – Копирование сетевых файлов с возобновлением.

/B – Копирование символической ссылки вместо ее целевого объекта.

/J – Копирование с использованием небуферизованного ввода/вывода. Рекомендуется для очень больших файлов.

Ключ /Y можно установить через переменную среды COPYCMD.

Ключ /-Y командной строки переопределяет такую установку.

Примеры использования XCOPY

XCOPY /? – выдать краткую справку по использованию команды.


Что означает D:\copy1:
имя файла или каталога
(F = файл, D = каталог)? D

После ответа D целевой каталог будет создан и копирование будет выполняться в D:\COPY1\. Для подавления запроса на создание целевого каталога используется параметр /I:

xcopy %TEMP%\*.ini D:\copy1\ini /H /Y /C /R /S /I – копирование всех файлов с расширением .ini из каталога временных файлов в каталог D:\copy1\ini\ . Если целевой подкаталог \ini\ не существует, то он будет создан без запроса пользователю ( /I ) .

xcopy %TEMP%\*.ini D:\copy1\ini /H /Y /C /R /S /I /D:09-16-2013 – то же, что и в предыдущем примере, но выполняется копирование только тех файлов, у которых установлена дата изменения 16 сентября 2013 года и старше.

xcopy C:\ D:\copy1\LISTDIR /H /Y /C /R /S /I /E /T – создать структуру папок диска C: в каталоге D:\copy1\LISTDIR. Копирование файлов не выполняется. Копируются только папки, включая пустые, скрытые и системные.

xcopy C:\ D:\copy1\LISTDIR /H /Y /C /R /S /I /E /T /D:09-16-2013 воссоздать в каталоге D:\copy1\LISTDIR структуру папок диска C: , с датой изменения 16 сентября 2013 года и позже.

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


Весь список команд CMD Windows

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

Вашему вниманию — относительно простой скрипт (CMD-сценарий), реализующий резервное копирование с заданной глубиной архивации.

Скрипт предназначен для создания резервных копий путем упаковки в архив содержимого произвольного каталога. Помимо собственно поддержки глубины архивации в скрипте раеализовано сохранение новых резервных копий в каталоги, имена которых формируются на основе даты/времени резервирования. При выполнении архивации RAR будет пытаться открывать также совместно используемые файлы (бывает полезно, чтобы не заставлять пользователей обязательно выйти из программы; например, при резервировании файловых баз 1С). Удобнее всего использовать такой подход к резервированию данных, если прописать запуск скрипта в планировщик.

SETLOCAL enabledelayedexpansion
rem Глубина архивации (количество последних архивов, которые должны быть сохранены)
SET ArcDepth=5
rem Путь к каталогу, в который будут складываться резервные копии
SET DirName=My Backup's
rem Путь к каталогу с новым бэкапом (%DATE: =0% %TIME: =0% - замена пробелов в %DATE% и %TIME% на нули)
FOR /f "tokens=1-7 delims=/-:., " %%a IN ("%DATE: =0% %TIME: =0%") do (	SET NewBkDir=%DirName%\%%c.%%b.%%a_%%d.%%e.%%f.%%g
)
rem Путь к лог-файлу
SET LogFile=%DirName%\%DirName%.LOG
ECHO ***** НАЧАЛО %DATE% %TIME% ***** >> "%LogFile%"
IF NOT EXIST "%DirName%" (	MD "%DirName%"	ECHO "%DirName%" - создан >> "%LogFile%"
)
ECHO Создание нового каталога для бэкапа: >> "%LogFile%"
IF NOT EXIST "%NewBkDir%" (	MD "%NewBkDir%"	ECHO "%NewBkDir%" - создан >> "%LogFile%"
) ELSE (	ECHO "%NewBkDir%" - существовал ранее >> "%LogFile%"
)
rem Блок создания новой резервной копии
SET SrcData=D:\My Src
SET ArcName=%NewBkDir%\MySrc.rar
ECHO Архивация "%SrcData%" с помощью RAR >> "%LogFile%"
rar a -m5 -md4096 -ep1 -ri1 -dh -ilog"%LogFile%" "%ArcName%" "%SrcData%"
rem Соблюдение глубины архивации (должны остаться только последние %ARCDEPTH% каталогов)
ECHO Удаление старых бэкапов: >> "%LogFile%"
SET Index=0
rem DIR /AD /B /O-D "%DirName%" - получение упорядоченного по дате списка каталогов, начиная с самых новых
FOR /f "tokens=1" %%i IN ('DIR /AD /B /O-D "%DirName%"') DO (	rem Первые %ArcDepth% архивов пропускаем, остальные удаляем	SET /a Index+=1	IF !Index! LEQ %ArcDepth% (	echo "%DirName%\%%i" - оставлен >> "%LogFile%"	) else (	RMDIR /S/Q "%DirName%\%%i"	echo "%DirName%\%%i" - удален >> "%LogFile%"	)
)
ECHO ***** КОНЕЦ %DATE% %TIME% ***** >> "%LogFile%"
ECHO. >> "%LogFile%"
ECHO. >> "%LogFile%"

Поскольку используется консольная версия архиватора RAR, необходимо, чтобы для скрипта был доступен RAR.exe. Для новых локализованных версий архиватора помимо файла RAR.exe также желательно наличие файла RarLng.dll, а для зарегистрированных пользователей — еще и файла rarreg.key. Для обеспечения доступности можно, например, просто положить все нужные файлы в рабочий каталог скрипта.

:/>  В powershell 5 1 как переходить предупреждения из команды удаленного вызова

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

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

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

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

SET NewBkDir=%DirName%\%%c.%%b.%%a_%%d.%%e.%%f.%%g

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

Время на прочтение

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

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

Естественно, простота скрипта обернулась и его недостатками, а именно:

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

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

Скрипт создания полного архива

@echo off
chcp 1251 >nul
set filebkp=server
call pass.bat user 1
call pass.bat pass 2
call pass.bat pwd 3
call pass.bat recipient 4
set mailsend=mailsend1.17b15.exe
set i=1
set pathbkp=..\backup
set pathtemp=..\temp
set srvbkp=https://%user%:%pass%@webdav.yandex.ru/backup/%filebkp%
set full=%filebkp%-full
set inc=%filebkp%-inc
set h=%TIME:~0,2%
set m=%TIME:~3,2%
set s=%TIME:~6,2%
set ms=%TIME:~9,2%
set curtime=%h%-%m%-%s%
set dd=%DATE:~0,2%
set mm=%DATE:~3,2%
set yyyy=%DATE:~6,4%
set curdate=%yyyy%-%mm%-%dd%
set curdatetime=%curdate: =0%-%curtime: =0%
call :loging "-----------------------------------"
call :loging "Текущее время - %curdatetime%"
call :loging "Создаем резервную копию текущих архивов"
ren "%pathtemp%" temp-bkp
md "%pathtemp%"
call :loging "Создаем полный архив %full%.7z"
7z.exe a -xr0!*.log -xr0!*.bak -xr0!*.tmp "%pathtemp%\%full%".7z -r -mx1 "%pathbkp%\*" -%pwd%
call :loging "Создаем резервную копию текущих архивов на сервере"
curl.exe -k -X MOVE -H "Destination:/backup/%filebkp%"-bkp "%srvbkp%" -o .\stdout
curl.exe -k -X MKCOL "%srvbkp%" -o .\stdout
:upload
call :loging "Попытка отправки номер %i%"
call :loging "Отправляем на сервер файл %full%.7z"
curl.exe -k -T "%pathtemp%\%full%".7z "%srvbkp%"/ --progress-bar -o .\stdout
call :loging "Скачиваем файл %full%.7z с сервера для сравнения с исходным"
curl.exe -k "%srvbkp%/%full%".7z -o "%pathtemp%"\test.7z --progress-bar -o .\stdout
call :loging "Сравниваем скачанный файл с исходным"
fc /LB1 /B "%pathtemp%\%full%".7z "%pathtemp%"\test.7z > nul
if ERRORLEVEL 1 goto Different
call :loging "Файлы одинаковы:"
set tolog="%full%.7z успешно отправлен на сервер"
call :loging %tolog%
set mailsubject=%tolog:"=%
call :loging "Удаляем устаревшие версии архива с компьютера и сервера"
RD /s/q "%pathtemp%"-bkp
curl.exe -k -X DELETE "%srvbkp%"-bkp -o .\stdout
del /q "%pathtemp%"\test.7z
goto exit
:Different
call :loging "Файлы различаются: %full%.7z на сервере НЕ совпадает с исходным"
call :loging "Повторяем отправку"
set /a i+=1
if %i% = 5 goto exit-f
goto upload
:exit-f
set tolog="Отправка файла %full%.7z на сервер не удалась"
call :loging %tolog%
set mailsubject=%tolog:"=%
call :loging "Восстанавливаем файлы предыдущего архива"
RD /s/q "%pathtemp%"
ren "%pathtemp%"-bkp temp
curl.exe -k -X DELETE "%srvbkp%" -o .\stdout
curl.exe -k -X MOVE -H "Destination:/backup/%filebkp%" "%srvbkp%"-bkp -o .\stdout
:exit
echo Отправляем лог %filebkp%-log.txt на сервер
curl.exe -k -T %filebkp%-log.txt "%srvbkp%"/../ --progress-bar -o .\stdout
echo Отправляем отчет в почту
%mailsend% -to %recipient% -from %user%@yandex.ru -ssl -port 465 -auth -smtp smtp.yandex.ru -user %user% -pass %pass% -sub "%filebkp%: %curdatetime% - %mailsubject%" -cs "windows-1251" -mime-type "text/plain" -msg-body %filebkp%-log.tmp
del /q %filebkp%-log.tmp
exit
:loging
echo %~1
echo %~1 >> %filebkp%-log.txt
echo %~1 >> %filebkp%-log.tmp
exit /b

Скрипт создания инкрементного архива

@echo off
chcp 1251 >nul
set filebkp=server
call pass.bat user 1
call pass.bat pass 2
call pass.bat pwd 3
call pass.bat recipient 4
set mailsend=mailsend1.17b15.exe
set tolog=zero
set mailsubject=zero
set i=1
set pathbkp=..\backup
set pathtemp=..\temp
set srvbkp=https://%user%:%pass%@webdav.yandex.ru/backup/%filebkp%
set full=%filebkp%-full
set inc=%filebkp%-inc
set h=%TIME:~0,2%
set m=%TIME:~3,2%
set s=%TIME:~6,2%
set ms=%TIME:~9,2%
set curtime=%h%-%m%-%s%
set dd=%DATE:~0,2%
set mm=%DATE:~3,2%
set yyyy=%DATE:~6,4%
set curdate=%yyyy%-%mm%-%dd%
set curdatetime=%curdate: =0%-%curtime: =0%
call :loging "-----------------------------------"
call :loging "Текущее время - %curdatetime%"
call :loging "Создаем инкрементный архив %inc%-%curdatetime%.7z"
7z.exe u -xr0!*.log -xr0!*.bak -xr0!*.tmp "%pathtemp%\%full%".7z -u- -up3q3r2x2y2z0w2!"%pathtemp%\%inc%-%curdatetime%".7z "%pathbkp%\*" -%pwd%
:upload
call :loging "Попытка отправки номер %i%"
call :loging "Отправляем архив на сервер"
curl.exe -k -T "%pathtemp%\%inc%-%curdatetime%".7z "%srvbkp%"/ --progress-bar -o .\stdout
call :loging "Скачиваем архив с сервера для сравнения с исходным"
curl.exe -k "%srvbkp%/%inc%-%curdatetime%".7z -o "%pathtemp%"\test.7z --progress-bar -o .\stdout
call :loging "Сравниваем скачанный архив с исходным"
fc /LB1 /B "%pathtemp%\%inc%-%curdatetime%".7z "%pathtemp%"\test.7z > nul
if ERRORLEVEL 1 goto Different
call :loging "Файлы одинаковы"
set tolog="%inc%-%curdatetime%.7z успешно отправлен на сервер"
call :loging %tolog%
set mailsubject=%tolog:"=%
goto exit
:Different
call :loging "Файлы различаются: %inc%-%curdatetime%.7z на сервере НЕ совпадает с исходным"
call :loging "Повторяем отправку"
set /a i+=1
if %i% = 5 goto exit-f
goto upload
:exit-f
set tolog="Отправка файла %inc%-%curdatetime%.7z на сервер не удалась"
call :loging %tolog%
set mailsubject=%tolog:"=%
:exit
del /q "%pathtemp%"\test.7z
echo Отправляем лог %filebkp%-log.txt на сервер
curl.exe -k -T %filebkp%-log.txt "%srvbkp%"/../ --progress-bar -o .\stdout
echo Отправляем отчет в почту
%mailsend% -to %recipient% -from %user%@yandex.ru -ssl -port 465 -auth -smtp smtp.yandex.ru -user %user% -pass %pass% -sub "%filebkp%: %mailsubject%" -cs "windows-1251" -mime-type "text/plain" -msg-body %filebkp%-log.tmp
del /q %filebkp%-log.tmp
exit
:loging
echo %~1
echo %~1 >> %filebkp%-log.txt
echo %~1 >> %filebkp%-log.tmp
exit /b

Новые команды:

call pass.bat xx x — вызов внешней программы, возвращающей обратно переменную xx со значением, указанным для идентификатора x.

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

for /f "usebackq delims=" %%i in (`find /n /v "" "%~dp0"pass.txt ^| find "[%2]"`) do (
set newvar=%%i
)
set %1=%newvar:~3%

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

set mailsend=mailsend1.17b15.exe — указание программы для отправки отчета в почту пользователя. Отправка письма происходит с учетной записи yandex.ru, с которой происходит отправка файлов в облако.

set i=1 — установка счетчика попыток на 1

call :loging “———————————–“ — вызов процедуры логирования. Процедуре передается строка, которая далее записывается в 2 файла — файл лога %filebkp%-log.txt и отдельный файл текущих операций %filebkp%-log.tmp, который затем отправляется пользователю как отчет об результате архивирования.

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

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

  1. для полного архива — создает резервные копии текущих архивов на сервере и на локальном компьютере
  2. создает новую резервную копию
  3. пытается отправить её на сервер
  4. после отправки скачивает резервную копию и сравнивает с оригиналом
  5. в случае успеха сравнения — отправляет на сервер лог операций и пользователю в почту отчет об успешной операции через программу mailsend1.17b15.exe + для полного архива — удаляет устаревшие версии архива
  6. в случае обнаружения разницы между файлами — пытается выполнить повторную отправку файла на сервер, и если в течении 5 попыток отправка не удается — отправляет на сервер лог операций и пользователю в почту отчет об неудаче через программу mailsend1.17b15.exe:
  7. подчищает временный файл текущих операций.

P.S.

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