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

Profile picture for user Олег

code

Набросал один маленький BAT скрипт для резервного копирование папки. Внесите свои данные и через scheduler настройте расписание резервного копирования.

Ссылки

7-Zip — бесплатный архиватор

BAT скрипт для резервного копирования папки в Облако Mail.Ru

Функции

  • С помощью robocopy делает резервные копии папки.
  • Каждый бэкап сохраняется в отдельную подпапку вида DD.MM.YYYY_hhmmmss.
  • С помощью 7-Zip архивирует резервные копии.
  • Удаляет старые резервные копии.

Код

@echo off
SetLocal EnableDelayedExpansion

rem =============================
rem ====== admin variables ======
rem =============================

set DirName=my_folder
set SourceDir=C:\%DirName%
set BackupDir=B:\%DirName%\daily\
set NumFolders=10

rem =============================
rem ======== 7-Zip path =========
rem =============================

set a7z=%ProgramFiles%\7-Zip\7z.exe

rem =============================
rem == create backup directory == 
rem ==== DD.MM.YYYY_hhmmmss =====
rem =============================

set h=%time:~0,2%
set h=%h: =0%
set FullBackupDir=%BackupDir%%date%_%h%%time:~3,2%%time:~6,2%\
md %FullBackupDir%

rem =============================
rem ====== copy directory =======
rem =============================

robocopy %SourceDir% %FullBackupDir%%DirName%\ /E /ZB /J /NFL /NDL /NJH /NJS /NC /NS /NP 2>nul >nul

rem =============================
rem ====== zip directory ========
rem =============================

"%a7z%" a -tzip -bb0 -bd -sdel "%FullBackupDir%%DirName%.zip" "%FullBackupDir%" 2>nul >nul

rem =============================
rem ==== remove old folders =====
rem =============================

for /f "tokens=* delims=" %%D in ('dir %BackupDir% /ad /b /o-d') do (
	if not %%D=="" (
		if not !NumFolders!==0 (
			set /a NumFolders-=1
		) else (
			rd /s /q %BackupDir%%%D 2>nul >nul
		)
	)
)
  • DirName — название папки
  • SourceDir — что бэкапим
  • BackupDir — куда бэкапим
  • NumFolders — сколько подпапок с бэкапами хранить
  • a7z — путь к 7z.exe

Пример настройки расписания

В Task Scheduler настраиваем новое задание.

bat

Выбираем пользователя, от имени которого будет выполняться резервное копирование. После сохранения задания нас спросят пароль от него. Ставим галку Run whether user is logged or not — запускать даже если юзер не залогинен.

bat

В триггерах настраиваем расписание. У меня резервное копирование происходит раз в сутки.

bat

Указываем ссылку на наш BAT файл.

bat

Настраиваем условия.

bat

Проверяем настройки. OK.

Теперь папка будет резервироваться раз в день. С настройкой NumFolders=10 в BAT файле мы будем хранить данные за последние 10 дней.

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

Папки с русским названием

От подписчиков:

Для бэкапа папок с русскими названиями нужно открыть Notepad++ и сохранить батник в кодировке ОЕМ 866.

Папки с пробелами

Как копировать папки с пробелами в названии? Пример:

robocopy "C:\Source Path" "C:\Destination Path" /option1 /option2...

Но:

robocopy "C:\Source Path" "C:\Destination Path\ " /option1 /option2...

или лучше используйте:

robocopy "C:\Source Path" "C:\Destination Path\\" /option1 /option2...

Проблема связана с экранированием.

https://ss64.com/nt/syntax-esc.html

Проблема с датой в английской локали

Замените

set FullBackupDir=%BackupDir%%date%_%h%%time:~3,2%%time:~6,2%\

на

set FullBackupDir=%BackupDir%%date:/=%_%h%%time:~3,2%%time:~6,2%\

или

set FullBackupDir=%BackupDir%%date:\=%_%h%%time:~3,2%%time:~6,2%\

или

set FullBackupDir=%BackupDir%%date:~4,2%.%date:~7,2%.%date:~-4%_%h%%time:~3,2%%time:~6,2%\

Или локаль в винде на русскую переведите.

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

Количество просмотров 46K

Здесь мы рассмотрим, как сделать систему дифференциального бэкапа «из коробки» (ну почти), с привлечением минимального количества внешних модулей, в лучших традициях UNIX-way.
Будем использовать 7za.exe \ 7z, а также UNIX-like утилиту pdate.exe, чтобы со временем нам было работать также удобно, как и в ламповом *NIX, а заменой bash нам будет «простонародный» BAT. Предыстория и подробности — под катом.

Предыстория

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

Взглянув на сие зашифрованное непотребство, я с благодарностью вспомнил про то, что каждый день у меня делается бэкап этой (и не только этой) шары встроенными средствами Windows Server 2003 SP2 x64. Но, полистав этот бэкап, я понял, что в плане резервного копирования средствами самой Windows не все так радужно. Во-первых, полный бэкап оказался недоступен, а значит восстановить cold-data (файлы, которые меняются очень редко) вряд ли получится. Во-вторых, восстановление из созданного инкрементального бэкапа оказалось задачей нетривиальной — за каждый шаг получалось восстановить только данные, которые были изменены, и ничего более. Получается, чтобы восстановить хотя бы все измененные данные (раз полный бэкап оказался утерян), то пришлось бы перебирать по очереди все бэкапы — не совсем то, что я ожидал от инкрементального бэкапа в таком случае.

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

Крепко задумавшись, я вспомнил свое первое знакомство с системой инкрементального копирования fsbackup за авторством Максима Чиркова www.opennet.ru/dev/fsbackup — гибкость, простота, в то же время обилие возможностей и открытый формат хранения архивов (tar). Жаль, что система разработана под *NIX / Linux. Google также не ответил на мой вопрос про подобную систему под Windows. Самое полезное, что я нашел — это краткий гайд хабровчанина antip0d и пример скрипта для резервного копирования. Именно материал по последней ссылке я и использовал для своего скрипта.

Собираем систему

В первую очередь, скачиваем последнюю стабильную версию. На момент написания это 16.04. Наш бэкап будем хранить в 7z архиве: поддержка многопоточности, шифрованных/многотомных архивов, а скорость извлечения из 7z выше скорости упаковки в 10-20 раз!
UPD: Спасибо хаброжителю Taciturn за поправку — вы также можете использовать 7z.exe, уже установленный в вашей системе. Функциональных различий между 7z и 7za я не выявил.

Нас интересуют:
7za.exe — автономная версия 7-Zip.
7za.dll — библиотека для работы с архивами 7z
7zxa.dll — библиотека для распаковки 7z архивов.
Для 64-битных ОС используем те же файлы из каталога x64.
К сожалению, ссылка из используемого мной материала на утилиту pdate никуда не ведет, единственная найденная мной версия

pdate v1.1 build 2007.12.06
© 2005-2007 Pavel Malakhov 24pm@mail.ru

Ссылка из встроенного мануала pdate ведет туда же, а именно — в никуда.

pm4u.opennet.ru/mysoft/pdate.htm

К счастью, на том же ресурсе есть краткая статья по этой программе, там же ее можно скачать.

Мной была использована следующая структура каталогов:
D:\winfsbackup — корневая директория скрипта и связанных файлов
D:\winfsbackup\7z — библиотеки и исполняемый файл 7za
D:\winfsbackup\backup — место хранения бэкапов (можно переназначить путем правки переменных, как и любые другие используемые файлы)
D:\winfsbackup\lists — списки включаемых и исключаемых файлов. О них расскажу чуть позже
D:\winfsbackup\log — логи
D:\winfsbackup\pdate
D:\winfsbackup\tmp — устанавливает рабочий каталог для временного базового архива
D:\winfsbackup\winfsbackup.bat — сам скрипт.

Логика работы

После обработки переменных скрипт смотрит блок :Main, где указывается логика работы бэкапа — в каком случае должен выполниться новый бэкап, а в каком случае — обновить существующий базовый архив. По умолчанию, новый архив создается в начале месяца, а все файлы из директории backup перемещаются в \backup\old, или если базового архива не существует.
Уже во время написания статьи я понял, что нужно добавить возможность обновления базового архива — упрощенный вариант «полный бэкап раз месяц + дифференциальный бэкапы к нему» целесообразно использовать для файловых обменников размером до ~250 Гб. Для моего файлообменника в 550 Гб с преобладанием мелких файлов скорость бэкапа оказалась неудовлетворительна (почти 55 часов). Справедливости ради стоит сказать, что это не может служить сколь нибудь достоверным замером производительности — в процессе бэкапа выяснилось, что некоторые файлы недоступны (привет chkdsk), а бэкап складывался в раздел удаленного сервера, который тоже был занят операциями дискового ввода-вывода.

:Main
REM Здесь описаны условия, в каком случае будет выполняться полный \ дифференциальный бэкап, либо обновление базового бэкапа.

REM Базовое условие - создание полного бэкапа если он не существует
IF NOT EXIST %baseArch% GOTO BaseArchive

REM полный бэкап раз месяц + дифференциальныt бэкапы к нему
IF %dm% EQU 1 GOTO BaseArchive ELSE GOTO UpdateArchive

REM обновляем базовый архив в 1 день месяца
REM IF %dm% EQU 1 GOTO UpdateBase ELSE GOTO UpdateArchive

REM Ежеквартальный полный бэкап (2, 19, 36 неделя года)
REM IF NOT %wn%.%dw% EQU 02.5 GOTO UpdateArchive
REM IF NOT %wn%.%dw% EQU 19.5 GOTO UpdateArchive
REM IF NOT %wn%.%dw% EQU 36.5 GOTO UpdateArchive

REM Обновляем базовый архив, каждую субботу
REM IF %dw% EQU 6 (GOTO UpdateBase) ELSE (GOTO UpdateArchive)

REM А здесь можно разместить действие, которое выполнится если предыдущие условия не отработают.
REM Я стараюсь избегать подобного поведения
ECHO Warning! No one condition matching, check :Main block of script >> %Log%
GOTO End

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

Переменные

dm, dw, wn — соответственно день месяца, день недели и номер недели (в численном выражении).
verboseLevel — режим «говорливости», выдает информацию о том, куда будет записываться архив, и прочее. Полезно, когда вносишь в структуру скрипта серьезные изменения.
tmpDir — место сохранения временного файла. По умолчанию, 7-Zip строит новый базовый файл архива в том же самом каталоге, где и старый базовый файл архива. Определяя этот ключ, вы можете установить рабочий каталог, где будет построен временный базовый файл архива. После того, как временный базовый файл архива построен, он копируется поверх первоначального; затем временный файл удаляется.

Дифференциальный бэкап

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

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

Некоторые опции командной строки

-bsp2 — выводит строку с прогрессом выполнения в STDERR. STDOUT 7z перенаправлен в лог, прогресс, естественно, туда не пишется. Эта команда выводит его в STDERR, для большей информативности.

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

