qkowlew: На Зилантконе меня сфоткали мыльницей. Мыльницам не позирую! (фига)
qkowlew ([personal profile] qkowlew) wrote2015-02-14 05:08 pm

CMD скрипт для резервного копирования для Windows XP/Vista/7/8

CMD скрипт для резервного копирования для Windows XP/Vista/7/8
Вниманию желающих виндоузеров, которых НЕ ПУГАЕТ редактирование текстового файла и его запуски из командной строки - представляю написанный мной скрипт.

1 вариант скрипта:
Использует ТОЛЬКО встроенные в Windows от XP до 8 команды системы
Это ровно один файл и более ничего.

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

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

- ежедневно создаётся свежая копия в подпапке latest
- предыдущие состояния "копируются" в подпапки с именами вида YYMMDD-HHMMSS (дата и время старта скрипта), то есть можно посмотреть БЫСТРО и ПРОСТО слепок каталога на эти моменты времени, НЕ используя никаких программ, кроме обычного файлового менеджера.
- Все файлы в этих папках являются хард линками, а это означает, вся эта последовательность бэкапов занимает места (сумму размеров всех исходных файлов ПЛЮС сумму объёмов их версий).
- Если ни один файл не изменился НИ размером, НИ таймстампом - новый бекап НЕ делается.
- Файл считается изменившимся, если у него изменился ИЛИ таймстамп (В ЛЮБУЮ сторону - это защита от кривостей таймзон!!!!), ИЛИ размер.

Минус - встроенная в Windows команда FSUTIL не умеет делать хард линки на сетевых дисках. Поэтому если вам всё-таки нужно делать копию на сетевой диск - CMD скрипт для резервного копирования для Windows XP/Vista/7/8 в том числе на сетевые диски с помощью бесплатной программы KillCopy, сайт автора.

Бета-тестеры (обоих вариантов) приветствуются.

UPD1: файлов лежащих глубже чем позволяет длина передаваемого в ком строке пути - скрипт не видит!
UPD2: так как консоль Windows - не UTF, проблема с националными символами, отличными от текущей cp для консоли - неустранимы.
UPD3: по багрепорту исправил обработку времени
UPD4: добавление назначенного задания в написанном как сейчас (в 1.0-1.1 версиях) виде работает в Windows 7 и НЕ работает корректно в Windows XP SP2 - в XP SP2 Schtasks /QUERY оказывается не позволяет посмотреть параметры конкретного задания. в SP3 - в одних версиях позволяет в других нет. Похоже, зависит от языка системы. 8-О
Schtasks /Query /TN "%MyName%" >nul 2>&1
if errorlevel 1 Schtasks /Create /SC DAILY /TN "%MyName%" /TR "'%ComSpec%' /c '%MyFullPath%'" >nul 2>&1

Под XP правильная команда должна обязательно содержать параметры запуска задания - система (сетевое имя компьютера, даже если это локальный комп), пользователь, пароль (пустой не стоит) или /RU SYSTEM:
Schtasks /Create /SC DAILY /TN "%MyName%" /TR "'%ComSpec%' /c '%MyFullPath%'" /S \\MYMACHINE /U userbackup /P lkjlihkuihkuh

UPD5: Если в пути встречается амперсэнд - получается полная фигня, команда очередная делится на части... В результате v1.3 переписана так, что сначала записывает список ВСЕХ файлов по подкаталогам в файл в %TEMP% а потом засасывает файл снова и уже по извлекаемым из него строкам анализирует... За 9 минут обошёл каталог РАБОТА нашёл в нём 106735 файлов и сформировал полный файллист размером 11 мегабайт. Сейчас проверяет наличие, размер и таймстамп файлов в ещё не существующем бекапе этой папки и формирует список файлов на копирование. За 1 час проверил 44000 файлов... А там ещё эти 75 гигабайт копировать, хехе...

Интересно, что xcopy /Y /S /T /E %SOURCE% %PATH1%\%DEST1%\%2\ на этой структуре обломалось в самом начале и не создало большей части каталогов.

Интересно, что FAR по Alt-F7 (и, соответственно, при ручном копировании) Found files: 107392, folders: 11752 на этом же каталоге.

UPD6: А. таки FOR /R не находит 652 спрятанных и 5 системных файлов. ;-) Отсюда разница с ФАРом.

UPD7: Выложил 1.3 версию исправленную. Различает Windows 7 и Windows XP при создании ежедневного задания. Обходит дерево со спецсимволами корректно.

UPD8: О скорости работы. Сеть 100 Мбит, винты сата2. 75 гигабайт суммарный объём, 106735 файлов в 11752 каталогах. Стартовый обход дерева - 9 минут, обход со сравнением размера-таймстампа - 2.5 часа, копирование 38 гигабайт - 3.5 часа, то есть 75 гиг скопируется за 7 часов. Это _первая_ копия, полная. Ессно, все "дифференциальные" будут быстрее на процесс копирования.

Спасибо darkwing - на миллионе файлов получается, что памяти сжирает cmd.exe аж под 4 гига в пике, тратит 30 минут на 1 проход, около 10 часов - на CheckUpdate...

Так что сделать более быструю проверку актуально. А то 10-30 файлов в секунду - это печаль-печаль.

UPD9: Перенёс строку set MyName=%0 перед CALL :SetUpTask по вот этому багрепорту

Post a comment in response:

This account has disabled anonymous posting.
(will be screened if not validated)
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org