Доработка объекта-сценария 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>

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Запуск сценария

Из книги Обработка баз данных на Visual Basic®.NET автора Мак-Манус Джеффри П

Запуск сценария Сценарий можно запустить непосредственно в окне Solution Explorer. Проще всего перетащить сценарий и опустить его на ссылку на базу данных, в которую нужно внести изменения. Или иначе, щелкните правой кнопкой мыши на сценарии и выберите в контекстном меню команду


Глава 2 Примеры использования  стандартных объектов WSH (JScript и VBScript)

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов автора Дронов Владимир

Глава 2 Примеры использования  стандартных объектов WSH (JScript и VBScript) В этой главе мы на примерах подробно рассмотрим, как с помощью стандартных объектов WSH 5.6, описание которых приведено в главе 1, можно решать некоторые практические задачи, связанные, в частности, с выводом


Создание макета файла DateArc.wsc с помощью Windows Script Component Wizard (JScript)

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

Создание макета файла DateArc.wsc с помощью Windows Script Component Wizard (JScript) Из листинга 10.1 можно понять, что создание компонента-сценария связано с написанием большого количества вспомогательного кода (нужно заполнить элементы <registration>, <property>, <method> и <events>, написать


Регистрация файла DateArc.wsc в качестве СОМ-объекта

Из книги автора

Регистрация файла DateArc.wsc в качестве СОМ-объекта После написания текста объекта-сценария нужно внести информацию о нем в системный реестр, т.е, зарегистрировать объект. Это можно сделать несколькими способами, самый простой из которых заключается в следующем. Нужно


Приложение 1 Справочник по языку JScript

Из книги автора

Приложение 1 Справочник по языку JScript Язык JScript — это разработанный Microsoft интерпретируемый объектно-ориентированный язык сценариев, который первоначально предназначался для создания динамических HTML-страниц. Отметим, что JScript не является урезанной версией какого-либо


Выполнение сценария

Из книги автора

Выполнение сценария Открытый в отладчике сценарий может выполняться в разных режимах с помощью соответствующих команд меню Debug.С помощью команды Debug|Run (или нажатия клавиши <F5) можно выполнить все операторы сценария до первой точки прерывания.Для того чтобы выполнить


Понятия объекта и экземпляра объекта

Из книги автора

Понятия объекта и экземпляра объекта В начале этой главы мы познакомились с типами данных, определяющими саму природу данных и набор действий, которые можно выполнять с этими данными. Так, строковый тип определяет, что данные этого типа представляют собой строки —


Понятия объекта и экземпляра объекта

Из книги автора

Понятия объекта и экземпляра объекта В начале этой главы мы познакомились с типами данных, определяющими саму природу данных и набор действий, которые можно выполнять с этими данными. Так, строковый тип определяет, что данные этого типа представляют собой строки —


Написание сценария

Из книги автора

Написание сценария Итак, с панелью Actions мы вкратце познакомились. Конечно, полностью ее возможности (кстати, весьма широкие) мы не рассмотрели, но сейчас нам важнее написать наш первый сценарий, чем выяснять, чем богата эта панель. Позже мы займемся ей более подробно.Выше


2.1. Запуск сценария

Из книги автора

2.1. Запуск сценария Запустить сценарий можно командой sh scriptname[ 8 ] или bash scriptname. (Не рекомендуется запуск сценария командой sh <scriptname>, поскольку это запрещает использование устройства стандартного ввода stdin в скрипте). Более удобный вариант -- сделать файл скрипта


16.3. Выполнение сценария

Из книги автора

16.3. Выполнение сценария Ниже рассматривается пример, который уже обсуждался ранее. В данном случае, файл называется cleanup.$ pg cleanup#!/bin/sh#имя: cleanup#это общий сценарий, выполняющий очистку echo "starting cleanup…wait"rm /usr/local/apps/log/*.logtail -40 /var/adm/messages /tmp/messagesrm /var/adm/messagesmv /tmp/messages /var/adm/messages echo