Вопрос по лекции 7, где рассматривается взаимодействие со сторонними программами, в том числе эмуляция нажатия кнопок клавиатуры WshShell.SendKeys. Вопрос в том что во время автоматизации может потребоваться не нажатие клавиатуры, а нажатие кнопок в сообщениях этих программ. Можно вытащить информацию о объекте (кнопке) скажем с помощью AutoIt Info, или ориентироваться скажем на текст на кнопке..., но как на эту кнопку нажать? (без обхода по клавиатуре) |
Сценарии WSH как XML-документы. Схема WS XML
Элемент <package>
Этот элемент необходим в тех WS-файлах, в которых с помощью элементов <job> определено более одного задания. В этом случае все эти задания должны находиться внутри пары тегов <package> и </package> (см. табл. 3.1). Другими словами, <package> является контейнером для элементов <job>.
Если же в WS-файле определено только одно задание, то элемент <package> можно не использовать.
Элемент <job>
Элементы <job> позволяют определять несколько заданий (независимо выполняющихся частей) в одном WS-файле. Иначе говоря, между тегами <job> и </job> будет находиться отдельный сценарий (который, в свою очередь, может состоять из нескольких частей, написанных, возможно, на разных языках).
У элемента <job> имеется единственный атрибут id, который определяет уникальное имя задания. Например, в сценарии two_jobs.wsf определяются два задания с именами "Task1" и "Task2" (листинг 9.1).
<package> <job id="Task1"> <!-- Описываем первое задание (id="Task1") --> <script language="VBScript"> WScript.Echo "Выполняется первое задание (VBScript)" </script> </job> <job id="Task2"> <!-- Описываем второе задание (id="Task1") --> <script language="JScript"> WScript.Echo("Выполняется второе задание (JScript)"); </script> </job> </package>Листинг 9.1. Файл two_jobs.wsf
Для того чтобы запустить конкретное задание из многозадачного WS-файла, нужно воспользоваться параметром //job:"JobID" в командной строке WSH. Например, следующая команда:
cscript //job:"Task1" two_jobs.wsf
запускает с помощью cscript.exe задание с именем "Task1" из файла two_jobs.wsf.
Замечание
Если параметр //job не указан, то по умолчанию из многозадачного WS-файла запускается первое задание.
Если в WS-файле имеется несколько заданий, то они должны находиться внутри элемента <package>. Элемент <job> является одним из двух обязательных элементов в сценариях WSH с разметкой XML.
Элемент <runtime>
При запуске почти всех стандартных команд или утилит командной строки Windows с ключом /? на экран выводится встроенная справка, в которой кратко описываются назначение и синтаксис этой команды или утилиты. Хорошим тоном считается создание такой справки и для разрабатываемых сценариев WSH. Понятно, что добавление в сценарий функции вывода информации о назначении, синтаксисе и аргументах этого сценария потребовало бы написания довольно большого количества кода: необходимо следить за ключом /? в командной строке, а при добавлении нового параметра командной строки возникнет необходимость изменения функции, отвечающей за вывод информации на экран.
Элемент <runtime> позволяет сделать сценарий самодокументируемым, т. е. в этом случае при задании в командной строке ключа /? на экран будет автоматически выводиться информация об использовании сценария, о его синтаксисе и аргументах (именных и безымянных), а также пример запуска сценария с конкретными значениями аргументов.
При этом сам элемент <runtime> является лишь контейнером, а содержимое для вывода информации хранится в элементах <named> (описание именных параметров командной строки), <unnamed> (описание безымянных параметров командной строки), <description> (описание самого сценария) и <example> (пример запуска сценария), которые находятся внутри <runtime>.
Элемент <named>
С помощью элементов <named> можно описывать (документировать) именные параметры командной строки сценария. В табл. 9.2 приведено описание аргументов элемента <named>.
Аргумент | Описание |
---|---|
name | Задает имя параметра командной строки |
helpstring | Строка, содержащая описание параметра командной строки |
type | Определяет тип параметра командной строки. Может принимать значения "string" (символьный тип), "boolean" (логический тип), "simple" (в сценарий передается только имя параметра без дополнительного значения). По умолчанию используется тип "simple" |
required | Используется для того, чтобы показать, является ли параметр командной строки обязательным. Может принимать значения "true" (параметр нужно указывать обязательно) и "false" (параметр можно не указывать) |
Информация, которая указывается для объявляемого в элементе <named> параметра командной строки, используется только для самодокументируемости сценария и никак не влияет на реальные значения, которые будут указаны в командной строке при запуске сценария. Например, если параметр объявлен как обязательный ( required="true" ), но в действительности не был указан при запуске сценария, то никакой ошибки во время работы не произойдет.
Если для аргумента командной строки сценария указан тип "string", то предполагается, что этот аргумент имеет имя и значение, разделенные символом ":", например:
/Имя:"Андрей Попов" /Возраст:33
Если в качестве типа параметра командной строки используется "simple", то для этого параметра в командной строке указывается только его имя без значения:
/Имя /Возраст
Для того чтобы передать в сценарий аргумент командной строки типа "boolean", нужно после имени этого аргумента указать символ + (соответствует логическому значению "истина" ) или — (соответствует значению "ложь" ). Например:
/Запись+ /ReWrite–
В листинге 9.2 приведен сценарий named.wsf, в котором в блоке <runtime> описываются три именных аргумента командной строки:
- /Имя (обязательный аргумент символьного типа);
- /Компьютер (необязательный аргумент символьного типа);
- /Новый (обязательный аргумент логического типа).
После запуска с помощью wscript.exe в сценарии named.wsf сначала вызывается метод WScript.Arguments.Usage, в результате чего на экран выводится диалоговое окно с информацией о сценарии и параметрах командной строки. Затем в сценарии проверяется, какие именно аргументы командной строки были подставлены при запуске и выделяются значения этих аргументов. Для этого создается объект WshNamed, являющийся коллекцией именных аргументов командной строки, и используется метод Exists этого объекта.
Значением параметра /Новый является константа логического типа ( true или false ), поэтому для формирования строки, соответствующей этому значению, используется условный оператор языка JScript:
//Проверяем, существует ли аргумент /Новый if (objNamedArgs.Exists("Новый")) //Получаем с помощью условного оператора значение //логического аргумента /Новый s+="Новый пользователь: "+(objNamedArgs("Новый") ? "Да" : "Нет");
<job id="Named"> <runtime> <description> Имя: named.wsf </description> <named name="Имя" helpstring="Имя пользователя" type="string" required="true" /> <named name="Компьютер" helpstring="Имя рабочей станции" type="string" required="false" /> <named name="Новый" helpstring="Признак того, что такого пользователя раньше не было" type="boolean" required="true" /> </runtime> <script language="JScript"> var objNamedArgs,s; //Вызываем метод ShowUsage для вывода на экран описания сценария WScript.Arguments.ShowUsage(); //Создаем объект WshNamed — коллекция именных аргументов сценария objNamedArgs= WScript.Arguments.Named; s=""; //Проверяем, существует ли аргумент /Имя: if (objNamedArgs.Exists("Имя")) //Получаем значение символьного аргумента /Имя s+="Имя: "+objNamedArgs("Имя")+"\n"; //Проверяем, существует ли аргумент /Компьютер: if (objNamedArgs.Exists("Компьютер")) //Получаем значение символьного аргумента /Компьютер s+="Машина: "+objNamedArgs("Компьютер")+"\n"; //Проверяем, существует ли аргумент /Новый if (objNamedArgs.Exists("Новый")) //Получаем с помощью условного оператора значение //логического аргумента /Новый s+="Новый пользователь: "+(objNamedArgs("Новый") ? "Да" : "Нет"); //Выводим полученные строки на экран WScript.Echo(s); </script> </job>Листинг 9.2. Файл named.wsf
Элемент <unnamed>
С помощью элементов <unnamed> можно описывать (документировать) безымянные параметры командной строки сценария. В табл. 9.3 приведено описание аргументов элемента <unnamed>.
Аргумент | Описание |
---|---|
name | Задает имя, которое будет указано для описываемого параметра командной строки при выводе информации о сценарии |
helpstring | Строка, содержащая описание параметра командной строки |
many | Определяет, сколько раз может быть указан безымянный параметр в командной строке. Значение, равное "true" (используется по умолчанию), означает, что безымянный параметр может встретиться в командной строке более одного раза. Значение, равное "false", означает, что безымянный параметр должен быть указан только один раз |
required | Определяет, является ли безымянный параметр командной строки обязательным. Может принимать значения "true", "on" или 1 (параметр нужно указывать обязательно), "false", "off" или 0 (параметр можно не указывать). Также значением аргумента "required" может быть целое число, которое показывает, сколько раз безымянный параметр должен обязательно быть указан в командной строке |
Информация, которая указывается для объявляемого в элементе <unnamed> параметра командной строки, используется, как и в случае элемента <named>, только для самодокументируемости сценария и никак не влияет на реальные значения, которые будут указаны в командной строке при запуске сценария. Например, если безымянный параметр объявлен как обязательный ( required="true" ), но в действительности не был указан при запуске сценария, то никакой ошибки во время работы не произойдет.
Рассмотрим в качестве примера сценарий unnamed.wsf, в который в качестве параметров командной строки должны передаваться расширения файлов, причем обязательно должны быть указаны хотя бы два таких расширения (листинг 9.3).
Для создания информации об использовании этого сценарии создается элемент <unnamed> следующего вида:
<unnamed name="Расш" helpstring="Расширения файлов" many="true" required=2 />
После запуска с помощью wscript.exe в сценарии unnamed.wsf сначала вызывается метод WScript.Arguments.Usage, в результате чего на экран выводится диалоговое окно с информацией о сценарии и параметрах командной строки. Затем в сценарии создается коллекция objUnnamedArgs (объект WshUnnamed ), которая содержит все безымянные аргументы командной строки, реально переданные в сценарий:
objUnnamedArgs=WScript.Arguments.Unnamed; //Создаем объект WshUnnamed
После этого определяется общее число реально переданных в сценарий параметров командной строки (свойство length ) и в цикле while организуется перебор всех элементов коллекции objUnnamedArgs.
<job id="Unnamed"> <runtime> <description> Имя: unnamed.wsf </description> <unnamed name="Расш" helpstring="Расширения файлов" many="true" required=2 /> </runtime> <script language="JScript"> var objUnnamedArgs,s; //Вызываем метод ShowUsage для вывода на экран описания сценария WScript.Arguments.ShowUsage(); objUnnamedArgs=WScript.Arguments.Unnamed; //Создаем объект WshUnnamed //Определяем количество безымянных аргументов s="Передано в сценарий безымянных аргументов: "+objUnnamedArgs.length; for (i=0; i<=objUnnamedArgs.length-1; i++) //Формируем строки со значениями безымянных аргументов s+="\n"+objUnnamedArgs(i); //Выводим полученные строки на экран WScript.Echo(s); </script> </job>Листинг 9.3. Файл unnamed.wsf