Копирование файлов bat по сети: Как написать свой bat файл для создания резервной копии
Содержание
BAT скрипт для резервного копирования папки в Облако Mail.Ru
- 19 июня 2022
Есть у меня скрипт для резервного копирования папки на соседний диск:
BAT скрипт для резервного копирования папки
Этот скрипт мне ежедневно делает резервную копию папки на примонтированный диск. Я решил немного усилить безопасность и добавить автоматическое еженедельное резервное копирование папки в Облако Mail.Ru. Поскольку я не любитель лишнего софта, то делать бэкап будем обычным BAT файлом. Принцип действия скрипта прост:
- Монтируем облачный диск в качестве обычного локального диска по протоколу WebDAV.
- Архивируем с помощью 7-Zip нужную папку на примонтированный диск, разбивая архив на файлы по 2 ГБ.
- Удаляем старые архивы.
- Демонтируем облачный диск.
Для того, чтобы скрипт заработал, нужно выполнить подготовительные работы. Нужно установить архиватор и настроить работу WebDAV.
Подключаем Облако Mail.Ru через WebDAV с помощью командной строки
7-Zip
7-Zip — бесплатный архиватор
Архиватор позволит загружать бэкап в облако в виде архива, тем самым экономя место в облаке. Одновременно с этим архиватор разобьёт архив на файлы по 2 ГБ, по протоколу WebDAV всё равно не получится загрузить файл больше 4 ГБ, по крайней мере в Облако mail.ru.
Подготовка служб
Сперва нужно проверить, работает ли у вас служба Веб-клиент (WebClient).
services.msc
Находим её в списке служб.
Служба Веб-клиент (WebClient) по умолчанию остановлена и находится в ручном режиме.
Меняем тип запуска на автоматический, и запускаем службу.
Если вы работаете на сервере, то служба Веб-клиент (WebClient) по умолчанию в серверных операционных системах Windows не установлена. Устанавливаем и запускаем:
Установка WebDAV клиента на Windows Server 2016
Генерируем пароль приложения
Для того, чтобы подключиться к облаку через WebDAV, нужно сгенерировать специальный пароль. По сути, мы будем неким сторонним приложением, которому нужно дойти в облако. Логинимся в браузере в свой ящик mail.ru и переходим на страницу:
https://account.mail.ru/user/2-step-auth/passwords/
Добавить.
Придумываем название для приложения. Продолжить.
Пишем пароль от ящика, ставим галку, что мы не верблюд. Продолжить.
Пароль сгенерирован, копируем его, он нам пригодится. Пароль выглядит как-то так: FKh63KgDL4JgDLWJjdJ2.
Таких паролей можно сгенерировать сколько угодно, и удалить потом, когда надобность в них отпадёт.
Код
@echo off SetLocal EnableDelayedExpansion rem ============================= rem ====== admin variables ====== rem ============================= set CloudURL=https://webdav.cloud.mail.ru/ set CloudPassword=FKh63KgDL4JgDLWJjdJ2 set [email protected] set LocalDriveLetter=O set FileName=web set SourceDir=C:\web set BackupDir=%LocalDriveLetter%:\backup\internet-lab.ru\ set NumFolders=2 rem ============================= rem ======== 7-Zip path ========= rem ============================= set a7z=%ProgramFiles%\7-Zip\7z.exe rem ============================= rem ======== open cloud ========= rem ============================= net use %LocalDriveLetter%: %CloudURL% %CloudPassword% /user:%CloudUser% 2>nul >nul rem ============================= rem == create backup directory == rem ==== YYYY-MM-DD-hhmmss ====== rem ============================= set h=%time:~0,2% set h=%h: =0% set FullBackupDir=%BackupDir%%date:~6,4%-%date:~3,2%-%date:~0,2%-%h%%time:~3,2%%time:~6,2%\ md %FullBackupDir% rem ============================= rem ====== zip directory ======== rem ============================= "%a7z%" a -tzip -v2g -bb0 -bd "%FullBackupDir%%FileName%.zip" "%SourceDir%" 2>nul >nul rem ============================= rem ==== remove old folders ===== rem ============================= for /f "tokens=* delims=" %%D in ('dir %BackupDir% /ad /b /o-n') do ( if not %%D=="" ( if not !NumFolders!==0 ( set /a NumFolders-=1 ) else ( rd /s /q %BackupDir%%%D 2>nul >nul ) ) ) rem ============================= rem ======= close cloud ========= rem ============================= net use %LocalDriveLetter%: /delete /y 2>nul >nul
- CloudURL — ссылка для подключения к облаку по WebDAV, для Облака mail.
ru это https://webdav.cloud.mail.ru/
- CloudPassword — сгенерированный нами ранее пароль для приложения, который используется при подключении WebDAV
- CloudUser — наш ящик mail.ru, который используется в качестве имени пользователя WebDAV
- LocalDriveLetter — имя локального диска, под которым подключаем облачный диск, я подключаю как O:\
- FileName — название файла архива, который будем создавать
- SourceDir — что бэкапим
- BackupDir — куда бэкапим, я бэкаплю в смонтированный облачный диск по пути O:\backup\internet-lab.ru\
- NumFolders — сколько папок с бэкапами хранить, я буду хранить две папки
- a7z — путь к 7z.exe
- -v2g — архив разбивается на части по 2 Гб, можно задать свой размер
При желании скрипт можно модифицировать для подключения к любому источнику WEBDAV.
Есть несколько моментов, которые следует иметь в виду:
Сначала мы делаем бэкап, а затем удаляем старый. Соответственно, в облаке должно быть место для NumFolders+1 бэкапов.
Протокол WebDAV не передаёт дату создания папки, поэтому для определения старых (на удаление) папок используется само название папки в виде YYYY-MM-DD-hhmmss. Скрипт сортирует папки по имени в обратном порядке и пропускает первые NumFolders штук, остальные удаляет. В общем, не меняйте название.
Название папки генерируется из текущей даты формата DD.MM.YYYY и времени чч:мм:сс,сс, если ваш Windows использует другой формат данных, то вам нужно модифицировать скрипт для формирования корректного названия папки.
Скрипт удаляет всё что лежит в BackupDir, не храните там что-то ещё!
Проверим как работает скрипт, запустим его несколько раз.
Скрипт работает.
Пример настройки расписания
В Task Scheduler настраиваем новое задание.
Выбираем пользователя, от имени которого будет выполняться резервное копирование. После сохранения задания нас спросят пароль от него. Ставим галку Run whether user is logged or not — запускать даже если юзер не залогинен.
В триггерах настраиваем расписание. У меня резервное копирование происходит раз в неделю по воскресеньям в 12:00.
Указываем ссылку на наш BAT файл.
Настраиваем условия.
Проверяем настройки. OK.
Теперь папка будет резервироваться раз в неделю. С настройкой NumFolders=2 в BAT файле мы будем хранить два последних бэкапа.
Теги
- Windows
- cmd
- special
- web
xcopy | Microsoft Learn
-
Статья -
-
Копирует файлы и каталоги, включая подкаталоги.
В разделе Примеры показан принцип использования этой команды.
Синтаксис
Xcopy <Source> [<Destination>] [/w] [/p] [/c] [/v] [/q] [/f] [/l] [/g] [/d [:MM-DD-YYYY]] [/u] [/i] [/s [/e]] [/t] [/k] [/r] [/h] [{/a | /m}] [/n] [/o] [/x] [/exclude:FileName1[+[FileName2]][+[FileName3]]] [{/y | /-y}] [/z] [/b] [/j] [/compress]
Параметры
Параметр | Описание |
---|---|
<Source> | Обязательный. Указывает расположение и имена файлов, которые требуется скопировать. Этот параметр должен содержать диск или путь. |
[<Назначение>] | Указывает назначение файлов, которые требуется скопировать. Этот параметр может включать букву диска и двоеточие, имя каталога, имя файла или их сочетание. |
/W | Отображает следующее сообщение и ожидает ответа перед началом копирования файлов:Нажмите любую клавишу, чтобы начать копирование файлов. |
/p | Запрашивает подтверждение создания каждого целевого файла.![]() |
/C | Игнорирует ошибки. |
/v | Проверяет каждый файл по мере записи в целевой файл, чтобы убедиться, что целевые файлы идентичны исходным файлам. |
/q | Подавляет отображение xcopy сообщений. |
/f | Отображает имена исходных и целевых файлов при копировании. |
/l | Создает список файлов, которые необходимо скопировать, но не копирует их активно. |
/Г | Создает расшифрованные файлы назначения , если назначение не поддерживает шифрование. |
/d [:ММ-ДД-ГГГГ] | Копирует исходные файлы, измененные только в указанную дату или после нее. Если значение MM-ДД-ГГГГ не указано, копирует все исходные файлы, xcopy которые новее существующих целевых файлов. Этот параметр командной строки позволяет обновлять измененные файлы. |
/U | Копирует файлы из источника , которые существуют только в целевом расположении .![]() |
/i | Если источник является каталогом или содержит подстановочные знаки, а назначение не существует, предполагается, xcopy что назначение указывает имя каталога и создает новый каталог. xcopy Затем копирует все указанные файлы в новый каталог. По умолчанию предлагает указать, xcopy является ли назначение файлом или каталогом. |
/s | Копирует каталоги и подкаталоги, если они не пусты. Если параметр /s опущен, xcopy работает в одном каталоге. |
/e | Копирует все подкаталоги, даже если они пусты. Используйте /e с параметрами командной строки /s и /t . |
/t | Копирует только структуру подкаталога (т. е. дерево), а не файлы. Чтобы скопировать пустые каталоги, необходимо включить параметр командной строки /e . |
/K | Копирует файлы и сохраняет атрибут только для чтения в целевых файлах, если они присутствуют в исходных файлах.![]() xcopy удаляет атрибут только для чтения. |
/r | Копирует файлы только для чтения. |
/h | Копирует файлы со скрытыми атрибутами и атрибутами системных файлов. По умолчанию xcopy не копирует скрытые или системные файлы |
/a | Копирует только исходные файлы, для которых заданы атрибуты архивного файла. Параметр /a не изменяет атрибут файла архива исходного файла. Сведения о том, как задать атрибут файла архива с помощью атрибута attrib, см. в разделе Связанные ссылки. |
/m | Копирует исходные файлы, для которых заданы атрибуты архивного файла. В отличие от /a, параметр /m отключает атрибуты архивных файлов в файлах, указанных в источнике. Сведения о том, как задать атрибут файла архива с помощью атрибута attrib, см. в разделе Связанные ссылки. |
/n | Создает копии, используя короткие имена файлов или каталогов NTFS.![]() |
/o | Копирует сведения о владельце файла и списке управления доступом на уровне пользователей (DACL). |
/x | Копирует сведения о параметрах аудита файла и списке управления доступом системы (SACL) (подразумевает /o). |
/exclude:FileName1[+[Имя_файла2]][+[Имя_файла3]( )] | Указывает список файлов. Необходимо указать хотя бы один файл. Каждый файл будет содержать строки поиска, каждая строка которых находится в отдельной строке файла. Если какая-либо из строк совпадает с любой частью абсолютного пути копируемого файла, этот файл будет исключен из копирования. Например, если указать строку obj , будут исключены все файлы под каталогом obj или все файлы с расширением OBJ .![]() |
/Y | Подавляет запрос на подтверждение перезаписи существующего целевого файла. |
/-Y | Запрашивает подтверждение перезаписи существующего целевого файла. |
/z | Копирует по сети в режиме перезапуска. |
/b | Копирует символьную ссылку вместо файлов. Этот параметр появился в Windows Vista®. |
/J | Копирует файлы без буферизации. Рекомендуется для очень больших файлов. Этот параметр был добавлен в Windows Server 2008 R2. |
/Сжать | Запросите сжатие сети во время передачи файла, если это применимо. |
/? | Отображение справки в командной строке. |
Использование /z
Если вы потеряете подключение на этапе копирования (например, если сервер, перешедший в автономный режим, разорвёт подключение), оно возобновляется после восстановления подключения. /z также отображает процент завершения операции копирования для каждого файла.
Использование /y в переменной среды COPYCMD.
В переменной среды COPYCMD можно использовать параметр /y . Эту команду можно переопределить с помощью команды /-y в командной строке. По умолчанию вам будет предложено перезаписать.
Копирование зашифрованных файлов
Копирование зашифрованных файлов на том, который не поддерживает EFS, приводит к ошибке. Сначала расшифруйте файлы или скопируйте их на том, который поддерживает EFS.
Добавление файлов
Чтобы добавить файлы, укажите один файл для назначения, а несколько файлов для источника (то есть с помощью подстановочных знаков или формата file1+file2+file3).
Значение по умолчанию для назначения
Если опустить назначение,
xcopy
команда копирует файлы в текущий каталог.Указание того, является ли назначение файлом или каталогом
Если назначение не содержит существующий каталог и не заканчивается обратной косой чертой (), появится следующее сообщение:
Does <Destination> specify a file name or directory name on the target(F = file, D = directory)?
Нажмите клавишу F, чтобы скопировать файл или файлы в файл. Нажмите клавишу D, чтобы скопировать файл или файлы в каталог.
Это сообщение можно отключить с помощью параметра командной строки /i , который позволяет xcopy
предположить, что назначением является каталог, если источником является несколько файлов или каталогов.
Использование команды для
xcopy
задания атрибута архива для файлов назначенияКоманда
xcopy
создает файлы с архивным набором атрибутов независимо от того, был ли этот атрибут задан в исходном файле. Дополнительные сведения об атрибутах файла и атрибутах см. в разделе Связанные ссылки.**
Сравнение xcopy**
и diskcopyЕсли у вас есть диск, содержащий файлы в подкаталогах, и вы хотите скопировать его на диск другого формата, используйте
xcopy
команду вместо diskcopy. Так как команда diskcopy копирует диски track by track, исходный и целевой диски должны иметь одинаковый формат.Команда
xcopy
не имеет этого требования. Используйтеxcopy
, если вам не требуется полная копия образа диска.Коды выхода для
xcopy
Для обработки кодов выхода, возвращаемых
xcopy
, используйте параметр ErrorLevel в командной строке if в пакетной программе. Пример пакетной программы, которая обрабатывает коды выхода с помощью if, см. в разделе Связанные ссылки. В следующей таблице перечислены коды выхода и их описание.Код выхода Описание 0 Файлы были скопированы без ошибок. 1 Файлы для копирования не найдены. 2 Чтобы завершить xcopy
работу, пользователь нажал клавиши CTRL+C.4 Произошла ошибка инициализации. Недостаточно памяти или места на диске, либо вы ввели недопустимое имя диска или недопустимый синтаксис в командной строке. 5 Произошла ошибка записи на диск.
Примеры
1. Чтобы скопировать все файлы и подкаталоги (включая все пустые подкаталоги) с диска A на диск B, введите:
xcopy a: b: /s /e
2. Чтобы включить любые системные или скрытые файлы в предыдущем примере, добавьте параметр командной строки /h следующим образом:
xcopy a: b: /s /e /h
3. Чтобы обновить файлы в каталоге \Reports с файлами в каталоге \Rawdata, которые были изменены с 29 декабря 1993 г., введите:
xcopy \rawdata \reports /d:12-29-1993
4. Чтобы обновить все файлы, существующие в \Reports в предыдущем примере, независимо от даты, введите:
xcopy \rawdata \reports /u
5. Чтобы получить список файлов для копирования с помощью предыдущей команды (т. е. без фактического копирования файлов), введите:
xcopy \rawdata \reports /d:12-29-1993 /l > xcopy.out
Файл xcopy.out содержит список всех копируемых файлов.
6. Чтобы скопировать каталог \Customer и все подкаталоги в каталог \\Public\Address на сетевом диске H:, сохраните атрибут только для чтения и появится запрос при создании нового файла в H:, введите:
xcopy \customer h:\public\address /s /e /k /p
7. Чтобы выполнить предыдущую команду, убедитесь, что xcopy
каталог \Address не существует, и подавьте сообщение, которое появляется при создании нового каталога, добавьте параметр командной строки /i следующим образом:
xcopy \customer h:\public\address /s /e /k /p /i
8. Вы можете создать пакетную программу для выполнения xcopy
операций и использовать команду batch if для обработки кода выхода при возникновении ошибки. Например, следующая пакетная программа использует заменяемые параметры для xcopy
параметров источника и назначения:
@echo off rem COPYIT.BAT transfers all files in all subdirectories of rem the source drive or directory (%1) to the destination rem drive or directory (%2) xcopy %1 %2 /s /e if errorlevel 4 goto lowmemory if errorlevel 2 goto abort if errorlevel 0 goto exit :lowmemory echo Insufficient memory to copy files or echo invalid drive or command-line syntax. goto exit :abort echo You pressed CTRL+C to end the copy operation. goto exit :exit
Чтобы использовать предыдущую пакетную программу для копирования всех файлов в каталоге C:\Prgmcode и его подкаталогах на диск B, введите:
copyit c:\prgmcode b:
Интерпретатор команд заменяет C:\Prgmcode на %1 и B: для %2, а затем использует xcopy
с параметрами командной строки /e и /s . Если xcopy
возникает ошибка, пакетная программа считывает код выхода и переходит к метке, указанной в соответствующей инструкции IF ERRORLEVEL , а затем выводит соответствующее сообщение и выходит из пакетной программы.
9. В этом примере копируются все непустые каталоги, а также файлы со связанным расширением после символа звездочки.
xcopy .\toc*.yml ..\..\Copy-To\ /S /Y rem Output example. rem .\d1\toc.yml rem .\d1\d12\toc.yml rem .\d2\toc.yml rem 3 File(s) copied
В предыдущем примере это конкретное значение исходного параметра .\toc*.yml копирует те же 3 файла, даже если были удалены два символа пути .\ . Однако файлы не копируются, если из исходного параметра удален подстановочный знак звездочки, что делает его только .\toc.yml.
- Copy.
- Перемещение
- Dir
- Attrib
- Diskcopy
- Если оператор
- Условные обозначения синтаксиса команд командной строки
Сценарий
— Использование пакетного копирования с сетевого диска на диск C: или D:
У меня возникли проблемы с выполнением пакетного файла, который копирует файлы с подключенного сетевого диска на локальный диск.
Вот пакетный код, который я использую (в данный момент он просто находится в папке низкого уровня, так как я не хочу выполнять команды в производственной среде, пока все не будет идеально).
эхо выключено клс эхо Хотите сделать резервную копию? Пауза скопируйте "\\My_Servers_IP\Shared Drive\FolderName\*" C:TEST_BACKUP_FOLDER Пауза
А еще пробовал:
эхо выкл. клс эхо Хотите сделать резервную копию? Пауза скопируйте "\\My_Servers_Name\Shared Drive\FolderName\*" C:TEST_BACKUP_FOLDER Пауза
Ни одна из приведенных выше команд не скопирует файлы в C:TEST_BACKUP_FOLDER, когда я запрошу это сделать, но если я использую тот же точный синтаксис, но делаю запрос на копирование с локального диска, он работает без проблем с этим синтаксисом и идет напрямую в вышеуказанную папку без проблем.
Самое странное, что вывод cmd даже показывает, что файлы, которые я хочу скопировать, даже распознаются в командной строке, а в конце написано «1 файл скопирован», но в эту папку ничего не копируется. Итак, я знаю, что у меня правильный пункт назначения запроса на копирование, потому что он даже распознает, какие файлы находятся в папке, и отображаются имена. И, как я уже сказал, назначение в C: также правильно, потому что, когда я использую этот адрес на локальном ПК, они каждый раз копируются в эту папку. Это явно что-то с сетевым диском. Сначала я подумал, может быть, это проблема с правами доступа, но папка, которую я сейчас пытаюсь использовать, представляет собой общий подключенный диск, к которому любой сотрудник компании может получить доступ и имеет привилегии чтения и записи. Почему такие проблемы на общедоступном общем диске?
Не могли бы вы предложить дополнительные предложения?
- пакетный файл
- скрипты
- cmd
- копия
3
Вы копируете все файлы в один файл с именем TEST_BACKUP_FOLDER
попробуйте это:
md TEST_BACKUP_FOLDER скопируйте "\\My_Servers_IP\Shared Drive\FolderName\*" TEST_BACKUP_FOLDER
2
Просто сделайте следующее изменение
эхо выкл.клс эхо Хотите сделать резервную копию? Пауза скопируйте "\\My_Servers_IP\Shared Drive\FolderName\*" C:\TEST_BACKUP_FOLDER Пауза
Возможно, это связано с проверкой безопасности. Эта тема может вам помочь.
Есть два предложения: одно с помощью pushd и одно с изменением реестра. Я бы предложил использовать первый…
Самое главное, вам нужно смонтировать диск
net use z: \\yourserver\sharename
Конечно, вам нужно убедиться, что учетная запись, под которой запускается пакетный файл, имеет разрешение на доступ к общему ресурсу. Если вы делаете это с помощью запланированной задачи, вы можете выбрать учетную запись, выбрав задачу, а затем:
- щелкните правой кнопкой мыши Свойства
- щелкните вкладку Общие
- сменить аккаунт на
«При выполнении задачи используйте следующую учетную запись пользователя:»
Это в Windows 7, в разных версиях Windows может немного отличаться.
Затем запустите свой пакетный сценарий со следующими изменениями
копировать "z:\FolderName" "C:\TEST_BACKUP_FOLDER"
Для рекурсивного копирования файлов и подпапок из каталога используйте это:
md TEST_BACKUP_FOLDER Robocopy "\\My_Servers_IP\Shared Drive\FolderName\*" TEST_BACKUP_FOLDER /E
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
окон — Пакетный сценарий для копирования файла из одной сетевой папки в другую на основе даты последнего изменения или даты создания
Задавать вопрос
спросил
Изменено
5 лет, 10 месяцев назад
Просмотрено
4к раз
У меня есть два общих сетевых диска: назовем их: DriveA и DriveB .
Есть два файла, которые ежедневно генерируются на DriveA , и я хочу каждый день копировать последние файлы в DriveB/Folder1/fileA и DriveB/Folder2/fileB .
Может ли кто-нибудь предоставить мне решение, в котором я могу копировать файлы на основе даты создания:
- Копировать файл A ( дата создания: 17 июля ) в Диск B/Папка1
- Скопировать файл B (дата создания : 17 июля ) в Диск B/Папка2
Я придумал решение, но оно копирует файл на основе «сегодняшней даты».
SET [email protected]
УСТАНОВИТЬ имя пользователяDOMAIN=11111111
УСТАНОВИТЕ пароль=pwd@1234
net use "\\111.444.222.777\ПАПКА" /USER:%usernameID% %password% /persistent:no
установить источник = \\ 222.111.333.444\ПАПКА\ПАПКА2\Report_
net use "\\DOMAIN\storage\2012-0151_hms_ux\Hadoop\LiveDataLandingZoneDWH" /user:[email protected] pwd@1234 /persistent:no
set dest=\\code1\storage\2012-0151_hms_ux\Hadoop\LiveDataLandingZoneDWH\Input\Report\Report_
for /f "skip=1" %%x in ('wmic os get localdatetime') сделать, если не определен MyDate установить MyDate=%%x
установить сегодня=%МояДата:~0,4%%МояДата:~4,2%%МояДата:~6,2%
эхо %сегодня%
:копировать
скопировать "%source%%today%0700.csv" "%dest%%today%0700.csv"
IF ERRORLEVEL 0 перейти к отключению
перейти к концу
Пауза
:Отключить
перейти к концу
Пауза
:конец
пауза
РЕДАКТИРОВАТЬ 1:
Теперь я использую следующую команду для копирования файлов на дату 16 июля 2017 года:
xcopy C:\Users\Desktop\report\ActualHRC_*.
csv C:\Users\Downloads /D:07-16-2017
pause
Как я могу динамически предоставить /D:m-d-y
? Я имею в виду, переменные должны брать m
, d
и y
из системы.
Заранее спасибо!
- окна
- пакетный файл
- скрипты
Я думаю, вы слишком все усложнили. Есть очень простое решение: xcopy /Y/D
.
Если просто набрать xcopy /?
вы можете увидеть все варианты. Для опции /D
указано:
Копирует файлы, измененные в указанную дату или позже.
Если дата не указана, копируются только те файлы,
время источника более новое, чем время назначения.
Существует также robocopy
, который также встроен в Windows, предлагает еще больше возможностей и, как утверждается, способен копировать из сетевого ресурса в сетевой ресурс, используя пути UNC. (поэтому сопоставление дисков не требуется.