(Notes) 2001

Скрипты WSH

VBSCRIPT - это особый язык программирования, используемый для склеивания в один пакет любых зарегистрированных в системе COM-обьектов. Кроме того он используется в виндузне как:

Едва-ли какой-то еще язык так важен для функционирования Windows. По своей важности он напоминает язык PERL в UNIX. А по сути VBSCRIPT - это своего рода вершина пирамиды типа Assembler'ные инструкции >>> API на C >>> классы на C++ >>> VBSCRIPT. Тем не менее в школе почему-то изучают какой-то там Pascal, а не VBSCRIPT. Полную документацию по VBSCRIPT можно сгрузить отсюда.


Сам по себе язык VBSCRIPT, наряду с JSCRIPT, REXX, PERL и другими языками может быть использован для написания сценариев WSH - т.е. для непосредственного манипулирования в строчном интерплетирующем режиме всеми обьектами Windows. Полную документацию по WSH можно сгрузить отсюда.

Вообше-то встроенная обьектная модель WSH довольно ограничена - но здесь проявляется самая замечательная особенность VBSCRIPT - возможность напрямую загружать любые зарегистрированные в системе COM-обьекты и прямо в строчном интерплетирующем режиме обращаться к методам и свойствам любых COM-обьектов! (Правда для этого COM-обьекты должны поддерживать специальный высокоуровневый интерфейс IDispatch.)

Благодаря этим замечательным особенностям я использую WSH на VBSCRIPT очень часто - от планирования дефрагментации дисков на ночь до выполнения на нем повторящихся кликаний по кнопкам какой-нибудь прикладной системы.

Жаль только, что в Windows не предусмотрен макрорекордер, автоматически создающий текст на WSH для повторяющихся кликаний по кнопкам.


Вот простейший пример использования WSH. При работе с длинными текстовыми файлами мне понадобилось пронумеровать в них строки, как это делает юниксовая утилита NL. Набираем скриптик:

While Not (WScript.StdIn.AtEndOfStream)
WScript.StdOut.WriteLine ( string (5-len (WScript.StdIn.Line), "0" ) & WScript.StdIn.Line & ": " & WScript.StdIn.ReadLine() )
Wend

Сохраняем скриптик как NUM.VBS, затем для удобства цепляем к этому скрипту батничек NL.BAT:

cscript //nologo NUM.vbs <%1 >%2

C этим батничком никогда не забудешь про //nologo и что стандартные потоки StdIn и StdOut присутствуют только в CScript и отсутствуют в WScript. А вот результат применения этого WSH-скрипта. Сгрузить описанный скриптик можно отсюда.


Вот пример более интересного использования WSH для рассылки спама в тех случаях, когда прямую рассылку через SMTP выполнить не удается. Обратите внимание на хитрый способ передачи русских букв в WSH, который напрямую ни CSCRIPT, ни WSCRIPT не принимают. Собственно говоря, и саму эту обработку шаблонов несложно было бы выполнить на WSH, просто у меня под рукой оказалась студия, а не PrimalScript.


Все программы, которые пишутся, со временем забываются, но этим своим WSH-скриптом я пользуюсь уже много лет. Всякий раз, когда я приходил знакомиться с новой организацией, работающей под Windows, у меня всегда возникал неизбежный вопрос "Что эти юзеры тут с умным видом делают возле компьютеров?". Когда мне наконец-то надоело это выяснять с помощью OLE/COM Viewer'а, RegEdit'а и всяких сниферов - я написал пакетик из трех этих программок на WSH:

Чтобы загрузить к себе на копмец эти три скриптика на WSH кликните по этой ссылке, загрузите все к себе на компец, а затем там хороший README - в нем все прописано, что делать дальше. И если все будет сделано правильно хотя бы для первой программки, то вы получите вот такую замечательную табличку всех COM-обьектов вашего компьютера и все правильные ProgID ваших COM-обьектов (я вам рекомендую пользоваться обощенным ProgID - VersionIndependentProgID).

В этом примере из шести тысяч COM-обьектов, зарегистрированных на моем компеце, отобраны только XML2-парсеры):




Ниже приведены два обучающих примера с пошаговыми инструкциями и исходными текстами программ, демонстрирующие технику подключения к VBA стандартных моникеров для выгрузки двух иерархических баз данных:

Для прямого вызова COM-обьктов из VBSCRIPT или VB они должны поддерживать специальный высокоуровневый интерфейс IDispatch. Тогда, COM-обьекты можно напрямую подключать к своим программам непосредственно:

Существует, однако хитрый альтернативный способ подключения COM-обьектов, когда из свой проги вызывается специальный моникер, который и отдает нашей проге ссылку на внутренние структуры COM-обьекта:

Конечно моникер можно вызвать не только с пустыми параметрами, но и передать ему точную спецификацию того обьекта, ссылку на который мы хотим получить в своей программе.

Например, вызов WMI-моникера может выглядить так: WINMGMTS: {authenticationLevel=pktPrivacy, impersonationLevel=impersonate} ! \\COMPUTER\root\cimv2 : Win32_Product.IdentifyingNumber= "{25A13826-8E4A-4FBF-AD2B-776447FE9646}", Name="WMI Tools", Version="1.50.1131.0001"

В связи с широким распространением иерархических каталогов с информацией, параметры передаваемые моникеру LDAP, стандартизированы аж в 181 международном стандарте, последний из которых RFC3674). Однако, в практическом плане я рекомендую пользоваться микрософтовской документацией, ссылки на которую приведены в вышеприведенных пошаговых инструкциях.

Кстати в моих программах параметры моникеров запрашиваются у пользователя в диалоговых окошках, что дает широчайшие возможности для экспериментов.


Если же вы хотите узнать о иерархических базах данных побольше, то советую прочитать на моем сайте полное описание языка Xpath, с помощью которого осуществляется навигация по иерархической базе данных XML-тегов.



И еще два слова о моем любимом инструменте для работы с WSH (и не только). Это PrimalScript от компании www.sapien.com (креки вы найдете за пару секунд). В отличии от глючных монстров от Microsoft дистрибутив занимает всего 3,3 метра и этот инструмент поддерживает более 30 языков программирования с подсказкой, ключевыми словами и прочими сервисами. В новой версии PrimalScript есть даже мастер построения WMI-сценариев! Единственный недостаток PrimalScripta - он почему-то не поддерживает ключевых слов языка Assembler'a из-за чего мне приходится еще держать Source Insight - впрочем это уже совсем другая история, к WSH отношения не имеющая.

Обратите внимание на количество поддерживаемых PrimalScript языков. А вот раскрывающийся справа списочек в подсказке PrimalScripta - это и есть тот самый списочек из 6 тысяч COM-обьктов моего компьютера, которые позволяют его хоть наизнанку вывернуть. Первая из трех публикуемых мною на этом сайте программ - COM_LIST как раз и выгружает этот замечательный списочек с точными именами COM-обьктов прямо в Excel.



Comments ( )
Link to this page: //www.vb-net.com/wsh/index.htm
< THANKS ME>