Книга: Windows Script Host для Windows 2000/XP

Перемещение файлов с ведением журнала действий

Перемещение файлов с ведением журнала действий

Поставим перед собой следующую задачу. Пусть в заданный каталог на жестком диске (например, C:In) поступают из почтовой программы или по локальной сети файлы с различными расширениями. Требуется выделить из них все файлы с заданным расширением (например, 003) и перенести их в другой каталог (например, C:Out). При этом необходимо вести журнал операций (log-файл), в который для каждого переносимого файла записывать следующую информацию: имя файла, дату и время его создания, дату и время перемещения файла. Структура log-файла (в нашем случае это файл C:Inlog.txt) должна быть следующей:

Имя файла (Дата и время создания) Дата и время перемещения

Например:

34556.003    (19/10/2002 10:45) 19/10/2002 11:02
43432_KL.003 (19/10/2002 10:45) 19/10/2002 11:02
45.003       (19/10/2002 10:45) 19/10/2002 11:02
              ...

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


Рис. 5.13. Информация о перемещении файлов

Поставленную задачу выполняет рассматриваемый ниже сценарий MoveLog.js; запускать этот сценарий следует в консольном режиме с помощью cscript.exe.

Пути к каталогу-источнику, в котором первоначально находятся файлы, и к целевому каталогу, в который будут перемещены эти файлы, хранятся соответственно в переменных Source и Dest:

var
 Source="C:In", //Путь к каталогу-источнику файлов для перемещения
 Dest="C:Out"; //Путь к целевому каталогу

В переменных Mask и PathLog записаны соответственно расширение файлов для перемещения и путь к log-файлу:

var
 Mask="003", //Расширение файлов для перемещения
 PathLog="C:Inlog.txt"; //Путь к log-файлу

Сначала в сценарии с помощью метода FolderExists объекта FileSystemObject проверяется наличие на диске каталога-источника; в случае отсутствия этого каталога выводится соответствующее сообщение и выполнение сценария прерывается:

//Создаем объект FileSystemObject
FSO=WScript.CreateObject("Scripting.FileSystemObject");
//Проверяем наличие каталога-источника
if (!FSO.FolderExists(Source)) {
 //Выводим сообщение об отсутствии каталога-источника
 WScript.Echo("Каталог-источник", Source, "не существует.");
 WScript.Echo("Нажмите Enter...");
 WScript.StdIn.ReadLine();
 //Выходим из сценария
 WScript.Quit();
}

Аналогичным образом проверяется наличие целевого каталога:

//Проверяем наличие целевого каталога
if (!FSO.FolderExists(Dest)) {
 //Выводим сообщение об отсутствии целевого каталога
 WScript.Echo("Целевой каталог", Dest, "не существует.");
 WScript.StdIn.ReadLine();
 WScript.StdIn.ReadLine();
 //Выходим из сценария
 WScript.Quit();
}

После этого создается объект Enumerator (переменная Files) для доступа к коллекции всех файлов в каталоге-источнике:

//Создаем объект Folder для каталога-источника Fold=FSO.GetFolder(Source);
//Создаем объект Enumerator для доступа к коллекции файлов
//в каталоге-источнике
Files=new Enumerator(Fold.Files);

Операции записи информации в log-файл и непосредственно переноса файлов из одного каталога в другой реализованы соответственно в функциях WriteLog() и MoveFiles().

В функции WriteLog() после объявления переменных открывается log-файл в режиме добавления строк:

var s, ss, s1, d, File, FLog;
WScript.Echo(" ");
WScript.Echo("Записываем информацию в log-файл...");
//Открываем log-файл для добавления
FLog=FSO.OpenTextFile(PathLog, ForAppending, true);

Затем в цикле while происходит просмотр коллекции файлов в каталоге-источнике:

//Переходим к первому элементу коллекции файлов
Files.moveFirst();
//Цикл по всем файлам в коллекции
while (!Files.atEnd()) {
 //Извлекаем текущий файл из коллекции
 File=Files.item();
 //Переходим к следующему файлу в коллекции
 Files.moveNext();
}

Если файл подлежит перемещению (расширение этого файла совпадает с расширением файлов для перемещения), то определяется его имя (свойство Name), дата создания (свойство DateCreated) и текущая дата (объект Date), и в log-файл записывается соответствующая информация:

