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

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

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

Просмотры 45K

Здесь мы рассмотрим, как сделать систему дифференциального бэкапа «из коробки» (ну почти), с привлечением минимального количества внешних модулей, в лучших традициях 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:winfsbackup7z — библиотеки и исполняемый файл 7za
D:winfsbackupbackup — место хранения бэкапов (можно переназначить путем правки переменных, как и любые другие используемые файлы)
D:winfsbackuplists — списки включаемых и исключаемых файлов. О них расскажу чуть позже
D:winfsbackuplog — логи
D:winfsbackuppdate
D:winfsbackuptmp — устанавливает рабочий каталог для временного базового архива
D:winfsbackupwinfsbackup.bat — сам скрипт.

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

После обработки переменных скрипт смотрит блок :Main, где указывается логика работы бэкапа — в каком случае должен выполниться новый бэкап, а в каком случае — обновить существующий базовый архив. По умолчанию, новый архив создается в начале месяца, а все файлы из директории backup перемещаются в backupold, или если базового архива не существует.
Уже во время написания статьи я понял, что нужно добавить возможность обновления базового архива — упрощенный вариант «полный бэкап раз месяц + дифференциальный бэкапы к нему» целесообразно использовать для файловых обменников размером до ~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:foobar, и мы хотим исключить вложенную директорию E:foobarsomefolder, то в exclude_general.txt мы должны добавить barsomefolder или barsomefolder

