Скрипт для архивации файлов старше определенной даты

Для архивации файлов старше определенной даты, например логов, предлагаю воспользоваться следующим скриптом на языке JScript:

if (WScript.Arguments.Length < 4)
{
  WScript.Echo("Usage: archivelogs.js c:\\folder\\with_logs\\ log_extension c:\\temp\\filelist.txt c:\\folder\\archive_name_w/o_extension");
  WScript.Quit();
}
var archname = new String();
var currdate = new Date();
var regexp = new RegExp(String().concat("\\.", WScript.Arguments(1), "$"), "i");
var shell = WScript.CreateObject("WScript.Shell");
var filesys = WScript.CreateObject("Scripting.FileSystemObject");
var filelist = filesys.CreateTextFile(WScript.Arguments(2), true, false);
var folder = filesys.GetFolder(WScript.Arguments(0));
var files = new Enumerator(folder.Files);
currdate.setDate(1);
currdate.setHours(0);
currdate.setMinutes(0);
currdate.setSeconds(0);
currdate.setMilliseconds(0);
for (; !files.atEnd(); files.moveNext())
{
  if (regexp.test(files.item().Name))
    if (files.item().DateLastModified < currdate)
      filelist.WriteLine(files.item());
}
filelist.Close();
switch (currdate.getMonth())
{
  case 0: archname = String().concat(WScript.Arguments(3), currdate.getFullYear()-1, "12"); break;
  case 10:
  case 11: archname = String().concat(WScript.Arguments(3), currdate.getFullYear(), currdate.getMonth()); break;
  default: archname = String().concat(WScript.Arguments(3), currdate.getFullYear(), "0", currdate.getMonth());
}
shell.Run(String().concat("\"C:\\Program Files\\WinRAR\\Rar.exe\" m -ep -m5 -s ", archname, " @", WScript.Arguments(2)), 1, true);
filesys.DeleteFile(WScript.Arguments(2), true);

Как работает скрипт. Получив входные данные, выполняется поиск файлов по расширению в указанном каталоге. Если файл не изменялся в текущем месяце (поведение определяется в строках 14-18), то путь к нему записывается во временный список. Затем запускается WinRAR, который перемещает файлы в архив с указанным именем и суффиксом года и прошлого месяца, например: archname200712.rar, archname200803.rar.
Формат запуска скрипта: cscript.exe //nologo archivelogs.js путь_к_папке_с_файлами расширение_файлов путь_к_временному_списку_файлов путь_к_создаваемому_архиву_без_расширения

Скрипт для архивации файлов старше определенной даты: 4 комментария

  1. Dens

    Такой же (почти) только на PowerShell. Архивирует файлы старше 30 дней. Arxiv_Rar.ps1:
    Cd “путь к папке”
    $var1 = get-date
    # устанавливаем дату для нахождения элементов, старше 30 дней
    $var1 = $var1.adddays(-30)
    # перемещаем их
    Dir | where {$_.lastwritetime -lt $var1} | move –destination “путь в склад”
    call arxivSnaps.bat
    …………………….

    arxivSnaps.bat:
    SET PATH=%PATH%;»C:\Program Files (x86)\WinRAR\»

    rar a -agYYYYMMDD -y -r -idp arxiv путь в склад \* > arxiv.log

    Формат запуска: ./ arxiv_rar.ps1

  2. Тамара

    Добрый день,

    Нужен срипт, который можно было бы запускать ежедневно и он бы архивировал конкретный файл (путь к файлу постоянный), а затем отправлял бы его по почте по конкретным адресам. Было бы неплохо, если бы скрипт еще и отрубал доступ к файлу (если у кого-то из пользователей на момент запуска скрипта файл открыт), т.е. архивировал бы последнюю сохраненную версию.
    Сама в этом ничего не понимаю, поэтому, если есть что посоветовать, внимательно слушаю.

  3. Александр Кузьмин Автор записи

    К сожалению я так и не смог выделить время, чтобы вам помочь. Придется разбираться самостоятельно, благо примеры необходимых скриптов приведены в моем блоге. По поводу отключения пользователей — в этом нет смысла, т.к. после отключения сессии клиент заново подключится и, возможно, начнет вносить изменения в файл. В данном случае следует воспользоваться VSS (Shadow Copy), но это уже работа с API ОС Windows Server и необходимость написания отдельного приложения 🙂

Добавить комментарий