Глава 1 первое знакомство с windows script host / windows script host для windows 2000/xp
В ранних версиях Windows стандартным средством для автоматизации однотипных повторяющихся задач служили командные (пакетные) файлы и утилиты пакета Resource Kit для соответствующей версии. Однако даже с помощью имеющегося в Windows NT/2000/XP усовершенствованного командного интерпретатора cmd.exe трудно написать какую-либо сложную программу-сценарий (script): отсутствует полноценная интерактивность, нельзя напрямую работать с рабочим столом Windows и системным реестром и т.д.
Для исправления этой ситуации компанией Microsoft был разработан сервер сценариев WSH — Windows Script Host, с помощью которого можно выполнять сценарии, написанные, в принципе, на любом языке (при условии, что для этого языка установлен соответствующий модуль (scripting engine), поддерживающий технологию ActiveX Scripting). В качестве стандартных языков поддерживаются Visual Basic Script Edition (VBScript) и JScript.
Вообще говоря, принцип работы сценариев, поддерживаемых WSH, состоит в использовании объектов ActiveX, поэтому вначале мы очень кратко опишем возможности самой технологии ActiveX компании Microsoft.
Напомним, что в Windows с самого начала для обеспечения обмена данными между приложениями была разработана технология связывания и внедрения объектов (OLE, Object Linking and Embedding). Вначале технология OLE использовалась для создания составных документов, а затем для решения более общей задачи — предоставления приложениями друг другу собственных функций (служб) и правильного использования этих функций. Технология, позволяющая одному приложению (клиенту автоматизации), вызывать функции другого приложения (сервера автоматизации), была названа OLE Automation. В основе OLE и OLE Automation лежит разработанная Microsoft базовая “компонентная” технология COM (Component Object Model).
В общих словах, компонентное программное обеспечение — это способ разработки программ, при котором используются технологии создания программных модулей, подобные технологиям, применяемым для разработки аппаратных средств. Сложные элементные схемы собираются из стандартизированных микросхем, которые имеют четко определенные документированные функции. Разработчик может эффективно пользоваться такими микросхемами, не задумываясь об их внутренней структуре. В программных компонентах, написанных на каком-либо языке программирования, детали реализации используемых алгоритмов также скрыты внутри компонента (объекта), а на поверхности находятся общедоступные интерфейсы, которыми могут пользоваться и другие приложения, написанные на том же или другом языке.
В настоящее время, по заявлению Microsoft, термин OLE используется только по историческим причинам. Вместо него Microsoft с 1996 года применяет новый термин — ActiveX, первоначально обозначавший WWW (World Wide Web) компоненты (объекты), созданные на базе технологии СОМ.
Технология ActiveX до последнего времени являлась ключевой в продуктах Microsoft. Наиболее полное воплощение она нашла в программах Microsoft Office, Internet Explorer, IIS (Internet Information Service). В эти продукты для управления соответствующими объектами автоматизации были встроены интерпретаторы специальных языков сценариев: VBScript (используется в Microsoft Office, Internet Explorer, IIS) и JScript (используется в Internet Explorer, IIS). Однако непосредственно в операционной системе, вне этих продуктов, выполнять сценарии, написанные на VBScript или JScript, было нельзя.
Сервер сценариев WSH является мощным инструментом, предоставляющим единый интерфейс (объектную модель) для специализированных языков (VBScript, JScript, PerlScript, REXX, TCL, Python и т.п.), которые, в свою очередь, позволяют использовать любые внешние объекты ActiveX. С помощью WSH сценарии могут быть выполнены непосредственно в операционной системе Windows, без встраивания в HTML-страницы.
Скажем несколько слов относительно нумерации версий WSH. Самая первая версия WSH, входившая в качестве стандартного компонента в Windows 98, имела номер 1.0. С другой стороны, эта версия опиралась на языки сценариев JScript и VBScript версии 5.0, которые поддерживались Internet Explorer 5.0, поэтому можно к самой первой версии WSH относиться и как к WSH 5.0. Следующей версии WSH, входившей в поставку Windows 2000, был присвоен номер 2.0; в этой версии использовались языки JScript и VBScript версии 5.1. Наконец, номер последней версии WSH, являющейся неотъемлемой частью Windows ХР, компания Microsoft решила все же привязать к номеру версии языков JScript и VBScript — таким образом появился сервер сценариев WSH 5.6.
Отметим также, что даже сама аббревиатура “WSH” сначала расшифровывалась Microsoft как “Windows Scripting Host”, а затем было принято название “Windows Script Host”.
Замечание
Несмотря на то, что WSH 5.6 является стандартной частью Windows ХР, эту версию можно также установить и использовать во всех предыдущих 32-разрядных версиях Windows 95/98/ME/NT/2000. Для этого необходимо скачать инсталляционный файл для WSH 5.6 с сервера Microsoft (http://msdn.microsoft.com/scripting); там же можно найти и документацию по WSH 5.6.
WSH предъявляет минимальные требования к объему оперативной памяти и является очень удобным инструментом для автоматизации повседневных задач пользователей и администраторов операционной системы Windows. Используя сценарии WSH, можно непосредственно работать с файловой системой компьютера, а также управлять работой других приложений (серверов автоматизации). При этом возможности сценариев ограничены только средствами, которые предоставляют доступные серверы автоматизации.
Перечислим только наиболее очевидные задачи, для автоматизации которых прекрасно подходят сценарии WSH.
? Организация резервного копирования на сетевой сервер файлов с локальной машины, которые отбираются по какому-либо критерию.
? Быстрое изменение конфигурации рабочего стола Windows в зависимости от задач, выполняемых пользователем.
? Автоматический запуск программ Microsoft Office, создание там сложных составных документов, распечатка этих документов и закрытие приложений.
? Управление работой приложений, не являющихся серверами автоматизации, с помощью посылки в эти приложения нажатий клавиш.
? Подключение и отключение сетевых ресурсов (дисков и принтеров).
? Создание сложных сценариев регистрации для пользователей.
? Выполнение задач администрирования локальной сети (например, добавление или удаление пользователей).
Простейший WSH-сценарий, написанный на языке JScript или VBScript, — это обычный текстовый файл с расширением js или vbs соответственно, создать его можно в любом текстовом редакторе, способном сохранять документы в формате “Только текст”.
Замечание
Специальные мощные программы, позволяющие создавать и отлаживать сценарии, описаны в приложении 3.
Размер сценария может изменяться от одной до тысяч строк, предельный размер ограничивается лишь максимальным размером файла в соответствующей файловой системе.
В качестве первого примера создадим JScript-сценарий, выводящий на экран диалоговое окно с надписью “Привет!” (рис. 1.1).
Рис. 1.1. Простое диалоговое окно
Для вывода такого окна достаточно с помощью, например, стандартного Блокнота Windows (notepad.exe) создать файл First.js, содержащий всего одну строку:
WScript.Echo(“Привет!”);
Тот же самый сценарий на языке VBScript, естественно, отличается синтаксисом и выглядит следующим образом:
WScript.Echo “Привет!”
Несмотря на то, что для работы наших сценариев достаточно всего одной строки, желательно сразу приучить себя к добавлению в начало файла информации о находящемся в нем сценарии: имя файла, используемый язык, краткое описание выполняемых действий. На языке JScript такая информация, оформленная в вице комментариев, может выглядеть следующим образом:
/*******************************************************************//* Имя: First.js *//* Язык: JScript *//* Описание: ВЫВОД на экран приветствия *//*******************************************************************/
Рис. 1.2. Сценарий First.js
На языке VBScript то же самое выглядит следующим образом:
‘*******************************************************************‘ Имя: First.vbs‘ Язык: VBScript‘ Описание: Вывод на экран приветствия‘*******************************************************************
Для запуска сценариев WSH существует несколько способов.
Можно выполнить сценарий из командной строки с помощью консольной версии WSH cscript.exe. Например, чтобы запустить сценарий, записанный в файле C:ScriptFirst.js, нужно загрузить командное окно и выполнить в нем команду
cscript С:ScriptFirst.js
В результате выполнения этого сценария в командное окно выведется строка “Привет!” (рис. 1.3).
Рис. 1.3. Результат выполнения First.js в консольном режиме (cscript.exe)
Сценарий можно выполнить из командной строки с помощью (оконной) графической версии WSH wscript.exe. Для нашего примера в этом случае нужно выполнить команду
wscript C:ScriptFirst.js
Тогда в результате выполнения сценария на экране появится нужное нам диалоговое окно (рис. 1.4).
Таким образом, мы видим, что при запуске сценария в консольном режиме вывод текстовой информации происходит в стандартный выходной поток (на экран), при запуске в графическом режиме — в диалоговое окно.
Рис. 1.4. Результат выполнения First.js в графическом режиме (wscript.exe)
Для запуска сценария с помощью пункта Выполнить (Run) меню Пуск (Start), достаточно написать полное имя этого сценария в поле Открыть (Open) (рис. 1.5).
Рис. 1.5. Запуск сценария из меню Пуск в Windows ХР
В этом случае по умолчанию сценарий будет выполнен с помощью wscript.exe, т.е. вывод информации будет вестись в графическое диалоговое окно.
Самым простым является запуск сценария в окнах Проводника Windows или на рабочем столе — достаточно просто выполнить двойной щелчок мышью на имени файла со сценарием или на его значке (рис. 1.6).
Рис. 1.6. Запуск сценария с помощью Проводника Windows
При этом, как и в случае запуска с помощью меню Пуск (Start), сценарий по умолчанию выполняется с помощью wscript.exe.
В случае необходимости для сценариев можно задавать различные параметры, влияющие на ход их выполнения. Для консольной (cscript.exe) и графической (wscript.exe) версий сервера сценариев эти параметры задаются по-разному.
В этом случае исполнение сценария контролируется с помощью параметров командной строки для cscript.exe (табл. 1.1), которые включают или отключают различные опции WSH (все эти параметры начинаются с символов //).
Таблица 1.1. Параметры командной строки cscript.exe
Например, команда
cscript //Nologo C:ScriptFirst.js
запустит сценарий First.js без информации о версии WSH (рис. 1.7).
Сценарий можно запускать с параметрами командной строки, которые указываются после имени этого сценария (процедура обработки таких параметров будет описана ниже, при рассмотрении объектов
WshArguments, WshNamed и WshUnnamed). Например, командаcscript //В C:ScriptFirst.js /а /b
запустит сценарий First.js в пакетном режиме, при этом
/а и /b будут являться параметрами этого сценария, а //B — параметром приложения cscript.exe.
Рис. 1.7. Результат выполнения First.js в консольном режиме без информации о версии WSH
При использовании для запуска модуля wscript.exe свойства сценария можно устанавливать с помощью вкладки Сценарий (Script) диалогового окна, задающего свойства файла в Windows (рис. 1.8).
После задания свойств сценария автоматически создается файл с именем этого сценария и расширением wsh, который имеет структуру наподобие ini-файла, например:
[ScriptFile]Path=C:ScriptFirst.js[Options]Timeout=0DisplayLogo=1
Если дважды щелкнуть в Проводнике Windows по wsh-файлу или запустить такой файл из командной строки, то соответствующий сервер сценариев (wscript.exe или cscript.exe) запустит сценарий, которому соответствует wsh- файл, с заданными в секции Options параметрами.
Замечание
Если wsh-фaйл не запускается, нужно проверить наличие на диске файла, указанного в секции ScriptFile.
Рис. 1.8. Установка свойств сценария First.js
При запуске сценариев с помощью wscript.exe для задания параметров командной строки сценария можно использовать технологию drag-and-drop — если выделить в Проводнике Windows несколько файлов и перетащить их на ярлык сценария, то этот сценарий запустится, а имена выделенных файлов передадутся ему в качестве параметров.
Перейдем теперь к описанию собственной объектной модели WSH 5.6. С помощью внутренних объектов этой версии WSH из сценариев можно выполнять следующие основные задачи:
? выводить информацию в стандартный выходной поток (на экран) или в диалоговое окно Windows;
? читать данные из стандартного входного потока (т. е. вводить данные с клавиатуры) или использовать информацию, выводимую другой командой;
? использовать свойства и методы внешних объектов, а также обрабатывать события, которые генерируются этими объектами;
? запускать новые независимые процессы или активизировать уже имеющиеся;
? запускать дочерние процессы с возможностью контроля их состояния и доступа к их стандартным входным и выходным потокам;
? работать с локальной сетью: определять имя зарегистрировавшегося пользователя, подключать сетевые диски и принтеры;
? просматривать и изменять переменные среды;
? получать доступ к специальным папкам Windows;
? создавать ярлыки Windows;
? работать с системным реестром.
В WSH 5.6 входят перечисленные ниже объекты:
?
WScript. Это главный объект WSH, который служит для создания других объектов или связи с ними, содержит сведения о сервере сценариев, а также позволяет вводить данные с клавиатуры и выводить информацию на экран или в окно Windows.
?
WshArguments. Обеспечивает доступ ко всем параметрам командной строки запущенного сценария или ярлыка Windows.
?
WshNamed. Обеспечивает доступ к именным параметрам командной строки запущенного сценария.
?
WshUnnamed. Обеспечивает доступ к безымянным параметрам командной строки запущенного сценария.
?
WshShell. Позволяет запускать независимые процессы, создавать ярлыки, работать с переменными среды, системным реестром и специальными папками Windows.
?
WshSpecialFolders. Обеспечивает доступ к специальным папкам Windows.
?
WshShortcut. Позволяет работать с ярлыками Windows.
?
WshUrlShortcut. Предназначен для работы с ярлыками сетевых ресурсов.
?
WshEnvironment. Предназначен для просмотра, изменения и удаления переменных среды.
?
WshNetwork. Используется при работе с локальной сетью: содержит сетевую информацию для локального компьютера, позволяет подключать сетевые диски и принтеры.
?
WshScriptExec. Позволяет запускать консольные приложения в качестве дочерних процессов, обеспечивает контроль состояния этих приложений и доступ к их стандартным входным и выходным потокам.
?
WshController. Позволяет запускать сценарии на удаленных машинах.
?
WshRemote. Позволяет управлять сценарием, запущенным на удаленной машине.
?
WshRemoteError. Используется для получения информации об ошибке, возникшей в результате выполнения сценария, запущенного на удаленной машине.
Кроме этого, имеется объект FileSystemObject, обеспечивающий доступ к файловой системе компьютера (этот объект будет подробно описан в главе 5).
Перейдем теперь к рассмотрению свойств и методов внутренних объектов WSH.
Замечание
Примеры всех сценариев, приведенных далее в этой главе, написаны на JScript. Так как эти сценарии только иллюстрируют свойства и методы WSH и не используют особенностей, характерных только для JScript, перевод их на VBScript не представляет никакого труда.
Свойства объекта
WScript позволяют получить полный путь к использующемуся серверу сценариев (wscript.exe или cscript.exe), параметры командной строки, с которыми запущен сценарий, режим его работы (интерактивный или пакетный). Кроме этого, с помощью свойств объекта WScript можно выводить информацию в стандартный выходной поток и читать данные из стандартного входного потока. Также WScript предоставляет методы для работы внутри сценария с объектами автоматизации и вывода информации на экран (в текстовом режиме) или в окно Windows.
Отметим, что в сценарии WSH объект
WScript можно использовать сразу, без какого-либо предварительного описания или создания, т. к. его экземпляр создается сервером сценариев автоматически. Для использования же всех остальных объектов нужно применять либо метод CreateObject, либо определенное свойство другого объекта.
Свойства объекта
WScript представлены в табл. 1.2.
Таблица 1.2. Свойства объекта WScript
Опишем более подробно те свойства объекта WScript, которые требуют дополнительных пояснений.
В следующем примере (листинг 1.1) с помощью цикла for на экран выводятся все параметры командной строки, с которыми был запущен сценарий.
Листинг 1.1. Вывод на экран всех параметров сценария/*******************************************************************//* Имя: ShowArgs.js *//* Язык: JScript *//* Описание: Вывод на экран параметров запущенного сценария *//*******************************************************************/var i, objArgs;objArgs = WScript.Arguments; //Создаем объект WshArgumentsfor (i=0; i<=objArgs.Count()-1; i ) WScript.Echo(objArgs(i)); //Выводим на экран i-й аргумент/************* Конец *********************************************/
Другие примеры работы с аргументами командной строки приведены в листингах 1.4, 1.5, 2.22 и 2.23.
Доступ к стандартным входным и выходным потокам с помощью свойств
StdIn, StdOut и StdErr можно получить только в том случае, если сценарий запускался в консольном режиме с помощью cscript.exe. Если сценарий был запущен с помощью wscript.exe, то при попытке обратиться к этим свойствам возникнет ошибка “Invalid Handle” (рис. 1.9).
Рис. 1.9. Ошибка при обращении к
StdIn в графическом режиме
Работать с потоками
StdOut и StdErr можно с помощью методов Write, WriteLine, WriteBlankLines, а с потоком StdIn — с помощью методов Read, ReadLine, ReadAll, Skip, SkipLine. Эти методы кратко описаны в табл. 1.3.
Таблица 1.3. Методы для работы с потоками
Напомним, что операционная система Windows поддерживает механизм конвейеризации (символ “|” в командной строке). Этот механизм делает возможным передачу данных от одной программы к другой. Таким образом, используя стандартные входные и выходные потоки, можно из сценария обрабатывать строки вывода другого приложения или перенаправлять выводимые сценарием данные на вход программ-фильтров (
FIND или SORT). Например, следующая команда будет сортировать строки вывода сценария example.js и выводить их в файл sort.txt:cscript //Nologo example.js | sort > sort.txt
Опция //Nologo здесь нужна для того, чтобы в файл sort.txt не попадали строки с информацией о разработчике и номере версии WSH.
Кроме этого, с помощью методов, работающих с входным потоком StdIn, можно организовывать диалог с пользователем, т. е. создавать интерактивные сценарии. Пример такого сценария представлен в листинге 1.2.
Листинг 1.2. Пример интерактивного сценария/*******************************************************************//* Имя: Interact.js *//* Язык: JScript *//* Описание: Ввод/вывод строк в консольном режиме *//*******************************************************************/var s;//Выводим строку на экранWScript.StdOut.Write(“Введите число: “);//Считываем строкуs = WScript.StdIn.ReadLine();//Выводим строку на экранWScript.StdOut.WriteLine(“Вы ввели число ” s);/************* Конец *********************************************/
Объект
WScript имеет несколько методов, которые описаны в табл. 1.4.
Таблица 1.4. Методы объекта WScript
Метод | Описание |
---|---|
CreateObject(strProgID [, strPrefix]) | Создает объект, заданный параметром strProgID |
ConnectObject(strObject, strPrefix) | Устанавливает соединение с объектом strObject, позволяющее писать функции-обработчики его событий (имена этих функций должны начинаться с префикса strPrefix) |
DisconnectObject(obj) | Отсоединяет объект obj, связь с которым была предварительно установлена в сценарии |
Echo([Arg1] [, Arg2] [,…]) | Выводит текстовую информацию на консоль или в диалоговое окно |
GetObject(strPathname [, strProgID], [strPrefix]) | Активизирует объект автоматизации, определяемый заданным файлом (параметр strPathName), или объект, заданный параметром strProgID |
Quit([intErrorCode]) | Прерывает выполнение сценария с заданным параметром intErrorCode кодом выхода. Если параметр intErrorCode не задан, то объект WScript установит код выхода равным нулю |
Sleep(intTime) | Приостанавливает выполнения сценария (переводит его в неактивное состояние) на заданное параметром intTime число миллисекунд |
Приведем дополнительные пояснения и примеры использования для методов, приведенных в табл. 1.4.
Строковый параметр strProgID, указываемый в методе
CreateObject, называется программным идентификатором объекта (Programmic Identifier, ProgID).
Если указан необязательный параметр strPrefix, то после создания объекта в сценарии можно обрабатывать события, возникающие в этом объекте (естественно, если объект предоставляет интерфейсы для связи с этими событиями). Когда объект сообщает о возникновении определенного события, сервер сценариев вызывает функцию, имя которой состоит из префикса strPrefix и имени этого события. Например, если в качестве strPrefix указано “
MYOBJ_“, а объект сообщает о возникновении события “OnBegin“, то будет запущена функция “MYOBJ_OnBegin“, которая должна быть описана в сценарии.
В следующем примере метод
CreateObject используется для создания объекта WshNetwork:var WshNetwork = WScript.Createobject(“WScript.Network”);
Отметим, что объекты автоматизации из сценариев можно создавать и без помощи WSH. В JScript для этого используется объект
ActiveXObject, например:var WshNetwork = new ActiveXObject(“WScript.Network”);
В VBscript для создания объектов может использоваться специальная функция
CreateObject, например:Set WshNetwork = CreateObject(“WScript.Network”)
Однако организовать в сценарии обработку событий создаваемого объекта можно только при использовании метода
WScript.CreateObject.
Объект, соединение с которым осуществляется с помощью метода
ConnectObject, должен предоставлять интерфейс к своим событиям.
В следующем примере в переменной
MyObject создается абстрактный объект “SomeObject“, затем из сценария вызывается метод SomeMetod этого объекта. После этого устанавливается связь с переменной MyObject и задается префикс “MyEvent” для процедур обработки события этого объекта. Если в объекте возникнет событие с именем “Event“, то будет вызвана функция MyEvent_Event. Метод DisconnectObject объекта WScript производит отсоединение объекта MyObject.var MyObject = WScript.CreateObject(“SomeObject”);MyObject.SomeMethod();WScript.ConnectObject(MyObject, “MyEvent”);
function MyEvent_Event(strName) { WScript.Echo(strName);}WScript.DisconnectObject(MyObject);
Если соединения с объектом obj не было установлено, то метод
DisconnectObject(obj) не будет производить никаких действий. Пример применения DisconnectObject был приведен выше.
Параметры Arg1, Arg2 задают аргументы для вывода. Если сценарий был запущен с помощью wscript.exe, то метод
Echo направляет вывод в диалоговое окно, если же для выполнения сценария применяется cscript.exe, то вывод будет направлен на экран (консоль). Каждый из аргументов при выводе будет разделен пробелом. В случае использования cscript.exe вывод всех аргументов будет завершен символом новой строки. Если в методе Echo не задан ни один аргумент, то будет напечатана пустая строка.
Например, после выполнения сценария EchoExample.js (листинг 1.3) с помощью cscript.exe на экран будут выведены пустая строка, три числа и строка текста (рис. 1.10).
Листинг 1.3. Сценарий EchoExample.js/*******************************************************************//* Имя: EchoExample.js *//* Язык: JScript *//* Описание: Использование метода WScript.Echo *//*******************************************************************/WScript.Echo(); //Выводим пустую строкуWScript.Echo(1,2,3); //Выводим числаWScript.Echo(“Привет!”); //Выводим строку/************* Конец *********************************************/
Рис. 1.10. Вывод информации с помощью метода Echo
Другие примеры использования метода
Echo приведены в главе 2 (см. листинги 2.1, 2.2, 2.4 и 2.5).
В следующем примере сценарий переводится в неактивное состояние на 5 секунд:
WScript.Echo(“Сценарий запущен, отдыхаем…”);WScript.Sleep(5000);WScript.Echo(“Выполнение завершено”);
Метод
Sleep необходимо применять при асинхронной работе сценария и какой-либо другой задачи, например, при имитации нажатий клавиш в активном окне с помощью метода WshShell.SendKeys (см. листинги 1.13, 2.31, 2.32).
В WSH входят объекты, с помощью которых можно получить доступ к коллекциям, содержащим следующие элементы:
? параметры командной строки запущенного сценария или ярлыка Windows (объекты
WshArguments, WshNamed и WshUnnamed);
? значения переменных среды (объект
WshEnvironment);
? пути к специальным папкам Windows (объект
WshSpecialFolders).
Объект
WshArguments содержит коллекцию всех параметров командной строки запущенного сценария или ярлыка Windows. Этот объект можно создать только с помощью свойства Arguments объектов WScript и WshShortcut.
В принципе, работать с элементами коллекции
WshArguments можно стандартным для JScript образом — создать объект Enumerator и использовать его методы moveNext, item и atEnd. Например, вывести на экран все параметры командной строки, с которыми запущен сценарий, можно следующим образом (листинг 1.4).Листинг 1.4. Вывод всех параметров сценария (стандартные коллекции JScript)/********************************************************************//* Имя: EnumArgs.js *//* Язык: JScript *//* Описание: Вывод на экран параметров запущенного сценария *//********************************************************************/var objArgs, e, x;objArgs = WScript.Arguments; //Создаем объект WshArguments//Создаем объект Enumerator для коллекции objArgse = new Enumerator(objArgs);for (;!e.atEnd();e.moveNext()) { x = e.item(); //Получаем значение элемента коллекции WScript.Echo(x); //Выводим значение параметра на экран}/************* Конец *********************************************/
Однако намного удобнее использовать методы
Count и Item самого объекта WshArguments (метод Item имеется у всех коллекций WSH). Метод Count возвращает число элементов в коллекции, т. е. количество аргументов командной строки, а метод Item(n) — значение n-го элемента коллекции (нумерация начинается с нуля). Более того, чтобы получить значение отдельного элемента коллекции WshArguments, можно просто указать его индекс в круглых скобках после имени объекта.Замечание
Число элементов в коллекции хранится и в свойстве
Length объекта WshArguments.
Таким образом, предыдущий пример можно переписать более компактным образом (листинг 1.5).
Листинг 1.5. Вывод всех параметров сценария (методы WSH)/*******************************************************************//* Имя: ShowArgs.js *//* Язык: JScript *//* Описание: Вывод на экран параметров запущенного сценария *//*******************************************************************/var i, objArgs;objArgs = WScript.Arguments; //Создаем объект WshArgumentsfor (i=0; i<=objArgs.Count()-1; i ) WScript.Echo(objArgs(i)); //Выводим на экран i-й аргумент/************* Конец *********************************************/
С помощью объекта
WshArguments можно также выделять и отдельно обрабатывать аргументы сценария, у которых имеются имена (например, /Name:Andrey) и безымянные аргументы. Ясно, что использование именных параметров более удобно, т. к. в этом случае нет необходимости запоминать, в каком порядке должны быть записаны параметры при запуске того или иного сценария.
Для доступа к именным и безымянным аргументам используются соответственно два специальных свойства объекта
WshArguments: Named и Unnamed.
Свойство
Named содержит ссылку на коллекцию WshNamed, свойство Unnamed — на коллекцию WshUnnamed.
Таким образом, обрабатывать параметры командной строки запущенного сценария можно тремя способами:
? просматривать полный набор всех параметров (как именных, так и безымянных) с помощью коллекции
WshArguments;
? выделить только те параметры, у которых есть имена (именные параметры) с помощью коллекции
WshNamed;
? выделить только те параметры, у которых нет имен (безымянные параметры) с помощью коллекции
WshUnnamed.
У объекта
WshArguments имеется еще один метод ShowUsage. Этот метод служит для вывода на экран информации о запущенном сценарии (описание аргументов командной строки, пример запуска сценария и т.д.). В свою очередь, подобную информацию можно задать только при использовании WSH-сценариев с разметкой XML; более подробно о применении метода ShowUsage идет речь в главе 3 при рассмотрении элементов <runtime>, <description>, <example>, <named> и <unnamed>.
Объект
WshNamed содержит коллекцию параметров командной строки запущенного сценария, у которых имеется уникальное имя (именные параметры). В WSH 5.6 именной параметр всегда начинается с символа “/”, после чего приводится имя этого параметра, затем ставится двоеточие “:” и пишется значение параметра, например:/Name:Andrey
В качестве значения именного параметра рассматривается набор символов, начинающихся после двоеточия и заканчивающихся перед первым встретившимся пробелом. Для того чтобы значением параметра командной строки была строка, состоящая из нескольких слов, необходимо заключить эту строку в кавычки. Например:
/Name:”Andrey Popov”
Создается объект WshNamed с помощью свойства
Named коллекции WshArguments. Для того чтобы получить значение определенного аргумента, его имя используется в качестве индекса коллекции.Замечание
Узнать число именных параметров можно только с помощью свойства
Length коллекции WshNamed; метода Count у этой коллекции нет.
Например, пусть сценарий MyScript.js запущен с двумя именными параметрами:
MyScript.js /User:Andrey /Computer:Server1
Тогда вывести на экран значение параметров Name и Computer можно двумя способами:
var objNamedArgs;objNamedArgs=WScript.Arguments.Named;WScript.Echo(“Имя пользователя: ” objNamedArgs.Item(“User”));WScript.Echo(“Имя компьютера: ” objNamedArgs.Item (“Computer”));
или просто
var objNamedArgs;objNamedArgs=WScript.Arguments.Named;WScript.Echo(“Имя пользователя: ” objNamedArgs(“User”));WScript.Echo(“Имя компьютера: ” objNamedArgs(“Computer”));
Отметим также, что значением именного параметра, как и безымянного, может служить целая строка, состоящая из нескольких литералов и заключенная в кавычки, например:
MyScript.js /User:”Andrey Popov” /Computer:Server1
Тогда в результате выполнения в сценарии MyScript.js следующей строки:
WScript.Echo(“Имя пользователя: ” WScript.Arguments.Named(“User”));
на экран будет выведено
Имя пользователя: Andrey Popov
Для того чтобы узнать, был ли указан при запуске сценария тот или иной именной параметр, используется метод
Exists объекта WshNamed. Например,if (WScript.Arguments.Named.Exists(“User”)) WScript.Echo(“Имя пользователя: ” WScript.Arguments.Named(“User”));
Примеры, иллюстрирующие использование объекта WshNamed, приведены также в главе 2 (см. листинги 2.22 и 2.23).
В коллекции
WshUnnamed содержатся параметры командной строки запущенного сценария, у которых нет имени (безымянные параметры). Создается этот объект с помощью свойства Unnamed коллекции WshArguments. Для того чтобы получить значение определенного аргумента, его номер используется в качестве индекса коллекции (нумерация начинается с нуля).Замечание
Узнать число безымянных параметров можно только с помощью свойства
Length коллекции WshUnnamed; метода Count у этой коллекции нет.
Например, сценарий MyScript.js запущен с двумя безымянными параметрами:
MyScript.js “Andrey Popov” Server1
Тогда после выполнения в сценарии MyScript.js любого из следующих двух блоков:
var objUnnamedArgs;obUnnamedArgs=WScript.Arguments.Unnamed;WScript.Echo(“Имя пользователя: ” objUnnamedArgs.Item(0));WScript.Echo(“Имя компьютера: ” objUnnamedArgs.Item(1));
или
var objUnnamedArgs;obUnnamedArgs=WScript.Arguments.Unnamed;WScript.Echo(“Имя пользователя: ” objUnnamedArgs(0));WScript.Echo(“Имя компьютера: ” objUnnamedArgs(1));
на экран выведутся следующие строки:
Имя пользователя: Andrey PopovИмя компьютера: Server1
Примеры, иллюстрирующие использование объекта
WshUnnamed, приведены также в главе 2 (см. листинги 2.22 и 2.23).
Объект
WshEnvironment позволяет получить доступ к коллекции, содержащей переменные среды заданного типа (переменные среды операционной системы, переменные среды пользователя или переменные среды текущего командного окна). Этот объект можно создать с помощью свойства Environment объекта WshShell или одноименного его метода:var WshShell=WScript.Createobject(“WScript.Shell”), WshSysEnv=WshShell.Environment, WshUserEnv=WshShell.Environment(“User”);
Объект
WshEnvironment имеет свойство Length, в котором хранится число элементов в коллекции (количество переменных среды), и методы Count и Item. Для того чтобы получить значение определенной переменной среды, в качестве аргумента метода Item указывается имя этой переменной в двойных кавычках. В следующем примере мы выводим на экран значение переменной среды PATH:var WshShell=WScript.CreateObject(“WScript.Shell”), WshSysEnv=WshShell.Environment;WScript.Echo(“Системный путь:”, WshSysEnv.Item(“PATH”));
Можно также просто указать имя переменной в круглых скобках после имени объекта:
WScript.Echo(“Системный путь:”,WshSysEnv(“PATH”);
Кроме этого, у объекта WshEnvironment имеется метод Remove(strName), который удаляет заданную переменную среды. Например, в листинге 1.6 приведен сценарий, который удаляет две переменные (
EXAMPLE_1 и EXAMPLE_2) из окружения среды пользователя.Замечание
Если в окружении среды пользователя нет переменных с именами
EXAMPLE_1 и EXAMPLE_2, то при вызове метода Remove произойдет ошибка.Листинг 1.6. Удаление переменных среды/*******************************************************************//* Имя: RemEnv.js *//* Язык: JScript *//* Описание: Удаление двух переменных среды *//*******************************************************************///Создаем объект WshShellvar WshShell = WScript.CreateObject(“WScript.Shell”);//Создаем объект WshEnvironmentvar WshUsrEnv = WshShell.Environment(“User”);//Удаляем переменные средыWshUsrEnv.Remove(“EXAMPLE_1”);WshUsrEnv.Remove(“EXAMPLE_2”);/************* Конец *********************************************/
Объект
WshSpecialFolders обеспечивает доступ к коллекции, содержащей пути к специальным папкам Windows (например, к рабочему столу или к меню Пуск (Start)); задание путей к таким папкам может быть необходимо, например, для создания непосредственно из сценария ярлыков на рабочем столе.
В Windows 9х поддерживаются следующие имена специальных папок:
? Desktop;
? Favorites;
? Fonts;
? MyDocuments;
? NetHood;
? PrintHood;
? Programs;
? Recent;
? SendTo;
? StartMenu;
? Startup;
? Templates.
В Windows NT/2000/XP дополнительно можно получить доступ еще к четырем папкам, которые хранят данные для всех пользователей:
? AllUsersDesktop;
? AllUsersStartMenu;
? AllUsersPrograms;
? AllUsersStartup.
Объект
WshSpecialFolders создается c помощью свойства SpecialFolders объекта WshShell:var WshShell=WScript.CreateObject(“WScript.Shell”), WshSpecFold=WshShell.SpecialFolders;
Как и почти все коллекции WSH, объект
WshSpecialFolders имеет свойство Length и методы Count и Item. Доступ к отдельному элементу производится либо через имя соответствующей папки, либо через числовой индекс (Листинг 1.7).Листинг 1.7. Обработка коллекции WshSpecialFolders/*******************************************************************//* Имя: ShowSpecFold.js *//* Язык: JScript *//* Описание: Вывод на экран названий специальных папок Windows *//* (коллекция WshSpecialFolders) *//*******************************************************************/var WshShell, WshFldrs, i;//Создаем объект WshShellWshShell = WScript.CreateObject(“Wscript.Shell”);//Создаем объект WshSpecialFoldersWshFldrs = WshShell.SpecialFolders;WScript.Echo(“Некоторые специальные папки…”);//Выводим путь к папке DesktopWScript.Echo(“Desktop=” WshFldrs.item(“Desktop”));//Выводим путь к папке FavoritiesWScript.Echo(“Favorites=” WshFldrs(“Favorites”));//Выводим путь к папке ProgramsWScript.Echo(“Programs=” WshFldrs(“Programs”));WScript.Echo(“”);WScript.Echo(“Список всех специальных папок…”);for (i=0;i<= WshFldrs.Count()-1;i ){ //Выводим на экран i-й элемент коллекции WshFldrs WScript.Echo(WshFldrs(i));}/************* Конец *********************************************/
Другие примеры работы со специальными папками Windows приведены в главе 2 (см. листинги 2.39–2.42).
Для работы с локальной сетью и оболочкой Windows (специальные папки, переменные среды, системный реестр) предназначены соответственно объекты
WshNetwork и WshShell.
Объект
WshNetwork предназначен для работы с ресурсами локальной сети; с помощью методов этого объекта можно подключать и отключать сетевые диски и принтеры.
Объект
WshNetwork создается следующим образом:var objNet=WScript.CreateObject(“WScript.Network”);
Свойства данного объекта приведены в табл. 1.5.
Таблица 1.5. Свойства объекта WshNetwork
Листинг 1.8. Пример использования объекта WshNetwork/*******************************************************************//* Имя: ShowNetwork.js *//* Язык: JScript *//* Описание: Вывод на экран сетевого имени компьютера и имени *//* пользователя *//*******************************************************************/var objNet;//Создаем объект WshNetworkobjNet = WScript.CreateObject(“WScript.Network”);//Выводим на экран свойства ComputerName и UserNameWScript.Echo(“Имя машины:”,objNet.ComputerName);WScript.Echo(“Имя пользователя:”,objNet.UserName);/************* Конец *********************************************/
Методы объекта
WshNetwork описаны в табл. 1.6.
Таблица 1.6. Методы объекта WshNetwork
Метод | Описание |
---|---|
AddPrinterConnection(strLocalName, strRemoteName [ ,bUpdateProfile] [,strUser] [,strPassword]) | Подключает локальный порт компьютера к сетевому принтеру |
Для Windows NT/2000/XP: AddWindowsPrinterConnection(strPrnPath) Для Windows 9x: AddWindowsPrinterConnection(strPrnPath, strDriverName[, strPort]) | Регистрирует принтер в Windows и подключает его к сетевому ресурсу. В отличие от AddPrinterConnection, этот метод позволяет создать связь с сетевым принтером без явного перенаправления вывода в локальный порт |
EnumNetworkDrives() | Возвращает коллекцию, в которой хранятся буквы и сетевые пути ко всем подключенным сетевым дискам |
EnumPrinterConnections() | Возвращает коллекцию, в которой хранятся данные обо всех подключенных сетевых принтерах |
MapNetworkDrive(strLocalName, strRemoteName, [bUpdateProfile], [strUser], [strPassword]) | Подключает сетевой ресурсstrRemoteNameпод локальным именем диска strLocalName |
RemoveNetworkDrive(strName, [bForce], [bUpdateProfile]) | Отключает подключенный сетевой диск |
RemovePrinterConnection(strName, [bForce], [bUpdateProfile]) | Отключает подключенный сетевой принтер |
SetDefaultPrinter(strPrinterName) | Делает заданный сетевой принтер принтером по умолчанию |
Опишем методы из табл. 1.6 более подробно.
Если необязательный параметр bUpdateProfile равен
True, то создаваемое сетевое подключение будет сохранено в профиле пользователя.
Параметры strUser (имя пользователя) и strPassword (пароль) нужны в том случае, когда вы подключаете сетевой принтер от имени пользователя, которое отличается от имени текущего пользователя, зарегистрированного в системе.
В следующем примере метод
AddPrinterConnection применяется для подключения принтера с сетевым именем \Server1Epson к локальному порту LPT1:var WshNetwork = CreateObject(“WScript.Network”);WshNetwork.AddPrinterConnection(“LPT1”, “\Server1Epson”);
Параметр strDriverName указывает имя драйвера, необходимого для подключаемого принтера. Если принтер подключается в операционной системе Windows 9х, то нужный драйвер уже должен быть установлен на этой машине, иначе возникнет ошибка подключения. В Windows NT/2000/XP параметр strDriverName игнорируется.
Параметр strPort задает в явном виде порт, вывод в который будет перенаправлен на сетевой ресурс (по умолчанию это порт
LPT1). В Windows NT/2000/XP параметр strPort игнорируется.
В следующем примере метод
AddWindowsPrinterConnection применяется для подключения сетевого принтера к локальному порту LPT1 (по умолчанию):var WshNetwork=CreateObject(“WScript.Network”);PrinterPath=”\printservDefaultPrinter”;PrinterDriver=”Lexmark Optra S 1650″;WshNetwork.AddwindowsPrinterConnection(PrinterPath, PrinterDriver);
Элементами возвращаемой коллекции являются буквы, обозначающие имеющиеся сетевые диски и сетевые имена ресурсов, к которым эти диски подключены. Первым элементом коллекции является буква, вторым — сетевое имя; эта последовательность сохраняется для всех сетевых дисков в коллекции.
В следующем примере на экран выводятся буквы, обозначающие все сетевые диски и имена ресурсов, к которым они подключены (листинг 1.9).
Листинг 1.9. Пример использования метода EnumNetworkDrives/*******************************************************************//* Имя: ShowNetDrives.js *//* Язык: JScript *//* Описание: Вывод на экран букв сетевых дисков и имен *//* соответствующих ресурсов *//*******************************************************************/var WshNetwork,oDrives,i;//Создаем объект WshNetworkWshNetwork = WScript.CreateObject(“WScript.Network”);//Создаем коллекцию с информацией о сетевых дискахoDrives = WshNetwork.EnumNetworkDrives();for (i=0; i<=oDrives.Count()-1; i ) WScript.Echo(oDrives.Item(i)); //Вывод i-го элемента коллекции/************* Конец *********************************************/
Элементами возвращаемой коллекции являются названия локальных портов и сетевые имена принтеров, связанных с этими портами. Сама коллекция организована так же, как и коллекция, возвращаемая методом
EnumNetworkDrives.
В следующем примере на экран выводятся названия всех переназначенных портов и имена сетевых ресурсов, с которыми они связаны (листинг 1.10).
Листинг 1.10. Пример использования метода EnumPrinterConnections/*******************************************************************//* Имя: ShowNetPrn.js *//* Язык: JScript *//* Описание: Вывод на экран переназначенных портов и имен *//* соответствующих ресурсов *//*******************************************************************///Создаем объект WshNetworkvar WshNetwork = WScript.CreateObject(“WScript.Network”);//Создаем коллекцию с информацией о подключенных принтерахvar oPrinters = WshNetwork.EnumPrinterConnections();for (i=0; i<=oPrinters.Count()-1; i ) WScript.Echo(oPrinters.Item(i)); //Вывод i-го элемента коллекции/************* Конец *********************************************/
Если необязательный параметр bUpdateProfile равен
True, то создаваемое сетевое подключение будет сохранено в профиле пользователя.
Параметры strUser (имя пользователя) и strPassword (пароль) нужны в том случае, когда вы подключаете сетевой диск от имени пользователя, которое отличается от имени текущего пользователя, зарегистрированного в системе.
В следующем примере диск “
z” подключается к сетевому ресурсу \Server1Programs:var WshNetwork = WScript.CreateObject(“WScript.Network”);WshNetwork.MapNetworkDrive(“Z:”,”\Server1Programs”);
В качестве параметра strName может быть указано либо локальное имя (буква сетевого диска), либо сетевое имя (имя подключенного сетевого ресурса); это зависит от того, каким образом осуществлялось подключение. Если сетевому ресурсу сопоставлена буква локального диска, то параметр strName должен быть локальным именем. Если сетевому ресурсу не сопоставлена никакая буква, то параметр strName должен быть сетевым именем.
Если необязательный параметр bForce равен
True, то отключение сетевого ресурса будет произведено вне зависимости от того, используется этот ресурс в настоящее время или нет.
Если необязательный параметр bUpdateProfile равен
True, то отключаемое сетевое подключение будет удалено из профиля пользователя.
В следующем примере производится подключение диска “z” к сетевому ресурсу, а затем отключение этого ресурса (листинг 1.11).
Листинг 1.11. Пример подключения и отключения сетевого диска/*******************************************************************//* Имя: MapDrive.js *//* Язык: JScript *//* Описание: Подключение/отключение сетевого ресурса *//*******************************************************************///Создаем объект WshNetworkvar WshNetwork = WScript.CreateObject(“WScript.Network”);//Подключаем сетевой диск Z: к \Server1ProgramsWshNetwork.MapNetworkDrive(“Z:”,”\Server1Programs”);//Отключаем сетевой диск Z:WshNetwork.RemoveNetworkDrive(“Z:”);/************* Конец *********************************************/
В качестве параметра strName может быть указано либо локальное имя (название порта), либо сетевое имя (имя подключенного сетевого принтера); это зависит от того, каким образом осуществлялось подключение. Если сетевому ресурсу явным образом сопоставлен локальный порт (например, LPT1), то параметр strName должен быть локальным именем. Если сетевому принтеру не сопоставлен локальный порт, то параметр strName должен быть сетевым именем.
Параметры bForce и bUpdateProfile в этом методе имеют то же значение, что и одноимённые параметры в методе
RemoveNetworkDrive.
В следующем примере отключается сетевой принтер, который был назначен на порт
LPT1:var WshNetwork = WScript.CreateObject(“WScript.Network”);WshNetwork.RemovePrinterConnection(“LPT1:”);
Параметр strName задает сетевое имя принтера, который должен будет использоваться в системе по умолчанию.
В следующем примере с помощью метода
AddPrinterConnection к порту LPT1: подключается сетевой принтер \Server1Epson, который затем устанавливается принтером по умолчанию (листинг 1.12).Листинг 1.12. Пример использования метода SetDefaultPrinter/*******************************************************************//* Имя: DefPrn.js *//* Язык: JScript *//* Описание: Установка принтера по умолчанию *//*******************************************************************///Создаем объект WshNetworkvar WshNetwork = WScript.CreateObject(“WScript.Network”);//Подключаем к LPT1 сетевой принтер \Server1EpsonWshNetwork.AddPrinterConnection(“LPT1:”,”\Server1Epson”);//Устанавливаем принтер по умолчаниюWshNetwork.SetDefaultPrinter(“\Server1Epson”);/************* Конец *********************************************/
Другие примеры, иллюстрирующие использование объекта
WshNetwork, приведены в главе 2 (см. листинги 2.47–2.52).
С помощью объекта
WshShell можно запускать новый процесс, создавать ярлыки, работать с системным реестром, получать доступ к переменным среды и специальным папкам Windows. Создается этот объект следующим образом:var WshShell=WScript.CreateObject(“WScript.Shell”);
Объект
WshShell имеет три свойства, которые приведены в табл. 1.7.
Таблица 1.7. Свойства объекта WshShell
Опишем теперь методы, имеющиеся у объекта
WshShell (табл. 1.8).
Таблица 1.8. Методы объекта WshShell
Метод | Описание |
---|---|
AppActivate(title) | Активизирует заданное параметром title окно приложения. Строка title задает название окна (например, “calc” или “notepad”) или идентификатор процесса (ProcessID, PID) |
CreateShortcut(strPathname) | Создает объект WshShortcut для связи с ярлыком Windows (расширение lnk) или объект WshUrlShortcut для связи с сетевым ярлыком (расширение url). Параметр strPathname задает полный путь к создаваемому или изменяемому ярлыку |
Environment(strType) | Возвращает объект WshEnvironment, содержащий переменные среды заданного вида |
Exec(strCommand) | Создает новый дочерний процесс, который запускает консольное приложение, заданное параметром strCommand. В результате возвращается объект WshScriptExec, позволяющий контролировать ход выполнения запущенного приложения и обеспечивающий доступ к потокам StdIn, StdOut и StdErr этого приложения |
ExpandEnvironmentStrings(strString) | Возвращает значение переменной среды текущего командного окна, заданной строкой strString (имя переменной должно быть окружено знаками “%”) |
LogEvent(intType, strMessage [ ,strTarget]) | Протоколирует события в журнале Windows NT/2000/XP или в файле WSH.log. Целочисленный параметр intТуре определяет тип сообщения, строка strMessage — текст сообщения. Параметр strTarget может задаваться только в Windows NT/2000/XP, он определяет название системы, в которой протоколируются события (по умолчанию это локальная система). Метод LogEvent возвращает true, если событие записано успешно и false в противном случае |
Popup(strТехt, [nSecToWait] , [strTitle], [nType]) | Выводит на экран информационное окно с сообщением, заданным параметромstrText. Параметр nSecToWait задает количество секунд, по истечении которых окно будет автоматически закрыто, параметрstrTitle определяет заголовок окна, параметрnType указывает тип кнопок и значка для окна |
RegDelete(strName) | Удаляет из системного реестра заданный параметр или раздел целиком |
RegRead(strName) | Возвращает значение параметра реестра или значение по умолчанию для раздела реестра |
RegWrite(strName, anyValue [,strType]) | Записывает в реестр значение заданного параметра или значение по умолчанию для раздела |
Run(strCommand, [intWindowStyle], [bWaitOnReturn]) | Создает новый независимый процесс, который запускает приложение, заданное параметромstrCommand |
SendKeys(string) | Посылает одно или несколько нажатий клавиш в активное окно (эффект тот же, как если бы вы нажимали эти клавиши на клавиатуре) |
SpecialFolders(strSpecFolder) | Возвращает строку, содержащую путь к специальной папке Windows, заданной параметром strSpecFolder |
Рассмотрим методы, приведенные в табл. 1.8, более подробно.
Метод
AppActivate активизирует уже запущенное указанное приложение (устанавливает на него фокус), но не производит никаких действий по изменению размеров его окна. Для того чтобы первоначально запустить нужное приложение и определить вид его окна, следует использовать метод Run объекта WshShell. Для того чтобы определить, какое именно приложение необходимо активизировать, строка title сравнивается по очереди с названиями окон всех запущенных приложений. Если не найдено ни одного точного совпадения, будет производиться поиск того приложения, название окна которого начинается со строки title. Если и в этом случае не будет найдено ни одного подходящего приложения, то будет вестись поиск приложения, заголовок которого заканчивается на эту строку. Если будет найдено несколько подходящих окон, то произойдет активизация одного из них (окно выбирается произвольно).
В качестве примера использования метода
AppActivate в листинге 1.13 приведен сценарий RunCalc.js, который запускает стандартный калькулятор Windows и выполняет в нем несколько простых арифметических действий (для этого используется метод SendKeys).Листинг 1.13. Сценарий RunCalc.js/*****************************************************************//* Имя: RunCalc.js *//* Язык: JScript *//* Описание: Активизация приложения с помощью имени окна *//*****************************************************************///Создаем объект WshShellvar WshShell = WScript.CreateObject(“WScript.Shell”);//Запускаем КалькуляторWshShell.Run(“calc”);//Приостанавливаем сценарий на 0,1 секундыWScript.Sleep(100);//Активизируем КалькуляторWshShell.AppActivate(“Calculator”);//Приостановка сценария на 0,1 секундыWScript.Sleep(100);//Посылаем нажатия клавиш в КалькуляторWshShell.SendKeys(“1{ }”);WScript.Sleep(500);WshShell.SendKeys(“2”);WScript.Sleep(500);WshShell.SendKeys(“~”);WScript.Sleep(2500);/************* Конец *********************************************/
В главе 2 приведены другие примеры использования метода
AppActivate (см. листинги 2.31 и 2.32).
Этот метод позволяет создать новый или открыть уже существующий ярлык для изменения его свойств.
В листинге 1.14 приведен пример сценария, в котором создаются два ярлыка — на сам выполняемый сценарий (объект
oShellLink и на сетевой ресурс (oUrlLink). Листинг 1.14. Пример использования метода CreateShortcut/*****************************************************************//* Имя: MakeShortcuts.js *//* Язык: JScript *//* Описание: Создание ярлыков из сценария *//*****************************************************************/var WshShell,oShellLink,oUrlLink;//Создаем объект WshShellWshShell=WScript.CreateObject(“WScript.Shell”);//Создаем ярлык на файлoShellLink=WshShell.CreateShortcut(“Current Script.lnk”);//Устанавливаем путь к файлуoShellLink.TargetPath=WScript.ScriptFullName;//Сохраняем ярлыкoShellLink.Save();//Создаем ярлык на сетевой ресурсoUrlLink = WshShell.CreateShortcut(“Microsoft Web Site.URL”);//Устанавливаем URLoUrlLink.TargetPath = “http://www.microsoft.com”;//Сохраняем ярлыкoUrlLink.Save();/************* Конец *********************************************/
Примеры работы с ярлыками приведены в листингах 1.19–1.24, 2.43 и 2.44.
Параметр strType задает вид переменных среды, которые будут записаны в коллекции
WshEnvironment; возможными значениями этого параметра являются “System” (переменные среды операционной системы), “User” (переменные среды пользователя), “Volatile” (временные переменные) или “Process” (переменные среды текущего командного окна).Замечание
Для Windows 9х единственным допустимым значением параметра strType является “Process”.
В следующем примере мы распечатываем число процессоров, имеющихся в компьютере с операционной системой Windows NT/2000/XP (переменная
NUMBER_OF_PROCESSORS), и путь к каталогу Windows (листинг 1.15).Листинг 1.15. Печать значений переменных среды (объект WshShell.Environment)/*****************************************************************//* Имя: ShowEnvir.js *//* Язык: JScript *//* Описание: Получение значений некоторых переменных среды *//*****************************************************************/var WshShell,WshSysEnv;//Создаем объект WshShellWshShell = WScript.CreateObject(“WScript.Shell”);//Создание коллекции WshEnvironmentWshSysEnv = WshShell.Environment(“SYSTEM”);WScript.Echo(WshSysEnv(“NUMBER_OF_PROCESSORS”));WScript.Echo(WshShell.Environment.Item(“WINDIR”));/************* Конец *********************************************/
В следующем примере на экран выводится путь к каталогу Windows (листинг 1.16).
Листинг 1.16. Печать значений переменных среды (ExpandEnvironmertStrings)/*****************************************************************//* Имя: ExpEnvStr.js *//* Язык: JScript *//* Кодировка: Windows *//* Описание: Получение значений переменный среды с помощью *//* метода ExpandEnvironmentString *//*****************************************************************/var WS = WScript.CreateObject(“WScript.Shell”);WScript.Echo(“Каталог Windows:” WS.ExpandEnvironmentStrings(“%WinDir%”));/************* Конец *********************************************/
В Windows NT/2000/XP события записываются в системном журнале, а в Windows 9х — в файле WSH.log, расположенном в каталоге пользователей Windows. Запись в WSH.log будет содержать время события, его тип и текст. Типы сообщений описаны в табл. 1.9.
Таблица 1.9. Типы сообщений (параметр intType)
В следующем примере производится протоколирование работы сценария регистрации (здесь предполагается, что если этот сценарий отработал успешно, то функция
RunLoginScript возвращает true, в противном случае — false):var WshShell = WScript.CreateObject(“WScript.Shell”);rc = RunLoginScript();if (rc) WshShell.LogEvent(0,”Logon Script Completed Successfully”);else WshShell.LogEvent(1,”Logon Script failed”);
Если в методе не задан параметрstrTitle, то по умолчанию заголовком окна будет “Windows Script Host.”
Параметр
nType может принимать те же значения, что и в функции MessageBox из Microsoft Win32 API. В табл. 1.10 описаны некоторые возможные значения параметра nType и их смысл (полный список значений этого параметра можно посмотреть в описании функции MessageBox в документации по функциям Windows API).
Таблица 1.10. Типы кнопок и иконок для метода Popup
Замечание
В сценариях, написанных на языке VBScript, можно непосредственно использовать именованные константы типа
vbOkCancel без предварительного их объявления. Для того чтобы использовать такие константы в JScript-сценариях, их нужно предварительно объявить как переменные и присвоить нужные значения (например, var vbOkCancel=1;). Естественно, в любых сценариях вместо имен констант можно использовать их числовые значения.
В методе
Popup можно комбинировать значения параметра, приведенные в табл. 1.10. Например, в результате выполнения следующего сценария:var WshShell = WScript.CreateObject(“WScript.Shell”);WshShell.Popup(“Копирование завершено успешно”, 5, “Ура”,65);
на экран будет выведено информационное окно, показанное на рис. 1.11, которое автоматически закроется через 5 секунд.
Рис. 1.11. Информационное окно, созданное методом
Popup
Метод Popup возвращает целое значение, с помощью которого можно узнать, какая именно кнопка была нажата для выхода (табл. 1.11).
Таблица 1.11. Возвращаемые методом Popup значения
Примеры вывода информации с помощью метода
Popup представлены в главе 2 (см. листинги 2.13 и 2.14).
Если параметр strName оканчивается символами
\, то этот метод удаляет ключ целиком (вместе со всеми параметрами внутри его), в противном случае удаляется только один заданный параметр. Параметр strName должен начинаться с одного из следующих корневых ключей (табл. 1.12).
Таблица 1.12. Названия ключей
Пример, иллюстрирующий применение метода
RegDelete, приведен в главе 2 (см. листинги 2.45 и 2.46).
С помощью этого метода можно прочитать следующие типы данных:
REG_SZ, REG_EXPAND_SZ, REG_DWORD, REG_BINARY и REG_MULTI_SZ. Если в реестре содержатся данные других типов, то метод RegRead вернет значение DISP_E_TYPEMISMATCH.
Если параметр strName оканчивается символами
\, то этот метод считывает значение по умолчанию для раздела (если оно установлено), в противном случае читается значение параметра.
В следующем примере на экран выводятся считанные из реестра с помощью метода
RegRead значение параметра и значение по умолчанию для раздела реестра (листинг 1.17).Листинг 1.17. Чтение значений параметра и раздела системного реестра/********************************************************************//* Имя: RegRead.js *//* Язык: JScript *//* Описание: Чтение значений параметра и раздела системного реестра *//********************************************************************/var WS,s;//Создаем объект WshShellWS = WScript.CreateObject(“WScript.Shell”);s=”Значение параметраn”;s =”HKCU\Control Panel\Keyboard\KeyboardSpeed = “;//Читаем значение параметра реестраs =WS.RegRead(“HKCU\Control Panel\Keyboard\KeyboardSpeed”) “nn”;s =”Значение по умолчанию для разделаn”;s =”HKCU\Control Panel\Keyboard\ = “;//Читаем значение по умолчанию для раздела реестраs =WS.RegRead(“HKCU\Control Panel\Keyboard\”);//Вывод на экран сформированной строкиWScript.Echo(s);/************* Конец ***********************************************/
Если параметр strName оканчивается символами
\, то этот метод записывает раздел; если такого раздела нет, он будет создан. Если в конце strName отсутствуют символы \, то производится запись указанного параметра в нужный раздел; если такого параметра нет, он будет создан с указанным именем и значением.
Параметр anyValue метода задает значение, которое нужно записать в заданный параметром strName параметр или раздел реестра. Необязательный параметр strType определяет тип записываемого значения. В качестве strType можно указывать “
REG_SZ“, “REG_EXPAND_SZ“, “REG_DWORD” и “REG_BINARY“. Если в качестве параметра strType передается другое значение, то метод RegWrite вернет значение E_INVALIDARG.
В случае, когда strType установлено в “
REG_SZ” или “REG_EXPAND_SZ“, метод RegWrite автоматически конвертирует параметр anyValue в строку. Если значение strType равно “REG_DWORD“, то anyValue переводится в целый формат. Если strType равно “REG_BINARY“, то anyValue должно быть целым числом.
Пример, иллюстрирующий применение метода RegWrite, приведен в главе 2 (см. листинги 2.45 и 2.46).
Параметр intWindowStyle устанавливает вид окна для запускаемого приложения (табл. 1.13).
Таблица 1.13. Типы окна (intWindowStyle)
Замечание
В сценариях, написанных на языке VBScript, можно непосредственно использовать именованные константы типа
vbHide без предварительного их объявления. Для того чтобы использовать такие константы в JScript-сценариях, их нужно предварительно объявить как переменные и присвоить нужные значения (например, var vbHide=0;). Естественно, в любых сценариях вместо имен констант можно использовать их числовые значения.
Необязательный параметр bWaitOnReturn является логической переменной, дающей указание ожидать завершения запущенного процесса. Если этот параметр не указан или установлен в
false, то после запуска из сценария нового процесса управление сразу же возвращается обратно в сценарий (не дожидаясь завершения запущенного процесса). Если же bWaitOnReturn установлен в true, то сценарий возобновит работу только после завершения вызванного процесса.
При этом если параметр bWaitOnReturn равен
true, то метод Run возвращает код выхода вызванного приложения. Если же bWaitOnReturn равен false или не задан, то метод Run всегда возвращает ноль.
В следующем примере мы запускаем Блокнот (notepad.exe) и открываем в нем файл с выполняемым сценарием:
var WshShell = WScript.CreateObject(“WScript.Shell”);WshShell.Run(“%windir%\notepad” WScript.ScriptFullName);
Следующий сценарий печатает код выхода вызванного приложения (листинг 1.18).
Листинг 1.18. Вывод кода выхода запущенного приложения/********************************************************************//* Имя: RetCode.js *//* Язык: JScript *//* Описание: Вывод кода выхода запущенного приложения *//********************************************************************///Создаем объект WshShellvar WshShell = WScript.CreateObject(“WScript.Shell”);//Запускаем Блокнот и ожидаем завершения его работыReturn = WshShell.Run(“notepad ” WScript.ScriptFullName, 1, true);//Печатаем код возвратаWScript.Echo(“Код возврата:”, Return);/************* Конец ***********************************************/
Другие примеры запуска приложений с помощью метода Run приведены в главе 2 (см. листинги 2.31 и 2.32).
Каждая клавиша задается одним или несколькими символами. Например, для того чтобы задать нажатие друг за другом букв А, Б и В, нужно указать в качестве параметра для
SendKeys строку “АБВ“: string=”AБB”.
Несколько символов имеют в методе SendKeys специальное значение:
, ^, %, ~, (, ). Для того чтобы задать один из этих символов, их нужно заключить в фигурные скобки {}. Например, для задания знака плюс используется { }. Квадратные скобки [] хотя и не имеют в методе SendKeys специального смысла, их также нужно заключать в фигурные скобки. Кроме этого, для задания самих фигурных скобок следует использовать следующие конструкции: {{} (левая скобка) и {}} (правая скобка).
Для задания неотображаемых символов, таких как <Enter> или <Tab> и специальных клавиш, в методе
SendKeys используются коды, представленные в табл. 1.14.
Таблица 1.14. Коды специальных клавиш для SendKeys
Для задания комбинаций клавиш с <Shift>, <Ctrl> или <Alt>, перед соответствующей клавишей нужно поставить один или несколько кодов из табл. 1.15.
Таблица 1.15. Коды клавиш <Shift>, <Ctrl> и <Alt>
Для того чтобы задать комбинацию клавиш, которую нужно набирать, удерживая нажатыми клавиши <Shift>, <Сtrl> или <Alt>, нужно заключить коды этих клавиш в скобки. Например, если требуется сымитировать нажатие клавиш <G> и <S> при нажатой клавише <Shift>, следует использовать последовательность “
(GS)“. Для того же, чтобы задать одновременное нажатие клавиш <Shift> <G>, а затем <S> (уже без <Shift>), используется “ GS“.
В методе SendKeys можно задать несколько нажатий подряд одной и той же клавиши. Для этого необходимо в фигурных скобках указать код нужной клавиши, а через пробел — число нажатий. Например,
{LEFT 42} означает нажатие клавиши <<> 42 раза подряд; {h 10} означает нажатие клавиши <h> 10 раз подряд.Замечание
Метод
SendKeys не может быть использован для посылки нажатий клавиш для приложений, которые не были разработаны специально для запуска в Microsoft Windows (например, для приложений MS-DOS).
Примеры, иллюстрирующие использование
SendKeys, приведены в листингах 1.13, 2.31, 2.32.
Свойства и методы для работы с ярлыками Windows предоставляют два объекта WSH:
WshShortcut и WshUrlShortcut.
С помощью объекта
WshShortcut можно создать новый ярлык Windows или изменить свойства уже существующего ярлыка. Этот объект можно создать только с помощью метода CreateShortcut объекта WshShell. В листинге 1.19 представлен пример сценария, в котором создается ярлык на этот самый сценарий (ярлык будет находиться в текущем каталоге).Листинг 1.19. Создание ярлыка на выполняемый сценарий/*****************************************************************//* Имя: MakeShortcut1.js *//* Язык: JScript *//* Описание: Создание ярлыка на выполняемый сценарий *//*****************************************************************/var WshShell,oShellLink;//Создаем объект WshShellWshShell = WScript.CreateObject(“WScript.Shell”);//Создаем ярлык в текущем каталогеoShellLink = WshShell.CreateShortcut(“Current Script.lnk”);//Устанавливаем путь к файлуoShellLink.TargetPath = WScript.ScriptFullName;//Сохраняем ярлыкoShellLink.Save();/************* Конец *********************************************/
Свойства объекта
WshShortcut описаны в табл. 1.16.
Таблица 1.16. Свойства объекта WshShortcut
Приведем необходимые пояснения и примеры использования свойств объекта
WshShortcut.
В листинге 1.20 приведен пример сценария, создающего ярлык на этот самый сценарий с двумя параметрами командной строки.
Листинг 1.20. Создание ярлыка на выполняемый сценарий с аргументами командной строки/*****************************************************************//* Имя: MakeShortcut2.js *//* Язык: JScript *//* Описание: Создание ярлыка на выполняемый сценарий с *//* аргументами командной строки *//*****************************************************************/var WshShell,oShellLink;//Создаем объект WshShellWshShell = WScript.CreateObject(“WScript.Shell”);//Создаем ярлык в текущем каталогеoShellLink = WshShell.CreateShortcut(“Current Script.lnk”);//Устанавливаем путь к файлуoShellLink.TargetPath = WScript.ScriptFullName;//Указываем аргументы командной строкиoShellLink.Arguments = “-a abc.txt”;//Сохраняем ярлыкoShellLink.Save();/************* Конец *********************************************/
Для того чтобы назначить ярлыку “горячую” клавишу, необходимо в свойство
HotKey записать строку, содержащую названия нужных клавиш, разделенные символом “ “.Замечание
“Горячие” клавиши могут быть назначены только ярлыкам, которые расположены на рабочем столе Windows или в меню Пуск (Start). Для того чтобы нажатия “горячих” клавиш срабатывали, необходимо, чтобы языком по умолчанию в операционной системе был назначен английский.
В следующем примере (листинг 1.21) на рабочем столе создается ярлык для Блокнота, которому назначается комбинация “горячих” клавиш <Ctrl> <Alt> <D>.
Листинг 1.21. Создание ярлыка на Блокнот с комбинацией “горячих” клавиш/*****************************************************************//* Имя: MakeShortcut3.js *//* Язык: JScript *//* Описание: Создание ярлыка на Блокнот с комбинацией горячих */ /* клавиш *//*****************************************************************/var WshShell,strDesktop,oMyShortcut;//Создаем объект WshShellWshShell = WScript.CreateObject(“WScript.Shell”);//Определяем путь к рабочему столуstrDesktop = WshShell.SpecialFolders(“Desktop”);//Создаем ярлык в текущем каталогеoMyShortcut = WshShell.CreateShortcut(strDesktop “\a_key.lnk”);//Устанавливаем путь к файлуoMyShortcut.TargetPath = WshShell.ExpandEnvironmentStrings(“%windir%\notepad.exe”);//Назначаем комбинацию горячих клавишoMyShortcut.Hotkey = “CTRL ALT D”;//Сохраняем ярлыкoMyShortcut.Save();WScript.Echo(“Горячие клавиши для ярлыка: ” oMyShortcut.Hotkey);/************* Конец *********************************************/
Для того чтобы задать значок для ярлыка, необходимо в свойство
IconLocation записать строку следующего формата: “путь, индекс”. Здесь параметр путь определяет расположение файла, содержащего нужный значок, а параметр индекс — номер этого значка в файле (номера начинаются с нуля).
В следующем примере (листинг 1.22) создается ярлык на выполняющийся сценарий с первым значком (индекс 0) из файла notepad.exe.
Листинг 1.22. Создание ярлыка на выполняемый сценарий со значком из notepad.exe/*****************************************************************//* Имя: MakeShortcut4.js *//* Язык: JScript *//* Описание: Создание ярлыка на выполняемый сценарий с иконкой *//* из notepad.exe *//*****************************************************************/var WshShell,oShellLink;//Создаем объект WshShellWshShell = WScript.CreateObject(“WScript.Shell”);//Создаем ярлык в текущем каталогеoShellLink = WshShell.CreateShortcut(“Current Script.lnk”);//Устанавливаем путь к файлуoShellLink.TargetPath = WScript.ScriptFullName;//Выбираем иконку из файла notepad.exeoShellLink.IconLocation = “notepad.exe, 0”;//Сохраняем ярлыкoShellLink.Save();/************* Конец *********************************************/
Значением свойства
WindowStyle является целое число intWindowStyle, которое может принимать значения, приведенные в табл. 1.17.
Таблица 1.17. Значения параметра intWindowStyle
В следующем примере (листинг 1.23) создается ярлык для Блокнота, причем в качестве рабочего каталога указан корневой каталог диска С:.
Листинг 1.23. Создание ярлыка на Блокнот с комбинацией горячих клавиш/*****************************************************************//* Имя: MakeShortcut5.js *//* Язык: JScript *//* Описание: Создание ярлыка на Блокнот с изменением рабочего *//* каталога *//*****************************************************************/var WshShell,oShellLink;//Создаем объект WshShellWshShell = WScript.CreateObject(“WScript.Shell”);//Создаем ярлык в текущем каталогеoShellLink = WshShell.CreateShortcut(“Notepad.lnk”);//Устанавливаем путь к файлуoShellLink.TargetPath = “notepad.exe”;//Назначаем рабочий каталогoShellLink.WorkingDirectory = “c:\”;//Сохраняем ярлыкoShellLink.Save();/************* Конец *********************************************/
Объект
WshShortcut имеет единственный метод Save, который сохраняет заданный ярлык в каталоге, указанном в свойстве FullName.
С помощью объекта
WshUrlShortcut можно создать новый ярлык для сетевых ресурсов или изменить свойства уже существующего ярлыка. Этот объект, как и WshShortcut, можно создать только с помощью метода CreateShortcut объекта WshShell.
В следующем примере (листинг 1.24) создается сетевой ярлык для сайта www.microsoft.com.
Листинг 1.24. Создание сетевого ярлыка/*****************************************************************//* Имя: MakeShortcut6.js *//* Язык: JScript *//* Описание: Создание сетевого ярлыка для www.microsoft.com *//*****************************************************************/var WshShell,oUrlLink;//Создаем объект WshShellWshShell = WScript.CreateObject(“WScript.Shell”);//Создаем ярлык в текущем каталогеoUrlLink = WshShell.CreateShortcut(“Microsoft Web Site.URL”);//Устанавливаем путь к сайтуoUrlLink.TargetPath = “http://www.microsoft.com”;//Сохраняем ярлыкoUrlLink.Save();/************* Конец *********************************************/
Объект
WshUrlShortcut имеет два свойства: FullName и TargetPath, которые полностью аналогичны одноименным свойствам рассмотренного выше объекта WshShortcut.
Также у объекта
WshUrlShortcut имеется метод Save, с помощью которого ярлык сохраняется в каталоге, указанном в свойстве FullName.
Другие примеры работы с ярлыками с помощью объекта
WshShortcut приведены в главе 2 (см. листинги 2.43 и 2.44).
Из сценариев WSH 5.6 можно на локальной машине запускать дочерние процессы, имея при этом доступ к их стандартным входным/выходным потокам и контролируя ход выполнения этих процессов. Для этих целей предназначен объект
WshScriptExec.
Кроме этого, имеется возможность запустить сценарий, файл с которым находится на локальной машине, на другой удаленной машине. Для выполнения сценариев на удаленных машинах и обработки ошибок, возникающих в таких сценариях, используются объекты
WshController, WshRemote и WshRemoteError.
В WSH 5.6 появилась возможность при помощи метода
WshShell.Exec запускать консольное приложение или сценарий как дочерний процесс выполняемого сценария, т.е. с теми же переменными среды, что и у процесса-родителя. Метод WshShell.Exec выполняет командную строку, указанную в качестве его параметра, и возвращает объект WScriptExec, свойства и методы которого предоставляют информацию о запущенной задаче и обеспечивают доступ к ее стандартным потокам ввода/вывода и ошибок (обработка этих потоков необходима в силу того, что непосредственно на экране строки, выводимые дочерним приложением, не появляются).
Отметим также, что с помощью метода
WshShell.Exec можно запускать и графические оконные Windows-приложения. В этом случае создаваемый объект WshScriptExec полезен тем, что он позволяет получить идентификатор запущенного процесса (Process ID, PID), который затем можно использовать для активизации задачи при помощи метода WshShell.AppActivate.
Объект
WScriptExec имеет единственный метод Terminate, с помощью которого можно прервать выполнение дочернего процесса.
Например:
var WshShell=WScript.CreateObject(“WScript.Shell”);var ChildJob = WshShell.Exec(“cscript ChildScript.js”);ChildJob.Terminate();
Метод
Terminate пытается закрыть приложение, посылая ему сообщение WM_CLOSE. Если это не срабатывает, задача завершается принудительно. Методом Terminate нужно пользоваться только в крайнем случае, т.к. некоторые приложения, завершенные таким способом, не полностью освобождают ресурсы. Поэтому, как правило, лучше дождаться, когда запущенная задача сама закончит свою работу.
Свойства объекта
WshScriptExec описаны в табл. 1.18.
Таблица 1.18. Свойства объекта WshScriptExec
В следующем примере (сценарий MakeCalc.js) свойство
ProcessID используется для активизации стандартного калькулятора Windows. Напомним, что для этой цели также можно при вызове метода WshShell.AppActivate использовать название окна “Calculator”.Листинг 1.25. Активизация приложений с помощью PID/*****************************************************************//* Имя: MakeCalc.js *//* Язык: JScript *//* Описание: Активизация приложений с помощью PID *//*****************************************************************/var WshShell, theCalculator;//Создаем объект WshShellWshShell = WScript.CreateObject(“WScript.Shell”);//Запускаем калькуляторtheCalculator = WshShell.Exec(“calc”);//Приостанавливаем выполнение сценария для того, чтобы окно //калькулятора появилось на экранеWScript.Sleep(500);//Активизируем окно калькулятораWshShell.AppActivate(theCalculator.ProcessID);//Посылаем нажатия клавиш в окно калькулятораWshShell.SendKeys(“1{ }”);WScript.Sleep(500);WshShell.SendKeys(“2”);WScript.Sleep(500);WshShell.SendKeys(“~”);/************* Конец *********************************************/
После запуска дочернего процесса сценарий-родитель продолжает выполняться асинхронно, поэтому необходимо уметь определять, выполняется ли еще запущенная задача, или она уже завершена. Для этой цели используется свойство
Status: если значение Status равно 0, то это означает, что дочерний процесс находится в стадии выполнения, если Status равно 1, то запущенная задача уже завершена. Например, в результате выполнения приведенного в листинге 1.26 сценария ChildStatus.js на экран выведется несколько строк “Команда еще выполняется” (рис. 1.12).Листинг 1.26. Контроль состояния дочернего процесса/*****************************************************************//* Имя: ChildStatus.js *//* Язык: JScript *//* Описание: Контроль состояния дочернего процесса *//*****************************************************************/var WshShell,theJob;//Создаем объект WshShellWshShell=WScript.CreateObject(“WScript.Shell”);//Запускаем дочернее приложениеtheJob = WshShell.Exec(“xcopy /?”);for (;;) { if (theJob.status==1) //Проверяем завершение дочернего процесса break; //Выходим из цикла else WScript.Echo(“Команда еще выполняется”);}WScript.Echo(“Выполнение завершено”);/************* Конец *********************************************/
Рис. 1.12. Результат выполнения сценария ChildStatus.js
Работать c потоками
StdOut, StdIn и StdErr объекта WshScriptExec можно с помощью тех же методов, которые применяются в объекте WScript для доступа к соответствующим стандартным потокам (см. табл. 1.3). Например, запустив приведенный в листинге 1.27 сценарий ConToWin.js с помощью wscript.exe, мы выведем в графическое окно информацию о ключах программы cscript.exe (рис. 1.13).
Рис. 1.13. Результат выполнения сценария ConToWin.js
Отметим, что запускаемое консольное приложение cscript.exe выводит символы кириллицы в DOS-кодировке, поэтому для вывода таких символов в графическое окно их нужно преобразовать в Windows-кодировку. В рассматриваемом сценарии это делается с помощью функции DosToWin, которая преобразует переданную в качестве параметра строку следующим образом: все символы кириллицы в этой строке переводятся в Windows-кодировку, остальные символы остаются без изменений:
function DosToWin(s) { var i,ss; //Объявляем переменные //Проверяем, создан ли объект RusDict if (typeof(RusDict)==”undefined”) //Если объект RusDict не создан, создаем его MakeRusDict(); ss=””; for (i=0;i<s.length;i ) { //Цикл по всем символам в строке if (RusDict.Exists(s.charAt(i))) //Проверяем наличие символа в словаре //Преобразуем i-й символ в Windows-кодировку ss =RusDict.Item(s.charAt(i)); else ss =s.charAt(i); } return ss;}
Основным в функции
DosToWin является использование объекта Dictionary с именем RusDict. Этот объект формируется в функции MakeRusDict и содержит пары “ключ”–”знaчeниe” для всех букв русского алфавита, причем в качестве ключа указывается буква в DOS-кодировке, а в качестве значения — символ с кодом, который соответствует этой букве в Windows-кодировке.//Функция для создания объекта Dictionary с парами “ключ-значение”, где//”ключ”-буква в DOS-кодировке, “значение”- символ, соответствующий этой//букве в Windows-кодировкеfunction MakeRusDict() { //Создаем объект Dictionary RusDict = WScript.CreateObject(“Scripting.Dictionary”); //Заполняем пары “ключ” (символ в DOS-кодировке)- “значение” (символ в //Window-кодировке) для всех букв русского алфавита RusDict.add(“Ђ”, “А”); RusDict.add(“Ѓ”, “Б”); RusDict.add(“‚”, “В”); RusDict.add(“ѓ”, “Г”); RusDict.add(“„”, “Д”); RusDict.add(“…”, “Е”); RusDict.add(“р”, “Ё”); RusDict.add(“†”, “Ж”); RusDict.add(“‡”, “З”); RusDict.add(“€”, “И”); RusDict.add(“‰”, “Й”); RusDict.add(“Љ”, “К”); RusDict.add(“‹”, “Л”); RusDict.add(“Њ”, “М”); RusDict.add(“Ќ”, “Н”); RusDict.add(“Ћ”, “О”); RusDict.add(“Џ”, “П”); RusDict.add(“ђ”, “Р”); RusDict.add(“‘”, “С”); RusDict.add(“’”, “Т”); RusDict.add(““”, “У”); RusDict.add(“””, “Ф”); RusDict.add(“•”, “Х”); RusDict.add(“–”, “Ц”); RusDict.add(“—”, “Ч”); RusDict.add(“”, “Ш”); RusDict.add(“™”, “Щ”); RusDict.add(“љ”, “Ъ”); RusDict.add(“›”, “Ы”); RusDict.add(“њ”, “Ь”); RusDict.add(“ќ”, “Э”); RusDict.add(“ћ”, “Ю”); RusDict.add(“џ”, “Я”); RusDict.add(” “, “а”); RusDict.add(“Ў”, “б”); RusDict.add(“ў”, “в”); RusDict.add(“Ј”, “г”); RusDict.add(“¤”, “д”); RusDict.add(“Ґ”, “е”); RusDict.add(“с”, “ё”); RusDict.add(“¦”, “ж”); RusDict.add(“§”, “з”); RusDict.add(“Ё”, “и”); RusDict.add(“©”, “й”); RusDict.add(“Є”, “к”); RusDict.add(“«”, “л”); RusDict.add(“¬”, “м”); RusDict.add(“”, “н”); RusDict.add(“®”, “о”); RusDict.add(“Ї”, “п”); RusDict.add(“а”, “р”); RusDict.add(“б”, “с”); RusDict.add(“в”, “т”); RusDict.add(“г”, “у”); RusDict.add(“д”, “ф”); RusDict.add(“е”, “х”); RusDict.add(“ж”, “ц”); RusDict.add(“з”, “ч”); RusDict.add(“и”, “ш”); RusDict.add(“й”, “щ”); RusDict.add(“к”, “ъ”); RusDict.add(“л”, “ы”); RusDict.add(“м”, “ь”); RusDict.add(“н”, “э”); RusDict.add(“о”, “ю”); RusDict.add(“п”, “я”);}Листинг 1.27. Доступ к потоку StdOut дочернего процесса/*****************************************************************//* Имя: ConToWin.js *//* Язык: JScript *//* Кодировка: DOS *//* Описание: Доступ к потоку StdOut дочернего процесса *//*****************************************************************/var WshShell,theJob,s,IsBreak,RusDict; //Объявляем переменные//Функция для создания объекта Dictionary с парами “ключ-значение”, где//”ключ”-буква в DOS-кодировке, “значение”- символ, соответствующий этой//букве в Windows-кодировкеfunction MakeRusDict() { //Создаем объект Dictionary RusDict = WScript.CreateObject(“Scripting.Dictionary”); //Заполняем пары “ключ” (символ в DOS-кодировке)- “значение” (символ в //Window-кодировке) для всех букв русского алфавита RusDict.add(“Ђ”, “А”); RusDict.add(“Ѓ”, “Б”); RusDict.add(“‚”, “В”); RusDict.add(“ѓ”, “Г”); RusDict.add(“„”, “Д”); RusDict.add(“…”, “Е”); RusDict.add(“р”, “Ё”); RusDict.add(“†”, “Ж”); RusDict.add(“‡”, “З”); RusDict.add(“€”, “И”); RusDict.add(“‰”, “Й”); RusDict.add(“Љ”, “К”); RusDict.add(“‹”, “Л”); RusDict.add(“Њ”, “М”); RusDict.add(“Ќ”, “Н”); RusDict.add(“Ћ”, “О”); RusDict.add(“Џ”, “П”); RusDict.add(“ђ”, “Р”); RusDict.add(“‘”, “С”); RusDict.add(“’”, “Т”); RusDict.add(““”, “У”); RusDict.add(“””, “Ф”); RusDict.add(“•”, “Х”); RusDict.add(“–”, “Ц”); RusDict.add(“—”, “Ч”); RusDict.add(“”, “Ш”); RusDict.add(“™”, “Щ”); RusDict.add(“љ”, “Ъ”); RusDict.add(“›”, “Ы”); RusDict.add(“њ”, “Ь”); RusDict.add(“ќ”, “Э”); RusDict.add(“ћ”, “Ю”); RusDict.add(“џ”, “Я”); RusDict.add(” “, “а”); RusDict.add(“Ў”, “б”); RusDict.add(“ў”, “в”); RusDict.add(“Ј”, “г”); RusDict.add(“¤”, “д”); RusDict.add(“Ґ”, “е”); RusDict.add(“с”, “ё”); RusDict.add(“¦”, “ж”); RusDict.add(“§”, “з”); RusDict.add(“Ё”, “и”); RusDict.add(“©”, “й”); RusDict.add(“Є”, “к”); RusDict.add(“«”, “л”); RusDict.add(“¬”, “м”); RusDict.add(“”, “н”); RusDict.add(“®”, “о”); RusDict.add(“Ї”, “п”); RusDict.add(“а”, “р”); RusDict.add(“б”, “с”); RusDict.add(“в”, “т”); RusDict.add(“г”, “у”); RusDict.add(“д”, “ф”); RusDict.add(“е”, “х”); RusDict.add(“ж”, “ц”); RusDict.add(“з”, “ч”); RusDict.add(“и”, “ш”); RusDict.add(“й”, “щ”); RusDict.add(“к”, “ъ”); RusDict.add(“л”, “ы”); RusDict.add(“м”, “ь”); RusDict.add(“н”, “э”); RusDict.add(“о”, “ю”); RusDict.add(“п”, “я”);}//Функция для перевода строки из DOS- в Windows-кодировкуfunction DosToWin(s) { var i,ss; //Объявляем переменные //Проверяем, создан ли объект RusDict if (typeof(RusDict)==”undefined”) //Если объект RusDict не создан, создаем его MakeRusDict(); ss=””; for (i=0;i<s.length;i ) { //Цикл по всем символам в строке if (RusDict.Exists(s.charAt(i))) //Проверяем наличие символа в словаре //Преобразуем i-й символ в Windows-кодировку ss =RusDict.Item(s.charAt(i)); else ss =s.charAt(i); } return ss;}/************* Начало *********************************************///Создаем объект WshShellWshShell=WScript.CreateObject(“WScript.Shell”);//Запускаем дочернее приложениеtheJob = WshShell.Exec(“cscript”);IsBreak=false;for (;;) { if (!theJob.StdOut.AtEndOfStream) //Считываем всю информацию, находящуюся в потоке StdOut //дочернего процесса s =theJob.StdOut.ReadAll(); if (IsBreak) break; if (theJob.status==1) //Проверяем, не завершилась ли запущенная задача IsBreak=true; else WScript.Sleep(100);}//Преобразуем сформированные строки в Windows-кодировку//и выводим их на экранWScript.Echo(DosToWin(s));/************* Конец *********************************************/
Таким образом, можно с помощью метода Exec запустить утилиту командной строки, передавать ей нужную входную информацию с помощью свойства StdIn и с помощью свойства StdOut получать и анализировать выдаваемые этой утилитой строки (соответствующие примеры приведены также в листингах 2.37 и 2.38).
Объект
WshController имеет единственный метод CreateScript и предназначен для создания объекта-сценария на удаленной машине.
Замечание
В силу соображений безопасности удаленные сценарии можно запускать только с машин, на которых установлена операционная система Windows NT/2000/XP; то же самое требование предъявляется к машинам, на которых должны выполняться такие сценарии. Кроме этого, после начальной установки WSH по умолчанию выполнение удаленных сценариев запрещено; действия, которые необходимо произвести для разрешения выполнения таких сценариев, описаны в главе 2.
Создается объект WshController следующим образом:
var WshController=WScript.CreateObject(“WshController”);Замечание
Обратите внимание, что для объекта
WshController программным идентификатором (ProgID) является именно строка “WshController“, а не строка “WScript.WshController“, как указано в бета-версии документации на WSH 5.6.
Метод
CreateScript возвращает указатель на объект WshRemote, с помощью которого можно контролировать состояние удаленного сценария и управлять его выполнением. При выполнении этого метода WSH последовательно производит следующие действия:
? подготавливает файл со сценарием для пересылки на удаленную станцию;
? с помощью протокола DCOM создает экземпляр объекта
WshRemote на удаленной машине;
? пересылает сценарий на удаленную станцию для последующего выполнения с помощью метода
Execute объекта WshRemote.
Синтаксис метода
CreateScript: CreateScript(CommandLine, [MachineName])
Параметр CommandLine содержит командную строку для запуска сценария, который должен быть выполнен на удаленной станции. Путь к сценарию должен быть указан относительно локальной машины, а не относительно той станции, на которой должен выполняться сценарий. Чаще всего этот путь указывает на файл, находящийся непосредственно на локальном компьютере, хотя можно указать путь к сценарию, записанному на каком-либо общем сетевом ресурсе (это делает возможным, работая на одном компьютере, загружать сценарий с другого и выполнять этот сценарий на третьем компьютере в сети).
Второй необязательный параметр MachineName задает имя компьютера, на котором должен быть запущен сценарий. Если этот параметр не указан, то сценарий будет выполняться на локальной машине.
Объект
WshRemote необходим для контроля состояния сценариев, которые запущены на удаленной машине. В результате запуска такого сценария на удаленной машине создается процесс, поэтому можно сказать, что экземпляром объекта WshRemote, соответствующего выполняющемуся сценарию, является процесс. Создается WshRemote с помощью метода CreateScript объекта WshController:var Controller,RemoteScript;Controller=WScript.CreateObject(“WshController”);RemoteScript=Controller.CreateScript(“d: WscriptsWMyScript.js”, “Server1”);
Объект
WshRemote имеет два свойства: Error и Status.
В свойстве
Error хранится ссылка на объект WshRemoteError, который содержит информацию об ошибке, приведшей к аварийному завершению работы удаленного сценария.
Числовое свойство
Status позволяет определить состояние сценария, работающего асинхронно на удаленной машине. Возможные значения свойства Status приведены в табл. 1.19.
Таблица 1.19. Значения параметра Status
Два имеющихся у объекта
WshRemote метода позволяют соответственно запустить удаленный сценарий (метод Execute) или принудительно завершить его выполнение (метод Terminate); оба эти метода не имеют параметров. Метод Terminate, подобно одноименному методу объекта WshScriptExec, пытается закрыть приложение, посылая ему сообщение WM_CLOSE (если это не срабатывает, процесс завершается принудительно).
Кроме свойств и методов, объект WshRemote может генерировать три события, которые описаны в табл. 1.20.
Таблица 1.20. События объекта WshRemote
Для обработки в сценариях событий, приведенных в табл. 1.20, необходимо подключиться к объекту WshRemote с помощью метода ConnectObject объекта WScript (листинг 1.28).
Листинг 1.28. Обработка событий объекта WshRemote (JScript)/**********************************************************************//* Имя: RemoteEvents.js *//* Язык: JScript *//* Описание: Обработка событий, возникающих при выполнении удаленного *//* сценария *//**********************************************************************/Var Controller,RemScript,IsQuit; //Объявляем переменные//Создаем объект WshControllerController = WScript.CreateObject(“WshController”);//Создаем сценарий на удаленной машине (объект WshRemote)RemScript = Controller.CreateScript(“D:RemoteScript.js “, “stand”);//Устанавливаем соединение с объектом WshRemoteWScript.ConnectObject(RemScript, “RemoteScript_”);RemScript.Execute(); //Запускаем удаленный сценарийIsQuit = False;while (!IsQuit) WScript.Sleep(100); //Приостанавливаем сценарий на 0,1 секWScript.Quit(); //Выходим из сценария/*************** Функции-обработчики событий ***********************/function RemoteScript_End { //Событие End WScript.Echo(“Выполнение удаленного сценария завершено”); IsQuit = True;}function RemoteScript_Error { //Событие Error //Выводим на экран описание возникшей ошибки WScript.Echo(“Ошибка при выполнении удаленного сценария: ” RemScript.Error.Description); IsQuit = True;}function RemoteScript_Start { //Событие Start WScript.Echo(“Удаленный сценарий запущен”);}/************* Конец *********************************************/
Объект
WshRemoteError создается автоматически при возникновении ошибки во время выполнения сценария на удаленной машине и содержит информацию об этой ошибке. Ссылка на объект WshRemoteError хранится в свойстве Error соответствующего объекта WshRemote.
Свойства объекта
WshRemoteError описаны в табл. 1.21 (методов у этого объекта нет).
Таблица 1.21. Свойства объекта WshRemoteError
Свойство | Описание |
---|---|
Description | Содержит краткое описание ошибки, которая привела к аварийному завершению работы сценария. Если для какой-либо ошибки описание не предусмотрено, Description содержит пустую строку |
Line | Определяет номер строки в файле сценария, в которой произошла ошибка. Если для ошибки нельзя определить номер строки, в которой она произошла, в свойство Line записывается 0 |
Character | Определяет номер символа в строке, в котором произошла ошибка. Если для ошибки нельзя определить точную позицию, в которой она возникла, в свойство Character записывается 0 |
Number | Содержит числовой код ошибки |
SourceText | Содержит в текстовом виде строку сценария, в которой возникла ошибка. Так как не всегда возможно точно определить строку, в которой произошла ошибка, то иногда значением свойства SourceText может быть пустая строка |
Source | Содержит в символьном виде название СОМ-объекта, обращение к которому послужило источником ошибок |
Для получения информации о возникшей при выполнении удаленного сценария ошибке можно использовать обработчик события
Error объекта WshRemote; соответствующие примеры приведены в листингах 1.28, 2.56 и 2.57.
Главная |
Контакты |
Нашёл ошибку |
Прислать материал |
Добавить в избранное
Все материалы представлены для ознакомления и принадлежат их авторам.
Глава 2. примеры использования стандартных объектов wsh (jscript и vbscript). «windows script host для windows 2000/xp» | попов андрей владимирович
Ввод строк в консольном режиме
Самый простой способ ввести строку в консольном режиме предоставляет метод WScript.StdIn.ReadLine, при использовании этого метода ввод завершается нажатием клавиши .
Отметим, что при использовании стандартного входного потока WScript.StdIn в Windows ХР (по крайней мере в той версии, которой пользовался автор) возникает проблема, связанная с кодировкой символов кириллицы. Дело в том, что метод WScript.StdIn.ReadLine возвращает строку в DOS-кодировке, а для вывода на экран с помощью методов WScript.StdOut.WriteLine или WScript.Echo строка должна быть в Windows-кодировке (в предыдущих версиях Windows метод WScript.StdOut.WriteLine требовал строку в DOS-кодировке). Поэтому для корректного отображения символов кириллицы на экране приходится применять дополнительные функции конвертации из DOS- в Windows-кодировку. Стандартных методов или функций, предназначенных для этой цели, в языках JScript и VBScript нет, поэтому такие функции следует написать самостоятельно.
Рассмотрим сначала написанную на JScript функцию конвертации DosToWin из листинга 2.14:
function DosToWin(s) {
var i,ss; //Объявляем переменные
//Проверяем, создан ли объект RusDict
if (typeof(RusDict)==”undefined”)
//Если объект RusDict не создан, создаем его
MakeRusDict();
ss=””;
for (i=0;i
if (RusDict.Exists(s.charAt(i))) //Проверяем наличие символа в словаре
//Преобразуем i-й символ в Windows-кодировку
ss =RusDict.Item(s.charAt(i));
else ss =s.charAt(i);
}
return ss;
}
Как мы видим, эта функция преобразует переданную в качестве параметра строку следующим образом: все символы кириллицы в этой строке переводятся в Windows-кодировку, остальные символы остаются без изменений. Основным в функций DosToWin является использование объекта Dictionary (аналог ассоциативного массива) с именем RusDict. Этот объект формируется в функции MakeRusDict и содержит пары “ключ”–”значение” для всех букв русского алфавита, причем в качестве ключа указывается буква в DOS-кодировке, а в качестве значения — символ с кодом, который соответствует этой букве в Windows-кодировке:
function MakeRusDict() {
//Создаем объект Dictionary
RusDict = WScript.CreateObject(“Scripting.Dictionary”);
//Заполняем пары “ключ” (символ в DOS-кодировке)-“значение” (символ в
//Window-кодировке) для всех букв русского алфавита
RusDict.add(“Ђ”, “А”); RusDict.add(“Ѓ”, “Б”); RusDict.add(“‚”, “В”);
RusDict.add(“ѓ”, “Г”); RusDict.add(“„”, “Д”); RusDict.add(“…”, “Е”);
RusDict.add(“р”, “Ё”); RusDict.add(“†”, “Ж”); RusDict.add(“‡”, “З”);
RusDict.add(“€”, “И”); RusDict.add(“‰”, “Й”); RusDict.add(“Љ”, “К”);
RusDict.add(“‹”, “Л”); RusDict.add(“Њ”, “М”); RusDict.add(“Ќ”, “Н”);
RusDict.add(“Ћ”, “О”); RusDict.add(“Џ”, “П”); RusDict.add(“ђ”, “Р”);
RusDict.add(“‘”, “С”); RusDict.add(“’”, “Т”); RusDict.add(““”, “У”);
RusDict.add(“””, “Ф”); RusDict.add(“•”, “Х”); RusDict.add(“–”, “Ц”);
RusDict.add(“—”, “Ч”); RusDict.add(“”, “Ш”); RusDict.add(“™”, “Щ”);
RusDict.add(“љ”, “Ъ”); RusDict.add(“›”, “Ы”); RusDict.add(“њ”, “Ь”);
RusDict.add(“ќ”, “Э”); RusDict.add(“ћ”, “Ю”); RusDict.add(“џ”, “Я”);
RusDict.add(” “, “а”); RusDict.add(“Ў”, “б”); RusDict.add(“ў”, “в”);
RusDict.add(“Ј”, “г”); RusDict.add(“¤”, “д”); RusDict.add(“Ґ”, “е”);
RusDict.add(“с”, “ё”); RusDict.add(“¦”, “ж”); RusDict.add(“§”, “з”);
RusDict.add(“Ё”, “и”); RusDict.add(“©”, “й”); RusDict.add(“Є”, “к”);
RusDict.add(“«”, “л”); RusDict.add(“¬”, “м”); RusDict.add(“”, “н”);
RusDict.add(“®”, “о”); RusDict.add(“Ї”, “п”); RusDict.add(“а”, “р”);
RusDict.add(“б”, “с”); RusDict.add(“в”, “т”); RusDict.add(“г”, “у”);
RusDict.add(“д”, “ф”); RusDict.add(“е”, “х”); RusDict.add(“ж”, “ц”);
RusDict.add(“з”, “ч”); RusDict.add(“и”, “ш”); RusDict.add(“й”, “щ”);
RusDict.add(“к”, “ъ”); RusDict.add(“л”, “ы”); RusDict.add(“м”, “ь”);
RusDict.add(“н”, “э”); RusDict.add(“о”, “ю”); RusDict.add(“п”, “я”);
}
В функции DosToWin из VBScript-сценария StdIn1.vbs (листинг 2.15) реализован другой подход к переводу строки в Windows-кодировку, связанный с преобразованием ANSI-кодов символов:
Function DosToWin(s)
Dim i,k,ss
ss=””
For i=1 To Len(s) ‘ Цикл по всем символам в строке
k = Asc(Mid(s,i,1)) ‘ Определяем ANSI-код i-го символа
‘ Изменяем код k на код соответствующего символа в
‘ Windows-кодировке
If (128 <= k) And (k <= 175) Then
k=k 64
ElseIf (224 <= k) And (k <= 239) Then
k=k 16
ElseIf k = 240 Then
k=168
ElseIf k = 241 Then
k=184
End If
ss=ss Chr(k) ‘ Возвращаем преобразованную строку
Next
DosToWin=ss
End Function
Весь алгоритм этой функции состоит в вычислении по ANSI-коду буквы русского алфавита в DOS-кодировке кода символа в Windows-кодировке, соответствующего этой букве.
Листинг 2.14. Ввод одной строки с помощью метода StdIn.ReadLine (JScript)
/*******************************************************************/
/* Имя: StdIn1.js */
/* Язык: JScript */
/* Описание: Пример использования метода StdIn.ReadLine */
/*******************************************************************/
var s,RusDict; //Объявляем переменные
//Функция для создания объекта Dictionary с парами “ключ-значение”, где
//”ключ”-буква в DOS-кодировке, “значение”- символ, соответствующий этой
//букве в Windows-кодировке
function MakeRusDict() {
//Создаем объект Dictionary
RusDict = WScript.CreateObject(“Scripting.Dictionary”);
//Заполняем пары “ключ” (символ в DOS-кодировке)-“значение” (символ в
//Window-кодировке) для всех букв русского алфавита
RusDict.add(“Ђ”, “А”); RusDict.add(“Ѓ”, “Б”); RusDict.add(“‚”, “В”);
RusDict.add(“ѓ”, “Г”); RusDict.add(“„”, “Д”); RusDict.add(“…”, “Е”);
RusDict.add(“р”, “Ё”); RusDict.add(“†”, “Ж”); RusDict.add(“‡”, “З”);
RusDict.add(“€”, “И”); RusDict.add(“‰”, “Й”); RusDict.add(“Љ”, “К”);
RusDict.add(“‹”, “Л”); RusDict.add(“Њ”, “М”); RusDict.add(“Ќ”, “Н”);
RusDict.add(“Ћ”, “О”); RusDict.add(“Џ”, “П”); RusDict.add(“ђ”, “Р”);
RusDict.add(“‘”, “С”); RusDict.add(“’”, “Т”); RusDict.add(““”, “У”);
RusDict.add(“””, “Ф”); RusDict.add(“•”, “Х”); RusDict.add(“–”, “Ц”);
RusDict.add(“—”, “Ч”); RusDict.add(“”, “Ш”); RusDict.add(“™”, “Щ”);
RusDict.add(“љ”, “Ъ”); RusDict.add(“›”, “Ы”); RusDict.add(“њ”, “Ь”);
RusDict.add(“ќ”, “Э”); RusDict.add(“ћ”, “Ю”); RusDict.add(“џ”, “Я”);
RusDict.add(” “, “а”); RusDict.add(“Ў”, “б”); RusDict.add(“ў”, “в”);
RusDict.add(“Ј”, “г”); RusDict.add(“¤”, “д”); RusDict.add(“Ґ”, “е”);
RusDict.add(“с”, “ё”); RusDict.add(“¦”, “ж”); RusDict.add(“§”, “з”);
RusDict.add(“Ё”, “и”); RusDict.add(“©”, “й”); RusDict.add(“Є”, “к”);
RusDict.add(“«”, “л”); RusDict.add(“¬”, “м”); RusDict.add(“”, “н”);
RusDict.add(“®”, “о”); RusDict.add(“Ї”, “п”); RusDict.add(“а”, “р”);
RusDict.add(“б”, “с”); RusDict.add(“в”, “т”); RusDict.add(“г”, “у”);
RusDict.add(“д”, “ф”); RusDict.add(“е”, “х”); RusDict.add(“ж”, “ц”);
RusDict.add(“з”, “ч”); RusDict.add(“и”, “ш”); RusDict.add(“й”, “щ”);
RusDict.add(“к”, “ъ”); RusDict.add(“л”, “ы”); RusDict.add(“м”, “ь”);
RusDict.add(“н”, “э”); RusDict.add(“о”, “ю”); RusDict.add(“п”, “я”);
}
//Функция для перевода строки из DOS- в Windows-кодировку
function DosToWin(s) {
var i,ss; //Объявляем переменные
//Проверяем, создан ли объект RusDict
if (typeof(RusDict)==”undefined”)
//Если объект RusDict не создан, создаем его
MakeRusDict();
ss=””;
for (i=0;i
if (RusDict.Exists(s.charAt(i))) //Проверяем наличие символа в словаре
//Преобразуем i-й символ в Windows-кодировку
ss =RusDict.Item(s.charAt(i));
else ss =s.charAt(i);
}
return ss;
}
/************* Начало *********************************************/
//Печатаем приглашение для ввода
WScript.StdOut.Write(“Введите одну строку: “);
s = WScript.StdIn.ReadLine(); //Вводим строку с клавиатуры
WScript.StdOut.WriteBlankLines(1); //Печатаем пустую строку
WScript.StdOut.Write(“Было введено: “);
//Преобразовываем введенную строку в Windows-кодировку
//и выводим ее на экран
WScript.StdOut.WriteLine(DosToWin(s));
/************* Конец *********************************************/
Листинг 2.15. Ввод одной строки с помощью метода StdIn ReadLine (VBScript)
‘*******************************************************************
‘ Имя: StdIn1.vbs
‘ Язык: VBScript
‘ Описание: Пример использования метода StdIn.WriteLine
‘*******************************************************************
‘ Функция для перевода строки из DOS- в Windows-кодировку
Function DosToWin(s)
Dim i,k,ss
ss=””
For i=1 To Len(s) ‘ Цикл по всем символам в строке
k = Asc(Mid(s,i,1)) ‘ Определяем ANSI-код i-го символа
‘ Изменяем код k на код соответствующего символа в
‘ Windows-кодировке
If (128 <= k) And (k <= 175) Then
k=k 64
ElseIf (224 <= k) And (k <= 239) Then
k=k 16
ElseIf k = 240 Then
k=168
ElseIf k = 241 Then
k=184
End If
ss=ss Chr(k) ‘ Возвращаем преобразованную строку
Next
DosToWin=ss
End Function
‘************* Начало *********************************************
Dim s
‘ Печатаем приглашение для ввода
WScript.StdOut.Write “Введите одну строку: ”
s = WScript.StdIn.ReadLine ‘ Вводим строку с клавиатуры
WScript.StdOut.WriteBlankLines 1 ‘ Печатаем пустую строку
WScript.StdOut.Write “Было введено: ”
‘ Преобразовываем введенную строку в Windows-кодировку
‘ и выводим ее на экран
WScript.StdOut.WriteLine DosToWin(s)
‘************* Конец *********************************************
Используя метод WScript.StdIn.ReadAll, можно ввести сразу несколько строк подряд, ввод при этом прекращается после нажатия клавиш . Из введенной таким образом переменной можно затем сформировать массив, содержащий все строки. Для этого в JScript применяется метод split объекта string, а в VBScript — одноименная внутренняя функция Split (листинги 2.16 и 2.17).
Листинг 2.16. Ввод нескольких строк с помощью метода StdIn.ReadAll (JScript)
/*******************************************************************/
/* Имя: StdIn2.js */
/* Язык: JScript */
/* Описание: Пример использования метода StdIn.ReadAll */
/*******************************************************************/
var RusDict;
//Функция для создания объекта Dictionary с парами “ключ-значение”, где
//”ключ”-буква в DOS-кодировке, “значение”- символ, соответствующий этой
//букве в Windows-кодировке
function MakeRusDict() {
//Создаем объект Dictionary
RusDict = WScript.CreateObject(“Scripting.Dictionary”);
//Заполняем пары “ключ” (символ в DOS-кодировке)-“значение” (символ в
//Window-кодировке) для всех букв русского алфавита
RusDict.add(“Ђ”, “А”); RusDict.add(“Ѓ”, “Б”); RusDict.add(“‚”, “В”);
RusDict.add(“ѓ”, “Г”); RusDict.add(“„”, “Д”); RusDict.add(“…”, “Е”);
RusDict.add(“р”, “Ё”); RusDict.add(“†”, “Ж”); RusDict.add(“‡”, “З”);
RusDict.add(“€”, “И”); RusDict.add(“‰”, “Й”); RusDict.add(“Љ”, “К”);
RusDict.add(“‹”, “Л”); RusDict.add(“Њ”, “М”); RusDict.add(“Ќ”, “Н”);
RusDict.add(“Ћ”, “О”); RusDict.add(“Џ”, “П”); RusDict.add(“ђ”, “Р”);
RusDict.add(“‘”, “С”); RusDict.add(“’”, “Т”); RusDict.add(““”, “У”);
RusDict.add(“””, “Ф”); RusDict.add(“•”, “Х”); RusDict.add(“–”, “Ц”);
RusDict.add(“—”, “Ч”); RusDict.add(“”, “Ш”); RusDict.add(“™”, “Щ”);
RusDict.add(“љ”, “Ъ”); RusDict.add(“›”, “Ы”); RusDict.add(“њ”, “Ь”);
RusDict.add(“ќ”, “Э”); RusDict.add(“ћ”, “Ю”); RusDict.add(“џ”, “Я”);
RusDict.add(” “, “а”); RusDict.add(“Ў”, “б”); RusDict.add(“ў”, “в”);
RusDict.add(“Ј”, “г”); RusDict.add(“¤”, “д”); RusDict.add(“Ґ”, “е”);
RusDict.add(“с”, “ё”); RusDict.add(“¦”, “ж”); RusDict.add(“§”, “з”);
RusDict.add(“Ё”, “и”); RusDict.add(“©”, “й”); RusDict.add(“Є”, “к”);
RusDict.add(“«”, “л”); RusDict.add(“¬”, “м”); RusDict.add(“”, “н”);
RusDict.add(“®”, “о”); RusDict.add(“Ї”, “п”); RusDict.add(“а”, “р”);
RusDict.add(“б”, “с”); RusDict.add(“в”, “т”); RusDict.add(“г”, “у”);
RusDict.add(“д”, “ф”); RusDict.add(“е”, “х”); RusDict.add(“ж”, “ц”);
RusDict.add(“з”, “ч”); RusDict.add(“и”, “ш”); RusDict.add(“й”, “щ”);
RusDict.add(“к”, “ъ”); RusDict.add(“л”, “ы”); RusDict.add(“м”, “ь”);
RusDict.add(“н”, “э”); RusDict.add(“о”, “ю”); RusDict.add(“п”, “я”);
}
//Функция для перевода строки из DOS- в Windows-кодировку
function DosToWin(s) {
var i,ss; //Объявляем переменные
//Проверяем, создан ли объект RusDict
if (typeof(RusDict)==”undefined”)
//Если объект RusDict не создан, создаем его
MakeRusDict();
ss=””;
for (i=0;i
if (RusDict.Exists(s.charAt(i))) //Проверяем наличие символа в словаре
//Преобразуем i-й символ в Windows-кодировку
ss =RusDict.Item(s.charAt(i));
else ss =s.charAt(i);
}
return ss;
}
/************* Начало *********************************************/
var s,ArrS,i; //Объявляем переменные
//Печатаем приглашение для ввода
WScript.StdOut.WriteLine(“Вводите строки:”);
s = WScript.StdIn.ReadAll(); //Вводим строки с клавиатуры
WScript.StdOut.WriteBlankLines(3); //Печатаем пустые строки
ArrS=s.split(“n”); //Формируем массив из введенных строк
WScript.StdOut.WriteLine(“Всего ведено строк: ” ArrS.length);
for (i=1;i<=ArrS.length;i )
//Преобразовываем введенные строки в Windows-кодировку
//и выводим их на экран
WScript.StdOut.WriteLine(i “: ” DosToWin(ArrS[i-1]));
/************* Конец *********************************************/
Листинг 2.17. Ввод нескольких строк с помощью метода StdIn.ReadAll (VBScript)
‘*******************************************************************
‘ Имя: StdIn2.vbs
‘ Язык: VBScript
‘ Описание: Пример использования метода StdIn.ReadAll
‘*******************************************************************
Option Explicit
‘ Функция для перевода строки из DOS- в Windows-кодировку
Function DosToWin(s)
Dim i,k,ss
ss=””
For i=1 To Len(s) ‘ Цикл по всем символам в строке
k = Asc(Mid(s,i,1)) ‘ Определяем ANSI-код i-го символа
‘ Изменяем код k на код соответствующего символа в
‘ Windows-кодировке
If (128 <= k) And (k <= 175) Then
k=k 64
ElseIf (224 <= k) And (k <= 239) Then
k=k 16
ElseIf k = 240 Then
k=168
ElseIf k = 241 Then
k=184
End If
ss=ss Chr(k)
Next
DosToWin=ss ‘ Возвращаем преобразованную строку
End Function
‘************* Начало *********************************************
Dim s,ArrS,i,ColStr ‘ Объявляем переменные
‘ Печатаем приглашение для ввода
WScript.StdOut.WriteLine “Вводите строки:”
s = WScript.StdIn.ReadAll ‘ Вводим строки с клавиатуры
WScript.StdOut.WriteBlankLines 3 ‘ Печатаем пустые строки
ArrS=Split(s,vbCrLf) ‘ Формируем массив из введенных строк
ColStr=UBound(ArrS) 1
‘ Печатаем введенные строки
WScript.StdOut.WriteLine “Всего ведено строк: ” & ColStr
For i=1 To ColStr
‘ Преобразовываем введенные строки в Windows-кодировку
‘ и выводим их на экран
WScript.StdOut.WriteLine i & “: ” & DosToWin(ArrS(i-1))
Next
‘************* Конец *********************************************/
Методы write и writeline объекта wscript.stdout. windows script host для windows 2000/xp
13.4. Альтернативы read() и write()
Несмотря на то что системные вызовы read() и write() как нельзя лучше подходят приложениям для извлечения и хранения данных в файле, все же они не всегда являются самыми быстрыми методами. Они допускают управление отдельными порциями данных; для
Объект WScript
Свойства объекта WScript позволяют получить полный путь к использующемуся серверу сценариев (wscript.exe или cscript.exe), параметры командной строки, с которыми запущен сценарий, режим его работы (интерактивный или пакетный). Кроме этого, с помощью свойств объекта WScript
Свойства и методы экземпляра объекта
Как мы уже знаем, объект определяет набор свойств и методов, которые затем станут “собственностью” всех его экземпляров. Иными словами, экземпляр объекта получит все свойства и методы, что объявлены в объекте, на основе которого он
Свойства и методы объекта HTMLElement, применяемые для работы с элементами управления
Сначала мы рассмотрим самые полезные для нас свойства и методы объектов Web-обозревателя, представляющих различные элементы управления. Запомним: это именно объекты Web-обозревателя,
Свойства и методы объекта Element, применяемые для работы с элементами управления
А теперь обратимся к объекту Element библиотеки Ext Core и посмотрим, что он может предложить нам для работы с элементами управления.Метод getValue возвращает значение, введенное в поле ввода или область
Функции write(2) и writev(2)
Функции write(2) и writev(2) очень похожи на функции read(2) и readv(2), но используются для записи данных в файл. Функции имеют следующий вид:#include <unistd.>ssize_t write(int fildes, void *buf, size_t nbyte);#include <sys/types.h>#include <sys/uio.h>ssize_t writev(int fildes, struct iovec *iov, int iovcnt);Аргументы, передаваемые
Свойства и методы экземпляра объекта
Как мы уже знаем, объект определяет набор свойств и методов, которые затем станут “собственностью” всех его экземпляров. Иными словами, экземпляр объекта получит все свойства и методы, что объявлены в объекте, на основе которого он
Свойства и методы объекта HTMLElement, применяемые для работы с элементами управления
Сначала мы рассмотрим самые полезные для нас свойства и методы объектов Web-обозревателя, представляющих различные элементы управления. Запомним: это именно объекты Web-обозревателя,
Свойства и методы объекта Element, применяемые для работы с элементами управления
А теперь обратимся к объекту Element библиотеки Ext Core и посмотрим, что он может предложить нам для работы с элементами управления.Метод getValue возвращает значение, введенное в поле ввода или область
wscript.exe
Местонахождение: Windowssystem32 Описание: Microsoft (r) Windows Based Script HostСервер сценариев wscript.exe является GUI-вариантом, предназначенный для взаимодействия с пользователем через диалоговые окна Windows (в отличии от консольного приложения cscript.exe). С помощью сервера сценариев можно
wscript.exe
Местонахождение: Windowssystem32 Описание: Microsoft (r) Windows Based Script HostСервер сценариев wscript.exe является GUI-вариантом, предназначенный для взаимодействия с пользователем через диалоговые окна Windows (в отличии от консольного приложения cscript.exe). С помощью сервера сценариев можно
2.1. Свойства и методы объекта UserForm
Свойства объекта UserFormРассматривая в п. 1.2 и 1.3 примеры, решаемые в редакторе VBA, можно прийти к выводу, что такие простейшие задачи с выводом единственного результата в диалоговое окно не всегда будут удовлетворять потребностям
Свойства и методы объекта Button
По своим свойствам и методам объект Button во многом похож на объект movieclip. Имея весьма схожие наборы свойств и методов, эти два объекта зачастую ведут себя одинаково. В частности, объект Button поддерживает свойства х, _у, _xmouse, _ymouse, _height, _width, _alpha и
Свойства и методы объекта Key
Два важнейших метода, которые обязательно понадобятся нам для обработки нажатий клавиш, — это методы getAscii и getcode. Первый метод возвращает код символа ASCII, который присвоен нажатой клавише. Второй метод возвращает так называемый виртуальный