Windows: Автоматически скопировать резервную копию на внешний жесткий диск

Если локальной резервной копии данных недостаточно, а также недостаточно того, что резервная копия сохраняется в облаке, можно настроить, чтобы резервная копия автоматически копировалась на внешний USB-жесткий диск (или флэшку большого объема). Автоматически, сразу после того, как устройство подключили в USB-порт.

Для начала нам нужно узнать DeviceID съемного накопителя. Для этого лучше воспользоваться встроенной в комплект USBDLM утилитой, которая называется UsbDriveInfo.
При запуске можно выбрать съемный диск и в окошке с правой части найти DeviceID USB и скопировать строку вида:
USB\VID_058F&PID_6387\GZIQ1F4X
USBDLM-Autorun01
Теперь нужно под учетной записью с правами администратора открыть файл «C:\Program Files\USBDLM\USBDLM.ini».
Там нам необходимо в конец файла прописать строки:

[OnArrival10]
;Запустить приложение/процесс
Open="C:\Windows\System32\cmd.exe" /K C:\Windows\System32\robocopy.exe D:\Temp\Cobian\ %drive%\Backup\Cobian /XO /S
elevated=1

;Запустить только одну копию (лучше не включать для консольных команд - если одна консоль будет открыта, команда не будет исполнена)
OneInstance=0

;Процесс должен иметь следующий хэш MD5
md5=AD7B9C14083B52BC532FBA5948342B98

;Устройство должно быть с определенным ID
DeviceID=USB\VID_058F&PID_6387\GZIQ1F4X

В данном примере сначала идет команда open:

Open="C:\Windows\System32\cmd.exe" /K C:\Windows\System32\robocopy.exe D:\Temp\Cobian\ %drive%\Backup\Cobian /XO /S

Она запускает приложение с необходимыми ключами. Здесь ключ /K позволяет не закрывать окно консоли (это удобно чтобы посмотреть результаты копирования, а также в случае устранения каких-либо ошибок). Если необходимо закрывать окно, то можно воспользоваться ключом /C
Опция robocopy /COPYALL мне не подошла, т.к. я тестировал на флэшке с FAT32 и мне выдавалась ошибка при копировании.
Параметр /XO — исключить более ранние файлы (т.е. копироваться будут только новые и измененные файлы).
/S — копировать рекурсивно все вложенные папки кроме пустых.
Как видно из примера, в качестве пути назначения для резервной копии участвует переменная %drive%. Эта внутренняя переменная окружения программы USBDLM, она подставляет букву для примонтированного устройства. Полный список переменных окружения можно посмотреть на странице помощи.
Поскольку для доступа к резервной копии требовались права администратора, я указал, что необходимо повышение привилегий для процесса:

elevated=1

У меня на компьютере почти всегда запущена консоль. Таким образом, переменная OneInstance должна быть равна нулю, чтобы разрешить несколько копий запущенного приложения (cmd.exe). Если вдруг вы поставите 1, и уже будет запущен один экземпляр cmd.exe, то копирования не произойдет. Поэтому ставим:

OneInstance=0

Я попытался вычислить хэш MD5 для cmd.exe с помощью утилиты MD5-File от автора USBDLM, но пока я не выяснил, почему при этом включенном параметре cmd не запускается. Буду разбираться.

Последний пункт (один из самых важных), это идентификация устройства.

DeviceID=USB\VID_058F&PID_6387\GZIQ1F4X

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

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