До сих пор мы рассматривали простые одиночные файлы сценариев, в которых мог использоваться язык JScript или VBScript. В версии WSH 1.0 это был единственный поддерживаемый тип сценариев, причем используемый язык определялся по расширению файла: js для JScript и vbs для VBScript. Начиная с WSH 2.0 появилась возможность создавать сценарии, в которых можно применять оба языка одновременно. Для таких сценариев в операционной системе регистрируется расширение wsf; wsf-файлы мы будем далее называть просто WS-файлами. Новый тип сценариев (WS-файл) имеет еще несколько важных преимуществ перед одиночными файлами сценариев WSH 1.0:
□ поддерживаются вложенные файлы;
□ возможен доступ из сценария к внешним мнемоническим константам, которые определены в библиотеках типов используемых объектов ActiveX;
□ в одном WS-файле можно хранить несколько отдельных, независимых друг от друга, сценариев;
□ сценарий становится самодокументируемым, т.е. вывод информации об использовании сценария и его синтаксисе происходит автоматически.
Понятно, что для обеспечения новых возможностей необходимо иметь больше информации, чем ее может предоставить отдельный сценарий. В самом файле сценария должна присутствовать некоторая дополнительная информация, скажем, имя этого сценария (подобная информация содержится, например, в заголовках HTML-страниц). Другими словами, для сценариев WSH должен использоваться уже некий специальный формат, а не просто отдельные js- или vbs-файлы. В качестве такого формата разработчики Microsoft выбрали язык XML — Extensible Markup Language, который уже использовался ими для определения информационной модели в технологии WSC — Windows Script Components, которая позволяет с помощью языков сценариев создавать и регистрировать полноценные СОМ-объекты.
Таким образом, теперь сценарии WSH не просто содержат в текстовом виде ActiveX-совместимый сценарий, а являются XML-приложениями, поддерживающими схему WS XML — Windows Script XML, которая, в свою очередь, опирается на схему WSC XML. Поэтому для понимания двух технологий (WSC и WSH) достаточно освоить одну схему XML.
WS-файл рассматривается сервером сценариев как файл с разметкой XML, который должен соответствовать схеме WS XML. Новый тип файла и формат XML обеспечивают более мощную среду для написания сценариев.
Для того чтобы использовать язык XML в сценариях WSH, вовсе не обязательно вникать во все тонкости этого языка, однако основные принципы XML понимать, конечно, нужно.
Основные принципы XML
Проявляемый в настоящее время большой интерес к языку XML объясняется тем, что он предоставляет возможности, позволяющие в текстовой форме описывать структурированные данные. Точнее говоря, XML является метаязыком для создания различных языков разметки, которые способны определять произвольные структуры данных — двоичные данные, записи в базе данных или сценарии. Прежде всего, XML используется в Internet- приложениях при работе браузеров, которые отображают информацию, находящуюся на Web-серверах. При этом пользователю отдельно передаются данные в виде XML-документа, и отдельно — правила интерпретации этих данных для отображения с помощью, например, языков сценариев JScript или VBScript.
Как и HTML, XML является независимым от платформы промышленным стандартом. Полные спецификации XML и связанных с ним языков доступны на официальной странице консорциума W3C — World Wide Web Consortium по адресу http://www.w3c.org/xml.
Внешне XML-документ похож на HTML-документ, т.к. XML-элементы также описываются с помощью тегов, т.е. ключевых слов. Однако, в отличие от HTML, в XML пользователь может создавать собственные элементы, поэтому набор тегов не является заранее предопределенным. Еще раз повторим, что теги XML определяют структурированную информацию и, в отличие от тегов HTML, не влияют на то, как браузер отобразит эту информацию. Ниже перечислены несколько основных правил формирования корректного XML-документа:
□ документ XML состоит из элементов разметки (markup) и непосредственно данных (content);
□ все XML-элементы описываются с помощью тегов;
□ в заголовке документа с помощью специальных тегов помещается дополнительная информация (используемый язык разметки, его версия и т.д.);
□ каждый открывающий тег, который определяет область данных, должен иметь парный закрывающий тег (в HTML некоторые закрывающие теги можно опускать);
□ в XML, в отличие от HTML, учитывается регистр символов;
□ все значения атрибутов, используемых в определении тегов, должны быть заключены в кавычки;
□ вложенность элементов в документе XML строго контролируется.
Рассмотрим теперь структуру и синтаксис WS-файлов, использующих схему WS XML.
Схема WS XML
Синтаксис элементов, составляющих структуру WS-файла, в общем виде можно представить следующим образом:
Содержимое (content)
Открывающий тег элемента состоит из следующих компонентов:
□ открывающей угловой скобки "<";
□ названия элемента, написанного строчными буквами;
□ необязательного списка атрибутов со значениями (названия атрибутов пишутся строчными буквами, значения заключаются в двойные кавычки);
□ закрывающей угловой скобки ">".
Например, тег начала элемента
.
Если у элемента нет содержимого, то он имеет следующий вид:
To есть в этом случае элемент состоит из следующих компонентов:
□ открывающей угловой скобки "<";
□ названия элемента, написанного строчными буквами;
□ необязательного списка атрибутов со значениями (названия атрибутов пишутся строчными буквами, значения заключаются в двойные кавычки);
□ символа"/";
□ закрывающей угловой скобки ">".
Пример такого элемента:
Представленная в листинге 3.1 схема WS XML — это модель данных, определяющая элементы и соответствующие атрибуты, а также связи элементов друг с другом и возможную последовательность появления элементов. Также эта схема может задавать значения атрибутов по умолчанию.
Листинг 3.1. Схема WS XML
является исходным кодом сценария. Однако при таком подходе может произойти ошибочная интерпретация вложенных в сценарий зарезервированных для XML символов или слов как разметки XML. Например, имеющиеся в коде сценария знаки "меньше" (<) и "больше" (>) могут привести к прекращению разбора и выполнения сценария.
Для того чтобы задать режим строгой обработки сценария, нужно поместить элемент в самой первой строке сценария — никаких других символов или пустых строк перед ним быть не должно. При такой обработке WS-файла нужно четко следовать всем правилам стандарта XML. Код сценария должен быть помещен в секцию CDATA, которая начинается с символов "".
Замечание
В WSH 5.6 названия и значения атрибутов в элементе <?xml?> должны быть именно такими, как в листинге 3.1 (version="1.0" и standalone="yes").\
Элемент
<?job?>
Элемент задает режим отладки при выполнении WS-файла. Если значение атрибута debug равно true, то задание может быть выполнено во внешнем отладчике (см. приложение 3). Если же значение атрибута debug равно false, то отладчик для этого задания применен быть не может. По умолчанию debug имеет значение false.
Элемент
<package>
Этот элемент необходим в тех WS-файлах, в которых с помощью элементов
Если же в WS-файле определено только одно задание, то элемент
Элемент
<job>
Элементы
У элемента
Листинг 3.2. Файл two_jobs.wsf
Для того чтобы запустить конкретное задание из многозадачного WS-файла, нужно воспользоваться параметром //job:"JobID" в командной строке WSH. Например, следующая команда:
cscript //job:"Task1" two_jobs.wsf
запускает с помощью cscript.exe задание с именем "Task1" из файла two_jobs.wsf.
Замечание
Если параметр //job не указан, то по умолчанию из многозадачного WS-файла запускается первое задание.
Если в WS-файле имеется несколько заданий, то они должны находиться внутри элемента
Элемент
<runtime>
При запуске почти всех стандартных команд или утилит командной строки Windows с ключом /? на экран выводится встроенная справка, в которой кратко описываются назначение и синтаксис этой команды или утилиты (рис. 3.1).
Рис. 3.1. Встроенная справка для команды COPY
Хорошим тоном считается создание такой справки и для разрабатываемых сценариев WSH. Понятно, что добавление в сценарий функции вывода информации о назначении, синтаксисе и аргументах этого сценария потребовало бы написания довольно большого количества кода: необходимо следить за ключом /? в командной строке, а при добавлении нового параметра командной строки возникнет необходимость изменения функции, отвечающей за вывод информации на экран.
Элемент
При этом сам элемент
Замечание
Элемент <runtime> является дочерним относительно <job> , поэтому все описания, приведенные внутри <runtime> , относятся только к текущему заданию.
Элемент
<named>
С помощью элементов
Таблица 3.1. Аргументы элемента
Аргумент | Описание |
name | Задает имя параметра командной строки |
helpstring | Строка, содержащая описание параметра командной строки |
type | Определяет тип параметра командной строки. Может принимать значения " string " (символьный тип), " boolean " (логический тип), " simple " (в сценарий передается только имя параметра без дополнительного значения). По умолчанию используется тип " simple " |
required | Используется для того, чтобы показать, является ли параметр командной строки обязательным. Может принимать значения " true " (параметр нужно указывать обязательно) и " false " (параметр можно не указывать) |
Информация, которая указывается для объявляемого в элементе
Если для аргумента командной строки сценария указан тип "string", то предполагается, что этот аргумент имеет имя и значение, разделенные символом ":", например:
/Имя:"Андрей Попов" /Возраст:30
Если в качестве типа параметра командной строки используется "simple", то для этого параметра в командной строке указывается только его имя без значения:
/Имя /Возраст
Для того чтобы передать в сценарий аргумент командной строки типа "boolean", нужно после имени этого аргумента указать символ "+" (соответствует логическому значению "истина") или "-" (соответствует значению "ложь"). Например:
/Запись+ /ReWrite-
В листинге 3.3 приведен сценарий named.wsf, в котором в блоке
□ /Имя (обязательный аргумент символьного типа);
□ /Компьютер (необязательный аргумент символьного типа);
□ /Новый (обязательный аргумент логического типа).
После запуска с помощью wscript.exe в сценарии named.wsf сначала вызывается метод WScript.Arguments.Usage, в результате чего на экран выводится диалоговое окно с информацией о сценарии и параметрах командной строки (рис. 3.2).
Рис. 3.2. Диалоговое окно с информацией о параметрах сценария named.wsf
Затем в сценарии проверяется, какие именно аргументы командной строки были подставлены при запуске, и выделяются значения этих аргументов. Для этого создается объект WshNamed, являющийся коллекцией именных аргументов командной строки, и используется метод Exists этого объекта:
//Создаем объект WshNamed — коллекция именных аргументов сценария
objNamedArgs= WScript.Arguments.Named;
s="";
//Проверяем, существует ли аргумент /Имя:
if (objNamedArgs.Exists("Имя"))
//Получаем значение символьного аргумента /Имя
s+="Имя: "+objNamedArgs("Имя") +"\n";
//Проверяем, существует ли аргумент /Компьютер:
if (objNamedArgs.Exists("Компьютер"))
//Получаем значение символьного аргумента /Компьютер
s+="Машина: "+objNamedArgs("Компьютер") + "\n";
Значением параметра /Новый является константа логического типа (true или false), поэтому для формирования строки, соответствующей этому значению, используется условный оператор языка JScript:
//Проверяем, существует ли аргумент /Новый
if (objNamedArgs.Exists("Новый"))
//Получаем с помощью условного оператора значение
//логического аргумента /Новый
s+="Новый пользователь: "+(objNamedArgs("Новый") ? "Да" : "Нет");
Если запустить сценарий named.wsf следующим образом:
wscript.exe named.wsf /Имя:Popov /Компьютер:404_Popov /Новый+
то на экран будет выведено диалоговое окно, показанное на рис. 3.3.
Рис. 3.3. Значения именных аргументов командной строки, переданных в named.wsf
Листинг 3.3. Файл named.wsf
Имя: named.wsf
Кодировка: Windows
name="Имя"
helpstring="Имя пользователя"
type="string" required="true"/>
name="Компьютер"
helpstring="Имя рабочей станции"
type="string" required="false"/>
name="Новый"
helpstring="Признак того, что такого пользователя раньше не было"
type="boolean" required="true"/>
Элемент
<unnamed>
С помощью элементов
Таблица 3.2. Аргументы элемента
Аргумент | Описание |
name | Задает имя, которое будет указано для описываемого параметра командной строки при выводе информации о сценарии |
helpstring | Строка, содержащая описание параметра командной строки |
many | Определяет, сколько раз может быть указан безымянный параметр в командной строке. Значение, равное " true " (используется по умолчанию), означает, что безымянный параметр может встретиться в командной строке более одного раза. Значение, равное " false ", означает, что безымянный параметр должен быть указан только один раз |
required | Определяет, является ли безымянный параметр командной строки обязательным. Может принимать значения " true ", " on " или 1 (параметр нужно указывать обязательно), " false ", " off " или 0 (параметр можно не указывать). Также значением аргумента "required" может быть целое число, которое показывает, сколько раз безымянный параметр должен обязательно быть указан в командной строке |
Информация, которая указывается для объявляемого в элементе
Рассмотрим в качестве примера сценарий unnamed.wsf, в который в качестве параметров командной строки должны передаваться расширения файлов, причем обязательно должны быть указаны хотя бы два таких расширения (листинг 3.4).
Для создания информации об использовании этого сценария создается элемент
После запуска с помощью wscript.exe в сценарии unnamed.wsf сначала вызывается метод WScript.Arguments.Usage, в результате чего на экран выводится диалоговое окно с информацией о сценарии и параметрах командной строки (рис. 3.4).
Рис. 3.4. Диалоговое окно с информацией о параметрах сценария unnamed.wsf
Затем в сценарии создается коллекция objUnnamedArgs (объект WshUnnamed), которая содержит все безымянные аргументы командной строки, реально переданные в сценарий:
objUnnamedArgs=WScript.Arguments.Unnamed; //Создаем объект WshUnnamed
После этого определяется общее число реально переданных в сценарий параметров командной строки (свойство length) и в цикле while организуется перебор всех элементов коллекции objUnnamedArgs.
//Определяем количество безымянных аргументов
s="Передано в сценарий безымянных аргументов: "+objUnnamedArgs.length;
for (i=0; i<=objUnnamedArgs.length-1; i++)
//Формируем строки со значениями безымянных аргументов
s+="\n"+objUnnamedArgs(i);
//Выводим полученные строки на экран
WScript.Echo(s);
Если запустить сценарий unnamed.wsf следующим образом:
wscript.exe unnamed.wsf vbs js
то на экран будет выведено диалоговое окно, показанное на рис. 3.5.
Рис. 3.5. Значения безымянных аргументов командной строки, переданных в unnamed.wsf
Листинг 3.4. Файл unnamed.wsf
Имя: unnamed.wsf
Кодировка: Windows
Элемент
<description>
Внутри элемента
Пример использования элемента
а
б
Рис. 3.6. Вывод текста, описывающего сценарий: а — в графическом режиме; б — в консольном режиме
Листинг 3.5. Файл descrip.wsf
Имя: descrip.wsf
Кодировка: Windows
Описание: Здесь можно привести дополнительное описание сценария
Элемент
<example>
Внутри элемента
Рис. 3.7. Диалоговое окно, формируемое элементами
Сценарий example.wsf, диалоговое окно с описанием которого показано на рис. 3.7, приведен в листинге 3.6.
Листинг 3.6. Файл example.wsf
Имя: example.wsf
Кодировка: Windows
Описание: Здесь можно привести дополнительное описание сценария
Здесь приводится пример запуска сценария
(с параметрами командной строки, например)
Элемент
<resource>
Элемент
Для получения значения ресурса в сценарии нужно вызвать метод getResource, передав в качестве параметра символьный идентификатор ресурса (значение атрибута id).
В листинге 3.7 представлен пример сценария resource.wsf, в котором определяется ресурсная строка с идентификатором "MyName":
Значение этого ресурса затем выводится на экран с помощью метода Echo объекта WScript и метода getResource:
WScript.Echo(getResource("MyName"));
Листинг 3.7. Файл resource.wsf
Имя: resource.wsf
Описание: Пример использования в сценарии ресурсных строк
Меня зовут Андрей Попов
Элемент
<object>
Элемент
Атрибут id в
Таким образом, можно выделить код, который должен использоваться в нескольких сценариях, поместить его в один или несколько внешних файлов, а затем по мере необходимости просто подключать с помощью атрибута src эти файлы к другим сценариям.
Замечание
Элемент <script> является вторым обязательным элементом в сценариях WSH с разметкой XML.