Я пытаюсь автоматизировать резервное копирование папки на сервере 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 под рукой, чтобы это проверить, но я предполагаю, что этот подход хорошо подойдет вам.
Настоящим я отдаю должноеОтвет Джея на вопрос Рори о временив качестве основы для этого подхода.