PDA

Показать полную графическую версию : Автоматическое удаление файлов


Страниц : [1] 2

alnimo
24-08-2009, 14:14
День добрый. Поскажите решение данной задачи :раз в сутки очистить папку "Obmen". Заархивировать и скопировать содержимое папки в паку "Arh" (на всякий случай ) и удалить содержимое (папки и файлы). Желательно с помощью bat-ника
Спасибо.

verna
25-08-2009, 13:24
посмотрите команды copy и del
консольно архивировать может любой современный архиватор

megaloman
25-08-2009, 19:13
Идея решения - используем распространённый архиватор WinRar, у которого есть ключи
-df - архивировать с удалением файлов
-tb - архивировать файлы старше указанного времени
Берём системную дату, преобразуем её в вид, пригодный для архиватора, запускаем архиватор с указанными ключами для архивации файлов на начало текущих суток.
При желании анализируем наличие архива (строка с If) и позволяем работать архиватору не чаще раза в сутки.
Вот батник:

rem ---------------------------------------------------------------
rem Надо настроить:
rem Gde - Папка, где берём файлы для архивирования и удаления
rem Kuda - Папка, где храним архивы
rem TDate - Дата в формате ГГГГММДД
rem В приведенном батнике дата преобразуется из системной переменной %Date%
rem Для Win XP или 2003 %Date% по умолчанию выдаётся в формате ДД.ММ.ГГГГ
rem При необходимости написать своё преобразование

Set Gde=D:\Obmen
Set Kuda=D:\Obmen.arh

Set TDate=%date:~6,4%%date:~3,2%%date:~0,2%

If Exist %Kuda%\%TDate%.rar GoTo End

MD %Kuda%

"%programfiles%\WinRar\Winrar.exe" a -r -df -tb%TDate%0001 %Kuda%\%TDate%.rar %Gde%\*.*

:End
rem ---------------------------------------------------------------

Обратите внимание, что содержимое папки архивируется с подпапками (ключ -r). Поэтому архивную папку нельзя помещать внутрь архивируемой папки.
Не храните бат-файл внутри архивируемой папки - архиватор в конце концов его удалит.
И, наконец, если WinRar установлен не в Program Files, напишите правильный к нему путь

forsem
28-08-2009, 23:56
И лучше использовать бесплатный 7-zip

alnimo
29-08-2009, 09:27
Можно поподробней объяснить, что значит строки:
Set TDate=%date:~6,4%%date:~3,2%%date:~0,2%
"%programfiles%\WinRar\Winrar.exe" a -r -df -tb%TDate%0001 %Kuda%\%TDate%.rar %Gde%\*.*
Не понятно что за числа

megaloman
29-08-2009, 12:08
Системная переменная %Date% принимает значение текущей системной даты.
По умолчанию в Win XP и 2003 это дд.мм.гггг. В командном окне можете набрать Echo %Date% и посмотреть, что получится.
Условно изображу дату в виде номеров позиций символов слева направо: 01.34.6789
Итак, выражение %date:~6,4% вырежет из символьной строки даты символы, начиная с 6 позиции в количестве 4 штуки, т е 6789, то есть гггг.
Аналогично для дня и месяца.
В результате я присвоил переменной TDate литерал вида ггггммдд, которая понадобится мне для подстановки в командную строку архиватора WinRar
Если у Вас дата выдаётся в другом формате, соответственно надо написать своё выражение для TData, чтобы получить в результате ггггммдд.
(подробнее наберите в командном окне Set /? For /?)

Если в командном окне наберёте
echo %programfiles%
полУчите путь папки Program Files (у меня это C:\Program Files), куда по умолчанию устанавливаются общесистемные программы, в частности, WinRar.
Если архаватор в другом месте, естественно надо вместо %programfiles% указать реальный путь.

Таким образом строка "%programfiles%\WinRar\Winrar.exe" выдаёт полный путь к архиватору. Кавычки - путь с пробелами должен быть в кавычках. Без пробелов - кавычки тоже не помешают.

"C:\Program Files\WinRar\Winrar.exe"

Смысл команд и ключей смотрите в справочной системе WinRar -вызовите WinRar-меню Справка - Содержание
команда a -добавить файлы в архив
ключ -r - c подпапками
ключ -df - с удалением файлов после архивации
ключ -tb - архивировать файлы, модифицированные до указанной даты
Один из требуемых форматов даты ггггммддЧЧММСС

