Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Автоматическое удаление файлов (http://forum.oszone.net/showthread.php?t=148745)

alnimo 24-08-2009 14:14 1201904

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

verna 25-08-2009 13:24 1202726

посмотрите команды copy и del
консольно архивировать может любой современный архиватор

megaloman 25-08-2009 19:13 1203040

Идея решения - используем распространённый архиватор 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 1205951

И лучше использовать бесплатный 7-zip

alnimo 29-08-2009 09:27 1206133

Можно поподробней объяснить, что значит строки:
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 1206209

Системная переменная %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 - скрипта. Да и то, там сделано только для архивации файлов в папке без подпапок. К сожалению, все личные посты я удаляю практически сразу, а на домашнем компьютере у меня этого скрипта нет, поэтому пока его не привожу, на работу попаду через несколько дней и, дай бог, там скрипт сохранился. Можно напрячься и написать архивацию и удаление с подпапками, но для себя я не вижу пока в нём смысла.
Здесь я решал что-то похожее с помощью VBS-скрипта, но, опять же, привлекая WinRar

gora 29-08-2009 12:15 1206212

Цитата:

Цитата alnimo
Можно поподробней объяснить, что значит строки:
Set TDate=%date:~6,4%%date:~3,2%%date:~0,2% »

Переменная %date% "разрезается" на кусочки и складывается в нужном порядке.
Для подробностей выполните Set /?
Цитата:

Цитата alnimo
-tb%TDate%0001 »

Цитата:

Цитата справка WinRAR
Дата указывается в следующем формате: ГГГГММДДЧЧММСС. В поле даты допускается вставлять символы-разделители ('-' или ': ') и не указывать оставшиеся поля. Например, следующий ключ будет правильным: -tb2001-11-20

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


megaloman 01-09-2009 12:27 1208696

Вот 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 1757264

а как сделать чтобы батник работал с файлами только старше 3х месяцев, остальные файлы не трогал?
например сейчас сентябрь, батник бы заархивировал и удалил бы потом все файлы которые были созданы до июня

megaloman 21-09-2011 11:17 1757277

Запустите WinRar, вызовите справку.
Цитата:

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

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

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

megaloman 27-09-2011 12:54 1760967

Цитата:

... например сейчас сентябрь, батник бы заархивировал и удалил бы потом все файлы которые были созданы до июня
Смотрим справку 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 1817658

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

Dragokas 18-12-2011 23:59 1817678

К вопросу о ключах WinRAR: архивирую офис. документы обновлением для быстроты
Код:

rar.exe u -m0 -r -ri15 -n*.doc -n*.xls -n*.txt c:\docs.rar *.*
но потом заметил, что файлы, удаляемые на рабочем столе, остаются в архиве. Как исправить?
(в принципе можно и 7z)

megaloman 19-12-2011 20:17 1818179

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 1818472

Я немного по другому решил эту проблему просто добавил в твой предыдущий скрипт одну строку.

Код:

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 1818652

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 1818722

Цитата:

Цитата megaloman
1. У меня в XP forfiles нет, поэтому для совместимости я им не пользуюсь. »

В Resource Kit'е есть.

6umer 23-05-2013 17:42 2154886

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

Iska 23-05-2013 17:50 2154896

Код:

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

6umer 23-05-2013 17:58 2154903

спасибо.
не думал что настолько простой батник ..
здесь же помоему не хватает ключевых команд ...

Iska 23-05-2013 18:07 2154919

Цитата:

Цитата 6umer
здесь же помоему не хватает ключевых команд ... »

Каких?

6umer 24-05-2013 09:33 2155283

не слушайте меня!
спасибо вам.

mskam 19-08-2013 10:12 2203928

тут возникла задача на автоматическое удаление файлов старше 7 дней из определённого каталога и определённого расширения и эту задачу надо производить регулярно (раз в сутки) , ну допустим с регулярностью проблема решается добавлением батника в планировщик задач. а вот команда del не может решить всех поставленных задач... может кто чего подскажет. не используя стороннего ПО.

amel27 19-08-2013 11:46 2203989

mskam, поищите для начала по форуму - таких тем уже сотня наберется


Время: 02:01.

Время: 02:01.
© OSzone.net 2001-