Путь без слэша в конце может относиться как к файлу, так и к директории.
В 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:winfsbackuptmp
SET run_7z=D:winfsbackup7z7za.exe
SET run_pdate=D:winfsbackuppdatepdate.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:winfsbackuplog
SET Log=%LogDir%general.log
SET dDir=D:winfsbackupbackup
SET dlmDir=D:winfsbackupbackupold
SET baseArch=%dDir%general.7z
SET IncludeList=listsinclude_general.txt
SET ExcludeList=listsexclude_general.txt
SET ExcludeRegexp=listsexclude_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 --- Action was not selected! >> %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 --- Start to create new archive" >> %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 --- Exit code  - archive successfully created!" >> %Log%
	) ELSE (
		IF %ERRORLEVEL%==1 (
		%run_pdate% "Z --- Warning! Recieved exit code 1" >> %Log%
			) ELSE (
				IF %ERRORLEVEL%==2 (
				%run_pdate% "Z --- Exit code 2 - FATAL ERROR!" >> %Log%
				) ELSE (
					IF %ERRORLEVEL%==7 (
					%run_pdate% "Z --- Exit code 7 - Command prompt error!" >> %Log%
					) ELSE (
						IF %ERRORLEVEL%==8 (
						%run_pdate% "Z --- Exit code 8 - Not enough memory" >> %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 --- Start to update archive" >> %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 --- Exit code  - update successfully finished" >> %Log%
	) ELSE (
		IF %ERRORLEVEL%==1 (
		%run_pdate% "Z --- Warning! Recieved exit code 1" >> %Log%
			) ELSE (
				IF %ERRORLEVEL%==2 (
				%run_pdate% "Z --- Exit code 2 - FATAL ERROR!" >> %Log%
				) ELSE (
					IF %ERRORLEVEL%==7 (
					%run_pdate% "Z --- Exit code 7 - Command prompt error!" >> %Log%
					) ELSE (
						IF %ERRORLEVEL%==8 (
						%run_pdate% "Z --- Exit code 8 - Not enough memory" >> %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 --- Start to update archive" >> %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 --- Exit code  - update successfully finished" >> %Log%
	) ELSE (
		IF %ERRORLEVEL%==1 (
		%run_pdate% "Z --- Warning! Recieved exit code 1" >> %Log%
			) ELSE (
				IF %ERRORLEVEL%==2 (
				%run_pdate% "Z --- Exit code 2 - FATAL ERROR!" >> %Log%
				) ELSE (
					IF %ERRORLEVEL%==7 (
					%run_pdate% "Z --- Exit code 7 - Command prompt error!" >> %Log%
					) ELSE (
						IF %ERRORLEVEL%==8 (
						%run_pdate% "Z --- Exit code 8 - Not enough memory" >> %Log%
						) ELSE (
							ECHO Recieved error 255 - user stopped running process or exit code unknown! >> %Log%
						)
					)
				)
			)
		)
	)
)

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

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

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

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

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

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

Profile picture for user Олег

code

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

Ссылки

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

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

Функции

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

Постановка задачи

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

Пусть задача будет звучать следующим образом:

  1. Необходимо организовать автоматическое резервное копирование определенных файлов компьютера на отдельный носитель.
  2. Компьютер работает под управлением Windows версий 7 / 2008 или более поздней.
  3. Объем данных большой, поэтому копирование должно поддерживаться как полное, так и дифференциальное.
  4. Д.б. возможность копировать любые файлы, в т.ч. системные, заблокированные на чтение и т. п.
  5. Сторонним платным софтом пользоваться категорически не хочется (ну, допустим, мы стеснены в средствах, а эти ваши торренты — не наш путь! Или религия не позволяет. Или миллион других причин.), а лучше вообще обойтись без любого стороннего софта, пользуясь лишь возможностями ОС .

Немного подумав, еще расширим список хотелок:

  1. Как продолжение предыдущего пункта, формат архива также должен быть открытым и распространенным, чтобы в случае чего его без проблем открыть откуда угодно с помощью чего-угодно
  2. Более того, он должен быть таким, чтобы из любого, даже дифференциального архива, можно было бы без труда вытащить любой файл, не распаковывая для этого весь архив.
  3. Глубина архивации должна настраиваться (что называется, backup rotate).
  4. Было бы неплохо также с архивом сохранять дескрипторы безопасности NTFS.
  5. И вообще, хочется максимальной расширяемости и настраиваемости, если завтра возникнет желание нагородить дополнительный функционал.

Что ж, требования сформулированы, дело за малым – спланировать и реализовать всё остальное.

Выбор средств

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

  • Алгоритмический язык и командлеты – Powershell (хотя тут при желании можно и VBScript)
  • Доступ к файлам через службу теневого копирования тома (VSS)
  • Формат архива – Zip
  • Механизм копирования только измененных файлов – архивный бит файловой системы
  • Автоматизация запусков – встроенный планировщик
  • ПО архивации – ?

Несморя на то, что через пользовательский интерфейс Windows создать «Сжатую ZIP-папку» проще простого, в результате поиска встроенного аналога командной строки меня постиг облом №1. Для реализации, собственно, функции архивирования для оригинальной Windows из коробки, к сожалению, так или иначе требовалась либо доустановка NET Framework, либо сторонних командлетов Powershell, либо файлов из Resource Kit, либо чего-то еще.

Опробовав ряд вышеперечисленных вариантов меня постиг облом №2: на больших объемах архивируемых данных (начиная от пары сотен гигабайт) одни попросту вылетали, другие съедали всю память и начинали грузить сервер, третьи еще каким-то образом начинали чудить.

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

  • ПО архивации – 7-Zip

План алгоритма

Итак, алгоритм предельно прост: пишем сценарий на Powershell, который должен:

  1. Исходя из переданных параметров, создать теневую копию интересуемого тома.
  2. Получить к ней доступ из операционной системы.
  3. В случае дифференциальной/инкрементной резервной копии составить список измененных файлов.
  4. Заархивировать нужные файлы.
  5. По возможности заархивировать NTFS ACL
  6. Удалить теневую копию.
  7. В случае создания полной/инкрементной резервной копии – сбросить с файлов архивный бит.
  8. В случае создания полной копии удалить старые бэкапы (старше заданной глубины архивации).

Скрипт

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

Итоговый скрипт backup-files.ps1

##################################################################################################
# Скрипт резервного копирования данных v0.9b
# 25-12-2014
# Accel
##################################################################################################
#
#Поддерживаются полные и дифференциальные копии (на основе архивного атрибута файлов)
#
#Системные требования: 
#	Windows 7+, 2008+
#	Установленный архиватор 7-Zip (тестировалось на версии 9.30b)
#
#За один запуск скрипта возможно резервное копирование лишь с одного диска
#
#NTFS-полномочия на данный момент не сохраняются (определяется возможностями архиватора)
#
#Скрипт должен запускаться от пользователя, имеющего доступ к архивируемым файлам (с правами SYSTEM, Backup Operator и т.п.)

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue"

##################################################################################################
#Начало блока переменных
##################################################################################################

#Название задания архивирования
#Используется в именовании архива и ссылки на теневую копию
#Должно отвечать правилам именования файлов, наличие пробелов не рекомендуется, т.к. не тестировалось
#Пример: $ArchiveTaskName="DiskE"
$ArchiveTaskName="DiskE"

#Путь до диска-источника резервного копирования 
#Перечень целевых папок этого диска определяется отдельно
#Пример: $SrcDrivePath="D:"
$SrcDrivePath="D:"

#Путь до целевого диска 
#Пример: $BackupDrivePath="E:"
$BackupDrivePath="E:"

#Полный путь до файла со списком папок для архивирования на диске-источнике
#Пример: $SubfoldersToBackupFile = "E:Backupsrc_dirs.txt"
#	* Каждая строка данного файла должна содержать одну папку, которую мы хотим включить в архив
#	* Путь д.б. относительным, т.е. не содержать буквы диска.
#	* Иными словами, если одна из папок резервного копирования у нас D:FilesFilesToBackup, то в файле должна быть строка FilesFilesToBackup
#	* Кодировка - ANSI
$SubfoldersToBackupFile = "E:Backupsrc_dirs.txt"

#Путь до временного файла-списка файлов для архивации:
#Пример: $BackupFilesList = "E:Backupbackup-filelist.txt"
$BackupFilesList = "E:Backupbackup-filelist.txt"

#Путь до целевой папки с архивами (В ней не должно быть никаких других файлов, иначе rotation их может удалить! Также лучше не использовать корень диска, а создать хоть одну подпапку.)
#Пример: $ArchiveDstPath = $BackupDrivePath+"BackupScript backup"
$ArchiveDstPath = $BackupDrivePath+"BackupScript backup"

#Полный путь до файла журнала задания
#Пример: $ScriptLogFile = "E:BackupBackupFiles.log"
$ScriptLogFile = "E:BackupBackupFiles.log"

#Путь до исполняемого файла архиватора 7-Zip
#Пример: $SevenZipExecutablePath = "C:Program files7-Zip7z.exe"
$SevenZipExecutablePath = "C:Program files7-Zip7z.exe"

#Количество дней хранения архива (отсчет ведется с последнего полного бэкапа)
#Пример: $BackupRotationIntervalDays=22
$BackupRotationIntervalDays=22

##################################################################################################
#Конец блока переменных
##################################################################################################


$BackupFilesListTmp = $BackupFilesList+".tmp"
$backuptype=$args[0]
$VSCPath = $BackupDrivePath+"VSC_"+$ArchiveTaskName+"_$(Get-Date -format "yyyyMMdd")"

Start-Transcript -path $ScriptLogFile

$LogVars=1

if ($LogVars=1) {
	echo "================================================================="
	echo "ArchiveTaskName: $ArchiveTaskName"
	echo "SrcDrivePath: $SrcDrivePath"
	echo "BackupDrivePath: $BackupDrivePath"
	echo "SubfoldersToBackupFile: $SubfoldersToBackupFile"
	echo "BackupFilesList: $BackupFilesList"
	echo "ArchiveDstPath: $ArchiveDstPath"
	echo "ScriptLogFile: $ScriptLogFile"
	echo "SevenZipExecutablePath: $SevenZipExecutablePath"
	echo "VSCPath: $VSCPath"
	echo "BackupRotationIntervalDays: $BackupRotationIntervalDays"
	echo "================================================================="
	}

echo "Backup started at: $(Get-Date)"

function BackupFull {
	echo "Backup type: full"
	
	#Создаем теневую копию
	$s1 = (gwmi -List Win32_ShadowCopy).Create($SrcDrivePath, "ClientAccessible")
	$s2 = gwmi Win32_ShadowCopy | ? { $_.ID -eq $s1.ShadowID }
	$d  = $s2.DeviceObject + ""

	#Создаем на нее ярлык (удалим предыдущий, если остался после прерванной архивации)
	CMD /C rmdir "$VSCPath"
	cmd /c mklink /d $VSCPath "$d"

	#Составляем список папок для архивации
	"" | Set-Content $BackupFilesList
	Get-Content $SubfoldersToBackupFile | Foreach-Object {CMD /C "echo $VSCPath$_* >> $BackupFilesList" }
	
	#Создаем массив параметров для 7-Zip
	$Arg1="a"
	$Arg2=$ArchiveDstPath+""+$ArchiveTaskName+"_$(Get-Date -format "yyyy-MM-dd")_`(Full`).zip"
	$Arg3="-i@"+$BackupFilesList
	$Arg4="-w"+$ArchiveDstPath
	$Arg5="-mx=3"
	$Arg6="-mmt=on"
	$Arg7="-ssw"
	$Arg8="-scsUTF-8"
	$Arg9="-spf"

	#Зипуем
	& $SevenZipExecutablePath ($Arg1,$Arg2,$Arg3,$Arg4,$Arg5,$Arg6,$Arg7,$Arg8,$Arg9)
	
	Remove-Item $BackupFilesList

	#Если теневые копии имеют необъяснимую тенденцию копиться, лучше удалим их все
	#CMD /C "vssadmin delete shadows /All /Quiet"
	
	#Или можно удалить только конкретную созданную в рамках данного бекапа
	"vssadmin delete shadows /Shadow=""$($s2.ID.ToLower())"" /Quiet" | iex

	#Удаляем ярлык
	CMD /C rmdir $VSCPath

	#Снимаем архивный бит
	Get-Content $SubfoldersToBackupFile | Foreach-Object {CMD /C "attrib -A -H -S $SrcDrivePath$_* /S /L" }
	
	#делаем rotation
	echo "Rotating old files..."
	CMD /C "forfiles /D -$BackupRotationIntervalDays /S /P ""$ArchiveDstPath"" /C ""CMD /C del @file"""
	}
	
function BackupDiff {
	echo "Backup type: differential"
	
	#Создаем теневую копию
	$s1 = (gwmi -List Win32_ShadowCopy).Create($SrcDrivePath, "ClientAccessible")
	$s2 = gwmi Win32_ShadowCopy | ? { $_.ID -eq $s1.ShadowID }
	$d  = $s2.DeviceObject + ""

	#Создаем на нее ярлык (удалим предыдущий, если остался после прерванной архивации)
	CMD /C rmdir $VSCPath
	cmd /c mklink /d $VSCPath "$d"
	
	#Включаем UTF-8
	CMD /C "chcp 65001 > nul"
	
	#Составляем список файлов, измененных с момента предыдущей архивации
	"" | Set-Content $BackupFilesList
	Get-Content $SubfoldersToBackupFile | Foreach-Object {CMD /C "dir $VSCPath$_ /B /S /A:A >> $BackupFilesList" }
	
	CMD /C "chcp 866 > nul"
	
	$SearchPattern="^"+$BackupDrivePath.Substring(0,1)+":\"
	
	#Отрезаем букву диска, иначе 7-zip при архивации по списочному файлу глючит, находя несуществующие дубли
	#(Get-Content $BackupFilesList) -replace $SearchPattern,'' > $BackupFilesListTmp
	Get-Content $BackupFilesList | ForEach-Object { $_ -replace $SearchPattern,"" } | Set-Content ($BackupFilesListTmp)
	
	Remove-Item $BackupFilesList
	Rename-Item $BackupFilesListTmp $BackupFilesList
	
	#Поскольку имя диска в путях удалили, нужно перейти в нужную директорию
	cd $BackupDrivePath

	#Создаем массив параметров для 7-Zip
	$Arg1="a"
	$Arg2=$ArchiveDstPath+""+$ArchiveTaskName+"_$(Get-Date -format "yyyy-MM-dd")_`(Diff`).zip"
	$Arg3="-i@"+$BackupFilesList
	$Arg4="-w"+$ArchiveDstPath
	$Arg5="-mx=3"
	$Arg6="-mmt=on"
	$Arg7="-ssw"
	$Arg8="-scsUTF-8"
	$Arg9="-spf"

	#Зипуем
	& $SevenZipExecutablePath ($Arg1,$Arg2,$Arg3,$Arg4,$Arg5,$Arg6,$Arg7,$Arg8,$Arg9)
	
	Remove-Item $BackupFilesList

	#Если теневые копии имеют необъяснимую тенденцию копиться, лучше удалим их все
	#CMD /C "vssadmin delete shadows /All /Quiet"
	
	#Или можно удалить только конкретную созданную в рамках данного бекапа
	"vssadmin delete shadows /Shadow=""$($s2.ID.ToLower())"" /Quiet" | iex

	#Удаляем ярлык
	CMD /C rmdir $VSCPath
	}
	
if ($backuptype -eq "diff") {
	BackupDiff | Out-Host
	}
elseif ($backuptype -eq "full") {
	BackupFull | Out-Host
	}
else {
	echo $backuptype
	echo "None backup type parameter passed! Usage: scriptname.ps1 [ full | diff ]"
	}

echo "Backup finished at: $(Get-Date)"

Stop-Transcript

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

Файл папок-источников src_dirs.txt

bases
files
photos
users/profiles

Использование

Складываем всё в одну папку, и всё, можно запускать в Powershell. Единственный параметр — тип запуска [full | diff], определяет полный/дифференциальный способ копирования.

PS E:Backup> .backup-files.ps1 full

Убедившись, что всё работает (или поправив параметры, если нет) создаём задание в планировщике (отдельно для полного копирования и отдельно для дифференциального).

Экспортированный пример задания: scheduled-backup-task-full.xml

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2014-10-14T23:14:45.0256428</Date>
    <Author>PCAccel</Author>
  </RegistrationInfo>
  <Triggers />
  <Principals>
    <Principal id="Author">
      <UserId>PCUser</UserId>
      <LogonType>S4U</LogonType>
      <RunLevel>HighestAvailable</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>true</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
    <UseUnifiedSchedulingEngine>false</UseUnifiedSchedulingEngine>
    <WakeToRun>true</WakeToRun>
    <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>C:WindowsSystem32WindowsPowerShellv1.0powershell.exe</Command>
      <Arguments>-Command "& {E:Backupbackup-files.ps1 full}"</Arguments>
    </Exec>
  </Actions>
</Task>

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

Замечания

  • Для корректной работы (в первую очередь для создания теневой копии) powershell должен быть запущен от имени администратора (или «с наивысшими привилегиями» в терминологии планировщика заданий).
  • По идее способ также годится для горячего консистентного резервного копирования хоть баз MSSQL, хоть MS Exchange (при установке соотв. shadow copy providers, которые к подобному софту идут в комплекте), хотя конкретно в этих случаях удобнее пользоваться встроенными средствами.
  • Инкрементным резервным копированием я не пользуюсь (много хлопот найти удаленный файл среди кучи инкрементных архивов), но если возникнет потребность, то он получается буквально комбинированием нескольких срочек из полного и дифференциального блоков скрипта.
  • Здесь также не реализован механизм сохранения ACL (формат zip, да и 7zip не поддерживают хранение дескрипторов безопасности в архиве; RAR умеет, но это уже не свободное ПО, что сильно противоречит условиям задачи). В случае необходимости дескрипторы можно сохранять в файл встроенными утилитами типа icacls и добавлять полученный дамп в создаваемый архив.
  • Увы и ах, алгоритм не подходит для XP/2003. Сложность возникает на моменте создания ярлыка на теневую копию (в этих ОС нет утилиты mklink, а по-быстрому обойти эти грабли у меня не вышло).

P.S.

Перед необходимостью изобретать свой велосипед автор за несколько лет

намучался

перепробовал большое количество разнообразного бесплатного готового ПО со похожей функциональностью (Cobian Backup, COMODO Backup и др.). Вдоволь находившись по разнообразным встроенным в упомянутый софт граблям, было принято решение написать что-то своё. На данный момент описанное решение успешно работает на серверах (Windows Server 2008 R2) и рабочих станциях (Windows 7 и Windows 8.1).

Самая крупная создаваемая полная резервная копия на данный момент составляет 1 Тб в исходных файлах, в архиве – 350 Гб. При архивировании с зеркала SAS (7200) на такой же локальный Volume-диск (оба работают внутри vSphere, будучи подключенными как RDM Passthrough-диски) операция занимает около 6 часов, что в условиях задачи является вполне приемлемым результатом.

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, например, \serverdirectory

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

robocopy /?

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

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

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

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

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

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

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

  • \testnode1C$source
    — исходный каталог, откуда копируются файлы
  • \testnode2C$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=\testnode2C$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 регулярно синхронизировать содержимое сетевой папки между двумя серверами с ведением логов.

  • Исходный путь — \testnode1C$source
  • Целевая директория- \testnode2C$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 \testnode1C$source \testnode2c$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 \testnode1C$source \testnode2c$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 или используете цепочки автоматизации с другими языками программирования.

Содержание

  1. BAT скрипт для резервного копирования папки
  2. Ссылки
  3. Функции
  4. Пример настройки расписания
  5. CMD/BAT, резервное копирование и глубина архивации
  6. Простая автоматизация резервного копирования под Windows
  7. Бэкап файлов Windows-сервера своими руками
  8. Предыстория
  9. Собираем систему
  10. Логика работы
  11. Переменные
  12. Дифференциальный бэкап
  13. Некоторые опции командной строки
  14. Вместо окончания
  15. Использование Robocopy для синхронизации и резервного копирования файлов, примеры
  16. Основные возможности Robocopy
  17. Синтаксис и параметры robocopy
  18. Использование robocopy для зеркалирования каталогов
  19. Инкрементальное копирование с помощью robocopy
  20. Robocopy: перемещение файлов
  21. Пример использование robocopy в планировщике задач
  22. Отслеживание изменений в каталогах с помощью robocopy
  23. Коды возврата (ошибки) robocopy

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

me2

code

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

Ссылки

Функции

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

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

backup folder 1 0

backup folder 2 0

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

backup folder 3 1

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

backup folder 4 0

backup folder 5 0

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

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

Источник

CMD/BAT, резервное копирование и глубина архивации

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

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

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

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

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

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

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

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

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

«Родная» кодировка для CMD-сценариев — OEM (866), а для Windows-версии архиватора RAR — ANSI (Windows-1251). В связи с этим лог-файл грешит некоторой неудобочитаемостью, если сценарий сохранить в родной для него OEM-кодировке. С одной строны, для себя я счел этот недостаток некритичным (в редакторе/просмотрщике Far Manager не трудно нажать F8 для смены кодировки), а с другой стороны ничто не мешает сохранить сценарий в кодировке ANSI (вывод в консоль командами ECHO в сценарии не используется — только в лог-файл, — поэтому пользователь никаких кракозяблов не увидит, зато лог будет нормально записываться в одной и той же кодировке). Буду благодарен, если предложите более корректный способ «подружить» эти кодировки.

Источник

Простая автоматизация резервного копирования под Windows

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

Имеем исходные условия:
Операционная система: MS Windows XP, 2003 и т.п.;
Объекты резервирования: Папки и файлы, находящиеся на локальных и сетевых дисках в объеме

200 ГБ;
Бюджет: 0 руб.;
Количество специально-обученных сотрудников для настройки процесса: 1 чел.
Количество специально-обученных сотрудников для обслуживания процесса: 0 чел.

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

На просторах Сети можно найти довольно большое количество различных программ решающих подобную задачу. Согласно задачи и поставленных условий были найдены, установлены и протестированы в условиях приближенных к боевым следующие программы: Cobian Backup (9, 10), Toucan, Areca, FBackup, Backup2Net и программа резервного копирования Samsung Auto Backup (идет в комплекте с одноименным съемным диском).

Тестирование данных программ на рабочих объемах данных показало их устойчивую неспособность справиться с простой задачей автоматического создания ежедневных бэкапов данных требуемого объема. Проблемы возникали как на этапе подготовки к выполнению резервирования, так и собственно в прогрессе оного.
Дольше всех (около недели) продержался Cobian Backup 10, после чего пошел в отказную и упорно начал делать бэкапы только около 600 МБ данных и сваливаясь с кучей ошибок в логах. Манипуляции с настройками теневого копирования и архивирования ни к чему, к сожалению не привели, а так в целом программа оставила довольно приятное впечатление, так что к применению рекомендуется (при условии стабильной работы в Ваших конкретных условиях).
Особая надежда была на Toucan, так как программа относится к СПО. Но увы, надежды не оправдались. По ходу выполнения задания на разных этапах программа вываливалась с классической ошибкой о недопустимой операции и необходимости ее (программы) закрытия.
Остальные участники отбора так же не устроили меня по различным причинам. Подробнее раскрывать процесс тестирования указанных программ не вижу особого смысла, т.к. к цели написания данной статьи, это напрямую не относится.
Таким образом, простая идея с поиском свободного решения поставленной задачи оказалась с треском провалена. Так как бродить далее по просторам Сети на предмет бесплатных для коммерческого применения программ резервного копирования уже не было ни сил, ни желания, ни надежды, а бэкапы делать крайне необходимо, то возникло естественное решение/желание соорудить что-то собственное. Результатом раздумий в течении довольно непродолжительного времени стало предлагаемое ниже решение простой автоматизации резервирования данных посредством обыкновенного bat-скрипта и стандартного планировщика. Скрипт работает, что называется, «из коробки», и не требует дополнительного тестирования и отладки, требуется только предоставить ему входные данные и заранее создать участвующие в процессе каталоги (проверок на этот предмет из соображений простоты нет).
Предвидя недовольство многих по поводу выкладывания готовых к употреблению решений, хочу сказать, что не у многих наших сограждан есть желание/время/возможность/талант/вписать нужное, для того чтобы разбираться с синтаксисом стандартной командной строки Windows. Также посмею указать на вероятность отличную от нуля, что хотя бы несколько юных и зеленых администраторов обратят свой взор на несомненную бесполезность изучения данной области.

И так, приступим. Сначала приведу полный текст скрипта без комментариев. Полный разбор с комментариями см. ниже.

Результатом ежедневной работы скрипта будет набор бэкапов нужных Вам данных, имеющий приблизительно такой вид:
dir d:backups

files2010-07-12_22-00-00.7z
files2010-07-13_22-00-00.7z
files2010-07-14_22-00-00.7z
files2010-07-15_22-00-00.7z
files2010-07-16_22-00-00.7z

Обещанный разбор с комментариями.

@Echo Off :: Отключение вывода текста скрипта
echo %date% %time% ***Start*** ::Вывод даты и времени старта скрипта
SetLocal EnableDelayedExpansion :: Команда изменяет работу с переменными в цикле.

В обычном случае, чтобы определить значение переменной окружения, надо воспользоваться конструкцией %переменная%. Однако, если значение переменной меняется внутри цикла и читается там же, то для корректной работы бат-файла, следует использовать команду SetLocal EnableDelayedExpansion и вместо символа «%», использовать символ «!». Иначе, значение переменной в цикле будет всегда одним и тем же — таким, каким было до входа в цикл.

Далее для успешной работы предлагаемого скрипта необходимо задать следущие входные параметры (переменные):

$SRC=list_add.txt ::файл-список архивируемых данных
$EXC=list_excl.txt ::файл-список исключаемых файлов
$DST=D:backups ::место хранения резервных копий
$PSW=password ::секретный пароль шифрования архива
$COMPR=1 ::степень сжатия данных архиватором 7zip (1=самое быстрое архивирование, 5=нормальное сжатие, 9=ультра-сжатие, 0=архивация без сжатия)
$COPIES=7 ::количество хранимых резервных копий

Следующая строка запускает архивацию посредством 7-Zip файлов и папок перечисленных в файле list_add.txt, кроме файлов, указанных в файле исключений list_excl.txt

Разберем эту строку подробнее:

C:«Program Files»7-Zip7z.exe :: Указывает место расположения исполняемого файла архиватора 7-Zip (точнее его консольной версии);

a :: это команда добавления файлов/папок в архив;

-t7z :: ключ задает тип создаваемого архива = 7z;

-mhe=on :: включает шифрование паролем заголовка архива и имен файлов/папок в архиве;

6,2%.7z
Команда динамически формируем полный путь и имя файла архива вида «D:backupsfiles2010-07-12_22-00-00.7z», где в имени присутствуют дата и время архивации;

@%$SRC% :: задает имя файла-списка архивируемых данных, вместо %$SRC% скрипт подставляет имя файла;

-scsWIN :: задает кодировку win для файла-списка;

-p%$PSW% :: ключ задает пароль для шифрования архива, вместо %$PSW% скрипт подставляет текстовую строку пароля;

-mx=%$COMPR% :: ключ задает степень сжатия архивируемых данных;

-ssw :: ключ разрешает архивацию файлов открытых приложениями на запись;

-xr@%$EXC% :: задает имя файла-списка данных, исключаемых из процесса архивации, r = означает, что надо исключать и подпапки, вместо %$EXC% скрипт подставляет имя файла;

>> log_7z.log :: символы >> обозначают перенаправление сообщений выводимых всей строкой с экрана (стандартного потока) в файл log_7z.log, это удобно для последущего анализа работы скрипта;

Эта часть скрипта отвечает за автоматическое удаление уже ненужных архивов данных, в соответствии с количеством заданым переменной $COPIES.

Разберем подробнее. Автоматическое удаление реализуется путем организации цикла, в ходе которого перебирается набор имен (множество) файлов архивов (как оно формируется — см. чуть ниже строку DIR. )
В общем виде наш цикл имеет вид: for /F [«КлючевыеСловаРазбора»] <%% | %>переменная in (МножествоИменФайлов) do команда [ПараметрыКоманднойСтроки]
Ключ /F определяет, что цикл произведет разбор всех элементов множества «МножествоИменФайлов»;
«КлючевыеСловаРазбора» — указывают какие разделители используются между элементами разбираемого множества, в нашем случае — разделителя нет;
%%i — переменная i, которая содержит в каждый шаг итерации текущий элемент разбираемого множества (т.е. очередное имя файла в нашем случае).

Также приведу, для примера, содержимое файла-списка list_add.txt:

M:mail
U:updates
Z:Бухгалтерия
Z:Отдел*
z:Справка
Z:Сисадмин

И файла исключений list_excl.txt:

Собственно вот весь расклад. Скриптик маленький, но надежно работающий. Хитростей никаких нет, все достаточно просто.
Да и напоследок банальность… Для автоматизации запуска можно использовать стандартный планировщик Windows, командной строкой вида «d:backupbackup.bat >> d:backupbackup.log». Это позволит вывести сообщения скрипта в лог-файл.
Всем удачи.

2) Подробная справка по функциям консольной версии 7-Zip прилагается к архиватору.

Источник

Бэкап файлов Windows-сервера своими руками

Здесь мы рассмотрим, как сделать систему дифференциального бэкапа «из коробки» (ну почти), с привлечением минимального количества внешних модулей, в лучших традициях 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

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

Мной была использована следующая структура каталогов:
D:winfsbackup — корневая директория скрипта и связанных файлов
D:winfsbackup7z — библиотеки и исполняемый файл 7za
D:winfsbackupbackup — место хранения бэкапов (можно переназначить путем правки переменных, как и любые другие используемые файлы)
D:winfsbackuplists — списки включаемых и исключаемых файлов. О них расскажу чуть позже
D:winfsbackuplog — логи
D:winfsbackuppdate
D:winfsbackuptmp — устанавливает рабочий каталог для временного базового архива
D:winfsbackupwinfsbackup.bat — сам скрипт.

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

250 Гб. Для моего файлообменника в 550 Гб с преобладанием мелких файлов скорость бэкапа оказалась неудовлетворительна (почти 55 часов). Справедливости ради стоит сказать, что это не может служить сколь нибудь достоверным замером производительности — в процессе бэкапа выяснилось, что некоторые файлы недоступны (привет chkdsk), а бэкап складывался в раздел удаленного сервера, который тоже был занят операциями дискового ввода-вывода.

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

Переменные

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Использование Robocopy для синхронизации и резервного копирования файлов, примеры

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

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

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

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

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

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

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

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

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

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

ispolzovanie utility robocopy v windows dlya kopir

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

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

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

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

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

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

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

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

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

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

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

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

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

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

sozdat zadanie planirovshika robocopy

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

zadanie zerkalirovaniya robocopy

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

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

raspisanie zapuska

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

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

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

zapusk komandy robocopy cherez planirovshik

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

Если вы всё настроили правильно, директории должны начать синхронизироваться. sobytiya zapuska zadaniya planirovshika

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

zhurnal zapuska planirovshika robocopy

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

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

Плюсы:

Минусы:

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

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

Hex Decimal Meaning if set
0x00 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 или используете цепочки автоматизации с другими языками программирования.

Источник

Сегодня мы узнаем про то, что такое bat файл и заодно создадим один из них.

Думаю, что многие, так или иначе, периодически создают резервные копии (так называемые backup-ы) тех или иных файлов и папок.

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

bat файл и его создание - иконка статьи

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

Поехали.

  • Bat файл — что к чему, вводная

  • Как создать bat файл и использовать его

  • Добавляем в файл команду, например, для копирования

  • Меняем формат файла и пробуем его запустить

  • Послесловие

Bat файл — что к чему, вводная

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

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

После запуска пакетного файла, программа — интерпретатор (как правило COMMAND.COM или CMD.EXE) читает его строка за строкой и последовательно исполняет команды.

Пакетный файл — аналог shell script в Unix-подобных операционных системах.

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

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

Пакетные файлы поддерживают операторы if и goto (а в системах семейства Windows NT и расширенный оператор for), что позволяет обрабатывать результаты выполнения предыдущих команд или приложений и в зависимости от этого выполнять дальше тот или иной блок команд (как правило, в случае удачного завершения приложение возвращает 0 в переменной errorlevel; в случае неудачного — 1 или большее значение).

Пакетные файлы в DOS имеют расширение .bat; для других операционных систем они могут иметь другие расширения — например, .CMD в Windows NT и OS/2, или .BTM в 4DOS или подобных оболочках.

С теорией разобрались, приступим к, собственно, практике, а именно созданию bat-ника.

к содержанию ↑

Как создать bat файл и использовать его

Давайте подготовим небольшое тестовое поле, чтобы было на базе чего экспериментировать. Откройте мой компьютер и создайте на диске C: папочку test. Зайдите в неё и создайте в ней папку testcopy.

Накидайте туда файлов (штук 5-10) — фотки, документы и тд и тп (любых короче). Поле для экспериментов готово. Далее нам надо создать, собственно, сам bat файл по нажатию на который у нас будет происходить копирование папки C:testtestcopy в, скажем, папку C:testbackup. Создавать вторую папку (которая backup) не надо — она будет появляться автоматически.

Создать bat очень просто. Жмем правой кнопкой мышки там где хотим его создать (расположение не важно — можно прямо на рабочем столе) и выбираем «Создать» — «Текстовый документ«.

Задаем созданному файлу название и открываем его блокнотом или любым другим текстовым редактором. Т.е. на данный момент мы имеем открытый текстовый файлик, который называется, допустим, копирование.txt.

к содержанию ↑

Добавляем в файл команду, например, для копирования

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

xcopy C:testtestcopy C:testbackup /f /i /y /s

Разъясняю что тут к чему:

  • xcopy — это сама команда;
  • C:testtestcopy — это источник, т.е. папка откуда копируются файлы и каталоги;
  • C:testbackup — это результат, т.е. место, куда будут скопированы файлы и каталоги;
  • /f /i /y /s — дополнительные параметры синтаксиса для команды xcopy (см.синтаксис ниже по тексту).

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

Далее, касательно синтаксиса (какие дополнительные параметры есть, какие можно дописать и зачем они нужны).

Какие есть (т.е. те, что я указал в данном примере):

  • /f — выводит имена исходных файлов и файлов-результатов в процессе копирования
  • /i — создает новый каталог в случае, если тот отсутствует в конечном пути
  • /y — перезаписывает файл в случае, если он уже есть
  • /s — копирует каталоги и подкаталоги, если они не пусты. Если параметр /s не задан, команда xcopy будет работать только с одним каталогом.

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

Далее нам надо сменить формат файла с txt на bat. Делается это следующим образом.

к содержанию ↑

Меняем формат файла и пробуем его запустить

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

Жмем «Применить» и «Ок«. Теперь мы можем менять расширение известных системе файлов, а посему направляемся к нашему файлику, жмем правой кнопкой мышки, выбираем «Переименовать» и методом печатания на клавиатуре меняем расширение с txt на bat (на вопрос системы стоит ли это делать отвечаем утвердительно).

В результате мы имеем следующую картину (в вашем случае файлик называется иначе, но имеет тот же формат):

bat файл в папке

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

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

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

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

к содержанию ↑

Послесловие

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

При желании можно поставить запуск этого bat-ника в определенные дни через планировщик Windows (или другие программы позволяющие это делать) и вообще забыть о проблеме долгих ручных backup‘ов.

Если есть какие-то вопросы или проблемы — спрашивайте. Как всегда помогу чем смогу ;)

PS: Если мне не изменяет память, то это кусочек темы из умных админских книжек, а именно из раздела «Автоматизация администрирования«.. так что можете собой гордится :)

Guide: Robocopy, Xcopy, Notepad cmd are Windows 10 backup command lines that let you backup files using command prompt in Windows 10. If you prefer versatile third-party backup and recovery software for the system (OS), files, folders, disk and partition backup from the command prompt, use EaseUS Todo Backup.

Can You Copy Files Using Command Prompt in Windows 10 for Backup?

Windows operating system has a mass of inbuilt backup and recovery programs. For example, File History in Windows 10 for backing up specific files and folders that often change, Backup and Restore in Windows 7 for making a full system image, and System Restore, Fresh Start.

Are there methods available to back up files and folders from the command prompt in Windows 10? Windows Linux Unix users are used to backing up files from command prompt, they keep the habit even after they changed Linux to Windows operating system. Moreover, backup using command prompt in Windows 10 lets us backup data without booting into Windows, particularly when your operating system failed to boot. The most commonly applied command lines are Robocoy, Xcopy, Notepad, and some commercial command-line backup software. Here, the most advanced, fastest, and user-friendly suggestion is EaseUS Todo Backup.

  1. 1. Robocoy command line backup
  2. 2. Xcopy command line backup
  3. 3. Notepad cmd backup
  4. 4. EaseUS command line backup

To prevent file loss due to system crash, file corruption, virus infection, etc. on your computer, it is necessary to back up your computer data from time to time. In Windows 10, you can easily copy files and folders from source to destination using the Robocopy, Xcopy and Notepad command. While if you want to back up your partition, disk, or Windows system, you need a developed backup tool to support you, like EaseUS Todo Backup here. 

Method 1. Backup Using Robocopy Command Line in Windows 10

Robocopy, short for Robust File Copy, provides more than 80 command-line parameters and switches for users to have an additional file copy for backup. A typical use scenario for this Windows 10 command backup line is copying a large file share. See the following detailed instructions.

Step 1. Type cmd in the search box, or press Windows + R (a run dialog box will be displayed ) and type cmd to open Command Prompt will show up.

Step 2. Type the command Robocopy (or xcopy for Windows 8/7/XP users) in this form: robocopy + space + source path + destination path. You can follow the example and create your own.

Robocopy «D:test» «F:test 1» (This is the simplest usage for Robocopy to copy contents of D:test to F:test 1)

backup files using command prompt Windows 10

Step 3. Press «Enter» and all your target files and folders will be backed up to your desired location, which can be any drive including an external USB flash drive.

backup files using command prompt Windows 10

Method 2. Backup Xcopy Using Command Prompt in Windows 10

Windows command line allows you to back up files and directories using the xcopy command. Xcopy has different switches using which we can specify the conditions on what files need to be copied. You can use a USB drive or an external hard disk as the backup location. Next, let’s start to learn what Xcopy command line we should use to backup files to copy files to an external hard drive.

xcopy source destination /M /E /G /H /Y

Note: /M switch turns off the archive attribute on the files after copying the file to the destination. This attribute will be set only if someone modifies the files afterward.

To back up data using date and time stamps, we need to run the below command:

xcopy source destination /E /G /H /Y /D:mm-dd-yy

Method 3. Backup Files Using Notepad CMD in Windows 10

For those who are not familiar with the command lines that Windows 10 command prompt offers, you can use notepad to launch a graphical user interface that you are used to. If your computer won’t boot and you want to copy files for backup, use the installation disc and enter the command prompt.

Step 1. In the Command Prompt, type Notepad.exe and press the Enter key to launch the Notepad application. Once the application is launched, click on File > Save As to launch Save As dialog.

Step 2. Locate the files you want to back up

Step 3. Plugin your USB or external storage

Step 4. Right-click on the files and/or folders you want to back up and select ‘send to’ your USB drive.

Method 4. Backup Everything Using Command Line Backup Software

The above three methods are only available for backing up files, folders, and directories. If your needs are backing up partition, disks, and systems, the former three commands can’t meet the demands. To do so, you can try EaseUS command line backup tool that enables you to back up file, folder, partition/disk, and system under the Windows command line directly, only performs the etbcmd command. You can schedule a differential, full, or incremental backup each time as you need.

Apart from the command line backup, EaseUS Todo Backup also provides you the graphical interface to clone several partitions to a new disk (HDD/SSD) at a time or clone Windows OS to SSD without re-installation.

Step 1. Run Command Prompt as administrator and run the command etbcmd to start EaseUS Todo Backup.

easeus todo backup command line starts

Step 2. All the command and parameters of this tool will be listed below.

easeus todo backup action details

Step 3. Here is an example of creating a backup task. And, you’d better list all partitions and disks on your computer first to confirm which partition you need to backup before creating a job.

easeus todo backup command line example

easeus todo backup command line list disk partition

Step 4. If you want to back up your system, you could use the parameter «/s system», Todo Backup will choose the system and boot partitions to backup them directly. You can also select partition manually. It should be partition 1 and 3 on the above list. 

easeus todo backup command line create system backup task

Step 5. For backing up to network drive, the location could be set as below.

easeus todo backup command line network drive

What’s the Most Convenient Backup Solution for Windows 10?

This article covers almost every Windows 10 backup command line method for users and administrators to backup files from the command prompt in Windows 10. As a matter of fact, the command line is always the choice of higher-level computer users, and people who’re insisting on this method is gradually decreasing since the way of computer backup has become more and more intelligent, easier and faster.

EaseUS Todo Backup offers the command line option for computer backup to a local drive, exernal hard disk, USB drive, network drive and even the Cloud storage. However, what customers prefer using it is not because it can backup using the command line but automatic backup options for files, folders, system, disk and partition backup.

By simply choosing a backup mode, the software will guide you throughout the backup way and complete the backup. No additional computer skills are required in this way. Get more information from this introduction video of EaseUS Todo Backup.

Guide: Robocopy, Xcopy, Notepad cmd are Windows 10 backup command lines that let you backup files using command prompt in Windows 10. If you prefer versatile third-party backup and recovery software for the system (OS), files, folders, disk and partition backup from the command prompt, use EaseUS Todo Backup.

Can You Copy Files Using Command Prompt in Windows 10 for Backup?

Windows operating system has a mass of inbuilt backup and recovery programs. For example, File History in Windows 10 for backing up specific files and folders that often change, Backup and Restore in Windows 7 for making a full system image, and System Restore, Fresh Start.

Are there methods available to back up files and folders from the command prompt in Windows 10? Windows Linux Unix users are used to backing up files from command prompt, they keep the habit even after they changed Linux to Windows operating system. Moreover, backup using command prompt in Windows 10 lets us backup data without booting into Windows, particularly when your operating system failed to boot. The most commonly applied command lines are Robocoy, Xcopy, Notepad, and some commercial command-line backup software. Here, the most advanced, fastest, and user-friendly suggestion is EaseUS Todo Backup.

  1. 1. Robocoy command line backup
  2. 2. Xcopy command line backup
  3. 3. Notepad cmd backup
  4. 4. EaseUS command line backup

To prevent file loss due to system crash, file corruption, virus infection, etc. on your computer, it is necessary to back up your computer data from time to time. In Windows 10, you can easily copy files and folders from source to destination using the Robocopy, Xcopy and Notepad command. While if you want to back up your partition, disk, or Windows system, you need a developed backup tool to support you, like EaseUS Todo Backup here. 

Method 1. Backup Using Robocopy Command Line in Windows 10

Robocopy, short for Robust File Copy, provides more than 80 command-line parameters and switches for users to have an additional file copy for backup. A typical use scenario for this Windows 10 command backup line is copying a large file share. See the following detailed instructions.

Step 1. Type cmd in the search box, or press Windows + R (a run dialog box will be displayed ) and type cmd to open Command Prompt will show up.

Step 2. Type the command Robocopy (or xcopy for Windows 8/7/XP users) in this form: robocopy + space + source path + destination path. You can follow the example and create your own.

Robocopy «D:test» «F:test 1» (This is the simplest usage for Robocopy to copy contents of D:test to F:test 1)

backup files using command prompt Windows 10

Step 3. Press «Enter» and all your target files and folders will be backed up to your desired location, which can be any drive including an external USB flash drive.

backup files using command prompt Windows 10

Method 2. Backup Xcopy Using Command Prompt in Windows 10

Windows command line allows you to back up files and directories using the xcopy command. Xcopy has different switches using which we can specify the conditions on what files need to be copied. You can use a USB drive or an external hard disk as the backup location. Next, let’s start to learn what Xcopy command line we should use to backup files to copy files to an external hard drive.

xcopy source destination /M /E /G /H /Y

Note: /M switch turns off the archive attribute on the files after copying the file to the destination. This attribute will be set only if someone modifies the files afterward.

To back up data using date and time stamps, we need to run the below command:

xcopy source destination /E /G /H /Y /D:mm-dd-yy

Method 3. Backup Files Using Notepad CMD in Windows 10

For those who are not familiar with the command lines that Windows 10 command prompt offers, you can use notepad to launch a graphical user interface that you are used to. If your computer won’t boot and you want to copy files for backup, use the installation disc and enter the command prompt.

Step 1. In the Command Prompt, type Notepad.exe and press the Enter key to launch the Notepad application. Once the application is launched, click on File > Save As to launch Save As dialog.

Step 2. Locate the files you want to back up

Step 3. Plugin your USB or external storage

Step 4. Right-click on the files and/or folders you want to back up and select ‘send to’ your USB drive.

Method 4. Backup Everything Using Command Line Backup Software

The above three methods are only available for backing up files, folders, and directories. If your needs are backing up partition, disks, and systems, the former three commands can’t meet the demands. To do so, you can try EaseUS command line backup tool that enables you to back up file, folder, partition/disk, and system under the Windows command line directly, only performs the etbcmd command. You can schedule a differential, full, or incremental backup each time as you need.

Apart from the command line backup, EaseUS Todo Backup also provides you the graphical interface to clone several partitions to a new disk (HDD/SSD) at a time or clone Windows OS to SSD without re-installation.

Step 1. Run Command Prompt as administrator and run the command etbcmd to start EaseUS Todo Backup.

easeus todo backup command line starts

Step 2. All the command and parameters of this tool will be listed below.

easeus todo backup action details

Step 3. Here is an example of creating a backup task. And, you’d better list all partitions and disks on your computer first to confirm which partition you need to backup before creating a job.

easeus todo backup command line example

easeus todo backup command line list disk partition

Step 4. If you want to back up your system, you could use the parameter «/s system», Todo Backup will choose the system and boot partitions to backup them directly. You can also select partition manually. It should be partition 1 and 3 on the above list. 

easeus todo backup command line create system backup task

Step 5. For backing up to network drive, the location could be set as below.

easeus todo backup command line network drive

What’s the Most Convenient Backup Solution for Windows 10?

This article covers almost every Windows 10 backup command line method for users and administrators to backup files from the command prompt in Windows 10. As a matter of fact, the command line is always the choice of higher-level computer users, and people who’re insisting on this method is gradually decreasing since the way of computer backup has become more and more intelligent, easier and faster.

EaseUS Todo Backup offers the command line option for computer backup to a local drive, exernal hard disk, USB drive, network drive and even the Cloud storage. However, what customers prefer using it is not because it can backup using the command line but automatic backup options for files, folders, system, disk and partition backup.

By simply choosing a backup mode, the software will guide you throughout the backup way and complete the backup. No additional computer skills are required in this way. Get more information from this introduction video of EaseUS Todo Backup.

Ценность резервного копирования ощущает каждый, кто сталкивался с потерей файлов.
Для резервного копирования можно использовать профессиональные платные продукты, например, Symantec Backup Exec Desktop and Laptop Option, а можно и самому бесплатно создать эффективный механизм резервного копирования файлов, как документов пользователя, так и служебных файлов на серверах, с помощью доступных подручных средств: командный файл и пара бесплатных программ.
Резервное копирование будет иметь следующие функции:

  • копирование всех файлов некоторого каталога и его подкаталогов (полное копирование, full backup), выполняется довольно долго при большом количестве файлов
  • копирование файлов, измененных после последнего резервного копирования (добавочное копирование, incremental backup) – определяется по архивному атрибуту, этот режим выполняется довольно быстро за счёт небольшого числа файлов


Реализация основана на следующих идеях:

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

Для создания ZIP файлов потребуется программа-архиватор с интерфейсом командной строки, например, 7-ZIP.

Предположим, что нам потребуется создавать резервные копии документов пользователя (%USERPROFILE%Documents) и сохранять их на файловом сервере, где выделены папки для резервных копий каждого пользователя \FILESERVERBackup%USERNAME%

Полное резервное копирование (FULLBACKUP.CMD)

Командный файл полного резервного копирования определяет имя файла по текущей дате, например, fullbackup_20130222.zip для 22 февраля 2013 года и вызывает архиватор:

@echo off

set files_folder=%USERPROFILE%Documents
set backup_folder=\FILESERVERBackup%USERNAME%
set backup_filename=%backup_folder%fullbackup_%date:~-4%%date:~3,2%%date:~0,2%.zip

7z.exe a -r "%backup_filename%" "%files_folder%*"

Предполагается, что программа 7-ZIP уже установлена на компьютере, и путь к её файлам прописан в переменной PATH. Если нет, необходимо добавить в последнюю строку путь к файлу.

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

Добавочное резервное копирование (INCBACKUP.CMD)

Отличие добавочного копирования состоит в том, что необходимо добавлять в ZIP не все файлы, а только те, которые имеют установленный архивный аттрибут («файл готов для архивирования»). Для этого используем программу DIR с необходимыми параметрами, сохраняя вывод в файл:

dir %files_folder% /A:A /B /S > "%list_filename%"

Необходимо запускать команду из Unicode среды (команда cmd /u incbackup.cmd), чтобы корректно обработать файлы, в названии которых есть символы из расширенного набора.

Следующим шагом необходимо подготовить сформированный список файлов для 7-ZIP:

  • преобразовать кодировку из UTF-16 в UTF-8 (требуется для 7-ZIP),
  • убрать из путей файлов начальную часть пути к каталогу

Это можно сделать одним запуском программы nhreplace:

nhrplc -spt:"%files_folder%" -t:"" -cp:auto,utf8 "%list_filename%"

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

@echo off

set files_folder=%USERPROFILE%Documents
set list_filename=%USERPROFILE%local settingstempbackup-list.txt
set backup_folder=\FILESERVERBackup%USERNAME%

dir %files_folder% /A:A-H /B /S > "%list_filename%"
nhrplc -spt:"%files_folder%" -t:"" -cp:auto,utf8 "%list_filename%"

set backup_filename=%backup_folder%incbackup_%date:~-4%%date:~3,2%%date:~0,2%.zip

pushd "%files_folder%"
7z.exe u "%backup_filename%" @"%list_filename%"
dir /A:A-H-S /B /S | attrib -A /s
popd
del "%list_filename%"

Также в файле присутствуют команды pushd-popd для перехода в каталог копируемых файлов и обратно. Перемещение в этот каталог необходимо для нормальной работы 7-ZIP со списком. В зависимости от того, как запускается командный файл и нужно ли возвращаться в исходный каталог, можно оставить пару pushd-popd, или ограничиться командой cd "%files_folder%"

Поскольку 7-ZIP не имеет функции сброса атрибута файла, для этого можно использовать команду attrib.

Использование

Созданные командные файлы fullbackup.cmd и incbackup.cmd можно запускать как вручную, так и по расписанию.
Например, файл incbackup.cmd можно запускать и несколько раз в день, хоть каждый час, и он будет обновлять файл резервной копии текущего дня по мере того, как пользователь вносит изменения в свои документы, при этом время резервного копирования будет небольшим.
При этом пользователю будут доступны сделанные копии по дням, и он сможет сам, без участия администратора, восстанавливать не только определённый файл, но и различные его редакции (по датам).

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

Все скрипты запускаются через планировщик заданий

Файл БД выгружается SQL Агентом в 20ч
Далее запускается скрипт в 3Ч упаковку в архив созданием имени текущего дня и перемещается на другой сервер
Другой скрипт удаляет старые копии

::@echo off
color 1a
:: Кодировка
chcp 1251
::Формирование переменной год месяц день
set D=%date:~0,2%
set M=%date:~3,2%
set Y=%date:~6,4%
set DMY=%Y%.%M%.%D%
::Подключение сетевого диска
net use Z: \192.168.101.7backups /user:логин пароль
:: Сжатие файла и перемещение по сети на другой сервер
«C:Program Files (x86)7-Zip7zG.exe» a -tzip -mx7 Z:BD_%DMY%.zip L:basebackupfor_fs
:: Отключение сетевого диска
net use Z: /delete

::@echo off
color 1a
chcp 1251
set D=%date:~0,2%
set M=%date:~3,2%
set Y=%date:~6,4%
set DMY=%Y%.%M%.%D%
net use Z: \192.168.101.7backups /user:Логин Пароль
copy D:basebackupfor_fs*.* Z:
ren Z:sitex_bd_r01.bak BD_%DMY%.BAK
net use Z: /delet

Удаление старых копий

‘Создание объектов
Set FSO3 = WScript.CreateObject(«Scripting.FileSystemObject»)
Set objNetwork = WScript.CreateObject(«WScript.Network»)

‘Присваиваем значения переменным
strDriveName = «Z:»
strRemoteShare = «\192.168.101.7backups»
strUser = «Пользователь»
strPassw = «Пароль»

if FSO3.DriveExists(strDriveName) Then

‘Выводим информацию на экран
‘WScript.Echo «Диск » & strDriveName & » уже подключен»

else

‘Подключаем диск Z:
WScript.Sleep 1000
objNetwork.MapNetworkDrive strDriveName, strRemoteShare, false, strUser, strPassw
WScript.Sleep 1000

End If

sFolderPath = «Z:»
maxCount = 7
Set oFSO = CreateObject(«Scripting.FileSystemObject»)
Set oFolder = oFSO.GetFolder(sFolderPath)
Set colFiles = oFolder.Files
If colFiles.Count>maxCount Then
‘ сформировали массив
Dim aFile()
ReDim aFile(colFiles.Count-1, 1)
Counter = 0
For Each oFiles in colFiles
aFile(Counter,0) = oFiles.Name
aFile(Counter,1) = oFiles.DateCreated
Counter = Counter +1
Next
Counter = Counter -1
‘ посортировали массив
For i = 0 To Counter
For j = i+1 To Counter
If aFile(i,1)<aFile(j,1) Then
VTmp = aFile(i,0)
aFile(i,0) = aFile(j,0)
aFile(j,0) = VTmp
VTmp = aFile(i,1)
aFile(i,1) = aFile(j,1)
aFile(j,1) = VTmp
End If
Next
Next
‘ удалили файлы
For i = maxCount To Counter
oFSO.DeleteFile(sFolderPath & aFile(i,0))
Next
End If

objNetwork.RemoveNetworkDrive «Z:»

1. Скрипт будет лежать на одном сервере (у сервера есть доступ ко всем проверяемым узлам) и будет работать по Траппер элементы данных (как активный агент но данные будет передавать скрипт) рядом со скриптом должен быть zabbix_sender.exe но лучше прописать переменную так как при запуске из планировщика может не отработать (например Path прописать ;C:zabbix;)

в 8:30 запуск скрипта check_bk_fs.bat
Цикл перебора IP районов
192.168.1ХХ.3for_fs*.bak
Каждый день в 20:20 выгрузка файла из SQl
Проверяем на следующий день дата изменения файла = минус один день от текущей даты если равно значит 1 нет 0

\192.168.%1.7backupsBD_%y%.%m%.%d%.*
Копия файла в архив каждый день сравниваем имя архива с текущей датой если = то проверяем дату изменения архива если текущая дата= то 1 если нет то 0
Получаем размер файла Проверяем что архив не битый высчитываем разность за сутки
Старый делим на новый должно быть не меньше <0.9 или
новый размер файла делить на старый значение должно быть не больше>1.1
Значение должно быть в районе 1
Так же получаем содержимое папки имя файла дата изменения размер в виде лога
Проверка файла выгруженного из SQL далее его упаковка в архив и копирование на другой сервер проверка

@echo off
color 1a

:: Удаление старых логов более 31 день
forfiles /p «%~dp0log» /S /D -31 /C «cmd /c del /f /a /q @file»

SETLOCAL
:: Перебор IP подсетей с 1 по 28
for /L %%a in (101,1,128) do call:backup %%a
……..
goto:eof

:backup
:: Проверка Копии за вчерашний день копия делается вечером скрипт запускается утром
set «sourcePath=\172.16.%1.6for_fs*.bak»
:: Переменная если файл не найден ошибка
set good=0

:: Скрипт минус 1 день
setlocal enabledelayedexpansion
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

:: День Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если дата 01 то будет 1
if %d:~0,1%==0 set d=%d:~1%
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%

:: Определение кл-ва дней в феврале высокосный год или нет от 0 до 3
:: %Деление по модулю является остаток от целочисленного деления
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)

::високосным является не год, который делится без остатка на 4, а тот, который делится на 4, кроме тех, которые делятся на 100, но не делятся на 400
::set /a feb1=y%% 100
::set /a feb2=y%% 400

::set IsLeapYear=No
::if !feb2!==0 (set IsLeapYear=Yes) else (
::if !feb2!==0 (
::if not !feb1!==0 (set IsLeapYear=Yes)
::)
::)

:: Минус 1 месяц
set /a tok=m-1
::Проверка января если месяц 1 -1=0 значит месяц 12
if %tok%==0 set tok=12
::Цифра месяца соответствует порядковому номеру в скобках
for /f «tokens=%tok%» %%i in («31 %feb% 31 30 31 30 31 31 30 31 30 31») do (
:: минус 1 день set /a d-=1
set /a d-=1
if !d!==0 (
set d=%%i
set m=%tok%
if !m!==12 set /a y-=1
)
)
set d=0%d%
set m=0%m%
::Так как даты сравнивает до точки, делаем дату единым числом ггггммдд
set yesterdas=%y%%m:~-2%%d:~-2%
::Конец скрипта минус 1 день
setlocal DISABLEDELAYEDEXPANSION
::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f «Skip=5 eol= delims=» %%p in (‘dir \192.168.%1.3for_fs*.bak’) do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k bklogforfs%1 -o «%%p»)
:: Запрос размера файла
for %%w in (\192.168.%1.3for_fs*.bak) do set sizeforfs=%%~zw
:: Переменные
:: Искать в заданном расположении
for %%i in («%sourcePath%») do (
for /f «tokens=1-5 delims=.-/ » %%j in («%%~ti») do (
::Дата изменения файла больше или равно минус текущий день
if %%l%%k%%j GEQ %yesterdas% (
:: Если файл найден то good=1
set good=1
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_backup%1.6 -o 1 & zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k bksizeforfs%1 -o %sizeforfs%) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_backup%1.6 -o 0)

:: Проверка копии в архиве на Файловом за сегодняшний день
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%
:: Переменная пути на файл
set «sourcePath=\192.168.%1.9es-backupsES_%y%.%m%.%d%.*»
:: Переменная если файл не найден ошибка
set good=0

::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f «Skip=5 eol= delims=» %%p in (‘dir \192.168.%1.9es-backups’) do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k logbkfses%1 -o «%%p»)
:: Запрос размера файла
for %%w in (\192.168.%1.9es-backupsES_%y%.%m%.%d%.*) do set sizees=%%~zw
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in («%sourcePath%») do (
for /f «tokens=1-5 delims=.: » %%j in («%%~ti») do (
::Изменение файла = Текущая дата дд.мм.гггг
if %%j.%%k.%%l == %date% (
:: Если файл найден то good=1
set good=1
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_arxbackups%1.9 -o 1 & zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k bksizefses%1 -o %sizees%) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_arxbackups%1.9 -o 0)

:: Создание Лога
::IF %1==128 call:log
::goto:pusto

::log
::check_bk_fs.bat>> %~dp0log%date%check_bk_fs.log|goto:eof

::pusto

Старая версия

@echo off
color 1a

SETLOCAL
:: Перебор IP подсетей с 1 по 28
for /L %%a in (101,1,128) do call:backup %%a
……..
goto:eof

:backup
:: Проверка Копии за вчерашний день копия делается вечером скрипт запускается утром
set «sourcePath=\192.168.%1.3for_fs*.bak»
:: Переменная если файл не найден ошибка
set good=0

:: Скрипт минус 1 день
setlocal enabledelayedexpansion
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

:: День Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если дата 01 то будет 1
if %d:~0,1%==0 set d=%d:~1%
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%

:: Определение кл-ва дней в феврале высокосный год или нет от 0 до 3
:: %Деление по модулю является остаток от целочисленного деления
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)

::високосным является не год, который делится без остатка на 4, а тот, который делится на 4, кроме тех, которые делятся на 100, но не делятся на 400
::set /a feb1=y%% 100
::set /a feb2=y%% 400

::set IsLeapYear=No
::if !feb2!==0 (set IsLeapYear=Yes) else (
::if !feb2!==0 (
::if not !feb1!==0 (set IsLeapYear=Yes)
::)
::)

:: Минус 1 месяц
set /a tok=m-1
::Проверка января если месяц 1 -1=0 значит месяц 12
if %tok%==0 set tok=12
::Цифра месяца соответствует порядковому номеру в скобках
for /f «tokens=%tok%» %%i in («31 %feb% 31 30 31 30 31 31 30 31 30 31») do (
:: минус 1 день set /a d-=1
set /a d-=1
if !d!==0 (
set d=%%i
set m=%tok%
if !m!==12 set /a y-=1
)
)
set d=0%d%
set m=0%m%
set yesterday=%d:~-2%.%m:~-2%.%y%
::Конец скрипта минус 1 день
setlocal DISABLEDELAYEDEXPANSION
::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f «Skip=5 eol= delims=» %%p in (‘dir \192.168.%1.3for_fs*.bak’) do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k bklogforfs%1 -o «%%p»)
:: Запрос размера файла
for %%w in (\192.168.%1.3for_fs*.bak) do set sizeforfs=%%~zw
:: Переменные
:: Искать в заданном расположении
for %%i in («%sourcePath%») do (
for /f «tokens=1-5 delims=.-/ » %%j in («%%~ti») do (
if %%j.%%k.%%l == %yesterday% (
:: Если файл найден то good=1
set good=1
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_backup%1.3 -o 1 & zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k bksizeforfs%1 -o %sizeforfs%) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_backup%1.3 -o 0)

:: Проверка копии в архиве на Файловом за сегодняшний день
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%
:: Переменная пути на файл
set «sourcePath=\192.168.%1.7backupsBD_%y%.%m%.%d%.*»
:: Переменная если файл не найден ошибка
set good=0
::Текущая дата дд.мм.гггг
set needDate=%date%

::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f «Skip=5 eol= delims=» %%p in (‘dir \192.168.%1.7backups’) do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k logbkfsbd%1 -o «%%p»)
:: Запрос размера файла
for %%w in (\192.168.%1.7backupsBD_%y%.%m%.%d%.*) do set sizebd=%%~zw
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in («%sourcePath%») do (
for /f «tokens=1-5 delims=.: » %%j in («%%~ti») do (
if %%j.%%k.%%l == %needDate% (
:: Если файл найден то good=1
set good=1
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_arxbackups%1.7 -o 1 & zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k bksizefsbd%1 -o %sizebd%) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_arxbackups%1.7 -o 0)

При создании элемента в заббиксе Имя узла сети должно строго соответствовать имени Сервера или ПК откуда запускается скрипт в примере будет FILESERVER1

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

Группа элементов trapbacku
Элемент Создаем для каждой подсети
имя SR01 not_backup
Тип Zabbix траппер
Ключ not_backup101.3
Тип информации Числовой
История 90d

Файл выгруженный из базы SQL для упаковки в архив копии на ФС
За вечер предыдущего дня
1 -файл есть
0 — файла нет

\SRXXfor_fs
Not 1XX.3 sitex_bd_rXX.bak

Триггер
Имя SR01 sitex backup {ITEM.LASTVALUE}
Важность выбираем
Выражение {FILESERVER1:not_backup101.3.last(#1)}=0 or {FILESERVER1:not_backup101.3.nodata(24h)}=1
Описание
в 8:30 запуск скрипта
Цикл перебора IP районов, подстановка даты в имя файла
\192.168.%1.7backupsBD_%y%.%m%.%d%.*
Копия файла в архив каждый день сравниваем имя архива с текущей датой если = то проверяем дату изменения архива если текущая дата= то 1 если нет то 0
1 -файл есть
0 — файла нет
Скрипт 40.90 D:Backapszabbix_bkcopy_bk_fs.bat
Последнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})

srbackup
srbackup

Группа элементов trapbackup
Элемент Создаем для каждой подсети
имя FS01 not_arxbackup
Тип Zabbix траппер
Ключ not_arxbackups101.7
Тип информации Числовой
История 90d

Описание Файл выгруженный из базы SQL и зархивированый в архив на ФС
Текущего дня
1 -файл есть
0 — файла нет
\FS101backups
BD_ГГГГ.ММ.ДД.zip

Триггер для каждого элемента
Имя FS01 not_arxbackup {ITEM.LASTVALUE}
Важность выбираете нужную
Выражение:
{FILESERVER1:not_arxbackups101.7.last(#1)}=0 or
{FILESERVER1:not_arxbackups101.7.nodata(24h)}=1 or
{FILESERVER1:bksizefsesrn101.last(#2)}/{FILESERVER1:bksizefsesrn101.last()}<0.9 or {FILESERVER1:bksizefsesrn101.last()}/{FILESERVER1:bksizefsesrn101.last(#2)}>1.1

Описание
в 8:30 запуск скрипта
Цикл перебора IP районов, подстановка даты в имя файла
\192.168.%1.7backupsDB_%y%.%m%.%d%.*
Копия файла в архив каждый день сравниваем имя архива с текущей датой если = то проверяем дату изменения архива если текущая дата= то 1 если нет то 0
1 -файл есть
0 — файла нет
Скрипт 40.90 D:Backapszabbix_bkcopy_bk_fs.bat
Последнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})

nodata если нет никаких данных за 24 часа 1 , если данные есть 0 или
Проверяем что архив не битый
Старый делим на новый должно быть не меньше <0.9 или
новый размер файла делить на старый значение должно быть не больше>1.1
Значение должно быть в районе 1 Нет данных или больше 10% процентов разница

fsbackup
fsbackup

группа элементов SizeTrapperBakup
Элемент
Имя BkSizeforfs101
Тип Zabbix Траппер
Ключ bksizeforfs101
Тип информации Целое число
Единица измерения b
Хранение 14d
Описание
Размер файла последнего бекапа BD
Каждый день
:: Запрос размера файла
for %%w in (\192.168.%1.3for_fs*.bak) do set sizeforfs=%%~zw

Элемент
Имя BkSizeFsBD101
Тип Zabbix Траппер
Ключ bksizefs101
Тип информации Целое число
Единица измерения b
Хранение 14d
Описание
Размер файла последнего бекапа BD на ФС
Каждый день
:: Запрос размера файла
for %%w in (\192.168.%1.7backupsBD_%y%.%m%.%d%.*) do set sizeesrn=%%~zw

sizebackup
sizebackup

Группа элементов LogTrapperBakup
Элемент bklogforfs101
Тип Zabbix Траппер
Ключ bklogforfs101
Тип информации Текст
Период хранения истории 14d
Описание
Структура каталога каждый день
::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f «Skip=5 eol= delims=» %%p in (‘dir \192.168.%1.3for_fs*.bak’) do

Элемент
Имя LogBkFS101
Тип Zabbix Траппер
Ключ logbkfs101
Тип информации Текст
Период хранения истории 14d
Описание
Структура каталога каждый день на ФС Копии BD
::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f «Skip=5 eol= delims=» %%p in (‘dir \192.168.%1.7backups’) do

logbackup
logbackup

@echo off
color 1a

:: Скрипт минус 1 день
setlocal enabledelayedexpansion
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%
:: День Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если дата 01 то будет 1
if %d:~0,1%==0 set d=%d:~1%
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: Определение кл-ва дней в феврале высокосный год или нет от 0 до 3
:: %Деление по модулю является остаток от целочисленного деления
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
:: Минус 1 месяц
set /a tok=m-1
::Проверка января если месяц 1 -1=0 значит месяц 12
if %tok%==0 set tok=12
::Значение минус месяц деление по модулю четного числа
for /f «tokens=%tok%» %%i in («31 %feb% 31 30 31 30 31 31 30 31 30 31») do (
:: минус 1 день set /a d-=1
set /a d-=1
if !d!==0 (
set d=%%i
set m=%tok%
if !m!==12 set /a y-=1
)
)
set d=0%d%
set m=0%m%
set yesterday=%d:~-2%.%m:~-2%.%y%
::Так как даты сравнивает до точки, делаем дату единым числом ггггммдд
set numyesterday=%y%%m:~-2%%d:~-2%
::Конец скрипта минус 1 день
setlocal DISABLEDELAYEDEXPANSION

::С 00 05ч каждый день кроме СБ и ВС дифах Имя файла минус день проверка в 9 00 (файл diff_17.09.2019.7z 17.09.2019 8:02)
::Переменная пути на файл
set «sourcePath=D:!BackupsDoksdiff_mountsdiff_%%a.%%b.%%c.7z»
:: Запрос содержание данной директории в текстовом формате
for /f «Skip=5 eol= delims=» %%p in (‘dir D:!BackupsDoksdiff_mounts’) do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k BkLogDiffFS17.9 -o «%%p»)
:: Запрашиваем содержимое папки ищем строки с архивом оставляем 4 столбец имя арахива обрезаем по _
for /F » tokens=7,8,9 delims=.|_ » %%a in (‘dir D:!BackupsDoksdiff_mounts^|FIND /I «7z»‘) do (
::Дата файла больше или равно >= минус текущий день (если да выполняем скрипт дальше)
if %%c%%b%%a GEQ %numyesterday% (
:: Запрос размера файла
for %%k in («%sourcePath%») do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k BkSizeDiffFS17.9 -o «%%~zk»)
::День недели
for /f «Skip=1» %%d In (‘WMIC Path Win32_LocalTime Get DayOfWeek’) do (
:: Проверка с понедельниа по субботу включительно
if %%d GEQ 1 (
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in («%sourcePath%») do (
for /f «tokens=1-5 delims=.: » %%j in («%%~ti») do (
::Дата изменения файла больше или равно минус текущий день
if %%l%%k%%j GEQ %numyesterday% (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k DiffFsBk17.9 -o 1) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k DiffFsBk17.9 -o 0)
)
)
)
)
)
)
)
)