Выражение %TDate%0001, например, 31 августа 2009 года будет иметь вид 200908310001
Заархивируются файлы изменённые до 00 час 1 мин 31 августа 2009.
В принципе, можно написать %TDate%000001, тогда заархивируются файлы изменённые до 00 час 00 мин 01 сек 31 августа 2009.

Файлы будут архивироваться в файл %Kuda%\%TDate%.rar (лучше написать "%Kuda%\%TDate%.rar"),
в приведенном примере для указанной мной даты получим архивный файл D:\Obmen.arh\20090831.rar

Файлы будут заархивированы из папки %Gde%\*.* (опять же, если в именах пробелы, лучше написать "%Gde%\*.*"),
то есть в примере это D:\Obmen
И лучше использовать бесплатный 7-zip
C точки зрения бесплатности - да. Удобства - увы, это не так. Не помню кому в личной переписке я решил задачу с помощью 7Zip, но это уже не с помощью bat-файла, а VBS - скрипта. Да и то, там сделано только для архивации файлов в папке без подпапок. К сожалению, все личные посты я удаляю практически сразу, а на домашнем компьютере у меня этого скрипта нет, поэтому пока его не привожу, на работу попаду через несколько дней и, дай бог, там скрипт сохранился. Можно напрячься и написать архивацию и удаление с подпапками, но для себя я не вижу пока в нём смысла.
Здесь (http://forum.oszone.net/post-1203277.html#post1203277) я решал что-то похожее с помощью VBS-скрипта, но, опять же, привлекая WinRar

gora
29-08-2009, 12:15
Можно поподробней объяснить, что значит строки:
Set TDate=%date:~6,4%%date:~3,2%%date:~0,2% »
Переменная %date% "разрезается" на кусочки и складывается в нужном порядке.
Для подробностей выполните Set /?-tb%TDate%0001 »
Дата указывается в следующем формате: ГГГГММДДЧЧММСС. В поле даты допускается вставлять символы-разделители ('-' или ': ') и не указывать оставшиеся поля. Например, следующий ключ будет правильным: -tb2001-11-20

Если говорить точнее, при внутренней обработке RAR будет трактовать вышеуказанный ключ как -tb20011120000000, что означает: "файлы, изменённые до 0 часа 0 минут 0 секунд 20 ноября 2001 года" (т.е. сама эта дата в заданный диапазон времени не входит).

megaloman
01-09-2009, 12:27
Вот VBS скрипт, решающий похожую задачу, но с архивированием в 7z
' Перемещаем файлы старше указанного количества дней по маске
' из одной папки (без подпапок) в другую - промежуточную
' Упаковываем промежуточную папку с именем сегодняшней даты
' Чистим промежуточную папку

' Исходные данные ----------------

InBox = "H:\Delete\Проба пера" ' Откуда перемещаем
OutTmp = "H:\Delete\Проба пера\Tmp" ' Куда перемещаем (TMP)
OutArc = "H:\Delete\Work" ' Куда архивируем

NDays = 60 ' Файлы старше количества дней
Maska="^.*\.txt$" ' Маска файлов (здесь *.txt)

Arc="C:\Program Files\7-Zip\7z.exe" ' Путь к архиватору

' --------------------------------

Set FSO = CreateObject("Scripting.FileSystemObject")
Set WS = CreateObject("WScript.Shell")
Set RE = New RegExp
Set InDir = FSO.GetFolder(InBox)
Set AllFiles = InDir.Files

RE.Pattern = Maska
RE.IgnoreCase = True

For Each iFile In AllFiles ' Цикл по файлам в папке

iName=iFile.Name ' Берём имя файла из папки
iDate = iFile.DateLastModified ' Берём дату модификации файла
' iDate = iFile.DateCreated ' Берём дату создания файла (если нужно убрать комментарий!)

If RE.Test(iName) And DateDiff("d", iDate, Date) > NDays Then ' Соответствует ли оно маске и дате
iFile.Move OutTmp+"\" ' Перемещаем
End If

Next

' Архивируем Tmp c именем архива = дате (я предпочитаю формат ГГГГММДД)

NArc = CStr(Date)
ArcFile = OutArc+"\"+Mid(NArc,7,4)+Mid(NArc,4,2)+Mid(NArc,1,2)+".7z" ' Имя архивного файла с путём

NArc = " a """+ArcFile+""""
NTmp = " """+OutTmp++"\*.*"""

a = WS.Run(""""+Arc+""""+NArc+NTmp,1,True)

' Удаляем файлы в TMP если архив существует

If FSO.FileExists(ArcFile) Then FSO.DeleteFile OutTmp+"\*.*", True

snkmaster
21-09-2011, 10:57
а как сделать чтобы батник работал с файлами только старше 3х месяцев, остальные файлы не трогал?
например сейчас сентябрь, батник бы заархивировал и удалил бы потом все файлы которые были созданы до июня

megaloman
21-09-2011, 11:17
Запустите WinRar, вызовите справку.Ключ -TO<время> — обрабатывать файлы более старые, чем указанный период времени
Используйте этот ключ, если нужно обработать только те файлы, дата изменения которых не попадает в указанный период времени, т.е. они были созданы/изменены более давно, чем определяет параметр <время >. Время указывается в следующем формате:

[<дни>d] [<часы>h] [ <минуты>m] [<секунды>s]

Например, для обработки файлов, изменённых более 15 дней назад, используйте ключ -to15d, а для обработки файлов, изменённых более чем 2,5 часа назад, используйте -to2h30m.
Если не устраивает WinRar - пишите.

megaloman
27-09-2011, 12:54
... например сейчас сентябрь, батник бы заархивировал и удалил бы потом все файлы которые были созданы до июня
Смотрим справку WinRarКлюч -TB<дата>
При указании этого ключа будут обрабатываться только файлы, модифицированные до указанной даты.
Дата указывается в следующем формате: ГГГГММДДЧЧММСС. В поле даты допускается вставлять символы-разделители ('-' или ':') и не указывать оставшиеся поля. Например, следующий ключ будет правильным: -tb2001-11-20
Если говорить точнее, при внутренней обработке RAR будет трактовать вышеуказанный ключ как -tb20011120000000, что означает: "файлы, изменённые до 0 часа 0 минут 0 секунд 20 ноября 2001 года" (т.е. сама эта дата в заданный диапазон времени не входит).
@Echo Off
rem Если дата в системе в формате дд.мм.гггг
rem Delta - сколько месяцев не трогать (здесь не более 12)

Set Delta=3

Set Otkuda=D:\Tmp
Set Kuda=D:\TmpRar

Set Rar="C:\Program files\Winrar\Winrar.exe"

Set /A YYYYMM=%Date:~6,4%%Date:~3,2%-%Delta%
If %YYYYMM% LSS %Date:~6,4%01 Set /A YYYYMM=%YYYYMM%-88

Set DPack=%YYYYMM%01000000
%Rar% a -r -df -ep1 -tb%DPack% "%Kuda%\%DPack%" "%Otkuda%\"

Fen1kc16
18-12-2011, 23:20
А как сделать так чтобы структура папок оставалась, а удалялись(архивировались) только файлы в папках и подпапках. удаление ключа -tb это же не выход.

Dragokas
18-12-2011, 23:59
К вопросу о ключах WinRAR: архивирую офис. документы обновлением для быстроты

rar.exe u -m0 -r -ri15 -n*.doc -n*.xls -n*.txt c:\docs.rar *.*

но потом заметил, что файлы, удаляемые на рабочем столе, остаются в архиве. Как исправить?
(в принципе можно и 7z)

megaloman
19-12-2011, 20:17
Fen1kc16, если модернизировать мой предыдущий код, то, чтобы структура папок оставалась (при условии, что у папок нет каких-то особых доступов и параметров безопасности)@Echo Off
rem Если дата в системе в формате дд.мм.гггг
rem Delta - сколько месяцев не трогать (здесь не более 12)

Set Delta=3

Set Otkuda=D:\Tmp
Set Kuda=D:\TmpRar
Set Rar="C:\Program files\Winrar\Winrar.exe"

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

del "~%0.bat" >Nul 1>nul 2>Nul

FOR /R "%Otkuda%" %%d IN (.) DO (
Set dDir=%%d
Echo md "!dDir:~0,-1!" >>"~%0.bat"
)

Set /A YYYYMM=%Date:~6,4%%Date:~3,2%-%Delta%
If %YYYYMM% LSS %Date:~6,4%01 Set /A YYYYMM=%YYYYMM%-88

Set DPack=%YYYYMM%01000000
%Rar% a -r -df -ep1 -tb%DPack% "%Kuda%\%DPack%" "%Otkuda%\"

Call "~%0.bat"
del "~%0.bat" >Nul 1>nul 2>Nul
То есть я создаю подпапки заново, если в процессе архивации они были удалены. Либо вариант, создать во всех папках какой-нибудь файл. Так как его время создания сегодня, архивироваться он не будет, и папка раром не удалится, так как не пустая. После архивации служебные файлы можно поудалять. Здесь папки не пересоздаются - удаления нет. @Echo Off
rem Если дата в системе в формате дд.мм.гггг
rem Delta - сколько месяцев не трогать (здесь не более 12)

Set Delta=3

Set Otkuda=D:\Tmp
Set Kuda=D:\TmpRar
Set Rar="C:\Program files\Winrar\Winrar.exe"

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /R "%Otkuda%" %%d IN (.) DO (
Set dDir=%%d
Echo 1 >"!dDir:~0,-1!~%0.bat"
)

Set /A YYYYMM=%Date:~6,4%%Date:~3,2%-%Delta%
If %YYYYMM% LSS %Date:~6,4%01 Set /A YYYYMM=%YYYYMM%-88

Set DPack=%YYYYMM%01000000
%Rar% a -r -df -ep1 -tb%DPack% "%Kuda%\%DPack%" "%Otkuda%\"

del "%Otkuda%\~%0.bat" /S

Fen1kc16
20-12-2011, 08:05
Я немного по другому решил эту проблему просто добавил в твой предыдущий скрипт одну строку.


Set Gde=F:\Desktop\obmen
Set Kuda=F:\Desktop\obmenarh

Set TDate=%date:~6,4%%date:~3,2%%date:~0,2%

If Exist %Kuda%\%TDate%.rar GoTo End

MD %Kuda%

"%programfiles%\WinRar\Winrar.exe" a -r -ed -tb%TDate%0001 %Kuda%\%TDate%.rar %Gde%\*.*

forfiles /P %Gde% /s /d -1 /c "cmd /c del @file /q

:End

ТАк можно или есть какие то подводные камни?

В 2003 server дата выводится как dd/mm/yy, из-за этого винрар не может создать архив, как с этим бороться?

megaloman
20-12-2011, 13:10
Fen1kc16,
1. У меня в XP forfiles нет, поэтому для совместимости я им не пользуюсь.

2. Если у вас дата dd/mm/yy то можно сделать (строку взял вашу и изменил)

Set TDate=20%date:~6,2%%date:~3,2%%date:~0,2%

То есть я добавил 20 чтобы вместо Вашего 11 получилось 2011. По идее, рар должен такое взять (я не проверял, это почти очевидно). Вам за 88 лет работы менять ничего не придётся. :lol:
То же, но будет работать и для формата дд.мм.гггг

Set TDate=20%date:~-2%%date:~3,2%%date:~0,2%

То есть вырезаю два последних символа в дате

3. В 2003 форматы отображения, в частности, даты, настраивается: Региональные параметры - Настройка - Дата - Там можно выставить формат даты как Вам нравится. Я предпочитаю дд.мм.гггг

Iska
20-12-2011, 14:26
1. У меня в XP forfiles нет, поэтому для совместимости я им не пользуюсь. »
В Resource Kit'е есть.

6umer
23-05-2013, 17:42
Добрый вечер. прочитал эту тему. но сообразить не могу все же...
необходим батник стартующий из автозапуска, и архивирующий папу расположенную в корне диска C:\
в каталог лежащий в том же диске.
архиватор бесплатный 7zip.
помогите пожалуйста кодом.

Iska
23-05-2013, 17:50
@ "%ProgramFiles%\7-Zip\7z.exe" a "C:\Куда архивировать\Архив.7z" "C:\Некая папка\"

6umer
23-05-2013, 17:58
спасибо.
не думал что настолько простой батник ..
здесь же помоему не хватает ключевых команд ...




© OSzone.net 2001-2012