Скрипты WSH
VBSCRIPT - это особый язык программирования, используемый для склеивания в один пакет любых зарегистрированных в системе COM-обьектов. Кроме того он используется в виндузне как:
- 1.Это язык командного интерплетатора WSH (типа языка, обрабатываемого command.com, но только с возможностью вывода окошек). Почти все инсталляции программ написаны именно на этом языке. Современной альтернативы этому языку нет, есть только его доисторические предшественники - BAT-файлы из MS-DOS.
- 2.В виде языка, исполняемого браузером Internet Explorer на стороне клиента (т.е., когда вы входите на сервер и смотрите там страничку с разными двигающимися картинками и кнопками, то ваш браузер исполняет программу именно на этом языке (ну, иногда еще на Jscript).
- 3.Это стандартный язык, на котором Internet Information Server изготавливает для вас html-странички, которые вы просматриваете браузером, из шаблонов ASP. Опять же в редких случаях для этих целей может быть применены альтернативные языки.
Едва-ли какой-то еще язык так важен для функционирования 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 >%2C этим батничком никогда не забудешь про //nologo и что стандартные потоки StdIn и StdOut присутствуют только в CScript и отсутствуют в WScript. А вот результат применения этого WSH-скрипта. Сгрузить описанный скриптик можно отсюда.
Вот пример более интересного использования WSH для рассылки спама в тех случаях, когда прямую рассылку через SMTP выполнить не удается. Обратите внимание на хитрый способ передачи русских букв в WSH, который напрямую ни CSCRIPT, ни WSCRIPT не принимают. Собственно говоря, и саму эту обработку шаблонов несложно было бы выполнить на WSH, просто у меня под рукой оказалась студия, а не PrimalScript.
Все программы, которые пишутся, со временем забываются, но этим своим WSH-скриптом я пользуюсь уже много лет. Всякий раз, когда я приходил знакомиться с новой организацией, работающей под Windows, у меня всегда возникал неизбежный вопрос "Что эти юзеры тут с умным видом делают возле компьютеров?". Когда мне наконец-то надоело это выяснять с помощью OLE/COM Viewer'а, RegEdit'а и всяких сниферов - я написал пакетик из трех этих программок на WSH:
- COM_LIST - эта программа позволяет вытащить из реестра полный список всех зарегистрированных в системе COM-обьектов с правильными именами ProgID для из вызова.
- EXE_LIST - эта программа позволяет получить список всех исполняемых файлов на диске с указанием назначения этих EXE и DLL файлов (если, конечно это назначение вписал в стандартное поле разработчик - но для программ солидных фирм - это закон).
- MENU_LIST - наконец эта программа позволяет в виде таблицы получить иерархический список программ, вызываемых от кнопки ПУСК. (Что тоже бывает нужно, если меню уже стало огромным и необозримым и еще если хочется выяснить, к каким именно программам, существующими на этом компе, существуют ярлычки от кнопки ПУСК).
Чтобы загрузить к себе на копмец эти три скриптика на WSH кликните по этой ссылке, загрузите все к себе на компец, а затем там хороший README - в нем все прописано, что делать дальше. И если все будет сделано правильно хотя бы для первой программки, то вы получите вот такую замечательную табличку всех COM-обьектов вашего компьютера и все правильные ProgID ваших COM-обьектов (я вам рекомендую пользоваться обощенным ProgID - VersionIndependentProgID).
В этом примере из шести тысяч COM-обьектов, зарегистрированных на моем компеце, отобраны только XML2-парсеры):
Ниже приведены два обучающих примера с пошаговыми инструкциями и исходными текстами программ, демонстрирующие технику подключения к VBA стандартных моникеров для выгрузки двух иерархических баз данных:
Для прямого вызова COM-обьктов из VBSCRIPT или VB они должны поддерживать специальный высокоуровневый интерфейс IDispatch. Тогда, COM-обьекты можно напрямую подключать к своим программам непосредственно:
- Set Connect = WScript.CreateObject("ADODB.Connection")
Существует, однако хитрый альтернативный способ подключения COM-обьектов, когда из свой проги вызывается специальный моникер, который и отдает нашей проге ссылку на внутренние структуры COM-обьекта:
- Set WMI_Ref_Obj = GetObject("WinMgmts:")
- Set ActivDirObject = GetObject("WinNT:")
- Set ActivDirObject = GetObject("LDAP:")
- Set ActivDirObject = GetObject("IIS:")
- Set ActivDirObject = GetObject("NWCOMPAT:")
- Set ActivDirObject = GetObject("NDS:")
Конечно моникер можно вызвать не только с пустыми параметрами, но и передать ему точную спецификацию того обьекта, ссылку на который мы хотим получить в своей программе.
Например, вызов 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.
|