qkowlew: На Зилантконе меня сфоткали мыльницей. Мыльницам не позирую! (фига)
[personal profile] qkowlew
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 по вот этому багрепорту

Date: 2015-Feb-17, Tuesday 04:55 (UTC)
From: [identity profile] qkowlew.livejournal.com
Так. Выложил версию 1.3 - советую пробовать именно её.