Архив за месяц: Апрель 2008

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

Для архивации файлов старше определенной даты, например логов, предлагаю воспользоваться следующим скриптом на языке 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 путь_к_папке_с_файлами расширение_файлов путь_к_временному_списку_файлов путь_к_создаваемому_архиву_без_расширения

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

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

if (WScript.Arguments.Length < 1)
{
  WScript.Echo("Usage: email.js filetosend.txt");
  WScript.Quit();
}
var FSO = WScript.CreateObject("Scripting.FileSystemObject");
var File = FSO.OpenTextFile(WScript.Arguments(0), 1);
var Email = WScript.CreateObject("CDO.Message");
Email.From = "results@domain.com";
Email.To = "administrator@domain.com";
Email.Subject = "Task results";
Email.Bodypart.Charset = "koi8-r";
Email.Textbody = File.ReadAll();
Email.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2;
Email.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.domain.com";
Email.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25;
Email.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "user";
Email.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "pwd";
Email.Configuration.Fields.Update();
Email.Send();
File.Close();

Отправляемый файл должен быть в кодировке ANSI (windows-1251). Если авторизация на почтовом сервере не требуется, необходимо закомментировать строки 17 и 18 двумя косыми чертами (//).
Формат запуска скрипта: cscript.exe //nologo email.js путь_к_файлу_для_отправки

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

Очень часто возникает необходимость перекодировать текстовый файл, например, перенаправленный вывод консольного приложения имеет кодировку CP866, что не совсем приемлемо для отправки по почте. Предлагаю воспользоваться следующим скриптом на языке JScript:

if (WScript.Arguments.Length < 1)
{
  WScript.Echo("Usage: oem2ansi.js filetoconvert.txt");
  WScript.Quit();
}
var Stream1 = WScript.CreateObject("ADODB.Stream");
var Stream2 = WScript.CreateObject("ADODB.Stream");
Stream1.Type = 2;
Stream1.Mode = 3;
Stream1.Charset = "cp866";
Stream1.Open();
Stream1.LoadFromFile(WScript.Arguments(0));
Stream2.Type = 2;
Stream2.Mode = 3;
Stream2.Charset = "windows-1251";
Stream2.Open();
Stream1.CopyTo(Stream2,-1);
Stream1.Close();
Stream2.SaveToFile(WScript.Arguments(0),2);
Stream2.Close();

ADODB.Stream поддерживает великое множество кодировок, в том числе UTF-8, с полным перечнем можно ознакомиться в реестре по следующему пути: HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Charset.
Формат запуска скрипта: cscript.exe //nologo oem2ansi.js путь_к_файлу_для_перекодирования

Решение проблемы пропадающих значков в System Tray

Если после загрузки Windows XP пропадают значки в System Tray, например регулятор громкости, диспетчер задач и т.д., то для решения проблемы необходимо в контекстном меню рабочего стола включить опцию «Закрепить веб-элементы на рабочем столе».
Каким образом это может быть взаимосвязано — мне неизвестно, но проблема решается.