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

Доработка объекта-сценария DateArc.wsc (JScript)

Доработка объекта-сценария DateArc.wsc (JScript)

Для получения нужного нам СОМ-объекта из сформированного с помощью Windows Script Component Wizard файла DateArc.wsc нужно выполнить несколько шагов.

Во-первых, для того, чтобы использовать внутри описания СОМ-объекта символы кириллицы, необходимо добавить в директиву <?xml?> аргумент encoding="windows-1251" (без этого в сценарии не удастся даже написать по-русски комментарии):

<?xml version="1.0" encoding="windows-1251"?>

Во-вторых, в контейнер <registration>  мы вставим элемент <script> с двумя функциями Register() и Unregister(), которые будут выводить на экран диалоговые окна с соответствующей информацией при регистрации компонента-сценария и его отключении соответственно:

<script language="JScript">
<![CDATA[
var WshShell;
//Инициализируем константы для диалоговых окон
var vbInformation=64;
function Register() {
 //Создаем объект WshShell
 WshShell = new ActiveXObject("WScript.Shell");
 WshShell.Popup("Компонент зарегистрирован в системе",0,
  "Компонент для архивирования файлов",vbInformation);
}
function Unregister()   {
 //Создаем объект WshShell
 WshShell = new ActiveXObject("WScript.Shell");
 WshShell.Popup("Компонент удален из системы", 0,
  "Компонент для архивирования файлов",vbInformation);
}
]]>
</script>

Затем нам понадобятся две дополнительные функции. Первая из них NowIs() формирует строку формата ММДД, где ММ — текущий месяц, ДД — текущий день:

//Вспомогательная функция для символьного представления даты
function NowIs() {
 var d, s="", s1="";
 //Создаем объект Date (текущая дата)
 d=new Date();
 //Выделяем номер месяца
 s+=(d.getMonth()+1);
 //Если месяц представляется одним символом, добавляем слева "0"
 if (s.length==1) s="0"+s;
 //Выделяем в дате день
 s1+=d.getDate();
 //Если день представляется одним символом, добавляем слева "0"
 if (s1.length==1) s1="0"+s1;
 s+=s1;
 //Возвращаем сформированную строку
 return s;
}

Вторая функция CheckPath() будет проверять наличие исходного каталога и каталога для хранения архивных файлов. Для этого используется метод FolderExists() объекта FileSystemObject. Заметим, что сам объект FileSystemObject нужно создавать не путем вызова метода CreateObject объекта WScript, а с помощью конструкции new ActiveXObject():

FSO=new ActiveXObject("Scripting.FileSystemObject");

т.к. в отличие от обычного сценария WSH в компоненте-сценарии нет встроенного объекта WScript. Если хотя бы один из каталогов не существует, функция CheckPath() запишет соответствующее сообщение в свойство SErrMess и вернет значение false, в противном случае функция CheckPath() возвращает значение true.

//Проверка доступности каталогов
function CheckPath() {
 var FSO;
 //Создаем объект FileSystemObject
 FSO=new ActiveXObject("Scripting.FileSystemObject");
 //Проверяем доступность исходного каталога
 if (!FSO.FolderExists(SFrom)) { //Исходный каталог не существует
  //Формируем строку с информацией об ошибке
  SErrMess="Не найден исходный каталог "+SFrom;
  return false;
 }
 //Проверяем доступность каталога для архивирования
 if (!FSO.FolderExists(SArch)) {
  //Каталог для архивирования не существует
  //Формируем строку с информацией об ошибке
  SErrMess="Не найден каталог для хранения архивов "+SArch;
  return false;
 }
 //Если оба каталога существуют, возвращаем true
 return true;
}

Основной функцией, осуществляющей архивирование файлов, является FilesToArchiv(). В самом начале этой функции с помощью вызова CheckPath() проверяется наличие рабочих каталогов. Если хотя бы один из каталогов не существует, то выполнение FilesToArchiv() прерывается и возвращается значение false:

if (!CheckPath()) return false;

Затем создаются экземпляры объектов FileSystemObject и WshShell:

//Создаем объект FileSystemObject
FSO = new ActiveXObject("Scripting. FileSystemObject");
//Создаем объект WshShell
WshShell = new ActiveXObject("WScript.Shell");

Имя файла-архива формируется следующим образом:

//Формируем имя файла-архива
SFName=SPref+NowIs()+".arj";

Архиватор arj.exe мы будем запускать в отдельном командном окне, которое закроется после выполнения этой программы. Для этого мы сформируем командную строку SComLine, с помощью которой запускается вторичная копия командного процессора (путь к командному процессору хранится в переменной среды %COMSPEC%, вторичная копия вызывается с помощью ключа ):

SComLine="%COMSPEC% /с ";

Синтаксис запуска arj.exe для создания архивного файла имеет следующий вид:

arj.exe a Archiv Files

гдеArchiv — путь к файлу-архиву,Files — имена добавляемых в архив файлов (здесь можно использовать шаблонные символы ? и *). Поэтому мы добавим нужные компоненты к командной строке SComLine:

SComLine+=" arj.exe a "+FSO.BuildPath(SArch, SFName) + " ";
SComLine+= FSO.BuildPath(SFrom, SMask);

Команды, записанные в SComLine, запускаются с помощью метода Run объекта WshShell; код возврата сохраняется в переменной RetCode:

RetCode = WshShell.Run(SComLine, 1, true);

Равенство нулю переменной RetCode означает, что архивирование выполнено без ошибок — в этом случае функция FilesToArchiv() возвращает true. Если же при выполнении arj.exe возникла ошибка (переменная RetCode не равна нулю), то ее код вносится в сообщение об ошибке (свойство SErrMess):

//Анализируем код возврата для arj.exe
if (0==RetCode)
 //Выполнение arj.exe завершилось без ошибок
 return true;
else {
 //Формируем строку с информацией об ошибке
 SErrMess="Ошибка ARJ.EXE! Код "+RetCode;
 return false;
}
 

Полностью содержимое файла DateArc.wsc приведено в листинге 10.4.

Листинг 10.4. СОМ-объект DateArc.WSC (JScript)