-slp — крайне полезная опция. Режим больших страниц увеличивает скорость сжатия. Однако, есть пауза в начале сжатия, в то время когда 7-Zip распределяет большие страницы в памяти. Если 7-Zip не может разместить большие страницы, он размещает обычные маленькие страницы. Кроме того, Диспетчер задач не показывает реальное использование памяти программами, если 7-Zip использует большие страницы. Эта особенность работает только на Windows 2003 / XP x64. Также нужно иметь права администратора для вашей системы. Рекомендованный размер оперативной памяти для этой особенности — 3 Гб или больше. если вы используете режим -slp, ваша система Windows может зависнуть на несколько секунд, когда 7-Zip выделяет блоки памяти. Когда Windows пытается выделить большие страницы из оперативной памяти для 7-Zip, Windows может подвесить другие задачи на это время. Это может выглядеть как полное зависание системы, но затем ее работа восстанавливается, и, если распределение прошло успешно, 7-Zip работает быстрее. Не используйте режим -slp, если вы не хотите, чтобы другие задачи быть «подвешены». Кроме того, бессмысленно использовать режим -slp для сжатия небольших наборов данных (менее 100 МБ). Но если вы сжимаете большие наборы данных (300 Мб или более) методом LZMA с большим словарем, вы можете получить увеличение скорости на 5% -10% в режиме -slp.
-mmt=on — устанавливает режим многопоточности. Если у вас многопроцессорная / многоядерная система, вы можете получить увеличение скорости с этим ключом. 7-Zip поддерживает режим многопоточности только для сжатия LZMA/LZMA2 и сжатия/распаковки BZip2.

-ms=off — отключает создание solid-архивов. Качество сжатия при этом, конечно же, падает, однако есть весьма весомые плюсы — вы можете периодически обновлять данные базового архива чтобы уменьшить размер дифференциальный бэкапов, и так как архив не является целостным, не нужно будет его дополнительно «пережимать». Non-solid архив более стоек к повреждениям, и время извлечения из него происходит заметно быстрее.

Include / exclude листы
По умолчанию определено 2 типа списка — список включаемых файлов / директорий (include_general.txt), и 2 списка исключений (exclude_general.txt, exclude_regexp.txt).

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

Например, если директория для бэкапа E:\foo\bar, и мы хотим исключить вложенную директорию E:\foo\bar\somefolder, то в exclude_general.txt мы должны добавить bar\somefolder или bar\somefolder\

Путь без слэша в конце может относиться как к файлу, так и к директории.
В exclude_regexp.txt вносятся исключаемые по regexp файлы, которые просматриваются рекурсивно. * — последовательность произвольных символов,? — любой символ.
7-Zip не использует системный синтаксический анализатор подстановочных знаков, поэтому «любой файл» для 7 Zip это ‘*’, а ‘*.*’ — файл, имеющий расширение.

Ну и наконец, скрипт целиком:

@ ECHO OFF
REM Sources were found on http://sysadminwiki.ru/wiki/Резервное_копирование_в_Windows
CD %~dp0
TITLE winfsbackup
MODE CON: COLS=120 LINES=55
ECHO Setting vars...
REM --- Definition block ---
SET verboseLevel=1
SET tmpDir=D:\winfsbackup\tmp
SET run_7z=D:\winfsbackup\7z\7za.exe
SET run_pdate=D:\winfsbackup\pdate\pdate.exe
FOR /F "usebackq" %%a IN (`%run_pdate% e`) DO (SET dm=%%a)
FOR /F "usebackq" %%a IN (`%run_pdate% u`) DO (SET dw=%%a)
FOR /F "usebackq" %%a IN (`%run_pdate% V`) DO (SET wn=%%a)
SET LogDir=D:\winfsbackup\log
SET Log=%LogDir%\general.log
SET dDir=D:\winfsbackup\backup
SET dlmDir=D:\winfsbackup\backup\old
SET baseArch=%dDir%\general.7z
SET IncludeList=lists\include_general.txt
SET ExcludeList=lists\exclude_general.txt
SET ExcludeRegexp=lists\exclude_regexp.txt
SET updArch_dw=%dDir%\day_general_%dw%.7z
SET updArch_wn=%dDir%\week_general_%wn%.7z

IF %verboseLevel%==0 GOTO Main
ECHO Verbose mode ON!
ECHO Today is %wn% week of year, %dw% day of week.
ECHO Full quarter backup will execute (if enabled) on 2, 19 and 36 week, friday.
ECHO Temporary directory is %tmpDir%
ECHO Now logging into %Log%
ECHO Current backup directory is %dDir%, older backups stored into %dlmDir%

:Main
REM Here discribed conditions - in which case script will make new backup, update older one, etc
REM You are free to change these conditions
REM Make sure you envisaged all possible cases
REM Actions here are not disigned to be active more than 1 at same time, excluding base condition
REM If you want multiple conditions, you should edit it

REM Base condition - full backup will be created if it is not exist
IF NOT EXIST %baseArch% GOTO BaseArchive

REM Command below turns on making full backup at 1'st day of every month, in other days - increments
REM IF %dm% EQU 1 GOTO BaseArchive ELSE GOTO UpdateArchive

REM This option enables updating full backup every month
IF %dm% EQU 1 GOTO UpdateBase ELSE GOTO UpdateArchive

REM Uncomment these 3 commands if you want to run full backup ~every quarter (2, 19, 36 week of year)
REM IF NOT %wn%.%dw% EQU 02.5 GOTO UpdateArchive
REM IF NOT %wn%.%dw% EQU 19.5 GOTO UpdateArchive
REM IF NOT %wn%.%dw% EQU 36.5 GOTO UpdateArchive

REM This option enables rewriting base archive every saturday with new files in order to decrease size of increments
REM IF %dw% EQU 6 (GOTO UpdateBase) ELSE (GOTO UpdateArchive)

REM Here you can place default action if conditions of previous ones were not executed.
%run_pdate% "Z --- \A\c\t\i\o\n \w\a\s\ \n\o\t \s\e\l\e\c\t\e\d\! >> %Log%
ECHO Warning! No one condition matching, check :Main block of script
GOTO End

:BaseArchive
ECHO Clear %dlmDir% and move data of previous month to that dir...
IF NOT EXIST %dlmDir%\nul MKDIR %dlmDir%
DEL /Q %dlmDir%\*
MOVE /Y %dDir%\* %dlmDir% 2> nul

%run_pdate% "====== Y B =======" > %Log%
%run_pdate% "Z --- \S\t\a\r\t \t\o \c\r\e\a\t\e \n\e\w \a\r\c\h\i\v\e" >> %Log%

ECHO Creating new backup %baseArch%
%run_7z% a %baseArch% -w%tmpDir% -i@%IncludeList% -x@%ExcludeList% -xr@%ExcludeRegexp% -bsp2 -ssw -slp -scsWIN -mmt=on -mx3 -ms=off >> %Log%
IF %ERRORLEVEL%==0 (
	%run_pdate% "Z --- \E\x\i\t \c\o\d\e \0 \- \a\r\c\h\i\v\e \s\u\c\c\e\s\s\f\u\l\l\y \c\r\e\a\t\e\d!" >> %Log%
	) ELSE (
		IF %ERRORLEVEL%==1 (
		%run_pdate% "Z --- \W\a\r\n\i\n\g\! \R\e\c\i\e\v\e\d\ \e\x\i\t \c\o\d\e \1" >> %Log%
			) ELSE (
				IF %ERRORLEVEL%==2 (
				%run_pdate% "Z --- \E\x\i\t \c\o\d\e \2 \- \F\A\T\A\L \E\R\R\O\R\!" >> %Log%
				) ELSE (
					IF %ERRORLEVEL%==7 (
					%run_pdate% "Z --- \E\x\i\t \c\o\d\e \7 \- \C\o\m\m\a\n\d \p\r\o\m\p\t \e\r\r\o\r!" >> %Log%
					) ELSE (
						IF %ERRORLEVEL%==8 (
						%run_pdate% "Z --- \E\x\i\t \c\o\d\e \8 \- \N\o\t \e\n\o\u\g\h \m\e\m\o\r\y" >> %Log%
						) ELSE (
							ECHO Recieved error 255 - user stopped running process or exit code unknown! >> %Log%
						)
					)
				)
			)
		)
	)
)
GOTO End

:UpdateBase
ECHO Refreshing base archive
ECHO ******* ******* *******  >> %Log%
%run_pdate% "Z --- \S\t\a\r\t \t\o \u\p\d\a\t\e \a\r\c\h\i\v\e" >> %Log%
%run_7z% u %baseArch% -up0q1r2x1y2z1w0 -w%tmpDir% -i@%IncludeList% -x@%ExcludeList% -xr@%ExcludeRegexp% -bsp2 -ssw -slp -scsWIN -mmt=on -mx5 -ms=off >> %Log%
IF %ERRORLEVEL%==0 (
	%run_pdate% "Z --- \E\x\i\t \c\o\d\e \0 \- \u\p\d\a\t\e \s\u\c\c\e\s\s\f\u\l\l\y \f\i\n\i\s\h\e\d" >> %Log%
	) ELSE (
		IF %ERRORLEVEL%==1 (
		%run_pdate% "Z --- \W\a\r\n\i\n\g\! \R\e\c\i\e\v\e\d\ \e\x\i\t \c\o\d\e \1" >> %Log%
			) ELSE (
				IF %ERRORLEVEL%==2 (
				%run_pdate% "Z --- \E\x\i\t \c\o\d\e \2 \- \F\A\T\A\L \E\R\R\O\R\!" >> %Log%
				) ELSE (
					IF %ERRORLEVEL%==7 (
					%run_pdate% "Z --- \E\x\i\t \c\o\d\e \7 \- \C\o\m\m\a\n\d \p\r\o\m\p\t \e\r\r\o\r!" >> %Log%
					) ELSE (
						IF %ERRORLEVEL%==8 (
						%run_pdate% "Z --- \E\x\i\t \c\o\d\e \8 \- \N\o\t \e\n\o\u\g\h \m\e\m\o\r\y" >> %Log%
						) ELSE (
							ECHO Recieved error 255 - user stopped running process or exit code unknown! >> %Log%
						)
					)
				)
			)
		)
	)
)
GOTO End

:UpdateArchive
ECHO Updtaing existing full backup
ECHO ******* ******* *******  >> %Log%
%run_pdate% "Z --- \S\t\a\r\t \t\o \u\p\d\a\t\e \a\r\c\h\i\v\e" >> %Log%
IF %dw%==7 (SET updArch=%updArch_wn%) ELSE SET updArch=%updArch_dw%

REM --- Check files existence ---
IF EXIST %updArch% DEL /Q %updArch%

REM --- Create incremental archive ---
<nul set /p strTemp=Updating %baseArch% to incremental %updArch% archive
ECHO.
%run_7z% u %baseArch% -u- -up0q0r2x0y2z0w0!%updArch% -w%tmpDir% -i@%IncludeList% -x@%ExcludeList% -xr@%ExcludeRegexp% -bsp2 -ssw -slp -scsWIN -mmt=on -mx5 -ms=off >> %Log%
IF %ERRORLEVEL%==0 (
	%run_pdate% "Z --- \E\x\i\t \c\o\d\e \0 \- \u\p\d\a\t\e \s\u\c\c\e\s\s\f\u\l\l\y \f\i\n\i\s\h\e\d" >> %Log%
	) ELSE (
		IF %ERRORLEVEL%==1 (
		%run_pdate% "Z --- \W\a\r\n\i\n\g\! \R\e\c\i\e\v\e\d\ \e\x\i\t \c\o\d\e \1" >> %Log%
			) ELSE (
				IF %ERRORLEVEL%==2 (
				%run_pdate% "Z --- \E\x\i\t \c\o\d\e \2 \- \F\A\T\A\L \E\R\R\O\R\!" >> %Log%
				) ELSE (
					IF %ERRORLEVEL%==7 (
					%run_pdate% "Z --- \E\x\i\t \c\o\d\e \7 \- \C\o\m\m\a\n\d \p\r\o\m\p\t \e\r\r\o\r!" >> %Log%
					) ELSE (
						IF %ERRORLEVEL%==8 (
						%run_pdate% "Z --- \E\x\i\t \c\o\d\e \8 \- \N\o\t \e\n\o\u\g\h \m\e\m\o\r\y" >> %Log%
						) ELSE (
							ECHO Recieved error 255 - user stopped running process or exit code unknown! >> %Log%
						)
					)
				)
			)
		)
	)
)

:End
ECHO Done!
%run_pdate% "Z --- \D\o\n\e" >> %Log%
ping localhost -w 1000 -n 5 > nul

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

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

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

Собранный пример можно посмотреть на YandexDisk.

Там же — zip-архив для скачивания.
Конструктивная критика, советы, и тем более, тестирование — welcome!
Спасибо за внимание! Всем долгого аптайма, стабильного линка, и конечно, бэкапов под рукой.

Robocopy – это консольная утилита Windows для копирования файлов, которую можно использовать для синхронизации/репликации файлов и каталогов, и в сценариях резервного копирования. Robocopy (Robust File Copy) доступна начиная с Windows NT 4.0 Resource Kit, но по умолчанию эта функция появилась только в Windows Vista и Windows Server 2008. Robocopy заменяет Xcopy и copy, как более функциональная.

Содержание:

  • Основные возможности Robocopy
  • Синтаксис и параметры robocopy
  • Использование robocopy для зеркалирования каталогов
  • Инкрементальное копирование с помощью robocopy
  • Robocopy: перемещение файлов
  • Пример использование robocopy в планировщике задач
  • Отслеживание изменений в каталогах с помощью robocopy
  • Коды возврата (ошибки) robocopy

Основные возможности Robocopy

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

  • Устойчивость к обрывам сети (robocopy может продолжить копирования после восстановления сетевого доступа);
  • Корректное копирование файлов с их атрибутами и NTFS правами доступа;
  • Копирование с сохранением исходной временной метки;
  • Возможность копирования файлов и директорий, запрещенных для доступа даже администратору, с помощью ключа /B (ключ позволяет игнорировать проверку прав доступа, ключ доступен только для участников группы Администраторы или Операторы архива);
  • Возможность задать количество попыток копирования файла, если файл недоступен;
  • Режим полного зеркалирования директорий;
  • Пропуск уже существующих файлов (с одинаковым размером или временной меткой timestamp);
  • Индикатор прогресса копирования;
  • Корректная работа с длинными путями (более 260 символов);
  • Эффективные алгоритмы и многопоточность позволяют выполнять копирование файлов намного быстрее, чем обычное копирование средствами Windows;
  • Поддержка коды возврата (что позволяет использовать robocopy в различных внешних скриптах и утилитах).

Официальной графической версии robocopy (c GUI) от Microsoft нет. Существуют пользовательские версии, но их поддержка прекращена. Список неофициальных GUI для robocopy (это сторонние программы):

  • EazyCopy
  • RoboMirror
  • RichCopy

Синтаксис и параметры robocopy

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

Официальная документация: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy

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

robocopy <source> <dest> [фильтр файлов] [параметры]

Поддерживаются как локальные пути, так и UNC, например, \\server\directory

Полный синтаксис утилиты robocopy (все параметры и их описания) доступны по команде:

robocopy /?

использование утилиты robocopy в windows для копирование и синхронизации файлов и каталогов

Исполняемы файл robocopy.exe находится в каталоге C:\Windows\System32.

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

Для тестирование различных команд robocopy без выполнения операций (копирования, перемещения или удаления) с файлами используется параметр
/L
. Данный параметр вернет список файлов и папок, которые будут скопированы вашей командой.

Использование robocopy для зеркалирования каталогов

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