//Выделяем расширение файла
s=FSO.GetExtensionName(File.Name);
//Проверяем, совпадает ли расширение текущего файла
//с расширением файлов для перемещения
if (s==Mask) {
 //Выводим имя файла на экран
 WScript.Echo("  "+File.Name);
 //Определяем дату создания файла
 d=new Date(File.DateCreated);
 //Формируем строку ss для записи в log-файл
 ss=LFillStr(13,File.Name)
 s1="("+DateToStr(d)+" ";
 s1+=TimeToStr(d)+")";
 ss+=LFillStr(20,s1);
 //Определяем текущую дату
 d=new Date();
 ss+=DateToStr(d);
 ss+=" "+TimeToStr(d);
 //Записываем сформированную строку в log-файл
 FLog.WriteLine(ss);
}

Записываемая в log-файл строка формируется в нужном виде с помощью вспомогательных функций LFillStr (выравнивание строки влево в поле заданной длины), DateToStr (формирование из объекта Date строки формата ДД/ММ/ГГГГ) и TimeTostr (формирование из объекта Date строки формата ЧЧ:ММ).

В функции MoveFiles(), как и в WriteLog(), производится перебор в цикле while файлов каталога-источника (элементов коллекции Files). Перемещение файлов осуществляется с помощью последовательного применения методов Copy и Delete:

Files.moveFirst();
//Цикл по всем файлам в коллекции
while (!Files.atEnd()) {
 //Извлекаем текущий файл из коллекции
 File=Files.item();
 //Выделяем расширение файла
 s=FSO.GetExtensionName(File.Name);
 //Проверяем, совпадает ли расширение текущего файла
 //с расширением файлов для перемещения
 if (s==Mask) {
  //Выводим имя файла на экран
  WScript.Echo("  "+File.name);
  //Копируем файл в целевой каталог
  File.Copy(Dest);
  //Удаляем файл
  File.Delete();
  //Увеличиваем счетчик количества перемещенных файлов
  Col++;
 }
 //Переходим к следующему файлу в коллекции
 Files.moveNext();
}

После перемещения всех файлов на экран выводится информация об их количестве:

WScript.Echo("Перемещено файлов:", Col);
WScript.Echo("Нажмите Enter...");
WScript.StdIn.ReadLine();

Полный текст сценария MoveLog.js приведен в листинге 5.19.

Листинг 5.19. Поиск файлов с ведением log-файла

/*******************************************************************/
/* Имя: MoveLog.js                                                 */
/* Язык: JScript                                                   */
/* Описание: Перемещение файлов из каталога-источника в            */
/*           целевой каталог с ведением log-файла                  */
/*******************************************************************/
//Объявляем переменные
var
 Source="C:In", //Путь к каталогу-источнику файлов для перемещения
 Dest="C:Out",  //Путь к целевому каталогу
 Mask="003",        //Расширение файлов для перемещения
 PathLog="C:Inlog.txt",   //Путь к log-файлу
 ForAppending=8;    //Константа для работы с файлами
