Показать полную графическую версию : [решено] Архивирование файлов в каталоге
Tonny_Bennet
09-09-2010, 11:36
Здравствуйте.
Есть необходимость архивировать все файлы (кроме уже существующих архивов) в исходном каталоге. Имя архива должно полностью повторять имя файла за исключением расширения. Скрипт должен работать только в определённый промежуток времени (ночью). При создании архива исходный файл должен удаляться. Также нужно вести логи всего происходящего. Не желательно обращаться к WinRar т.к. это программа платная, а на работе с этим строго.
Есть опыт написание BAT-ников, и VBS-скриптов, но только исходя из готовых примеров.
Хотелось бы чтобы вы дали какие нибудь полезные ссылочки или учебники где всё подробно объясняется. Буду очень признателен
@Echo Off
ChCp 1251>Nul
SetLocal EnableDelayedExpansion
Set src=c:\Temp\src
Set arch=c:\Temp\arch
Set ar7z=c:\Program Files\7-Zip\7z.exe
:: Типы архивов, которые могут быть в исходной папке
Set ext=7z zip rar
(For /R "%src%" %%a In (*.*) Do (
Set flg=
For %%i In (%ext%) Do If /I .%%i==%%~xa Set flg=1& Echo !Date! !Time! Архив %%a пропущен
If Not Defined flg (
"%ar7z%" a "%arch%\%%~na.7z" "%%a">Nul
Echo !Date! !Time! Файл %%a заархивирован в %arch%\%%~na.7z
Del /F/Q "%%a">Nul
Echo !Date! !Time! Исходный файл %%a удален
)
)
)>>log.txt
Архиватор можно заменить на автономный 7zr.exe или 7za.exe, положив его в любое место и прописав к нему путь.
Лог будет дописываться при каждом запуске.
Если в исходной папке будут несколько файлов с одинаковым именем, но разным расширением, то они будут упакованы в один архив. Этого можно избежать, если присваивать имя архиву равное имени и расширению исходного файла. В постановке задачи это не оговорено.
Архив можно создавать не 7z, а zip, для этого нужно просто заменить в скрипте расширение.
Запускать скрипт через планировщик.
Исходная папка и папка назначения могут быть и одной папкой
El Sanchez
09-09-2010, 13:01
Есть необходимость архивировать все файлы (кроме уже существующих архивов) в исходном каталоге. Имя архива должно полностью повторять имя файла за исключением расширения. »
Tonny_Bennet, в качестве примера используется консольный архиватор 7za:
@Echo Off
Set Source=C:\Source
Set Logs=C:\Logs
For /F "Tokens=*" %%A In ('Dir /B /S /A-D "%Source%"') Do (
7za a "%Source%\%%~nA" "%%A" -x!*.7z 1>>"%Logs%\_%Date%_Log.log" 2>>"%Logs%\_%Date%_ErrorLog.log"
If /I Not "%%~xA"==".7z" Del /F /Q "%%A" >nul
)
Скрипт должен работать только в определённый промежуток времени (ночью) »
Настройте запуск батника через планировщик задач.
Хотелось бы чтобы вы дали какие нибудь полезные ссылочки или учебники где всё подробно объясняется. Буду очень признателен »
Тутошний поиск
130222
Аналогичная тема с руборда (шикарная коллекция примеров)
команда /?, -?, -h и т.д.
Не желательно обращаться к WinRar т.к. это программа платная, а на работе с этим строго. »
Угу, везде так. К WinRAR'у придираются, а стоят пиратские винды и оффисы.
Опоздал...:)
El Sanchez, архивы 7z он не заархивирует повторно, а удалить их ему ни кто не помешает. ;)
El Sanchez
09-09-2010, 13:24
gora, спасибо. Отпуск расхолаживает. Пост исправлен.
Tonny_Bennet
09-09-2010, 14:24
Зпуск в планировщике это конечно хорошо но Скрипт должен работать только в определённый промежуток времени (ночью) »
т.е. запуститься он запуститься а вот кто его остановит неизвестно...
gora, скрипт работает. Спасибо.... но он только и файл логов архивирует и сам файл скрипта если он лежит в папке :)
и файл логов архивирует и сам файл скрипта если он лежит в папке»
А зачем он там лежит?! :dont-know В задаче это не оговорено.
1 Вынесите скрипт из папки (лог создается рядом со скриптом)
2 Добавьте расширения скрипта и лога (у лога оно может быть произвольным) в строкуSet ext=7z zip rar bat txt запуститься он запуститься а вот кто его остановит неизвестно »
Он сам остановится после выполнения работы. Или у Вас там столько файлов, что он за одну ночь их все не упакует и нужно переносить работу на следующую ночь? ;)
Тогда укажите временнЫе границы работы скрипта.
megaloman
09-09-2010, 20:38
Для начала я бы провёл организационные мероприятия. Все архивы поместил бы в отдельную папку. Очень неплохо, чтобы там батник делал подпапки с именем, содержащим год и месяц (и, может быть, день), в которые бы архивы создавались - зачем нужны архивы за неопределённый период. Туда бы записывал лог. В принципе, и батник можно поместить туда же. И, прежде чем удалять исходный файл, я бы убедился, что архив существует (а вдруг место на диске исчерпалось, а файлы будем удалять ...). И, кроме того, я бы застраховался от того, что два файла имеют одинаковые имена, но разные расширения, так как такие файлы обычно архиватором архивируются с одинаковыми именами-расширениями и, в лучшем случае, получим архив с несколькими файлами с одинаковыми именами и разными расширениями. А просили заархивировать каждый файл отдельно.Set Source=D:\Source
Set Arch=D:\Source\Arch
Set ExtArc=7Z
Set LogFile=D:\Source\Arch\{Archives.log
Set PgmArc="C:\Program Files\7-Zip\7z.exe"
Set DirDay=%Arch%\%Date:~6,4%%Date:~3,2%%Date:~0,2%
md "%DirDay%"
FOR %%i IN ("%Source%\*.*") DO Call :Arhivator "%%i"
GoTo :Eof
:Arhivator
Set N=%DirDay%\%~nx1.%ExtArc%
%PgmArc% a "%N%" %1
If Exist "%N%" (
Echo %Date% %Time% %N% >>%LogFile%
Del %1
)
Source - где исходные файлы
Arch - где архивы
ExtArc - расширение, с которым создаётся архив
LogFile - куда пишется лог-файл
PgmArc - где архиватор (я делал для 7Z)
Например, файл D:\Source\траляля.exe
будет заархивирован в файл D:\Source\Arch\20100909\траляля.exe.7Z
и если файл D:\Source\Arch\20100909\траляля.exe.7Z существует, то удалим D:\Source\траляля.exe
Батник помещаем в назначенные задания, где укажем время его выполнения.
Можно при желании сделать в лог файле выдачу размера каждого файла до и после архивации.
Tonny_Bennet
10-09-2010, 11:55
megaloman, Вот ОНО!!! Благодарю :)
Как можно упаковать каталог с файлами через lzma? Не просто каталог а именно каждую файл отдельно в свою каталог упаковать и удалить упакованный файл. Например, C:\temp\*.* там есть:
C:\temp\file.exe
C:\temp\distrib\file.nfo
C:\temp\distrib\folder\file.txt
примерно так:
C:\temp\file.exe.lzma
C:\temp\distrib\file.nfo.lzma
C:\temp\distrib\folder\file.txt.lzma
А WCX SSSR LZMA плагин через Total CMD так упакует:
C:\temp\file.exe.lzma
C:\temp\file.nfo.lzma
C:\temp\file.txt.lzma
и не может удалить оригинал файлы.
Добрый день!!!
В данных рассуждениях идёт речь об архивации файлов в определённой папке.Всё работает,спасибо.
Но вот вопрос,как переделать код для задачи архивации файлов и папок с вложенными файлов,хранящихся в одной папке.
То есть у меня есть папка допустим D:/Source,а в свою очередь в этой папке есть и файлы и папки в которых хранятся файлы.
И также стоит задача архивировать все данные в один файл.
За ранее благодарен
Цитирую:
a (Add) command
Adds files to archive.
…
Switches that can be used with this command
…
-r (Recurse)
…
Цитирую:
Цитата 7-Zip Command Line Version User's Guide:
a (Add) command
Adds files to archive.
…
Switches that can be used with this command
…
-r (Recurse)
…
Это к моему вопросу?
kmc, да. Вы пробовали?
Для цитирования используйте тэг «quote» (http://forum.oszone.net/misc.php?do=bbcode#quote).
Нет не пробовал.Честно говоря не пойму куда этот код вставлять-имеется ввиду после как строчек
предложу метод на powershell вот он (http://blog.wadmin.ru/2010/09/backup-windown-2008-r2-via-powershell/)
Честно говоря не пойму куда этот код вставлять-имеется ввиду после как строчек »
Примеры есть непосредственно в справке 7-Zip:
…
Examples
7z l archive.zip *.doc -r-
lists all *.doc files that belong to the archived root directory in the archive.zip archive.
7z a -tzip archive.zip -r src\*.cpp src\*.h
adds all *.cpp and *.h files from directory src and all it's subdirectories to the archive.zip archive.
7z a archive.7z folder1\
adds all files from directory folder1 and all it's subdirectories to the archive.7z archive.
7z a archive.7z -r folder2\
searches all folder2 directories in all subdirectories, and adds them (including all subdirectories) to the archive.7z archive.
…
Вот исходник,он в принципе такой же как здесь приводят в пример,единственное он не удаляет файлы которые берёт для архивирования.
Где здесь нужно поставить -r(.......) ????
Set Source=D:\Ser\Source
Set Arch=D:\Ser\Arch
Set ExtArc=7Z
Set LogFile=D:\Ser\Log\{Archives.log
Set PgmArc="C:\Program Files\7-Zip\7z.exe"
Set DirDay=%Arch%\%Date:~6,4%%Date:~3,2%%Date:~0,2%
md "%DirDay%"
FOR %%i IN ("%Source%\*.*") DO Call :Arhivator "%%i"
GoTo :Eof
:Arhivator
Set N=%DirDay%\%~nx1.%ExtArc%
%PgmArc% a "%N%" %1
If Exist "%N%" (
Echo %Date% %Time% %N% >>%LogFile%
)
kmc, тогда сначала словами опишите, что Вам нужно.
На данном форуме,приведён пример программирования bat файла,где реализуется след. задача:
Происходит архивирование файлов,находящихся по указонному пути Set Source=D:\Ser\Source ,причём архивация идёт каждого файла в одну папку-на заархивированнной папке указывается дата архивации.Но у меня задача немного другая,мне требуется заархивировать также не только файлы находящиеся по указанному пути но папки и вложения в них(любые,как и папки и файлы).
Вот код который реализуется архивацию файлов,без папок и вложения.Смысл в том чтобы происходила архивация всего что находится в Source(папки,вложения в папки и т.д. -всё!!!) в один файл.
Set Source=D:\Ser\Source
Set Arch=D:\Ser\Arch
Set ExtArc=7Z
Set LogFile=D:\Ser\Log\{Archives.log
Set PgmArc="C:\Program Files\7-Zip\7z.exe"
Set DirDay=%Arch%\%Date:~6,4%%Date:~3,2%%Date:~0,2%
md "%DirDay%"
FOR %%i IN ("%Source%\*.*") DO Call :Arhivator "%%i"
GoTo :Eof
:Arhivator
Set N=%DirDay%\%~nx1.%ExtArc%
%PgmArc% a "%N%" %1
If Exist "%N%" (
Echo %Date% %Time% %N% >>%LogFile%
)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.