::С 7 00ч суббота раз в неделю (суботы на воскресенье) Имя файла минус день проверка в 9 00 ВС (файл full.7z 13.09.2019 20:45)
::Переменная пути на файл
set «sourcePath=D:!BackupsDoksFULL_mountsfull.7z»
:: Запрос содержание данной директории в текстовом формате
for /f «Skip=5 eol= delims=» %%p in (‘dir D:!BackupsDoksFULL_mounts’) do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k BkLogFullFS17.9 -o «%%p»)
::День недели
for /f «Skip=1» %%d In (‘WMIC Path Win32_LocalTime Get DayOfWeek’) do (
if %%d == 0 (
:: Проверка Воскресенье
:: Запрос размера файла
for %%k in («%sourcePath%») do set BkSizeFullFS=%%~zk
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in («%sourcePath%») do (
::Дата изменения файла больше или равно минус текущий день
for /f «tokens=1-5 delims=.: » %%j in («%%~ti») do (
if %%l%%k%%j GEQ %numyesterday% (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k FullFSBk17.9 -o 1 & zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k BkSizeFullFS17.9 -o %BkSizeFullFS%) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k FullFSBk17.9 -o 0)
)
)
)
)
)
)

::С 7 00ч в ВС раз в неделю (вс до пн) Имя файла минус день проверка в 9 00 ПН (файл full1s02.08.2020.7z)
::Переменная пути на файл
set «sourcePath=D:!BackupsDoks1s_mountsfull1s%%b.%%c.%%d.7z»
:: Запрос содержание данной директории в текстовом формате
for /f «Skip=5 eol= delims=» %%p in (‘dir D:!BackupsDoks1s_mounts’) do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k BkLog1sFS17.9 -o «%%p»)
::День недели
for /f «Skip=1» %%d In (‘WMIC Path Win32_LocalTime Get DayOfWeek’) do (
:: Проверка Понедельник
if %%d == 1 (
:: Запрашиваем содержимое папки ищем строки с архивом оставляем 4 столбец имя арахива оставляем дату из имени
for /F » tokens=7,8,9 delims=_|full1s|. » %%b in (‘dir D:!BackupsDoks1s_mounts^|FIND /I «7z»‘) do (
::Дата файла больше или равно >= минус текущий день (если да выполняем скрипт дальше)
if %%d%%c%%b GEQ %numyesterday% (
:: Запрос размера файла
for %%k in («%sourcePath%») do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k BkSize1sFS17.9 -o «%%~zk»)
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in («%sourcePath%») do (
for /f «tokens=1-5 delims=.: » %%j in («%%~ti») do (
::Дата изменения файла больше или равно минус текущий день
if %%l%%k%%j GEQ %numyesterday% (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k 1sFSBk17.9 -o 1) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k 1sFSBk17.9 -o 0)
)
)
)
)
)
)
)
)

:: Удаление старых логов более 31 день
forfiles /p «%~dp0log» /S /D -31 /C «cmd /c del /f /a /q @file»

2.Еще один вариант скрипта более простой который запрашивает только размер файла (еще дополнительно пишет в журнал внештатных ситуацай)

‘Option Explicit

Dim strFolder
Dim strMask
Dim strServerName

Dim objFSO
Dim objRegExp
Dim objFile

Dim boolFound

Dim WshShell
Set WshShell = WScript.CreateObject(«WScript.Shell»)

Dim xmlHTTP, adr, PostData, strDate
Set xmlHTTP = CreateObject(«Microsoft.XMLHTTP»)
adr=»http://192.168.175.4/glpi/journals/addRecord.php»

Public Filials
Filials = 0

strMask = Right(0 & Year(Date), 4) & «.» & Right(0 & Month(date), 2) & «.» & Right(0 & Day(date), 2)
strDate = Right(0 & Day(date), 2) & «.» & Right(0 & Month(date), 2) & «.» & Right(0 & Year(Date), 4)

For n=1 to 28
if n<10 then
strFolder = «\192.168.10″+CStr(n)+».7backups»
strServerName = «0»+CStr(n)
else
strFolder = «\192.168.1″+CStr(n)+».7backups»
strServerName = CStr(n)
End If

Set objFSO = WScript.CreateObject(«Scripting.FileSystemObject»)
Set objRegExp = WScript.CreateObject(«VBScript.RegExp»)

With objRegExp
.Pattern = strMask
.IgnoreCase = True
End With

If objFSO.FolderExists(strFolder) Then
boolFound = False
For Each objFile In objFSO.GetFolder(strFolder).Files
If objRegExp.Test(objFile.Name) Then
boolFound = True
PostData = «id=5&f40=Server_» & strServerName & «&f42=full_backup&f43=Windows_Server_2008_R2&f44=.bak&f45=FS2» & strServerName & «&f46=» & strDate & «&f47=» & objFile.Size

xmlHTTP.Open «POST», adr, False
xmlhttp.setRequestHeader «Content-Type», «application/x-www-form-urlencoded»
xmlHTTP.Send PostData

WshShell.Run «D:!Backapszabbix_bkzabbix_sender.exe -z 192.168.175.111 -s FILESERVER1 -k trapbackup» & strServerName & » -o » & objFile.Size, 0, true
‘WshShell.Run «zabbix_sender.exe -z 192.168.175.111 -s FS» & strServerName & » -k trapbackup03 -o » & objFile.Size, 0, true’
End If
Next

If boolFound Then
Filials = Filials + 1
Else

End If
Else

End If

Set objRegExp = Nothing
Set objFSO = Nothing
next

WScript.Quit 0

Группа trapbackup
Имя backup01
Тип Zabbix траппер
Ключ backup01
Тип информации Числовой целое
Единица измерения b
Период хранения истории 90d

Триггер
Имя NoBackup01
Важность задаем
Выражение
{FILESERVER1:trapbackup01.nodata(24h)}=1 or {FILESERVER1:trapbackup01.last(#2)}/{FILESERVER1:trapbackup01.last()}<0.9 or {FILESERVER1:trapbackup01.last()}/{FILESERVER1:trapbackup01.last(#2)}>1.1

Описание
nodata если нет никаких данных за 24 часа 1 , если данные есть 0 или
Проверяем что архив не битый
Старый делим на новый должно быть не меньше <0.9 или
новый размер файла делить на старый значение должно быть не больше>1.1
Значение должно быть в районе 1

через vbs
через vbs

Как выглядят Последние данные по данным скриптам 1 и 2 варианта

Последние данные
Последние данные

3.Старая проверка скрипт отправка на почту со своими минусами
Удаляет старый файл report.txt (в который выводятся ошибки проверки)
Проверка доступности пингом БД и ФС
Проверка создался ли новый файл копии на сервере БД из SQL и Архив на ФС
Если есть ошибки создается report.txt со всеми ошибками которые были в процессе
Далее если файл существует запускается батник (лежит в этой же папке что и проверочный на ошибки, если нет надо прописать путь) отправки почты .
Почта берет текст ошибок проверок из этого файла report.txt и отправляет на указанную электронку!
Минусы если сервер был выключен скрипт не отработал можно выставить запускать скрипт если был пропущен запуск, если нет инета почта не уйдет и повторно ничего отправлятся не будет или покакой то причине не отработала почта
Почтовая утилита stunnel-5.44-win32-installer.exe настраивается конфиг почты stunnel.conf

@echo off
color 1a
:: Перед проверкой удалим лог предыдущий
DEL /F /S /Q /A «D:report.txt»

TITLE proverka serverov
:proverka ping
:: сервер 1
echo SR01
ping -n 4 192.168.101.3 | find «TTL=» > nul
if %ERRORLEVEL% EQU 0 echo conect
if %ERRORLEVEL% EQU 1 echo ping 1xx.3 disconect >> D:report.txt
:proverka
:: сервер 2
echo FSS101
ping -n 4 192.168.101.7 | find «TTL=» > nul
if %ERRORLEVEL% EQU 0 echo conect
if %ERRORLEVEL% EQU 1 echo ping 2xx.7 disconect >> D:report.txt
TIMEOUT /T 2
cls

set «sourcePath=\192.168.101.3basebackupfor_fs»
set good=0
set needDate=%date%

for %%i in («%sourcePath%») do (
for /f «tokens=1-5 delims=.: » %%j in («%%~ti») do (
if %%j.%%k.%%l == %needDate% (
set good=1
)
)
)

if %good% == 0 (
echo 1XX.3 Not found backup dated %needDate% >> D:report.txt
)

set «sourcePath=\192.168.101.7esrn-backups»
set good=0
set needDate=%date%

for %%i in («%sourcePath%») do (
for /f «tokens=1-5 delims=.: » %%j in («%%~ti») do (
if %%j.%%k.%%l == %needDate% (
set good=1
)
)
)

if %good% == 0 (
echo 1XX.7 Not found backup dated %needDate% >> D:report.txt
)

dir /b/a-d/s «D:report.txt» && START «Pohta» Batpohta.bat || echo Bad!

exit

set file_blat=blat.exe
set file_text=D:report.txt
set file_log=D:log_blat.txt
set from_server=127.0.0.1
set from_port=587
set from_mail=логин@mail.ru
set from_name=логин@mail.ru
set from_pass=***
set to_mail=кому@mail.ru
set to_subject=»Rezervnai copy fs101″
%file_blat% %file_text% -server %from_server%:%from_port% -f %from_mail% -u %from_name% -pw %from_pass% -to %to_mail% -s %to_subject% -log %file_log%
exit

Напрямую батник не может отправить сообщение используем для этого библиотеки и приложение blat
Копируем 4 файла из папки full в папку System32

Команда в батнике
set file_blat=blat.exe – Запуск вспомогательной програмки
set file_text=D:report.txt — Блокнот из которого берется текст сообщения
set file_log=D:log_blat.txt – Лог исполнения
set from_server=127.0.0.1 – сервер исходящей почты
set from_port=587 – порт исходящей почты
set from_mail=логин@mail.ru — Данные пользователя от которого будет отправлено сообщение
set from_name=логин@mail.ru — Данные пользователя от которого отправляется сообщение
set from_pass=**** — Пароль
set to_mail=логин@mail.ru – Кому отправляем
set to_subject=»Rezervnai copy fs101″ – Тема сообщения
%file_blat% %file_text% -server %from_server%:%from_port% -f %from_mail% -u %from_name% -pw %from_pass% -to %to_mail% -s %to_subject% -log %file_log% — Исполняющая команда

Если в почте используется SSL нужна еще одна прогрммка например stunnel-5.44-win32-installer Запускается служба
https://www.stunnel.org/downloads.html

Устанавливаем редактируем файлик C:Program Files (x86)stunnelstunnel.conf
например для майла
[mail-pop3]
client = yes
accept = 127.0.0.1:110
connect = pop.mail.ru:995
[mail-smtp]
client = yes
accept = 127.0.0.1:587
connect = smtp.mail.ru:465

В свою очередь программа переадресовывает на локальный адрес 127.0.0.1 который мы указали в батнике
На основе https://infostart.ru/public/403899/
После перезапуска компа программа не стартанула stunnel AllUsers и поста не отправлялась команда отрабатывала сама отправка не происходила

Команды использовавшиеся в скриптах

ASSOC Вывод либо изменение сопоставлений по расширениям имен файлов.
AT Выполнение команд и запуск программ по расписанию.
ATTRIB Отображение и изменение атрибутов файлов.
BREAK Включение/выключение режима обработки комбинации клавиш CTRL+C.
CACLS Отображение/редактирование списков управления доступом (ACL) к файлам.
CALL Вызов одного пакетного файла из другого.
CD Вывод имени либо смена текущей папки.
CHCP Вывод либо установка активной кодовой страницы.
CHDIR Вывод имени либо смена текущей папки.
CHKDSK Проверка диска и вывод статистики.
CHKNTFS Отображение или изменение выполнения проверки диска во время загрузки.
CLS Очистка экрана.
CMD Запуск еще одного интерпретатора командных строк Windows.
COLOR Установка цвета текста и фона, используемых по умолчанию.
COMP Сравнение содержимого двух файлов или двух наборов файлов.
COMPACT Отображение/изменение сжатия файлов в разделах NTFS.
CONVERT Преобразование дисковых томов FAT в NTFS. Нельзя выполнить
преобразование текущего активного диска.
COPY Копирование одного или нескольких файлов в другое место.
DATE Вывод либо установка текущей даты.
DEL Удаление одного или нескольких файлов.
DIR Вывод списка файлов и подпапок из указанной папки.
DISKCOMP Сравнение содержимого двух гибких дисков.
DISKCOPY Копирование содержимого одного гибкого диска на другой.
DOSKEY Редактирование и повторный вызов командных строк; создание макросов.
ECHO Вывод сообщений и переключение режима отображения команд на экране.
ENDLOCAL Конец локальных изменений среды для пакетного файла.
ERASE Удаление одного или нескольких файлов.
EXIT Завершение работы программы CMD.EXE (интерпретатора командных строк) .
FC Сравнение двух файлов или двух наборов файлов и вывод различий между
ними.
FIND Поиск текстовой строки в одном или нескольких файлах.
FINDSTR Поиск строк в файлах.
FOR Запуск указанной команды для каждого из файлов в наборе.
FORMAT Форматирование диска для работы с Windows.
FTYPE Вывод либо изменение типов файлов, используемых при сопоставлении по
расширениям имен файлов.
GOTO Передача управления в отмеченную строку пакетного файла.
GRAFTABL Позволяет Windows отображать расширенный набор символов в графическом
режиме.
HELP Выводит справочную информацию о командах Windows.
IF Оператор условного выполнения команд в пакетном файле.
LABEL Создание, изменение и удаление меток тома для дисков.
MD Создание папки.
MKDIR Создание папки.
MODE Конфигурирование системных устройств.
MORE Последовательный вывод данных по частям размером в один экран.
MOVE Перемещение одного или нескольких файлов из одной папки в другую.
PATH Вывод либо установка пути поиска исполняемых файлов.
PAUSE Приостановка выполнения пакетного файла и вывод сообщения.
POPD Восстановление предыдущего значения текущей активной папки,
сохраненного с помощью команды PUSHD.
PRINT Вывод на печать содержимого текстовых файлов.
PROMPT Изменение приглашения в командной строке Windows.
PUSHD Сохранение значения текущей активной папки и переход к другой папке.
RD Удаление папки.
RECOVER Восстановление читаемой информации с плохого или поврежденного диска.
REM Помещение комментариев в пакетные файлы и файл CONFIG.SYS.
REN Переименование файлов и папок.
RENAME Переименование файлов и папок.
REPLACE Замещение файлов.
RMDIR Удаление папки.
SET Вывод, установка и удаление переменных среды Windows.
SETLOCAL Начало локальных изменений среды для пакетного файла.
SHIFT Изменение содержимого (сдвиг) подставляемых параметров для пакетного
файла.
SORT Сортировка ввода.
START Запуск программы или команды в отдельном окне.
SUBST С

Команда DIR позволяет отобразить список файлов и подкаталогов для указанного каталога. Список может быть отсортирован по множеству критериев, задаваемых параметрами командной строки.
Формат командной строки:
DIR [диск:][путь][имя_файла] [/A[[:]атрибуты]] [/B] [/C] [/D] [/L] [/N] [/O[[:]порядок]] [/P] [/Q] [/S] /T[[:]время]] [/W] [/X] [/4]

Параметры командной строки:
[диск:][путь][имя_файла] — Диск, каталог и/или файлы, которые следует включить в список.

/A — Вывод файлов с указанными атрибутами:
D Каталоги
R Доступные только для чтения
H Скрытые файлы
A Файлы для архивирования
S Системные файлы
Префикс «-» имеет значение НЕ
-S НЕ системные файлы.

/B — Вывод только имен файлов.
/C — Применение разделителя групп разрядов для вывода размеров файлов (по умолчанию). Для отключения этого режима служит ключ /-C.
/D — Вывод списка в несколько столбцов с сортировкой по столбцам.
/L — Использование нижнего регистра для имен файлов.
/N — Отображение имен файлов в крайнем правом столбце.
/O — Сортировка списка отображаемых файлов.

Порядок: N По имени (алфавитная), S По размеру (сперва меньшие), E По расширению (алфавитная), D По дате (сперва более старые), G Начать список с каталогов. Префикс «-» имеет значение НЕ
/P — Пауза после заполнения каждого экрана.
/Q — Вывод сведений о владельце файла.
/R — Отображение альтернативных потоков файлов.
/S — Вывод списка файлов из указанного каталога и его подкаталогов.
/T — Выбор поля времени для отображения и сортировки

время:
C Создание (время создания — Create )
A Последнее использование (последний доступ — Accsess )
W Последнее изменение (последняя модификация Write)
/W — Вывод списка в несколько столбцов.
/X — Отображение коротких имен для файлов, чьи имена не соответствуют стандарту 8.3. Формат аналогичен выводу с ключом /N, но короткие имена файлов выводятся слева от длинных. Если короткого имени у файла нет, вместо него выводятся пробелы.
/4 — Вывод номера года в четырехзначном формате

Стандартный набор ключей можно записать в переменную среды DIRCMD. Для отмены их действия введите в команде те же ключи с префиксом «-«, например: /-W
dir 123.txt /T:C покажет дату создания.
dir 123.txt /T:W покажет дату изменения.
dir «*»

Цикл FOR
tokens — данный параметр командной стоки цикла for cmd позволяет указать, какие номера полей строки, полученных из заданного текста, нужно передать для обработки в цикл. Полученные поля будут храниться в отдельной переменной. Фактически, если принимать каждое слово строки как отдельный элемент, то параметр tokens позволяет указать, какие именно слова по счету нужно обработать. Как упоминалось выше, стандартным разделителем является пробел и табуляция. Для дополнительной переменной, как и для переменной инициализации, в качестве имени указывается латинская буква, большая или маленькая. Значения можно указывать как через запятые, например, “tokens=1,4, 9” – первый, четвертый и девятый элемент, так и через диапазон, например, “tokens=4-11” – с четвертого по одиннадцатый. Можно комбинировать: “tokens=4-10,15,20” – с четвертого по десятый, а также, пятнадцатый и двадцатый элемент. Если мы укажем в качестве последнего значения звездочку, то создастся еще одна переменная, которая будет хранить в себе все остальные элементы (строки) текста.
delims – параметр позволяет задать дополнительные разделители строки на подстроки. Так, стандартными разделителями является пробел и символ табуляции. Например, “delims=,.:” – тут мы определили, что запятые, точки и двоеточия являют­ся разделителями.
Skip — позволяет в цикле cmd for задать количество строк, которые нужно пропустить, счет идет с начала файла, например
eol – позволяет задать признак концевого комментария Весь текст, что будет находиться после него, будет приниматься за комментарий
%~tI — переменная %I расширяется до даты /времени файла
EQU — равно, идентично оператору ==
NEQ — не равно
LSS — меньше, чем
LEQ — меньше или равно
GTR — больше, чем
GEQ — больше или равно
а ключ /I, если он указан, задает сравнение текстовых строк без учета регистра

команда1 & команда2 — Используется для разделения нескольких команд в одной командной строке. В cmd.exe выполняется первая команда, затем вторая команда.

команда1 && команда2 — Запускает команду, стоящую за символом &&, только если команда, стоящая перед этим символом была выполнена успешно. В cmd.exe выполняется первая команда. Вторая команда выполняется, только если первая была выполнена успешно.

команда1 || команда2 — Запускает команду, стоящую за символом ||, только если команда, стоящая перед символом || не была выполнена. В cmd.exe выполняется первая команда. Вторая команда выполняется, только если первая не была выполнена (полученный код ошибки превышает ноль).

@Echo Off
For /F «Skip=1» %%i In (‘WMIC Path Win32_LocalTime Get Day’) Do Set $Day=%%i&GoTo Day
:Day
For /F «Skip=1» %%i In (‘WMIC Path Win32_LocalTime Get Month’) Do Set $Month=%%i&GoTo Month
:Month
For /F «Tokens=%$Month% Delims=,» %%i In («Январь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь») Do Set $MonthName=%%i
For /F «Skip=1» %%i In (‘WMIC Path Win32_LocalTime Get Year’) Do Set $Year=%%i&GoTo Year
:Year
For /F «Skip=1» %%i In (‘WMIC Path Win32_LocalTime Get DayOfWeek’) Do Set /A $DayOfWeek=%%i+1&GoTo DayOfWeek
:DayOfWeek
For /F «Tokens=%$DayOfWeek% Delims=,» %%i In («Воскресенье,Понедельник,Вторник,Среда,Четверг,Пятница,Суббота») Do Set $DayOfWeekName=%%i
For /F «Skip=1» %%i In (‘WMIC Path Win32_LocalTime Get WeekInMonth’) Do Set $WeekInMonth=%%i&GoTo WeekInMonth
:WeekInMonth
For /F «Skip=1» %%i In (‘WMIC Path Win32_LocalTime Get Hour’) Do Set $Hour=%%i&GoTo Hour
:Hour
For /F «Skip=1» %%i In (‘WMIC Path Win32_LocalTime Get Minute’) Do Set $Minute=%%i&GoTo Minute
:Minute
For /F «Skip=1» %%i In (‘WMIC Path Win32_LocalTime Get Second’) Do Set $Second=%%i&GoTo Second
:Second
Echo —————————————
Echo День : %$Day%
Echo Месяц : %$MonthName% (%$Month%-й месяц года)
Echo Год : %$Year%
Echo —————————————
Echo День недели : %$DayOfWeekName% (%$DayOfWeek%-й день недели)
Echo Неделя месяца: %$WeekInMonth%
Echo —————————————
Echo Часов : %$Hour%
Echo Минут : %$Minute%
Echo Секунд : %$Second%
Echo —————————————

:: Скрипт минус 1 день
setlocal enabledelayedexpansion
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

:: День Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если дата 01 то будет 1
if %d:~0,1%==0 set d=%d:~1%
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%

:: Определение кл-ва дней в феврале высокосный год или нет от 0 до 3
:: %Деление по модулю является остаток от целочисленного деления
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)

::високосным является не год, который делится без остатка на 4, а тот, который делится на 4, кроме тех, которые делятся на 100, но не делятся на 400
::set /a feb1=y%% 100
::set /a feb2=y%% 400

::set IsLeapYear=No
::if !feb2!==0 (set IsLeapYear=Yes) else (
::if !feb2!==0 (
::if not !feb1!==0 (set IsLeapYear=Yes)
::)
::)

:: Минус 1 месяц
set /a tok=m-1
::Проверка января если месяц 1 -1=0 значит месяц 12
if %tok%==0 set tok=12
::Цифра месяца соответствует порядковому номеру в скобках
for /f «tokens=%tok%» %%i in («31 %feb% 31 30 31 30 31 31 30 31 30 31») do (
:: минус 1 день set /a d-=1
set /a d-=1
if !d!==0 (
set d=%%i
set m=%tok%
if !m!==12 set /a y-=1
)
)
set d=0%d%
set m=0%m%
set yesterday=%d:~-2%.%m:~-2%.%y%
::Конец скрипта минус 1 день
setlocal DISABLEDELAYEDEXPANSION

Как в скрипте находится високосный год например)
% деление по модулю является остаток от целочисленного деления
2019:4 = 504.75
504*4 = 2016
2019-2016=3

2020:4 = 505
505*4 = 2020
2020-2020 = 0

2021:4 = 505.25
505*4 = 2020
2021-2020 = 1
и так по кругу и узнаем високосный год))

Последний раз редактировалось Артём Мамзиков Вс окт 06, 2019 20:53, всего редактировалось 9 раз. количество слов: 3755

Понравилась статья? Поделить с друзьями:
  • Скорость сети в трее windows 11
  • Скрыть диск в windows 7 зарегистрированный системой
  • Скрипт для просмотра ключа windows 10
  • Скорость процессора ниже базовой windows 10
  • Скрыть водяной знак активации windows 10