<?xml version="1.0" encoding="windows-1251"?>
<component>
 <registration description="DateArc" progid="DateArc.WSC"
  version="1.00"
  classid="{424ac2bc-5732-4dea-be17-0211af99cd79}">
 <script language="JScript">
  <![CDATA[
var WshShell;
//Инициализируем константы для диалоговых окон
var vbInformation=64;
function Register() {
 //Создаем объект WshShell
 WshShell = new ActiveXObject("WScript.Shell");
 WshShell.Popup("Компонент зарегистрирован в системе",0,
  "Компонент для архивирования файлов",vbInformation);
}
function Unregister() {
 //Создаем объект WshShell
 WshShell = new ActiveXObject("WScript.Shell");
 WshShell.Popup("Компонент удален из системы",0,
  "Компонент для архивирования файлов",vbInformation);
}
   ]]>
  </script>
 </registration>
 <public>
  <property name="SFrom">
   <get/>
   <put/>
  </property>
  <property name="SArch">
   <get/>
   <put/>
  </property>
  <property name="SPref">
   <get/>
   <put/>
  </property>
  <property name="SMask">
   <get/>
   <put/>
  </property>
  <property name="SErrMess">
   <get/>
  </property>
  <method name="FilesToArchiv">
  </method>
 </public>
 <script language="JScript">
  <![CDATA[
var description = new DateArc;
//Конструктор объекта DateArc
function DateArc()   {
 //Объявляем свойства объекта DateArc
 this.get_SFrom = get_SFrom;
 this.put_SFrom = put_SFrom;
 this.get_SArch = get_SArch;
 this.put_SArch = put_SArch;
 this.get_SPref = get_SPref;
 this.put_SPref = put_SPref;
 this.get_SMask = get_SMask;
 this.put_SMask = put_SMask;
 this.get_SErrMess = get_SErrMess;
 //Объявляем метод FilesToArchiv
 this.FilesToArchiv = FilesToArchiv;
}
var SFrom,    //Исходный каталог для архивирования
    SArch,    //Каталог, в котором будет создаваться архив
    SPref,    //Префикс файла
    SMask,    //Маска, по которой отбираются файлы для
              //архивирования
    SErrMess; //Текст сообщения об ошибке
//Чтение и запись свойства SFrom
function get_SFrom() {
 return SFrom;
}
function put_SFrom(newValue) {
 SFrom = newValue;
}
//Чтение и запись свойства SArch
function get_SArch() {
 return SArch;
}
function put_SArch(newValue) {
 SArch = newValue;
}
//Чтение и запись свойства SPref
function get_SPref() {
 return SPref;
}
function put_SPref(newValue) {
 SPref = newValue;
}
//Чтение и запись свойства SMask
function get_SMask() {
 return SMask;
}
function put_SMask(newValue) {
 SMask = newValue;
}
//Чтение свойства SErrMess
function get_SErrMess() {
 return SErrMess;
}
//Вспомогательная функция для символьного представления даты
function NowIs() {
 var d, s="", s1="";
 //Создаем объект Date (текущая дата)
 d=new Date();
 //Выделяем номер месяца
 s+=(d.getMonth()+1);
 //Если месяц представляется одним символом, добавляем слева "0"
 if (s.length==1) s="0"+s;
 //Выделяем в дате день
 s1+=d.getDate();
 //Если день представляется одним символом, добавляем слева "0"
 if (s1.length==1) s1="0"+s1;
 s+=s1;
 //Возвращаем сформированную строку
 return s;
}
//Проверка доступности каталогов
function CheckPath() {
 var FSO;
 //Создаем объект FileSystemObject
 FSO=new ActiveXObject("Scripting.FileSystemObject");
 //Проверяем доступность исходного каталога
 if (!FSO.FolderExists(SFrom)) { //Исходный каталог не существует
  //Формируем строку с информацией об ошибке
  SErrMess="Не найден исходный каталог "+SFrom;
  return false;
 }
 //Проверяем доступность каталога для архивирования
 if (!FSO.FolderExists(SArch)) {
  //Каталог для архивирования не существует
  //Формируем строку с информацией об ошибке
  SErrMess="Не найден каталог для хранения архивов "+SArch;
  return false;
 }
 //Если оба каталога существуют, возвращаем true
 return true;
}
//Архивирование файлов из исходного каталога
function FilesToArchiv()  {
 var WshShell,SComLine,RetCode,SFName,FSO;
 //Если хотя бы один из каталогов не существует, возвращаем false
 if (!CheckPath()) return false;
 //Создаем объект FileSystemObject
 FSO=new ActiveXObject("Scripting.FileSystemObject");
 //Создаем объект WshShell
 WshShell = new ActiveXObject("WScript.Shell");
 //Формируем имя файла-архива
 SFName=SPref+NowIs()+".arj";
 //Формируем командную строку для запуска архиватора arj.exe
 SComLine="%COMSPEC% /c arj.exe a ";
 SComLine+=FSO.BuildPath(SArch,SFName)+" ";
 SComLine+=FSO.BuildPath(SFrom,SMask);
 //Запускаем архиватор arj.exe
 RetCode = WshShell.Run(SComLine, 1, true);
 //Анализируем код возврата для arj.exe
 if (0==RetCode)
  //Выполнение arj.exe завершилось без ошибок
  return true;
 else {
  //Формируем строку с информацией об ошибке
  SErrMess="Ошибка ARJ.EXE! Код "+RetCode;
  return false;
 }
}
  ]]>
 </script>
</component>

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


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