robocopy \\testnode1\C$\source\ \\testnode2\c$\dest\ *.txt /MIR /COPYALL /Z /B /J /R:3 /W:1 /REG /TEE /LOG+:%appdata%\robocopy.log

  • \\testnode1\C$\source\
    — исходный каталог, откуда копируются файлы
  • \\testnode2\C$\dest\
    — каталог назначения, куда скопируются файлы
  • *.txt
    – фильтр файлов. Синхронизируются только .txt файл и директории.
  • /MIR
    – полное зеркалирование данных в source и dest директориях. Файлы, удаленные из source директории или не присутствующие в ней, также будут удалены из dest. Если вы хотите, чтобы удаленные из source файлы оставались в dest, то поменяйте параметр /MIR на /E
  • /COPYALL
    – копирует всю информацию о файле (Атрибуты, параметры безопасности и т.д.). Как альтернатива, можно применять флаг /COPY:DT для копирования timestamp, а не всей информации. /COPALL требует прав администратора
  • /Z
    – robocopy продолжит копирование файла при обрыве. Полезно при копировании больших файлов (неплохая альтернатива копированию файлов по BITS)
  • /B
    – позволяет robocopy избегать ошибки access denied error. В этом режиме robocopy игнорирует все права на файлы, которые могли бы помешать прочитать/записать файл. Этот режим требует прав администратора либо участие в группе Операторы архива
  • /J
    – Копирование без буфера (файлового кэша, оперативной памяти). Эффективно для больших файлов.
  • /R:3
    – количество попыток скопировать недоступный файл. Значение по умолчанию – миллион, поэтому необходимо его сменить.
  • /W:1
    – секунды между попытками скопировать недоступный файл. Значение по умолчанию – 30 секунд.
  • /REG
    – сохранить текущие значения ключей /R и /W в реестр как стандартные, для будущих вызовов robocopy.
  • /TEE
    – разделение вывода работы команды и в лог файл, и в консоль. При фоновом вызове robocopy (например, из планировщика задача) этот параметр можно убрать, оставив только /LOG
  • /LOG
    – путь к файлу лога

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

При копировании больших файлов (более 2 Гб) с некоторых iSCSI/SAN томов, процесс robocopy может существенно использовать оперативную память сервера. Проблем обычно связано с тем, что для данного LUN в настройках RAID используется write-through кэширование вместо write-back.

Инкрементальное копирование с помощью robocopy

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

@echo off
set date_=%date:/=-%
set source=C:\source
set dest=\\testnode2\C$\dest\%date_%
mkdir %dest%
robocopy "%source%" "%dest%" /maxage:1 /E /COPYALL /Z /B /J /R:3 /W:1 /REG /LOG+: /LOG+:%appdata%\robocopy.log
@echo on
  • set date_=%date:/=-%
    — эта строчка присваивает значение переменной date_ в формате DD.MM.YYYY
  • /maxage:1
    — Максимальный возраст файла. Исключает файлы старше N дней или даты. Дата указывается в формате YYMMDD, например, /maxage:20200421
  • /E
    – копирует подпапки, без ограничения уровня вложенности. Для контроля уровня вложенности директорий можно использовать параметр /lev, например, /lev:3

Инкрементальность осуществляется за счёт параметра /maxage:1 — файлы старше суток копироваться не будут. Для первого, “базового” копирования, можно выполнить этот скрипт без параметра /maxage.

Заметка. Если файловые системы source или dest не являются NTFS, используйте ключ
/FFT
, так как на других файловых системах (включая эмулированные NTFS) может возникнуть ошибка, из-за которой robocopy будет видеть старые файлы как измененные, из-за отличий в метке времени.

Robocopy: перемещение файлов

С помощью ключа
/mov
или
/move
вы можете переместить файлы (а точнее удалить успешно скопированные файлы из исходной директории):

robocopy C:\source\ F:\dest\ /MOVE /E /COPYALL /Z /B /J /R:3 /W:1 /REG /TEE /LOG+:%appdata%\robocopy.log

  • /MOVE
    – удалить файлы и директории из исходной папки, после того как они были скопированы. Имейте в виду, что этот ключ нужно использовать вместе с /E или /S, в противном случае вы перенесете только файлы, но не директории. Если вы хотите перенести только файлы, используйте ключ /MOV

Примечание. Поведение robocopy при использовании ключей
/MOVE
и
/MOV
не интуитивно.

  • Если вы используете ключ /MOVE с ключом /E, то вы перенесете все файлы, директории (включая файлы внутри них) и пустые директории. Файлы и директории удалятся из исходной папки. /MOVE с /S даст такой же результат, но пустые директории не перенесутся и будут удалены.
  • Если вы используете ключ /MOV с ключом /E, то вы перенесете все файлы, включая те, которые находятся в директориях и поддиректориях, также скопируются все директории (включая пустые), но они не будут удалены из исходного каталога, в отличие от файлов. Используя /MOV с /S, вы получите такой же результат, но пустые директории не будут скопированы.

Пример использование robocopy в планировщике задач

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

  • Исходный путь — \\testnode1\C$\source
  • Целевая директория- \\testnode2\C$\source

Запустите командную строку с правами администратора и введите: compmgmt.msc

Перейдите в System Tools -> Task Scheduler Library. Создайте новое задание планировщика (Create task).

создать задание планировшика robocopy

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

Выберите опцию Run whether user is logged on or not, для того чтобы задание выполнялось в фоновом режиме. Также отметьте Run with highest privileges. Эта опция сработает если аккаунт из-под которого выполняется задание, будет иметь права администратора.

задание зеркалирования robocopy

Перейдите на вкладку Triggers и создайте новый триггер.

Выберите параметр On a schedule (по расписанию), выберите время начала и отметьте Repeat task every, указав интервал выполнения. В моём случае это 5 минут – каждые 5 минут, начиная с часа дня 22 апреля (обязательно измените эту дату на ту, которая нужна вам), директории будут синхронизированы. В for a duration of поставьте Indefinitely (бесконечно)

расписание запуска

Перейдите во вкладку Actions и нажмите New

Выберите Start a program, и укажите путь к .bat скрипту.

Содержание robocopy-mirror.bat:

@echo off
robocopy \\testnode1\C$\source\ \\testnode2\c$\dest\ /MIR /COPYALL /Z /B /J /R:3 /W:1 /REG /LOG+:C:\robocopy.log
@echo on

Помимо журнала выполнения задания планировщика, robocopy будет писать собственный лог файл копирования в C:\robocopy.log. Если аккаунт из-под которого будет выполняться скрипт не имеет прав администратора, смените C:\robocopy.log на нужный вам путь.

запуск команды robocopy через планировшик

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

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

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

журнал запуска планировщика robocopy

Отслеживание изменений в каталогах с помощью robocopy

В robocopy есть встроенный механизм отслеживания изменений в исходном каталоге (и их последующего копирования) и встроенный планировщик – параметры
/mon
и
/mot
.

  • /mon:N
    – проверяет исходную директорию на предмет изменений каждую 1 минуту, и если изменений в директории больше чем N, то будет произведено копирование в целевую директорию. Если задан параметр /mot:Y, то изменения будут проверяться каждые Y минут.
  • /mot:N
    – проверяет исходную директорию на предмет изменений каждые N минут. Минимальное значение N = 1, в минутах. Если параметр /mon не задан, то будет считаться что /mon:1

.bat скрипт для зеркалирования с отслеживанием изменений с интервалом в 1 минуту. Этот скрипт нужно запускать из-под аккаунта с правами администратора.

@echo off
robocopy \\testnode1\C$\source\ \\testnode2\c$\dest\ /MIR /COPYALL /Z /B /J /R:3 /W:1 /REG /LOG+:%appdata%\robocopy.log /mon:1 /mot:1

Плюсы:

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

Минусы:

  • Чтобы запустить .bat скрипт в фоновом режиме, нужно либо использовать VBS скрипт, либо стороннее ПО, например, NirCmd.
  • Минимальный интервал поиска изменений и копирования – 1 минута. Для меньшего интервала нужно использовать PowerShell или bat скрипт.

Коды возврата (ошибки) robocopy

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

Hex Decimal Meaning if set
0x00 0 No errors occurred, and no copying was done. The source and destination directory trees are completely synchronized.
0x01 1 One or more files were copied successfully (that is, new files have arrived).
0x02 2 Some Extra files or directories were detected. No files were copied Examine the output log for details.
0x04 4 Some Mismatched files or directories were detected. Examine the output log. Housekeeping might be required.
0x08 8 Some files or directories could not be copied (copy errors occurred and the retry limit was exceeded). Check these errors further.
0x10 16 Serious error. Robocopy did not copy any files. Either a usage error or an error due to insufficient access privileges on the source or destination directories.
Коды возврата могут комбинироваться:
0x03 3 (2+1) Some files were copied. Additional files were present. No failure was encountered.
0x05 5 (4+1) Some files were copied. Some files were mismatched. No failure was encountered.
0x06 6 (4+2) Additional files and mismatched files exist. No files were copied and no failures were encountered. This means that the files already exist in the destination directory
0x07 7 (4+1+2) Files were copied, a file mismatch was present, and additional files were present.

Любое значение больше 7 говорит о том, что при копировании через robocopy возникла ошибка. Вы можете обрабатывать эти ошибки в bat файле:

if %ERRORLEVEL% EQU 16 echo ***FATAL ERROR*** & goto end
if %ERRORLEVEL% EQU 15 echo OKCOPY + FAIL + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 14 echo FAIL + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 13 echo OKCOPY + FAIL + MISMATCHES & goto end
if %ERRORLEVEL% EQU 12 echo FAIL + MISMATCHES& goto end
if %ERRORLEVEL% EQU 11 echo OKCOPY + FAIL + XTRA & goto end
if %ERRORLEVEL% EQU 10 echo FAIL + XTRA & goto end
if %ERRORLEVEL% EQU 9 echo OKCOPY + FAIL & goto end
if %ERRORLEVEL% EQU 8 echo FAIL & goto end
if %ERRORLEVEL% EQU 7 echo OKCOPY + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 6 echo MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 5 echo OKCOPY + MISMATCHES & goto end
if %ERRORLEVEL% EQU 4 echo MISMATCHES & goto end
if %ERRORLEVEL% EQU 3 echo OKCOPY + XTRA & goto end
if %ERRORLEVEL% EQU 2 echo XTRA & goto end
if %ERRORLEVEL% EQU 1 echo OKCOPY & goto end
if %ERRORLEVEL% EQU 0 echo No Change & goto end
:end

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

PowerShell-Backup-Script

https://github.com/mpb10/PowerShell-Backup-Script

A PowerShell script used to back up files and folders.

Author: mpb10

August 13th, 2018

v2.0.0

  • INSTALLATION
  • USAGE
  • CHANGE LOG
  • ADDITIONAL NOTES

INSTALLATION

Script download link: https://github.com/mpb10/PowerShell-Backup/releases/download/v2.0.0/PowerShell-Backup-v2.0.0.zip

Requires: PowerShell 5.0 or greater*

*Version 5.0 of PowerShell comes pre-installed with Windows 10 but otherwise can be downloaded here: https://www.microsoft.com/en-us/download/details.aspx?id=50395

To Install:

  1. Ensure that you have PowerShell Version 5.0 or greater installed.
  2. Download the release .zip file and extract it to a folder.
  3. Run the ‘Installer’ shortcut located in the \install folder (or run the the script using the ‘PowerShell-Backup — Portable Version’ shortcut, navigate to the settings menu, and choose the 2 - Install script to: option).

A desktop shortcut and a Start Menu shortcut will be created. Run either of those to use the script. The install location is C:\Users\%USERNAME%\Scripts\PowerShell-Backup.

To uninstall this script and its files, delete the two folders C:\Users\%USERNAME%\Scripts\PowerShell-Backup and %APPDATA%\Microsoft\Windows\Start Menu\Programs\PowerShell-Backup and the desktop shortcut.