//Объявляем переменные
var FSO,Fold,Files;
//Функция для записи информации в log-файл
function WriteLog() {
//Объявляем переменные
var s,ss,s1,d,File,FLog;
 WScript.Echo("");
 WScript.Echo("Записываем информацию в log-файл...");
 //Открываем log-файл для добавления
 FLog=FSO.OpenTextFile(PathLog,ForAppending,true);
 //Переходим к первому элементу коллекции файлов
 Files.moveFirst();
 //Цикл по всем файлам в коллекции
 while (!Files.atEnd()) {
  //Извлекаем текущий файл из коллекции
  File=Files.item();
  //Выделяем расширение файла
  s=FSO.GetExtensionName(File.Name);
  //Проверяем, совпадает ли расширение текущего файла
  //с расширением файлов для перемещения
  if (s==Mask) {
   //Выводим имя файла на экран
   WScript.Echo("  "+File.Name);
   //Определяем дату создания файла
   d=new Date(File.DateCreated);
   //Формируем строку ss для записи в log-файл
   ss=LFillStr(13,File.Name)
   s1="("+DateToStr(d)+" ";
   s1+=TimeToStr(d)+")";
   ss+=LFillStr(20,s1);
   //Определяем текущую дату
   d=new Date();
   ss+=DateToStr(d);
   ss+=" "+TimeToStr(d);
   //Записываем сформированную строку в log-файл
   FLog.WriteLine(ss);
  }
  //Переходим к следующему файлу в коллекции
  Files.moveNext();
 }
}
//Функция для перемещения файлов
function MoveFiles() {
 //Объявляем переменные
 var s,ss,Col,File;
 Col=0; //Счетчик количества перемещенных файлов
 WScript.Echo("");
 WScript.Echo("Перемещаем файлы ...");
 //Переходим к первому элементу коллекции файлов
 Files.moveFirst();
 //Цикл по всем файлам в коллекции
 while (!Files.atEnd()) {
  //Извлекаем текущий файл из коллекции
  File=Files.item();
  //Выделяем расширение файла
  s=FSO.GetExtensionName(File.Name);
  //Проверяем, совпадает ли расширение текущего файла
  //с расширением файлов для перемещения
  if (s==Mask) {
   //Выводим имя файла на экран
   WScript.Echo("  "+File.name);
   //Копируем файл в целевой каталог
   File.Copy(Dest);
   //Удаляем файл
   File.Delete();
   //Увеличиваем счетчик количества перемещенных файлов
   Col++;
  }
  //Переходим к следующему файлу в коллекции
  Files.moveNext();
 }
 //Выводим информацию о количестве перемещенных файлов
 WScript.Echo("");
 WScript.Echo("Перемещено файлов:",Col);
 WScript.Echo("Нажмите Enter...");
 WScript.StdIn.ReadLine();
}
/*******************  Начало  **********************************/
//Создаем объект FileSystemObject
FSO=WScript.CreateObject("Scripting.FileSystemObject");
//Проверяем наличие каталога-источника
if (!FSO.FolderExists(Source)) {
 //Выводим сообщение об отсутствии каталога-источника
 WScript.Echo("Каталог-источник",Source,"не существует.");
 WScript.Echo("Нажмите Enter...");
 WScript.StdIn.ReadLine();
 //Выходим из сценария
 WScript.Quit();
}
//Проверяем наличие целевого каталога
if (!FSO.FolderExists(Dest)) {
 //Выводим сообщение об отсутствии целевого каталога
 WScript.Echo("Целевой каталог",Dest,"не существует.");
 WScript.StdIn.ReadLine();
 WScript.StdIn.ReadLine();
 //Выходим из сценария
 WScript.Quit();
}
//Создаем объект Folder для каталога-источника
Fold=FSO.GetFolder(Source);
//Создаем объект Enumerator для доступа к коллекцию файлов
//в каталоге-источнике
Files=new Enumerator(Fold.Files);
//Записываем информацию в log-файл
WriteLog();
//Перемещаем файлы в целевой каталог
MoveFiles();
/*************  Конец *********************************************/
// Вспомогательные функции 
//Дополнение строки ss ведущими нулями до длины ll
function LeadZero(ll,ss) {
 var i,s,l1;
 s=ss.toString();
 l1=s.length;
 if (l1<=ll) {
  for (i=1;i<=ll-l1;i++) s="0"+s;
 }
 return(s);
}
//Формирование из объекта Date строки формата ДД/ММ/ГГГГ
function DateToStr(dd) {
 var s;
 s=LeadZero(2,dd.getDate())+"/";
 s+=LeadZero(2,dd.getMonth()+1)+"/";
 s+=dd.getYear();
 return(s);
}
//Формирование из объекта Date строки формата ЧЧ:ММ
function TimeToStr(dd) {
 var s;
 s=LeadZero(2,dd.getHours())+":"+LeadZero(2,dd.getMinutes());
 return(s);
}
//Выравнивание строки s влево в поле длиной l символов
function LFillStr(l,s) {
 var ss,i,ll;
 ll=l-s.length;
 if (s.length>=l) {
  return(s);
 } else {
  ss=s;
  for (i=1;i<=ll;i++) {
   ss=ss+" ";
  }
  return(ss);
 }
}

Оглавление книги


Генерация: 1.332. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз