Автоматизация задачи резервного копирования папок (сжатие, перемещение, затем переименование в соответствии с соглашением об именовании)

Автоматизация задачи резервного копирования папок (сжатие, перемещение, затем переименование в соответствии с соглашением об именовании)

Я пытаюсь автоматизировать резервное копирование папки на сервере Windows 2003 R2 (в настоящее время это ручной процесс).

Эта задача состоит из трех компонентов:

1) Создайте zip-файл следующей папки в том же каталоге, не используя стороннего программного обеспечения:

d:\source\folder_to_back_up

Что дает нам:

d:\source\folder_to_back_up.zip

2) Переместите только что созданный zip-файл в:

d:\destination

3) Переименуйте zip-файл в соответствии со следующим соглашением об именовании:

Backup_YYYYMMDD.zip

Например, используя сегодняшнюю дату, имя будет таким:

Backup_20150516.zip

На данный момент я нашел, как автоматизировать шаг 2:

robocopy /mov d:\source d:\destination folder_to_back_up.zip

...но нужна помощь в автоматизации создания zip-файла, а также этапа переименования.

Будем очень признательны за любые идеи!

решение1

Поскольку вы начали рассматривать 7-zip в комментариях к другому ответу, вот как я это сделал:

set SOURCE=d:\source\folder_to_back_up
set DEST=d:\destination
rem # a: Add, -mx: compression level 0-9, -tzip use ZIP format, -ssc: case sensitive, -ssw: add files opened for writing, -r: recursive
pushd "%SOURCE%" && 7za a -mx9 -tzip -ssc -ssw -r "%DEST%\Backup_%date%.zip" & popd

Обратите внимание, что это по сути однострочный код, если вы встраиваете переменные source и dest. Пара pushd/ popdприсутствует, чтобы контекст не менялся в случае, если вы делаете несколько резервных копий в одном пакете. %date%является встроенным.

Я не думаю, что разумно хотеть создать специальный формат файла (zip) без соответствующих инструментов. Это как хотеть скомпилировать исходный код Java в jar без JDK.

Зависимости

Вы можете обойти проблему удаления инструмента, скопировав backup_stuff.batуказанный выше код 7za.exeрядом с этим файлом backup_stuff.bat-7za.exe, а затем вам просто нужно заменить его 7zaна %~dp0\backup_stuff.bat-7zaссылку именно на этот файл. Это должно выдать сообщение о том, что здесь есть внешняя зависимость...

Или, если вы хотите быть совсем параноиком, просто вставьте 7zip в пакетный файл :)

set SOURCE=d:\source\folder_to_back_up
set DEST=d:\destination

goto deps

:exec
pushd "%SOURCE%" && "%TEMP%\7za" a -mx9 -tzip -ssc -ssw -r "%DEST%\Backup_%date%.zip" & popd
goto end

:deps
@(
rem This is the Base64 enconded version of 7za.exe
rem To create this section execute the following commands:
rem certutil -encode 7za.exe 7za.exe.b64
rem echo @echo off>7za.exe.b64.bat && for /F "tokens=*" %L in (7za.exe.b64) do @echo echo %L>>7za.exe.b64.bat

echo -----BEGIN CERTIFICATE-----
echo TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAA+AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5v
echo dCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAAB9EXJSOXAcATlwHAE5cBwB
echo QmwQATtwHAG6bBIBIHAcAQ9WFgFbcBwBt3hDAThwHAE5cB0BlnAcAbp4QQE+cBwB

rem ... lot of lines ommitted for sake of stackoverflow

echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo -----END CERTIFICATE-----
)>%TEMP%\7za.exe.b64
certutil -decode -f %TEMP%\7za.exe.b64 %TEMP%\7za.exe >NUL

goto exec

:end

Мой cmd рухнул, когда я попытался сделать это с оригинальным exe-файлом 7-zip v9.20. Похоже, что есть ограничение на длину блока (...), я обнаружил, что оно составляет около 370 КБ (примерно 5000 строк b64). Оригинальный base64 7-zip был 800 КБ, но это не так уж важно, потому что его можно разделить на несколько @(...)>>target.fileблоков, которые не превышают лимит. Но я предлагаю запустить через , upx --brute 7za.exeчто делает exe-файл размером менее 300 КБ.

Источники

решение2

Вы можете создать zip-файл из пакетного файла. Это можно сделать с помощью программного кода Shell.Application в Microsoft Windows, а также с помощью командной строки, но для этого потребуется некоторый дополнительный код. Например,Ответ Ансгара Вихерса на вопрос пользователя 2868186содержит код (внизу), который выглядит солидно. В качестве альтернативы,Страница Роба Вандервуда на VBSтакже показано решение.

Вам может не понравиться идея необходимости иметь эти 8-12 строк (приблизительное количество) VBScript. Что ж, это лучший доступный метод, который я нашел для автоматизации вещей, полагаясь на наименьшее количество кода, добавленного в MS Windows. Я не думаю, что MS Windows (по крайней мере, не та версия, о которой вы спрашиваете) предоставляла способ сделать это с меньшим количеством кода.

Однако если вы собираетесь добавлять этот код регулярно, то вам, вероятно, захочется загрузить его, а не вводить его больше одного раза. И если вы его загружаете, я бы посоветовал вам загрузить какой-нибудь другой код, например, 7-Zip или Info-Zip. 7-Zip может занять больше времени, чтобы научиться использовать его из командной строки, но у меня с ним был успех. И если вы не собираетесь делать это больше одного раза, то это, вероятно, еще одна причина, по которой добавление программного обеспечения один раз, вероятно, будет хорошим решением в долгосрочной перспективе (минимальные временные затраты, долгосрочная отдача). Я понимаю, что использование такого программного обеспечения — это не совсем то, о чем вы просили, но я все равно поднимаю этот вопрос, потому что предлагаю серьезно подумать, окажется ли это лучшим решением.

Что касается вашего третьего шага, поместите следующее в пакетный файл:
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c%%a%%b) echo %mydate% Обратите внимание, что показанная команда FOR предназначена для запуска из пакетного файла. Попытка запустить ту же самую команду вне пакетного файла не сработает. Я тестировал в Win7 SP1. У меня нет сервера 2003 R2 под рукой, чтобы это проверить, но я предполагаю, что этот подход хорошо подойдет вам.

Настоящим я отдаю должноеОтвет Джея на вопрос Рори о временив качестве основы для этого подхода.

Связанный контент