USAGE

Run either the desktop shortcut or the Start Menu shortcut. Use option 1 of the main menu to backup a single folder. Use option 2 and the Backuplist.txt file to backup multiple folders at once in a batch job.

Upon being ran for the first time, the script will generate the BackupList.txt file in the \config folder. To use option 2 - Backup from list of the main menu, list folder paths under their respective stanzas in the BackupList.txt file, save it, and then run option 2 of the script.

CHANGE LOG

2.0.0	August 13th, 2018
	Re-wrote the script in the likeness of PowerShell-Youtube-dl. Cleaned up code.
	Can backup individual folders or use the BackupList.txt file to run batch jobs.
	Implemented some logging to the temp folder.

1.1.1 	June 23rd, 2017
	Uploaded to Github.
	Condensed installer to one PowerShell script.
	Edited documentation.

1.1.0	June 12th, 2017
	Added ability to back up folders listed in backuplist.txt.

ADDITIONAL NOTES

NOTE: This script utilizes 7-zip command line version 9.20 executable file. This version of 7-zip has been identified as being vulnerable to multiple code execution exploits via crafted archive files. Since the executable is only used to create archives, the danger these vulnerabilities pose are negligable as long as the 7-zip executable is only used by the script to create archives. This version of 7-zip is only used because of its ability to be easily downloaded and installed. To easily mitigate the vulnerabilities found in version 9.20, simply download 7-zip version 18.05 or higher, copy the file 7z.exe to the \bin directory, and rename the executable to 7za.exe.

This script uses the 7-Zip program to compress folders for backing up. 7-Zip is licensed under the GNU LGPL license and its source code can be found at https://www.7-zip.org/.

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 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.

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



Для примера будем бэкапить папки “Документы” и “Рабочий стол” (мы же страсть как любим хранить все на рабочем столе! )) в папку D:\backup. В этой папке создаем два текстовых файла backup.bat и work.bat и папку _log, где будем хранить отчеты. Подробно описывать командную строку и bat-файлы здесь не буду, информации достаточно в интернете, только вставлю комментарии где нужно.

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

Файл backup.bat с комментариями


@echo off

D:
cd D:\backup\
В этой папке храним наши резервные копии и bat-файлы.

set day=%DATE:~0,2%
set month=%DATE:~3,2%
set year=%DATE:~6,4%

set /a ttt=%TIME:~0,2%
set minute=%TIME:~3,2%
set second=%TIME:~6,2%

if %ttt% LSS 10 (
set hour=0%ttt%) else (
set hour=%ttt%)

set logfilename=%year%-%month%-%day%_%hour%-%minute%-%second%_backup.log
Задаем имя лог-файла. Собственно, все вышестоящие манипуляции с датой-временем лишь для того, чтобы это имя было удобным.

call D:\backup\work.bat>D:\backup\_log\%logfilename%
Выполняем копирование, и результаты пишем в лог.

2>nul forfiles /p «D:\backup\_log» /d -14 /c «cmd /c del /f /q @file»
Удаляем логи старше 14 дней (ключ /d -14)


Файл work.bat с комментариями


@echo off
echo Резервная копия всех моих файлов
echo (Способ подсмотрен в блоге blog.eorteam.com)
echo.
С чего начинается написание любой программы? Правильно — с копирайтов! Обратите внимание, консоль работает в кодировке CP866! Иначе кракозябры вместо русских букв.

ROBOCOPY с:\Users\username\Desktop d:\backup\Desktop /FFT /MIR /R:3 /W:5 /TEE /FP /NDL /NP

Это основная команда, рассмотрим ее подробнее
c:\Users\username\Desktop — “откуда”.
d:\backup\Desktop — “куда”.
/FFT — используется время файлов FAT. Огрубляет время последнего изменения файлов до двух секунд, благодаря этому в разных системах файл определяется, как не изменившийся, и лишний раз не копируется. Этот ключ полезен, например при бэкапе на сетевое хранилище (NAS).
/MIR — создает зеркало дерева папок.
/R:3 /W:5 — число повторных попыток неудавшегося копирования файла и интервал в секундах между попытками. Если не задать, то любой битый сектор подвесит наш скрипт почти на год (миллион попыток с интервалом 30 секунд)
Ну а дальше идет вкусовщина:
/FP — в выводе будут отображаться полные пути файлов, это нам для лога.
/NDL — а вот имена папок отображаться не будут.
/NP — и ход процесса, число скопированных процентов файла тоже.
Вообще утилита robocopy очень гибкая, все ключи можно посмотреть например здесь.

ROBOCOPY c:\Users\username\Documents d:\backup\Documents /FFT /MIR /R:3 /W:5 /TEE /FP /NDL /NP
Аналогично копируем Документы. Обратите внимание, ярлыки папок типа “Мои рисунки” будут раскрыты, и будут скопированы файлы из родительской c:\Users\username\Pictures\


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


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

На вкладке «Действие» создаем «Запуск программы» и указываем нашу «Программу или сценарий» D:\backup\backup.bat. Остальные параметры настраиваются по желанию. Например можем направлять себе уведомление по почте. Не забываем нажать «OK». Все, теперь из-под Администратора можно уходить и продолжать свою обычную работу. В 11 часов вечера резервная копия будет создана, а в папке D:\backup\_log появится файл с сегодняшним отчетом.

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

  • Скрывать защищенные системные файлы windows 10
  • Скрипт для переименования файлов в папке windows
  • Скрипт на питоне для windows
  • Скрытые настройки питания процессора windows 10
  • Скрипт для отключения обновлений windows 10