1

Я пытаюсь автоматизировать резервное копирование папки на сервере 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-файла, а также в шаге переименования.

Любые идеи будут высоко ценится!

2 ответа2

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

источники

0

Вы можете создать zip-файл из командного файла. Это можно сделать с помощью оболочки.Код прикладного программного обеспечения в 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 под рукой, чтобы проверить это, но я предполагаю, что этот подход будет хорошо работать для вас.

Настоящим я благодарю ответ Джея на вопрос Рори о времени, послуживший основанием для такого подхода.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .