Текст
                    CD-ROM
deni5<lscan
Гюнтер Борн
Руководство
разработчика
Microsoft
на Windows
Script Host 2.0
М-РУССППЦЩИ Л5 fosoftPress С^пптер

Маме и папе за их любовь, заботу и терпение.
Gunter Born Microsoft* Windows Script Host 2.0 Developer’s Guide Microsoft1 Press
Гюнтер Борн Руководство разработчика Microsoft* на Windows Script Host 2.0 МАСТЕР-КЛАСС И.РУССШ РЕДАКЦИЯ ^пптер Москва • Санкт-Петербург • Харьков • Минск 2001
УДК 004 ББК 32.973.26-018.2 Б53 Борн Г. Б53 Руководство разработчика на Microsoft Windows Script Host 2.0. Мастер- класс/ Пер. с англ. — СПб.: Питер; М.: Издательско-торговый дом «Русская Редакция», 2001. — 480 стр.: ил. ISBN 5-318-00605-1 ISBN 5-7502-0167-8 Книга Понтера Борна знакомит читателя с основами программирования сценариев для Microsoft Windows Script Host 2.0. В ней подробно и доступно описано, как с помощью сценариев автоматизировать решение таких рутин- ных задач, как резервное копирование файлов, управление учетными записями пользователей, настройка оболочки Windows и вызов приложений. В книге много примеров на языках VBScript и JScript. На прилагаемом к книге ком- пакт-диске, кроме исходных текстов примеров, вы найдете справочные руко- водства по языкам программирования сценариев VBScript и JScript, описа- ние объектной модели WSH, утилиты и электронную версию книги на англий- ском языке. Книга состоит из 14 глав, 2 приложений и предметного указателя. Названия всех команд, диалоговых окон и других интерфейсных элементов ОС приведены как на английском, так и на русском языке. УДК 004 ББК 32.973-26-018.2 Подготовлено к изданию по лицензионному договору с Microsoft Corporation, Ред- монд, Вашингтон, США. Macintosh является охраняемым товарным знаком компании Apple Computer, Inc. Intel — охраняемый товарный знак корпорации Intel. Active Directory, ActiveX, DirectX, Microsoft, Microsoft Press, MSDN, MS-DOS, Visual Basic, Visual C++, Visual Studio, Win32, Windows и Windows NT являются либо охраняемыми товарными знаками, либо то- варными знаками корпорации Microsoft в США и/или других странах. Все другие то- варные знаки являются собственностью соответствующих фирм. Информация, приведенная в этой книге, в том числе URL и другие ссылки на Web- узлы, может быть изменена без предварительного уведомления. Все названия компа- ний, организаций и продуктов, а также имена лиц, используемые в примерах, вымыш- лены и не имеют никакого отношения к реальным компаниям, организациям, про- дуктам и лицам. © Оригинальное издание на английском языке, ISBN O-7356-1O21-5 (англ.) Гюнтеп Борн, 2000 ISBN 5-318-00605-1 © П' а русский язык, Microsoft ISBN 5-7502-0167-8 2001
Оглавление Благодарности XII Введение XIII ЧАСТЬ I ОСНОВЫ ПРОГРАММИРОВАНИЯ СЦЕНАРИЕВ 1 ГЛАВА 1 Введение в Windows Script Host 2 Возможности сценариев WSH...................................3 Несколько замечаний о VBScript и JScript ...............3 Переход к WSH 2 .............................................4 Создание и использование сценариев ..........................5 Создаем первый сценарий на VBScript....................6 Создаем такой же сценарий на JScript...................7 Исполнение сценариев WSH ..............................8 Передача аргументов сценарию ...........................12 Новый формат .wsf-файлов ...............................16 Подключение внешних файлов............................17 Использование библиотек типов.........................18 Отладочные функции....................................19 ГЛАВА 2 Инструментальные средства и методика разработки 21 Создание сценариев ..........................................21 Использование шаблонов сценариев .......................22 Редактирование сценариев ....................................23 Вызов редакторов сценариев .............................24 Установка и удаление элементов управления ActiveX ...........31 Регистрация элемента управления ........................31 Удаление элемента управления ...........................32 Отладка сценариев ...........................................33 Трассировка программ..................................33 Работа с отладчиком Microsoft Script Debugger.........35 ГЛАВА 3 Основы программирования с использованием объектов 42 Объекты....................................................42 Пример простого объекта...............................42 Объектная модель .......................................43 Наборы .................................................44 Методы................................................45
VI Оглавление Пример из практики ........................................45 Доступные объекты..............................................46 Получение информации об объектах, методах и свойствах .....46 ГЛАВА 4 Введение в VBScript 47 Базовые возможности ............................................47 Операторы, непрерывные строки и комментарии ...............47 Константы и переменные ....................................49 Операторы .................................................58 Управляющие структуры .....................................63 Циклы.....................................................64 Функции и процедуры .......................................67 Дополнительные возможности .....................................75 Обработка ошибок ..........................................75 Регулярные выражения (в VBScript 5.0 и выше) ..............78 Классы (только для VBScript 5.0) ......................... 80 Оператор With (только в VBScript 5.0) .....................84 ГЛАВА 5 Введение в JScript 86 Что такое JScript? .............................................86 Структура программы на JScript.................................86 Комментарии ...............................................87 Операторы .................................................88 Константы.................................................89 Переменные................................................89 Использование Escape-последовательностей в строках ........93 Операторы......................................................94 Оператор присваивания..................................... 94 Операторы сравнения .......................................94 Арифметические операторы..................................95 Операторы инкремента и декремента ........................96 Логические операторы .....................................97 Старшинство операторов ...................................97 Управляющие структуры..........................................98 Оператор if...............................................98 Условный оператор ........................................99 Цикл for ................................................99 Цикл for. Jn ............................................ 101 Цикл while .............................................. 102 Цикл do...while..........................................102 Оператор switch ........................................103 Ключевые слова break и continue ....................... 104 Функции и объекты.............................................. 104 Пользовательские функции ................................104 Встроенные функции ...................................... 105
Оглавление VII Объекты ................................................105 Массивы ................................................106 ЧАСТЬ II ИНТЕРАКТИВНАЯ РАБОТА СО СЦЕНАРИЯМИ 109 ГЛАВА 6 Создание простых диалоговых окон на WSH 110 Использование метода Echo ....................................110 Использование метода Echo в программах на VBScript .... Ill Применение метода Echo в окне командной строки......... 112 Метод Echo в программах на JScript .....................113 Перевод строки при использовании метода Echo .......... 114 Применение функции MsgBox в программах на VBScript ...........115 Определение значка и кнопок диалогового окна............117 Установка фокуса на кнопке..............................119 Определение кнопки, которой закрыто диалоговое окно.... 120 Пример: создаем на VBScript приветствие при регистрации в системе...............................................122 Использование метода Popup .................................. 125 Использование метода Popup в программах на VBScript ....129 Еще один пример использования метода Popup на JScript . 130 ГЛАВА 7 Работа с объектами WSH 133 Использование объекта WScript ................................133 Получение свойств WSH и сценария ....................... 133 Получение свойств обработчика языка.....................137 Обращение к аргументам сценария.........................138 Обращение к переменным окружения ............................ 143 Обращение к переменным окружения в сценарии.............143 Создание и освобождение объектов..............................155 Отличия методов CreateObject и GetObject................157 Использование метода DisconnectObject ..................158 Запуск других программ из сценария .......................... 160 Запускаем Notepad из сценария ......................... 163 Запуск Calculator из программы на JScript ..............163 Пути с пробелами ...................................... 164 Метод Quit .............................................165 Исполнение команд MS-DOS с помощью метода Run ..........169 ГЛАВА 8 Получение вводимой пользователем информации в сценариях WSH 172 Вызов диалогового окна ввода на VBScript .................... 172 Вызов диалогового окна ввода на JScript ......................174 Решение для WSH 2: объединение VBScript и JScript...... 175 Метод prompt из Internet Explorer ......................177
VIII Оглавление ГЛАВА 9 Работа с формами 183 Создание диалогового окна About с помощью Internet Explorer. 183 Вывод HTML-файла методом showModalDialog............... 183 Вывод диалогового окна About на языке VBScript ........ 186 Вывод диалогового окна About на JScript ............... 188 Создание формы с помощью Internet Explorer и WSH............ 189 HTML-код для формы .....................................189 Вывод формы ............................................190 Вывод формы с помощью сценария WSH на JScript ..........195 Вывод диалогового окна выбора файла.................... 196 Улучшаем форму......................................... 199 ЧАСТЬ III ОСОБЫЕ ВОЗМОЖНОСТИ СЦЕНАРИЕВ 209 ГЛАВА 10 Создание ярлыков 210 Ярлыки: основные понятия ....................................210 Применение метода CreateShortcut .......................211 Ярлыки: идем дальше .........................................215 Применение объекта SpecialFolders ......................215 Создание ярлыка на рабочем столе .......................221 Создание ярлыка в меню Start............................225 Создание ярлыка с аргументами...........................231 Считывание свойств ярлыка ..............................235 Обновление ярлыка ......................................241 Создание ярлыка для Web-узла............................244 ГЛАВА 11 Дополнительные возможности WSH 247 Как получить имя пользователя, домена или компьютера ........247 Подключение к сетевому принтеру..............................249 Подключение принтера с помощью AddWindowsPrinterConnection ,.. 250 Подключение принтера с помощью AddPrinterConnection ....251 Удаление подключения принтера ..........................255 Создание списка всех подключенных принтеров ............256 Установка принтера по умолчанию ........................258 Подключение сетевых дисков ..................................260 Сценарии регистрации ...................................264 Доступ к реестру Windows ....................................264 Доступ к реестру в WSH .................................266 Доступ к реестру из VBScript ...........................268 Обработка ошибок периода выполнения при доступе к системному реестру ......................271 Проверка наличия раздела ............................. 273 Доступ к реестру в WSH ................................277 Перечисление разделов и параметров реестра ............281
Оглавление IX Доступ к реестру на удаленном компьютере ..................283 Изменение пути для установки Windows 98....................285 Сокрытие имени последнего зарегистрировавшегося пользователя .............................................287 Получение имени рабочей группы в Windows 98 ............... 288 ГЛАВА 12 Использование файловой системы и команд ввода-вывода 292 Объектная модель FileSystemObject..............................292 Создание FileSystemObject ................................293 Методы объекта FileSystemObject...........................293 Обращение к дискам ............................................294 Выводим список всех дисков компьютера ....................294 Вывод свойств диска ......................................300 Обращение к папкам и файлам ...................................306 Выводим список вложенных папок данной папки ..............306 Создание, перемещение, переименование и удаление папок .........................................309 Выводим список всех файлов папки .........................317 Получение атрибутов и дат файлов .........................320 Копирование и удаление файлов.............................327 Создание резервных копий папок............................331 Доступ к текстовым файлам .....................................336 Чтение данных из текстового файла ........................336 Подводные камни при просмотре текстовых файлов с помощью диалоговых окон и браузера ...............................339 Запись данных в текстовый файл............................347 Добавление нового текста в существующий файл..............351 Замена текста в файле.....................................353 Использование диалогового окна выбора папки ................. 356 Выбор папок методом BrowseForFolder.......................356 Выбор файлов методом BrowseForFolder .....................362 ГЛАВА 13 Управление окнами и приложениями из сценариев 366 Задержка выполнения сценария ..................................366 Снижение нагрузки на процессор методом Sleep .............366 Приостановка как способ решения проблемы асинхронных процессов ................................................368 Активизация приложения методом AppActivate.....................369 «Подводные камни» при применении метода AppActivate ......372 Имитация нажатия клавиш методом SendKeys ......................373 Применение SendKeys в WSH 2 ..............................373 Работа с двумя приложениями посредством SendKeys..........377 Настройка Windows с помощью сценариев регистрации .............380 Установка сценария регистрации ...........................380 Глобальные сценарии регистрации и выхода из системы.......382
X Оглавление Использование сценариев при запуске и отключении системы ................................. 383 Сценарии запуска и отключения системы в Windows 95/98 ... 383 ГЛАВА 14 Приемы программирования и советы 385 Ошибки периода выполнения....................................385 Обработка ошибок периода выполнения в VBScript ..........385 Обработка ошибок периода выполнения в JScript............386 Генерация ошибок периода выполнения в VBScript ..........386 Пути и даты ..................................................387 Получение пути сценария ................................387 Получение текущего каталога.............................388 Установка папки по умолчанию ............................388 Получение имени текущего диска..........................389 Вычисление разницы дат..................................389 Длинные имена, команда At и системные вызовы.................390 Запуск сценария с помощью планировщика Windows NT.......390 Работа с длинными именами в сценариях...................391 Выполнение системных вызовов методом Run ...............391 Блокировка рабочей станции в Windows 2000 ............. 394 Вызов диалогового окна Copy Disk .......................395 Вызов диалогового окна Format ..........................396 Вызов страницы свойств Screen Saver.....................397 Вызов модулей из Control Panel .........................397 Обработка сетевых подключений методом Run ..............399 Пользовательские диалоговые окна и вывод .................. 399 Применение табуляции и концов строк ....................399 Отображение консольного ввода и вывода .................399 Запись в строку и чтение из строки .....................401 Конвейеризация программного вывода .....................403 Поточный обмен с файлами ...............................404 Регистрация вывода из сценария .........................407 Печать из WSH-сценария .................................410 Работа с файлами ............................................411 Проверка наличия файла или папки .......................411 Проверка наличия файлов в папке ........................411 Проверка, используется ли база данных Access ...........412 Копирование файла.......................................413 Изменение имени файла или папки.........................413 Поиск файла ............................................415 Составление списка всех файлов-ярлыков .................415 Воспроизведение звука........................................417 Воспроизведение звука с помощью Internet Explorer ......418 Оболочка Windows ............................................420 Проверка версии оболочки ...............................421
Оглавление XI Упорядочение окон рабочего стола.....................422 Открытие окон папок..................................424 Доступ к диалоговым окнам оболочки Windows...........425 Подключение телефонных соединений .......................428 ЧАСТЬ IV ПРИЛОЖЕНИЯ 431 ПРИЛОЖЕНИЕ А Ресурсы WSH в Интернете 432 ПРИЛОЖЕНИЕ Б Безопасность сценариев 433 Частичная блокировка WSH ................................433 Предотвращение автоматического выполнения сценариев WSH .434 Параметры безопасности сценариев WSH.....................436 Заключительные замечания ................................440 Предметный указатель 442 Об авторе 451
Благодарности Разработка Windows Script Host (WSH) заняла много времени, как и созда- ние этой книги. Мои рукоплескания в первую очередь — разработчикам Microsoft за этот мощный инструмент для программирования на уровне опе- рационной системы. Множество людей вдохновляло меня своими вопросами, предложениями, советами, публикациями в телеконференциях и предоставленными примера- ми. Я хочу выразить особую благодарность Майклу Харрису (Michael Harris), Яну Морришу (Ian Morrish), Клэренс Вашингтон мл. (Clarence Washington Jr.) и всем, кто щедро делился информацией в группах новостей, посвященных WSH. Их идеи помогали мне по мере того, как я изучал программирование сценариев. Статьи Эндрю Клиника (Andrew Clinick) и советы Майка Уолена (Mike Whalen) были для меня подобны Розеттскому камню. Отдельное спа- сибо Эндрю и Майку за прочтение этой книги от начала до конца перед сда- чей ее в печать и за массу дельных предложений. Я бы никогда не закончил эту книгу без помощи многих людей. Мои осо- бые благодарности Томасу Полману (Thomas Pohlmann), рискнувшему осу- ществить первое издание злой книги в Германии. Он верил в книгу по WSH даже после того, как несколько других авторов потерпели неудачу на этом поприще. Я также хочу поблагодарить Томаса Брауна-Висхолера (Thomas Braun-Wiesholler) и Бена Райана (Ben Ryan), моих редакторов в немецком и американском отделениях Microsoft Press, которые дали мне возможность опубликовать переработанный вариант этой книги. Хотя мои рукописи все- гда превышали предельный объем, Томас и Бен никогда не теряли терпения при работе со мной. Особые благодарности моим редакторам в Microsoft Press: Ине Чанг (Ina Chang), Салли Стикни (Sally Stickney) и Марку Янгу (Маге Young). Они провели долгие часы, редактируя и шлифуя мой текст. Без их участия английская версия этой книги никогда бы не увидела свет. Хотелось бы поблагодарить и других участников проекта, слишком многочисленных, чтобы перечислить здесь их всех. Наконец, спасибо моим жене и детям, Кати и Бенджамину, за поддержку при работе над книгой. Гюнтер Борн Май 2000 г.
Введение Когда вышла Microsoft Windows 3-1, я надеялся, что в ее составе будет язык сценариев. В других ОС такой язык имелся, но в Windows 3-1 были только старомодные пакетные файлы MS-DOS. По нескольким причинам мне не хо- телось применять решения сторонних разработчиков, такие как PowerBASIC или Rexx. По выходу Microsoft Windows 95 я время от времени использовал Microsoft Visual Basic, Visual Basic for Applications (VBA) и сценарии HTML. В 1998 г., работая над справочником по Microsoft Windows 98 для немецко- го отделения Microsoft Press, я обнаружил в Windows 98 новую функциональ- ность — Windows Scripting Host (WSH), который предоставлял два языка сце- нариев: Microsoft Visual Basic, Scripting Edition (VBScript), и Microsoft JScript. Годом позже я засел за книгу Microsoft Windows 98 Power Toolkit для Mic- rosoft Press. Я хотел подробно описать WSH и объяснить способы использо- вания сценариев для автоматизации таких задач, как резервное копирование файлов, подключение сетевых дисков и принтеров и вывод пользовательс- ких диалоговых окон. Однако документации по WSH мне найти не удалось, а в справочных файлах Windows 98 информации о программировании сце- нариев не было. Windows Script Host Reference в основном являлся всего лишь официальным изданием, а книги и Web-сайты, к которым я обращал- ся, касались лишь написания HTML-сценариев с помощью VBScript и JScript. Итак, я начал изучать образцы WSH из комплекта поставки Windows 98, по- сещая сайт Microsoft, посвященный сценариям, и занимаясь созданием соб- ственных образцов для WSH. С боем я выяснял, какие объекты использовать в той или иной ситуации, как получать сведения о свойствах и методах и как реализовать сценарий на VBScript или JScript. Отладка моих первых сценариев была истинным муче- нием. WSH 1 выводил в основном таинственные сообщения об ошибках пе- риода выполнения в строке такой-то или просто делал совсем не то, что я ожидал (в то время я еще не знал, как применять отладчик Microsoft Script Debugger в среде написания сценариев). Получив сообщение об ошибке пе- риода выполнения, я снова и снова загружал сценарий в Notepad, находил ошибочную строку, считая строки вручную, и пытался исправить код мето- дом проб и ошибок. Проведя за этим занятием долгие часы, я решил, что это неверный подход к программированию сценариев. Начав просматривать телеконференции, посвященные WSH, я обнаружил, что не одинок в своих исканиях. Участники телеконференций — Ян Морриш, Клэренс Вашингтон мл. и Майкл Харрис — дали мне много полезных знаний, но информации, особенно по усложненным вопросам программирования, все равно не хватало. Как автор книг по программированию на VBA и HTML- сценариям, я был знаком с кругом сайтов, содержавших материалы по напи- санию HTML-сценариев и программированию ActiveX. Здесь я узнал, что в не-
XIV ВВЕДЕНИЕ которых редакторах есть поддержка программирования сценариев, и научил- ся использовать отладчик сценариев и инструменты для получения более под- робных сведений об объектах, их методах и свойствах, такие как Object Bro- wser из Visual Basic. Это позволило мне заметно повысить производительность и создавать сценарии в относительно комфортном окружении. В начале я применял типичный подход программиста макросов: я пытал- ся создавать сценарии, комбинируя простые операторы. Иногда это работа- ло, но чаще я был завален сообщениями о синтаксических ошибках и ошиб- ках периода выполнения. От моего внимания также ускользнули мощные операторы, позволяющие копировать файлы, запускать программы, полу- чать вводимую пользователем информацию и т. д. Некоторые участники те- леконференций по WSH рекомендовали инструменты и языки сторонних разработчиков, обещавших предоставить в мое распоряжение богатый на- бор операторов. Однако по опыту я знал, что языки с богатым набором опе- раторов трудно изучать и использовать. Взяв за основу мой опыт программирования на VBA, я начал изучать фи- лософию написания сценариев. Я узнал, что для таких задач, как считывание аргументов сценария и копирование файлов, операторы, глубоко «зарытые» в языке сценариев, не нужны, так как WSH дает доступ ко всем установлен- ным в системе объектам СОМ. Таким образом, в сценарии можно задейство- вать функции нужных объектов СОМ. Установка новых объектов СОМ позво- ляет увеличить число функций, которые можно применить в сценариях, не меняя сам язык сценариев, на котором они написаны. Так, если объект про- веряет орфографию, вы попросту можете включить его в сценарий. Позна- комившись с WSH поближе, я понял, что это самая актуальная технология, созданная Microsoft за последние годы. WSH — это клей, объединяющий объекты (например, систему проверки орфографии из Microsoft Office, тек- стовый процессор, браузер и почтовую систему), формируя новое специа- лизированное приложение. Вы легко и быстро создадите сложное приложе- ние с помощью нескольких строк сценария. К этому моменту я собрал большой материал, приобрел некоторый опыт и написал массу примеров. Я также включил в Microsoft Windows 98 Power Toolkit краткий раздел, посвященный WSH. В 1998 г. на Франкфуртской книж- ной ярмарке я познакомился с редакторами Microsoft Press Томасом Полма- ном и Стефаном Гати. Так родилась идея книги по программированию сце- нариев WSH. Через шесть недель была готова рукопись на немецком, а пер- вое издание этой книги вышло в январе 1999 г. Это была первая в мире кни- га по WSH 1. Весной вышла первая бета-версия WSH 2. Книгу по WSH 2 мы решили отложить до выхода Windows 2000. Я посвятил еще некоторое вре- мя изучению WSH 2 и других последних технологий, таких как ActiveX Data Objects (ADO), Active Directory Service Interfaces (ADSI) и Windows Mana- gement Instrumentation (WMI), и написал серию статей в компьютерном жур- нале для начинающих программистов на WSH. Я создал на своем Web-сайте раздел WSH Bazaar и провел множество часов в телеконференциях по WSH, изучая проблемы, возникающие у программистов сценариев.
ВВЕДЕНИЕ XV Собранного материала хватило на две книги: эту, адресованную начина- ющим и пользователям среднего уровня, и другую — для опытных пользова- телей — Advanced Development with Microsoft Windows Script Host 2.0, которая посвящена технологиям создания и использования сценариев и будет опуб- ликована Microsoft Press в конце этого года. В ней опытные программисты сценариев найдут более глубокое описание предметов, о которых рассказы- вается на страницах книги, которую вы держите в руках. В Advanced Deve- lopment with Microsoft Windows Script Host 2.0 будет рассказано о расширении возможностей при работе со сценариями с помощью дополнительных объек- тов. Там же будут освещены специальные темы, такие как XML-структура .wsf- файлов и многие недокументированные моменты, касающиеся этих файлов. Я объясню, как с помощью дополнительных инструментов получить подроб- ные сведения об объектах, их методах и свойствах, таких как OLE/COM Object Viewer и Object Browser. Вы узнаете, как в сценариях обращаться к приложениям Microsoft Office, как использовать объекты, такие как листы Microsoft Excel, система проверки орфографии из Office, документы Microsoft Word и функции Microsoft Outlook. Кроме того, я расскажу, как в сценариях осуществляется считывание и запись в БД с помощью Microsoft Access или ADO. Вы также узнаете, как администраторы могут посредством сценариев WSH обращаться к ADSI для поддержки пользовательских учетных записей, служб и совместно используемых ресурсов. Вы познакомитесь с новой тех- нологией WBEM (Web-Based Enterprise Management) и ее Microsoft-реализа- цией — Windows Management Interface, а также научитесь с помощью сце- нариев получать доступ к сети и информации о компьютере и прекращать выполнение процесса. Вы научитесь писать с помощью Visual Basic 5 Control Creation Edition (ССЕ) элементы управления ActiveX, позволяющие обращать- ся к функциям API Windows и буферу обмена, создавать формы ActiveX, уп- равлять приводом CD-ROM и выполнять множество других действий. Мы погрузимся в исследование исходного кода некоторых элементов управле- ния ActiveX, использованных в этой книге. Эта книга научит вас всему необ- ходимому для начала работы со сценариями WSH, a Advanced Development with Microsoft Windows Script Host 2.0 поможет стать экспертом в программи- ровании на WSH. Вы познакомитесь с хитростями, которые используют про- фессиональные разработчики, чтобы выжать максимум возможностей из WSH. Кому адресована эта книга Если вы опытный программист сценариев и используете WSH с момента его выхода, сразу переходите к. Advanced Development with Microsoft Windows Script Host 2.0. Эта же книга адресована всем интересующимся вопросами WSH, в том числе: системным администраторам, которым нужно реализовать автоматизи- рованные решения для управления пользовательскими учетными запися- ми, резервного копирования файлов и т. п., а также тем, кто хотел бы по- знакомиться с программированием сценариев;
XVI ВВЕДЕНИЕ И опытным пользователям, желающим настроить свою Windows-систему и автоматизировать решение некоторых задач с помощью языка сценариев; ® программистам, которым надо быстро изучить программирование на WSH, ищущим идеи и образцы кода, которые позволили бы им понять, какие задачи можно решить с помощью WSH; К менеджерам, которые хотят узнать, для чего нужен WSH и как с помощью сценариев WSH повысить производительность систем. Круг вопросов, рассматриваемых в книге Эта книга отнюдь не является полным справочником по сценариями — это набор примеров, которые начинаются с пошаговых инструкций. Поскольку большинство опытных пользователей и системных администраторов кое-что знают о программировании макросов и пакетных файлов, но очень мало — об объектно-ориентированном программировании, в книге будет дано вве- дение в использование объектов и программирование на VBScript и JScript. Прочитав эту книгу, вы должны знать, для чего нужен WSH, понимать ос- новы VBScript и JScript и уметь писать свои сценарии, использующие мето- ды и свойства объектов WSH. Читать книгу от доски до доски вовсе не обязательно. Вы можете сосре- доточиться на отдельных частях, которые отвечают вашим насущным инте- ресам и потребностям. Книга состоит из четырех частей. Название первой — «Основы програм- мирования сценариев» — говорит само за себя. Если раньше вы никогда не занимались программированием, я рекомендую начать чтение книги имен- но с этой части. В главе 1 вы познакомитесь с WSH и научитесь запускать сценарии. Вы узнаете об обработчиках языков, о том, как передавать аргу- менты сценарию, как использовать переключатели и устанавливать свойства сценария. Глава 2 знакомит с инструментами, упрощающими разработку сценариев. Вы узнаете, как применять редакторы сценариев, научитесь ус- танавливать элементы управления ActiveX и отлаживать сценарии. Если вам еще не приходилось заниматься объектно-ориентированным программиро- ванием, загляните в главу 3, где раскрывается сущность объектов, методов, свойств, наборов и моделей объектов. Глава 4 представляет собой введение в VBScript, а глава 5 — в JScript. Во второй части — «Интерактивная работа со сценариями» — разъясня- ется, как писать сценарии, получать вводимую пользователем информацию и выводить результаты в виде диалоговых окон и форм. Глава 6 знакомит с методами и функциями, позволяющими просматривать результаты в диало- говых окнах-, методом Echo, функцией VBScript MsgBox и методом Popup. Гла- ва 7 разъясняет способы использования объектов WSH. Из приведенных примеров вы узнаете, как считывать свойства сценария и языка с помощью объектов WScript, исследовать переданные сценарию аргументы и обращать- ся к переменным окружения. Вы поймете, как создавать и освобождать эк- земпляры объекта в период исполнения сценария, как методом Run запус-
ВВЕДЕНИЕ XVII кать программы в сценарии. В главе 8 объясняется, как создать диалоговое окно ввода функцией VBScript InputBox, как расширить возможность JScript, чтобы компенсировать отсутствие функции InputBox. Вы увидите примеры рас- ширения возможностей сценариев с помощью объектов Microsoft Internet Ex- plorer. Рассказ о применении объектов Internet Explorer для создания диалого- вых окон и форм ввода будет продолжен в главе 9- В третьей части — «Особые возможности сценариев» — мы познакомимся с дополнительными объектами. Глава 10 посвящена управлению ярлыками на рабочем столе и в меню Start. В главе 11 вы узнаете, как сложные задачи (например, получение имени пользователя, компьютера или доменного име- ни) решить с помощью WSH. В ней рассказывается о подключении принте- ров и дисков в сетевых средах, а также об обращении к реестру Windows в сценариях WSH. Глава 12 разъясняет, как работать с дисками, папками и фай- лами с помощью объекта FileSystemObject. В частности, вы научитесь пере- числять файлы и папки, запрашивать свойства диска и осуществлять резер- вное копирование файлов посредством сценариев. В главе 13 описаны сред- ства WSH 2, позволяющие задерживать исполнение сценария, воспроизво- дить в сценариях звуки и запускать некоторые приложения. Вы узнаете, как сделать окно приложения активным и имитировать нажатия клавиш мето- дом SendKeys. Глава 14 содержит нескольких методик, советов и хитростей программирования. Так, вы научитесь получать текущий путь, завершать ра- боту Windows, выводить данные на печать и использовать в сценариях обо- лочку Windows. Четвертая часть состоит из двух приложений. В приложении А приводит- ся список Интернет-ресурсов по WSH. Приложение Б, посвященное защите сценариев, включает самую свежую информацию и описание стратегий, позволяющих повысить степень защиты Windows-систем от вирусов на ос- нове сценариев WSH. Примеры и инструменты При чтении этой книги вы встретите примеры, которые вы можете набирать вручную или загружать с прилагаемого компакт-диска. Примеры находятся в папках, названных в соответствии с нумерацией глав, к которым они относят- ся: \Chapter01, \ChapterO2 и т. д. Эти папки расположены в папке \WSHDevGuide. Примеры можно также просматривать с помощью пользовательского интер- фейса компакт-диска. Программа установки позволяет установить примеры на локальный жесткий диск. Чтобы распаковать примеры в каталоги, струк- тура которых соответствует системе нумерации глав, выберите пункт Run из меню Start и введите команду D:\Setup.exe (гдеО,- — имя привода CD-ROM на вашем компьютере). Например, файлы примеров для главы 3 находятся в папке \WSHDevGuide\Chapter03- На прилагаемом компакт-диске вы также найдете другие полезные инст- рументы и файлы, в том числе Windows Script Host 2. Там также находятся справочники программиста по VBScript и JScript и другие материалы. Для
XVIII ВВЕДЕНИЕ отображения пользовательского интерфейса откройте файл Start.htm, рас- положенный в корневом каталоге компакт-диска. Далее вы можете просмат- ривать содержимое диска из браузера. ПРИМЕЧАНИЕ При использовании сценариев вы можете серьезно повредить свою систему. Всегда создавайте резервные копии систем- ных и других важных файлов перед попыткой запустить сценарий, модифицирующий эти файлы, реестр или параметры системы. Вы используете примеры из этой книги на свой страх и риск, особенно если собираетесь вносить в них какие-либо изменения. Ни я, ни Mic- rosoft не в состоянии обеспечить вас поддержкой при работе со сце- нариями, так что вносите изменения с осторожностью. Литература для дальнейшего чтения Дополнительную информацию, полезную для программистов сценариев WSH, можно найти в следующих источниках. Я рекомендую прежде всего прочитать документы Microsoft: Ж Справочник по Windows Script Host — справочный файл по объек- там WSH, их методам и свойствам, включающий также учебник по WSH; этот справочник находится на прилагаемом компакт-диске; М Справочник по языку VBScript — источник справочной информации по вопросам, связанным с VBScript в последней инстанции; в этом спра- вочном файле есть учебники по VBScript и объекту FileSystemObject-, файл с этим справочником также находится на прилагаемом компакт-диске; Ж Справочник по языку JScript — справочник по синтаксису JScript и всем методам и свойствам, которые поддерживает ядро языка; в нем тоже имеется учебник по JScript и объекту FileSystemObject-, находится на ком- пакт-диске, прилагаемом к этой книге. Требования к системе Для работы с этой книгой необходима Windows-система (Windows 95, Win- dows 98, Windows NT c Service Pack 4 или Windows 2000) с установленным Windows Script Host (рекомендуется версия 2). Для нектороых примеров потребуется Microsoft Internet Explorer (версии 4 и выше). Некоторые инст- рументы для написания сценариев есть в Windows (например, редактор) или находятся на прилагаемом к книге компакт-диске. Возможно, кое-какие из них вам придется загрузить из Интернета.
ВВЕДЕНИЕ XIX И последнее... Мы приложили все усилия, чтобы выверить содержимое этой книги и ком- пакт-диска. Исправления помещены по адресу mspress.microsoft.com/mspress/ support. Свои комментарии, вопросы или идеи относительно этой книги и при- лагаемого к ней компакт-диска присылайте в Microsoft Press по электронной почте (mspinput@microsoft.com) или по адресу: Microsoft Press Attn: Microsoft Windows Script Host 2.0 Developer’s Guide Editor One Microsoft Way Redmond, WA 98052-6399 Связаться co мной можно через мой Web-сайт: www.borncity.de. Хочу еще раз обратить ваше внимание, что ни по одному из указанных адресов не предоставляется поддержка при работе со сценариями.
ЧАСТЬ I ОСНОВЫ ПРОГРАММИРОВАНИЯ СЦЕНАРИЕВ
ГЛАВА 1 Введение в Windows Script Host До Windows 98 в Windows практически не было средств автоматизации ре- зервного копирования файлов и выполнения рутинных операций по админи- стрированию системы. Конечно, определенные задачи, скажем, копирование файлов, можно было выполнить и с помощью старых пакетных файлов MS-DOS (ВАТ) в окне командой строки. Однако в ВАТ-файлы можно помещать лишь простые последовательности команд MS-DOS, которые не поддерживают диа- логовые окна и сообщения (среди их недостатков можно отметить поддержку только простого ветвления и отсутствие настоящей функциональности цик- лов). Запись макрокоманд в Windows 3.1 позволила несколько расширить круг выполняемых действий, обеспечивая запись и воспроизведение простых пос- ледовательностей нажатий клавиш и щелчков мыши. Но у средства записи мак- рокоманд не было программного доступа. В поиске более мощных средств автоматизации пользователи обратились к решениям сторонних фирм, таким как PowerBatch, или обратились к сре- дам программирования типа Delphi, Microsoft Visual Basic и Microsoft Visual C++. Но для многих пользователей Windows они были неприемлемы из-за их сложности и стоимости. Поскольку в Microsoft Office входил язык VBA (Visual Basic for Applications), a Web-разработчикам известны языки сценариев Microsoft Visual Basic, Scripting Edition (VBScript) и JavaScript от Netscape, создание Microsoft средства рабо- ты co сценариями для Windows было лишь вопросом времени. Windows Script Host (WSH) и является таким средством, которое попадает в категорию технологий Microsoft Windows Script. WSH — это автономный сервер сценариев, позволяющий исполнять сце- нарии на уровне ОС. Например, вы можете вызвать сценарий из командной строки или из Windows Explorer, дважды щелкнув файл сценария. WSH удо- бен для решения многих задач администрирования, для которых пользова- тельский интерфейс практически не нужен. Он намного гибче в сравнении со старыми пакетными файлами MS-DOS, так как JScript и VBScript являют- ся мощными языками сценариев с полным доступом к объектам WSH и лю- бым другим объектам автоматизации.
ГЛАВА 1 Введение в Windows Script Host 3 ПРИМЕЧАНИЕ До выхода второй версии Windows Script Host назы- вался Windows Scripting Host. Я буду обозначать обе версии аббревиа- турой WSH. Возможности сценариев WSH Сценарии позволяют решать широкий спектр задач по автоматизации и на- стройке Windows-систем. Вот некоторые из них. Ш Резервирование и восстановление файлов в системе (эта возможность особенно удобна, если требуется сохранить небольшое число файлов с вашей машины на сетевом сервере). Выключение или перезапуск Windows одним щелчком. Сценарий также позволяет добавить специальные задачи, которые нужно выполнить во время выключения или запуска системы: например, резервирование оп- ределенных файлов после закрытия приложений или занесение имени пользователя в журнал после загрузки системы. (Возможность протоко- лирования информации посредством сценариев особенно полезна в Windows 95/98; в Windows NT/2000 многие функции протоколирования встроены.) Интегрирование приложений с их данными. Например, сценарий может запустить приложение из пакета Office, загрузить и обработать документ, вывести его на печать и закрыть приложение. Подобным образом вы мо- жете ассоциировать документ с любым приложением. М Решение таких задач администрирования системы, как добавление, об- новление и удаление пользовательских учетных записей в Windows NT/ 2000. Сценарий WSH позволяет автоматизировать все три задачи с помо- щью интерфейса ADSI (Active Directory Service Interfaces), поддерживае- мого Windows NT/2000. M Прямой доступ к оболочке Windows (для создания ярлыков или подклю- чения сетевых устройств, таких как диски и принтеры) через соответству- ющие объекты. Считывание значений переменных окружения и получение сведений о Windows. Запуск программ и управление объектами Automation. Вывод диалоговых окон, информирующих пользователя о состоянии программы или получающих вводимую им информацию. й Обращение к оболочке Windows и интерфейсам прикладного програм- мирования (API) для управления окнами и приложениями. Несколько замечаний о VBScript и JScript WSH, поставляемый с Windows 98/2000 (его также можно загрузить из Ин- тернета для Windows 95/NT 4), поддерживает два языка программирования:
4 ЧАСТЬ I Основы программирования сценариев VBScript и JScript. VBScript использует тот же синтаксис, что и Visual Basic, и по сути является подмножеством этого языка. JScript представляет собой Microsoft-реализацию ECMAScript, не зависимого от производителя языка программирования на основе JavaScript. Этих языков достаточно для знакомства с миром программирования сце- нариев. Однако Microsoft создан открытый интерфейс WSH, что позволяет сторонним производителям интегрировать собственные обработчики для поддержки других языков, таких как Perl, Tool Control Language (Tel) и Rexx. Переходи WSH2 Первоначально WSH 1 поставлялся c Windows NT 4 Option Pack. Он также входит в состав Windows 98. Если WSH 1 не активен, его следует установить как дополнительный компонент Windows. WSH 2 — неотъемлемая часть Windows 2000, так что если вы работаете в этой ОС, установка WSH 2 не тре- буется. Чтобы выяснить, установлен ли в вашей системе WSH, просто откройте папку (например, с помощью Windows Explorer), в которой есть файлы с расширением .js, .vbs или .wsf. Если значки, которыми обозначены эти фай- лы, совпадают с показанными ниже (рис. 1-1), то установлен WSH 2. Если для обозначения файлов с расширением .wsf используется значок «неизвестный документ», то установлен WSH 1; если же все файлы с указанными расшире- ниями обозначены такими значками, WSH на компьютере не установлен. VBSciiplvbs JScriptjs WSHfile.w$f Рис. 1-1. Значки и расширения файлов сценариев. Отличия VBScript от Visual Basic/VBA и JScript — от JavaScript Если вы раньше программировали на Visual Basic, VBA или писали сце- нарии для документов HTML на VBScript или JScript, то написание сце- нариев на WSH не должно вызвать у вас затруднений. И все же кое-что обязательно надо иметь в виду. й Программы на Visual Basic могут быть скомпилированы в ЕХЕ-фай- лы, но в WSH такой функциональности нет. В WSH вам придется дер- жать все сценарии в простых текстовых .vbs-, .js- или .wsf-файлах. Для интерпретации содержимого файла сценария WSH использует об- работчики Windows Script, так что можно создавать сценарии с по- мощью простого текстового редактора (такого как Notepad). Я В языки VBScript и JScript (поставляются с WSH 2) не входят конст- рукции вроде оператора Declare из Visual Basic и VBA, позволяющие обращаться к внешним функциям и процедурам. В VBScript нет процедур для расширенной обработки ошибок в период выполне-
ГЛАВА 1 Введение в Windows Script Host 5 ния (таких как On Error Go'10метка). Ни VBScript, ни JScript не под- держивают явное объявление типов данных. Любая переменная рассматривается в них как Variant. Ж Объектная модель WSH отличается от объектной модели Internet Explorer. Так, в WSH не поддерживается объект windowdocument для вывода информации пользователем. Поскольку у среды WSH нет расширенного пользовательского интерфей- са (который есть у Internet Explorer), объектная модель WSH не поддержи- вает событий пользовательского интерфейса (подобных onclick в сценари- ях HTML). Однако WSH все же поддерживает обработку событий, в чем вы еще убедитесь. Чтобы обновить Windows 95/98/NT 4 до WSH 2, WSH надо ус- тановить вручную. Соответствующие версии WSH 2 для каждой из этих ОС есть на прилагаемом CD. Последние версии файлов WSH также доступны для загрузки по адресу http://msdn.microsoft.com/scrilJting (бесплатно). ПРИМЕЧАНИЕ В случае Windows NT 4 вы также должны установить Service Pack 3- Для работы с WSH в Windows 95/NT 4 требуется Internet Explorer 4 или более поздней версии. Чтобы WSH 2 работал с Internet Explorer 3 под Windows 95, нужно установить DCOM. Подробнее об этом см. Web-сайт Microsoft по адресу http://msdn.microsoft.com/scripting. WSH и различные версии обработчиков языков Необходимо знать, какая версия WSH установлена у вас на компьюте- ре и какие версии обработчиков языков (language engines) применя- ются для исполнения сценариев. После версии 3-1 (поставлявшейся с WSH 1) Microsoft выпустила несколько обновлений обработчиков язы- ков. В версии 31а исправлено несколько ошибок. С Visual Studio 6 по- ставляется версия 4. В Internet Explorer 5 входит версия 5, в которой исправлены некоторые ошибки и расширены возможности языка. Она также предлагается Microsoft как отдельное обновление, доступное по адресу http://msdn.microsoft.com/scripting. WSH 2 является частью Windows Script 5.1, куда также входит вер- сия 5.1 обработчиков VBScript и JScript. Обработчики языков версии 5.1 можно использовать с Internet Explorer 4 и 5 и с IIS версий 3 и 4. Создание и использование сценариев Готовы ли вы создать свой первый сценарий и начать с ним работать? Для начала мы создадим простую программу, которая выводит диалоговое окно с сообщением Hello, world. Она позволит проиллюстрировать основы про- граммирования и исполнения сценариев.
6 ЧАСТЬ I Основы программирования сценариев Создаем первый сценарий на VBScript Чтобы создать на VBScript простое диалоговое окно (рис. 1-2), нужна лишь одна строка кода: WScript.Echo "Hello, world" Рис. 1-2. Простое диалоговое окно. Но как создать сам файл сценария? В случае такого простого сценария достаточно Notepad. 1. Запустите Notepad.exe и введите операторы (рис. 1-3). Самый важный из них — WScriptEcho, поскольку именно он создает диалоговое окно. Рис. 1-3. Ваша первая программа на VBScript. 2. Сохраните содержимое окна редактора на жестком диске как текстовый файл под любым именем (например, Hello) с расширением .vbs. ПРИМЕЧАНИЕ Советую присваивать файлам сценариев на VBScript расширение .vbs. Этот тип файлов автоматически регистрируется как предназначенный для обработки WSH. Если вы дадите файлам другое расширение, ни одна из версий WSH не распознает язык, на котором написаны сценарии в этих файлах. При двойном щелчке файла сце- нария с неверным расширением (например, .vb) откроется диалоговое окно Open With, поскольку ни одно приложение для обработки фай- лов с таким расширением не зарегистрировано. После того, как вы сохранили этот сценарий, на жестком диске должен появиться файл Hello.vbs со следующим исходным кодом (листинг 1-1): * ************************************************ Файл: Hello.vbs (пример для WSH на VBScript) ' Автор: (с) G. Born ' Выводит простое диалоговое окно
ГЛАВА 1 Введение в Windows Script Host 7 WScript.Echo "Hello, world” '*** Конец Листинг 1-1. Hello.vbs. Вы можете спросить: было сказано, что для вызова диалогового окна до- статочно одной строки, но почему здесь восемь? Действительно, можно было бы создать простой сценарий из одной строки. Но я советую вам всегда до- бавлять комментарии с дополнительной информацией, которая включает ваше имя (как автора этого файла) и описание назначения сценария. Эти комментарии будут полезны другим и особенно вам самим. (Или вы всегда помните назначение и содержимое сценария спустя несколько недель? Лич- но я — нет!) Обработчик сценариев игнорирует эти комментарии. А теперь вернемся к коду. Поскольку мы используем VBScript, будем вво- дить все операторы в соответствии с его синтаксисом. Перед комментари- ем на VBScript ставится одинарная кавычка: ' Это комментарий. Обработчик языка VBScript всегда игнорирует ту часть строки, которая стоит после одинарной кавычки. Это значит, что вы можете закомментиро- вать целую строку или только ее конец. Например, следующий оператор выводит диалоговое окно с текстом Hello, world. Комментарий в конце этой строки игнорируется. WScript.Echo "Hello, world” ' Вывести сообщение. СОВЕТ Файл Hello.vbs находится на прилагаемом к этой книге CD в папке \WSHDevGuide\Chapter01 с другими примерами из этой главы. В этой папке также расположены шаблоны VBScript.vbs и JScript.js. Их можно использовать для создания новых сценариев. Просто загрузи- те шаблон в свой редактор (щелкнув правой кнопкой значок файла и выбрав из контекстного меню команду Edit), введите необходимые команды и сохраните этот файл с новым именем. Создаем такой же сценарий на JScript Если вы предпочитаете писать программы на JScript, можно следовать дан- ным выше инструкциям, но следует вводить все операторы, придерживаясь синтаксиса JScript. Вот как выглядит предыдущая программа (листинг 1-1), переписанная на JScript (листинг 1 -2): // Файл: Hello.js (Пример для WSH на JScript) Ц Автор: (с) G. Born И // Выводит простое окно сообщения см. след. стр.
8 ЧАСТЬ I Основы программирования сценариев WScript.Echo("Hello, world”); Ц*** Конец Листинг 1-2. Hellojs. Однострочные комментарии на JScript помечаются двумя прямыми слэ- шами (//), а начало и конец многострочного комментария отмечаются так: /*... '/• Комментарии расположены в начале и в конце листинга 1-2. Для вы- вода окна сообщения я также использовал метод Echo объекта WScript (см. главу 3). Оператор, создающий простое диалоговое окно с текстом Hello, world и кнопкой ОК, на JScript выглядит иначе, чем на VBScript: WScript.Echo("Hello, world”); Видите разницу? При программировании на JScript хорошим тоном счи- тается завершать точкой с запятой все операторы (за редким исключением). Метод Echo также требует заключить в скобки строку «Hello, world*. Исполнение сценариев WSH Сценарии WSH, сохраненные в .vbs- или .js-файлах, можно исполнять в Win- dows, дважды щелкнув значок файла сценария, из диалогового окна Run или из командной строки. Исполнение сценария в Windows Чтобы исполнить сценарий в Windows, просто дважды щелкните значок его файла. По умолчанию Windows вызывает для исполнения сценария програм- му WScript.exe (так как при установке WSH она регистрируется как обработ- чик файлов с этим расширением). ПРИМЕЧАНИЕ WSH реализован в двух файлах. WScript.exe — это сер- вер сценариев, предназначенный для взаимодействия с пользователем через диалоговые окна Windows. CScript.exe — это консольное прило- жение Windows (оно работает в окне командной строки и посылает выходную информацию STDOUT подобно встроенным командам MS- DOS и Windows NT). CScript.exe предназначен главным образом для неинтерактивных задач. В Windows 98 WScript.exe находится в папке \Windows, a CScripLexe — в \Windows\Command. В Windows 2000 оба сервера располагаются в папке \WINNT\System32. Запустим сценарий. Для этого найдите в папке \WSHDevGuide\Chapter01 файл Hello.vbs и дважды его щелкните. В результате должно появится диало- говое окно (рис. 1-2). При двойном щелчке файла Hello.js выводится иден- тичное диалоговое окно. Диалоговые окна, которые выводятся в результате запуска любого из примеров, можно закрыть, нажав кнопку ОК.
ГЛАВА 1 Введение в Windows Script Host 9 Диалоговое окно Run также позволяет исполнять сценарии с помощью сервера WScript.exe или CScript.exe (этот метод особенно удобен, когда сце- нарию требуется передать аргументы). Для этого: 1. в меню Start выберите команду Run; 2. в текстовом поле Open введите исполнимую команду (например, WSc- ript.exe C:\Test\Hello.vbs); 3. нажмите ОК, чтобы закрыть диалоговое окно и исполнить сценарий. Исполнение сценария в окне командной строки Сценарии также можно исполнять в окне командной строки. Этот способ поддерживается как CScripLexe, так и WScript.exe. Чтобы исполнить сценарий, в командной строке надо ввести команду: CScript.exe раГЬ\имя_сценария [параметры сервера] [аргументы сценария] WScript.exe раТИ\имя_сценария [параметры сервера] [аргументы сценария] Вместо строки имя_сценария нужно подставить имя сценария с указанием пути к его файлу. В командной строке можно указать дополнительные пара- метры сервера и/или аргументы сценария. Перед параметрами сервера, с помощью которых активизируются и деак- тивизируются функции WSH, всегда ставятся два прямых слэша (табл. 1-1): Табл. 1-1. Параметры CScript.exe и WScript.exe. Параметр Поддерживается Поддерживается Описание WSH1___________WSH2________________________________________ //1 s J Активизирует интерактивный ре- жим, позволяя выводить пригла- шения для ввода команд пользова- телем и сообщения об ошибках в сценарии (установлен по умолча- нию). Противоположен по дей- ствию параметру //В). //В J Активизирует пакетный режим, в котором подавляется вывод в командной строке приглашений для ввода команд и сообщений об ошибках в сценарии. Если в сце- нарии имеется метод Echo, вывод всех приглашений для ввода команд пользователем отключает- ся. В WSH 2 этот параметр также позволяет отключить режим эха WScript.exe. //Т:пп s J Устанавливает значение таймаута (максимальное время исполнения сценария в секундах). см. след. стр.
10 ЧАСТЬ I Основы программирования сценариев Табл. 1-1. {продолжение} Параметр Поддерживается WSH 1 П оддержи вается WSH 2 Описание //fogo Выводит заставку (текст, появляю- щийся в окне командной строки после запуска сценария — верх- ние команды на рис. 1-4). Уста- новлен по умолчанию, противо- положен параметру //nologo. //nologo z ✓ Отключает вывод заставки при исполнении. //H:CScript //H:\VScript Регистрирует CScript.exe или WScript.exe как приложение по умолчанию для исполнения сце- нариев (//H:CScript или //H;WScript соответственно). Пос- ле начальной установки WSH сер- вером по умолчанию является WScript.exe. //s у V Сохраняет текущие параметры командной строки для данного пользователя. //? J V Выводит страницу со справочной информацией о параметрах сервера. //D V Активизирует режим Active Debugging для файлов сценариев .js и .vbs (см. главу 2). //E:engine J Устанавливает обработчик языка для исполнения сценария. //Job:xxx J Исполняет задание, ID которого в .wsf-файле равен ххх. //x J Исполняет сценарий под управле нием отладчика. Окно командной строки для вызова сценария Hello.vbs с несколькими параметрами выглядит так (рис. 1-4): Рис. 1-4. Команды для вызова CScript.exe или WScript.exe.
ГЛАВА 1 Введение в Windows Script Host 11 Полный список параметров сервера позволяет вывести команда CScript.exe //?. Параметры WScript.exe показаны ниже (рис. 1-5): чтобы вывести это окно, выберите в меню Start команду Run, наберите WScript.exe//? и щелкните ОК. Рис. 1-5. Параметры сервера сценариев WScript.exe. Установка свойств сценария Некоторые параметры исполнения сценария задаются параметрами серве- ра WScript.exe или CScript.exe. Параметры командной строки можно задать в окне командной строки. Если вы предпочитаете исполнять сценарии в Windows, то установить параметры сервера сценария можно из диалогово- го окна Run. Обычно пользователи предпочитают запускать сценарии двойным щел- чком (значка самого сценария или его ярлыка). Но Windows позволяет оп- ределить дополнительные свойства сценария. Для этого нужно щелкнуть сценарий правой кнопкой, выбрать из контекстного меню Properties и уста- новить нужные значения на странице свойств сценария (рис. 1-6). Рис. 1 -6. Страница свойств сценария.
12 ЧАСТЬ I Основы программирования сценариев Установив флажок против параметра Stop Script After Specified Number Of Seconds, можно задать значение таймаута в поле ввода Seconds. Если сцена- рий не завершился до истечения указанного таймаута, Windows прекраща- ет его исполнение. Параметр Display Logo When Script Executed In Command Console вынуждает CScripLexe выводить в окне командной строки сообще- ние «Microsoft (R) Windows Script Host...». Когда вы закроете страницу свойств, нажав кнопку OK, Windows создаст новый файл с именем файла сценария и расширением .wsh. Дважды щелк- нув этот файл, вы вынудите Windows исполнить сценарий с параметрами, установленными на странице свойств сценария. Файлы с расширением .wsh — это простые текстовые файлы, похожие на .ini-файлы. Их можно откры- вать в любом текстовом редакторе (например, в Notepad). Файл с расшире- нием .wsh содержит такие строки: [ScriptFile] Path=C:\WSHDevGuide\Chapter01\Hello. js [Options] Timeout=10 DisplayLogo=1 Оператор Path в разделе [ScriptFile] идентифицирует файл, в котором на- ходится подлежащий исполнению сценарий. Свойства периода выполнения определяются ключевыми словами в разделе [Options], Значение Timeout рав- но значению, заданному пользователем на странице свойств. Параметр Dis- playLogo-1 активизирует вывод заставки в окне командной строки (парамет- ры //logo и //nologo описаны в табл. 1-1). ПРИМЕЧАНИЕ В операторе Path .wsh-файлов можно использовать от- носительные пути и пути UNC (Universal Naming Convention). Относи- тельные пути и пути UNC повышают переносимость .wsh-файлов и свя- занных с ними сценариев, делая их независимыми от абсолютных пу- тей. Так, в примере Args.wsh используется оператор Path=\/rgs.i>bs, кото- рый является ссылкой на файл Args.vbs в текущем каталоге. Можно пе- ренести файлы Args.wsh и Args.vbs на другой диск, но Args.wsh все рав- но сможет найти Args.vbs, пока эти файлы находятся в одном каталоге. Передача аргументов сценарию Сценарию из предыдущего примера никаких аргументов не требовались. Однако иногда пользователь должен передать сценарию один или несколь- ко аргументов, таких как имя файла. Сценарий на VBScript (листинг 1-3) выводит все переданные ему аргументы: '****************«*«*«««««««««««****«**«*«««««««« ’ Файл: Args.vbs (Пример для WSH на VBScript) ’ Автор: (с) G. Born ' Выводит в диалоговом окне все переданные аргументы
ГЛАВА 1 Введение в Windows Script Host 13 text = “Arguments" & vbCrLf & vbCrLf Set objArgs = WScript.Arguments For i = 0 to objArgs.Count - text = text & objArgs(i) Next 1 & vbCrLf Создать объект. Цикл для обработки аргументов. Получить аргумент. WScript.Echo text ' Показать аргумент с помощью метода Echo. '*** Конец Листинг 1-3. Args.vbs. Потенциальные проблемы при передаче аргументов Прежде чем идти дальше, я хочу обратить ваше внимание на некото- рые проблемы при передаче аргументов. Допустим, вы хотите передать сценарию аргумент Hello, world. Это не удастся сделать следующей командой, так как слова Hello, и world будут интерпретированы WSH как отдельные аргументы: WScript.exe C:\WSHDevGuide\ChapterO1\Args.vbs Hello, world Чтобы передать строку с пробелами как единый аргумент, надо зак- лючить ее в двойные кавычки: WScript.exe C:\WSHDevGuide\ChapterO1\Args.vbs “Hello, world” При передаче аргументов сценарию может возникнуть и другая проблема. В случае длинных имен файлов сценариев весь путь надо заключать в двойные кавычки. Если, скажем, попытаться исполнить сценарий Args Test.vbs следующей командой, будет твориться нечто загадочное: WScript.exe C:\WSHDevGuide\Chapterd\Args Test.vbs “Hello, world” В Windows 2000 вы получите сообщение о неверном расширении у файла Args. В Windows 95/98 сценарий запустится, но появится сооб- щение о неверных аргументах. Реакция системы при этом зависит от того, как Windows обрабатывает команды в командной строке. Эту про- блему можно решить, заключая длинные имена с пробелами в двойные кавычки. Команда должна быть записана так: WScript.exe “C:\WSHDevGuide\ChapterO1\Args Test.vbs" “Hello, world" Все сказанное относится и к CScript.exe. Сценарий на листинге 1-3 получает набор Arguments объекта WScript и выводит все аргументы из этого набора в диалоговом окне (рис. 1-7).
14 ЧАСТЬ I Основы программирования сценариев Windows Script Host и Рис. 1-7. Вывод аргументов сценария. i н«ео ; (e# 1 2 : 3 Допустим, вы хотите передать аргументы существующему сценарию. Двойного щелчка в этом случае недостаточно, так как в результате сценарий просто будет исполнен. Чтобы передать сценарию аргументы, вызовите ди- алоговое окно Run, выбрав из меню Start команду Run (рис. 1-8). В тексто- вом поле Open введите имя сервера (CScript.exe или WScript.exe), имя диска, путь и имя файла сценария. Аргументы, разделенные пробелами, добавляют- ся к командной строке. Рис. 1-8. Передача аргументов сценария с помощью диалогового окна Run. Если передавать аргументы через диалоговое окно Run неудобно, може- те создать ярлык для файла сценария и задать аргументы как свойства ярлы- ка (если аргументы не будут меняться). Для этого: 1. щелкните правой кнопкой значок файла сценария и выберите из контек- стного меню команду Create Shortcut; 2. щелкните ярлык правой кнопкой и выберите из контекстного меню Properties; 3. в текстовом поле Target открывшейся страницы свойств ярлыка укажите команду с нужными аргументами (рис. 1-9). Windows сохранит аргументы, когда вы закроете окно свойств, нажав ОК. Когда пользователь дважды щелкает ярлык, аргументы автоматически пере- даются сценарию.
ГЛАВА 1 Введение в Windows Script Host 15 Рис. 1-9. Свойства ярлыка файла сценария. Передача аргументов в командной строке Запрашивает ли ваш сценарий какие-либо аргументы (например, имя фай- ла)? Пользуетесь ли вы командной строкой для исполнения сценариев (с помощью CScriptexe или WScript.exe)? Кроме параметров сервера, перед которыми ставятся два прямых слэша, вы можете передать сценарию неко- торые дополнительные аргументы в виде его параметров. Для этого просто поместите аргументы сценария, разделенные пробелами, в конце командной строки. Вот как можно вызвать в командной строке Args.vbs: CScript.exe C:\WSHDevGuide\ChapterO1\Args.vbs //S "Hello, world" 123 WScript.exe C:\WSHDevGuide\ChapterO1\Args.vbs //S "Hello, world" 123 Вот некоторые команды, исполняемые в окне командной строки с помо- щью CScriptexe (рис. 1-10): Bflrgunr.nt a Bite I Io. world world Рис. 1-10. Исполнение сценария и передача аргументов в окне командной строки. '.:\>CScrlpt .oxo C:MJSHlMJvGuidf>M,hapterHl\R»-g Microsoft <R> Windows Script Host (torsion Copyright <C> Microsoft Corporation 1996 1999 |C:\>CScrlpt .exo CtxWSHDevCuido^ChapterOlMlryc iBl-uUn Hello Ail rights rocoruod •Je /ZS •Kollo. World"‘Z/nolOQQ-.l ?.
16 ЧАСТЬ I Основы программирования сценариев ПРИМЕЧАНИЕ Отдельные аргументы могут быть не обязательны, но в командной строке требуется указать хотя бы имя файла сценария. Не обязательно помечать аргумент прямым слэшем, как говорится в до- кументации по WSH. Вы можете также использовать параметры, поме- ченные //, вперемешку с аргументами, которые должны быть переда- ны сценарию (см. вторую команду на рис. 1-10). На рис. 1-10 показано выполнение сценария на JScript (листинг 1-4). В этом сценарии для вывода переданных аргументов используется метод Echo. Если в качестве сервера вы используете CScript.exe, то всю выводимую ин- формацию он направит в окно командной строки (это стандартное поведе- ние консольных программ Windows). СОВЕТ Чтобы направить информацию, выводимую сценарием, в файл, можно использовать этот метод совместно с перенаправлением ввода- вывода. В результате выполнения команды CScriptexe D:\Test.vhs «Hello» 1 > D:\Test.tmp создается файл D:\Testtmp, куда направляется вся выводи- мая сценарием информация. //**.....................******............... Ц Файл: Args.js (Пример для WSH на JScript) // Автор: (с) G. Born И // Выводит аргументы сценария в диалоговом окне //.....................*..................... var objArgs; var text = "Argumente \n\n“; var objArgs = WScript.Arguments; // Создать объект. for (var i = 0; i < objArgs.length; i++) // Цикл для обработки аргументов, text = text + objArgs(i) + ’\n'; // Получить аргумент. WScript.Echo!text); 11 Показать аргументы с помощью метода Echo. Ц*** Конец Листинг 1-4. Argsjs. Новый формат .wsf-файлов Хотя в WSH 2 можно использовать .vbs- и .js-файлы, Microsoft определен но- вый формат файлов с расширением .wsf (аббревиатура от «Windows script file»). Такой файл, как и .vbs- и .js-файлы, представляет собой текстовый до- кумент, но содержит код на языке XML (Extensible Markup Language). Файл .wsf с минимальным набором команд имеет такую структуру:
ГЛАВА 1 Введение в Windows Script Host 17 <job id="T1"> <script language="VBScript"> WScript.Echo "Hello, world" </script> </job> Тэги описывают элементы XML, а элемент <script> ... </script> содержит обычный код сценариев. ПРИМЕЧАНИЕ Так как .wsf-файлы являются XML-документами, редак- тировать их можно в любом редакторе с поддержкой XML. Если тако- вого нет, сгодится любой текстовый редактор (например, Notepad). Использование XML-расширений в .wsf-файлах Код предыдущего примера содержит минимальный набор элементов XML, необходимый для создания исполняемого .wsf-файла. Из соображений со- вместимости со спецификацией XML-документов, советую применять рас- ширенную структуру .wsf-файлов: <?xml version="1.0" encoding="IS0-8859-1"?> <job id="T1"> <script language="VBScript"> <![CDATAf text = "world" WScript.Echo "Hello, " & text ]]> </script> </job> Содержимое элемента <script> заключено в инструкцию: <!CCDATAQ _ ]]> которая говорит анализатору XML-документа (в данном случае кода сценария), что его содержимое не нужно проверять на предмет соответствия синтаксису XML. Атрибут encoding?«ISO-8859-l * позволяет включать в сценарии специаль- ные символы из алфавитов Западной Европы, например, А, б, ё или й. ПРИМЕЧАНИЕ В примерах .wsf-файлов, приведенных в справочных файлах, элемент <?xml._?> не применяется. Однако для совместимости ваших .wsf-файлов с инструментарием XML и будущими версиями WSH рекомендую использовать инструкции, показанные в этом разделе. Подключение внешних файлов Если у вас сохранились ,js- или .vbs-файлы из предыдущих проектов WSH, их можно подключить к новому сценарию WSH с помощью некоторых элемен- тов структуры .wsf-файлов. В тэге <script> можно указать внешний .vbs- или
18 ЧАСТЬ I Основы программирования сценариев .js-файл с помощью атрибута src. Ниже файл Hello.js подключается к новому сценарию WSH Test.wsf: <?xml version="1.0" encoding="IS0-8859-1"?> <job id=”T1”> <script language=”JScript” src=”Hello.js"/> <script language="VBScript"> <l[CDATA[ WScript.Echo "Hello, world number 2” ]]> </script> </job> При исполнении этого сценария WSH сначала загружает и обрабатыва- ет файл Hello.js. Затем управление возвращается wsf-файлу, при этом испол- няется второй элемент <script>, содержащий оператор WScript£cho. Атрибут src позволяет также определить ссылку на файл сценария, содержащий лишь одну функцию. После этого функция станет доступна для вызова из сцена- рия в .wsf-файле. ПРИМЕЧАНИЕ Как видно из предыдущего примера, wsf-файлы позво- ляют комбинировать сценарии, написанные на разных языках. Использование библиотек типов Элемент .wsf-файла <reference> позволяет задействовать в сценарии констан- ты, определенные в библиотеках типов. Следующий элемент <reference> по- лучает из библиотеки типов ссылку на объект FileSystemObject: <reference guid='{420B2830-E718-11CF-893D-00A0C9054228}1 /> Определив подобную ссылку, сценарий может использовать именованные константы, экспортированные из библиотеки типов. Следующий пример .wsf-файла выводит константы для типов дисков, определенные в объекте FileSystemObject: <?xml version="1.0" encoding="IS0-8859-r'?> <job id=”TypeLlbExample”> <reference guid='{420B2830-E718-11CF-893D-00A0C9054228}’/> <scrlpt language="VBScript"> <l[CDATA[ WScript.Echo "CDRom = " & CDRom & vbCrLf & _ "Fixed = " & Fixed & vbCrLf & _ . "RamDisk = " & RamDisk & vbCrLf & _ "Remote = " & Remote & vbCrLf & _ "Unknown = " & Unknown & vbCrLf & _
ГЛАВА 1 Введение в Windows Script Host 19 "Removable = " & Removable ]]> </script> </job> Я вернусь к вопросу использования библиотек типов в главе 12, когда мы начнем работать с дисками, файлами и папками. Более глубокое обсуждение элемента <reference>, включая методики нахождения значений GUID библио- тек типов, см. в vimve. Advanced Development with Microsoft Windows Script Host 2.0. Отладочные функции Простые операторы типа stop и debugger из .vbs- и .js файлов (в WSH 1) по- зволяют автоматически вызвать ранее установленный отладчик. Для отлад- ки сценария в среде WSH 2 при его вызове надо указать один из переключа- телей командной строки, //D или //X. Отлаживать .wsf-файл с помощью двойного щелчка позволяет команда <?job debug=«true»?>, заданная в пределах одного из элементов <job>. Если в сценарии имеется оператор stop или debugger, эта инструкция вынуждает WSH запустить отладчик сценариев. Оператор <?job debug=<false»?>, задан- ный в пределах элемента <job>, отключает отладчик сценариев. Следующий код (пример из файла Testl.wsf) устанавливает в .wsf-файле инструкцию об- работчика <?job... ?>•. <?xml version=”1.0" encoding="IS0-8859-1"?> <job id=”T1"> <?job debug="true"?> <script language="VBScript”> stop WScript.Echo "Hello” </script> <script language="JScript"> debugger WScript.Echo("Hello1”); </script> </job> Что делать, если в WSH 2 не работает отладчик сценариев Некоторые пользователи обнаружили, что после установки WSH 2 от- ладчик перестал работать с .wsf-файлами. Эта ошибка WSH 2.0 будет исправлена в следующей версии. К счастью, эта проблема легко разре- шима: в указанном ниже разделе реестра содержится параметр JUDebug типа DWORD. см. след. стр.
20 ЧАСТЬ I Основы программирования сценариев HKEY_CURRENT_USER\Software\Microsof t:\Windows Script\Settlngs Если его значение равно 0, отладка отключена. Чтобы активизиро- вать отладку, установите параметрJITDebug в 1. После этого отладка в WSH 2 заработает. Если вы не хотите влезать в реестр, воспользуйтесь файлом Debug- On.reg: двойной щелчок этого файла — и реестр будет автоматически модифицирован.
ГЛАВА 2 Инструментальные средства и методика разработки В этой главе пойдет речь об инструментах и методах, упрощающих созда- ние сценариев. Я познакомлю вас с редакторами сценариев, объясню, как устанавливать и удалять элементы управления ActiveX, а также расскажу о средствах отладки. Создание сценариев Сценарий можно создать «с нуля» в редакторе Notepad из Microsoft Windows. Ддя этого нужно просто запустить Notepad и ввести нужные операторы, при- держиваясь синтаксиса выбранного языка сценариев (о синтаксисе см. гла- ву 1). После этого сохраните сценарий в файле (рис. 2-1). В случае VBScript у файла должно быть расширение .vbs, если использовался JScript — .js, а если WSH 2 (Microsoft Windows Script Host) — .wsf (подробнее о .wsf-файлах см. раздел «Новый формат .wsf-файлов» главы 1). СОВЕТ Чтобы увидеть все файлы сценариев в текущем каталоге, в диалоговом окне Save As выберите в раскрывающемся списке Save As Туре элемент All Files. Рис. 2-1. Сохранение файла сценария из Notepad.
22 ЧАСТЬ I Основы программирования сценариев Использование шаблонов сценариев Создание сценариев ос нуля» — не самый лучший подход. Например, если вы, следуя моему совету из главы 1, добавляете комментарии в заголовок сцена- рия, каждый раз при создании нового сценария вам придется повторять эти действия. Вместо этого можно создавать сценарии, используя шаблоны VB- Script.vbs и JScript.js, а wsf-файлы — с помощью шаблона WSHfile.wsf. Просто сконфигурируйте Windows так, чтобы она узнавала шаблоны сценариев: 1. откройте на прилагаемом CD папку \WSHDevGuide\ChapterO 1 и скопи- руйте оттуда файлы VBScript.vbs, JScript.js и WSHfile.wsf в локальную пап- ку на жестком диске; 2. дважды щелкните значок Tweak UI в панели управления, а затем щелкни- те вкладку New в диалоговом окне Tweak UI; 3. чтобы создать новые типы шаблонов, перетащите все файлы шаблонов из окна папки на вкладку New (рис. 2-2); 4. закройте диалоговое окно Tweak UI, щелкнув кнопку ОК — Tweak UI ско- пирует файлы в папку Windows \ShellNew (в Windows 98) или в папки \Documents и Settings\<HMH пользователя>\Тетр1аге8 (в Windows 2000) и зарегистрирует новые шаблоны. G* '•? 'r.”; • •' - * c-z SZ-w ,-r ДШЙ ShHRelete... Tetf.wH ChnptorOI VBSciipt.vb* VBScript Script Не Tert2.wd T«)3W Medifwd 2/15/20004:23 PM Snr 211 V/SHlfcw»» V/S» <MLb< £fa Вг«1саи 5/ ШМюгс joh E кс«1 WoAthaa t У. V Mtc.-otc/i PhotpCra*» Pctae У- P Document • T«»l Decuman) S^4*V/ava Stxnd Atlfibutu; (nt*nul) i. Рис. 2-2. Регистрация шаблона сценария с помощью Tweak UI. После этого в контекстном меню New появятся три новые команды: JScript Script File, VBScript Script File и Windows Script File (рис. 2-3) — они позволя- ют создать новый сценарий в любой папке.
ГЛАВА 2 Инструментальные средства и методика разработки 23 Рис. 2-3. Создание нового сценария с помощью контекстного меню. ПРИМЕЧАНИЕ Tweak UI — инструмент для настройки ОС Windows — надо установить специально. Пользователи Windows 98 найдут этот модуль в папке \tools\reskit\powertoy на дистрибутивном компакт-дис- ке Windows 98. Те же, кто работает в Windows 95/NT 4/2000, смогут заг- рузить текущую версию Tweak UI из Интернета (самую последнюю вер- сию вы найдете на сайте http://uww.microsoft.com). Чтобы установить этот инструмент, найдите папку с установочными файлами Tweak UI. Щелкнув правой кнопкой файл TweakUI.inf, выберите из контекстно- го меню команду Install. В папке Control Panel появится значок установ- ленного Tweak UI. Редактирование сценариев Создавать и редактировать файлы сценариев можно в Notepad. Чтобы за- грузить в Notepad уже существующий файл, щелкните его правой кнопкой и из контекстного меню выберите Edit (команда Edit автоматически добав- ляется после установки WSH). К несчастью, Notepad поддерживает лишь элементарные функции ре- дактирования текстовых файлов. Настоящие проблемы начинаются при от- ладке сценариев. Если во время синтаксического разбора исходного кода WSH находит ошибочный оператор или возникает ошибка периода выпол- нения, диалоговое окно сообщает об ошибке, указывая ее код и номер стро- ки (рис. 2-4).
24 ЧАСТЬ I Основы программирования сценариев Рис. 2-4. Диалоговое окно сообщения об ошибке, которое выводится во время исполнения сценария (в WSH 2). В этой ситуации вам придется отредактировать файл сценария. К несча- стью, отыскать ошибочный оператор с помощью Notepad довольно трудно, поскольку приходится считать строки исходного текста вручную, а в случае длинных сценариев это вообще неосуществимо. Решить эту проблему позво- ляют редакторы, описанные ниже. Все они поддерживают нумерацию строк. ПРИМЕЧАНИЕ Только в версии Notepad из Windows 2000 есть коман- да Go То, позволяющая перейт и к заданной строке текстового файла. Вызов редакторов сценариев Если вместо редактора по умолчанию (которым является Notepad) вы хоти- те использовать собственный редактор сценариев, нужно запустить его и загрузить файл сценария. Специальную команду для вызова редактора сце- нариев удобно держать в контекстном меню файлов. Следующая команда контекстного меню EditPlus открывает .vbs- или .js-файл в программе EditPlus (рис. 2-5). Рис. 2-5. Контекстное меню со специальной командой для вызова редактора сценариев.
ГЛАВА 2 Инструментальные средства и методика разработки 25 Чтобы добавить в контекстное меню такую команду, нужно сделать сле- дующее. 1. Откройте окно папки. Выберите из меню View (в Windows 95/98) или Tools (в Windows 2000) пункт Folder Options, чтобы открыть диалоговое окно Folder Options. 2. На вкладке File Types (рис. 2-6) выберите из списка Registered File Types расширение файла сценария, а затем щелкните кнопку Edit (в Windows 95/98/NT 4) или Advanced (в Windows 2000). Рис. 2-6. Диалоговое окно Folder Options. 3. В результате появится диалоговое окно Edit File Туре (рис. 2-7). Щелкните в нем кнопку New, чтобы открыть диалоговое окно New Action (рис. 2-8). Рис. 2-7. Диалоговое окно Edit File Type.
26 ЧАСТЬ I Основы программирования сценариев Рис. 2-8. Диалоговое окно New Action. 4. В текстовом поле Action введите имя новой команды контекстного меню, а в поле Application Used То Perform Action — команду для вызова прило- жения (имя исполнимого файла и путь к нему). Символы %1 заменяют имя текущего файла, которое будет подставлено во время исполнения команды. Найти нужную программу можно с помощью кнопки Browse. 5. Закройте все диалоговые окна, чтобы зарегистрировать новую команду. ПРИМЕЧАНИЕ Убедитесь, что vbs-, .js- и, возможно, .wsf-файлы зареги- стрированы как сценарии. Подробнее о регистрации расширений и команд см. мою книгу Inside the Microsoft Windows 98 Registry (Microsoft Press, 1998). Далее описаны редакторы сценариев, часть которых распространяются бесплатно. PrimalSCRIPT Мощный редактор сценариев для Windows, разработанный компанией SAPIEN Technologies, Inc. Если вы занимаетесь разработкой сценариев WSH, а также сценариев на других языках, выбирайте PrimalSCRIPT. Он поддер- живает соответствующий интерфейс и среду разработки для нескольких языков сценариев. Первая версия редактора поддерживает простые функ- ции редактирования сценариев. Вы можете вставлять в исходный текст фрагменты кода {For...То, If...Then..£lse и т. д.) на любом из языков, поддер- живаемых редактором. Вторая версия PrimalSCRIPT (рис. 2-9) прекрасно подходит для разработ- ки сценариев WSH. В ней есть нумерация строк (что позволяет легко найти троку с номером, указанным в диалоговом окне сообщения об ошибке), средство просмотра библиотек типов и многие другие возможности. Вы можете редактировать .wsf-файлы, содержащие несколько заданий или эле- ментов сценария. При выборе определенного элемента сценария редактор покажет только его команды — определения и атрибуты рассматриваются как свойства. PrimalSCRIPT 2 также обрабатывает четко определенные доку- мента XML (Extensible Markup Language). Кроме того, он упрощает процесс отладки сценариев. Эта программа поддерживает отладку сценариев WSH «на месте», поэтому можно как исполнять .js-, .vbs- и .wsf-файлы в окне ре- дактора, так и передавать управление отладчику сценариев.
ГЛАВА 2 Инструментальные средства и методика разработки 27 Рис. 2-9. PrimalSCRIPT 2. ПРИМЕЧАНИЕ Подробнее о возможностях XML, а также о четко опре- деленных документах см. мою книгу Advanced Development with Microsoft Windows Script Host 2.0. Поскольку PrimalSCRIPT 2 поддерживает библиотеки типов, в нем имеют- ся весьма изощренные функции редактирования. Например, при вводе клю- чевого слова, обозначающего объект, в окне IbolTip появляется определение методов или свойств объектов (аналогично тому, как это происходит в сре- дах разработки от Microsoft типа VBA [Visual Basic for Applications]). Вы можете загрузить 30-дневную ознакомительную версию PrimalSCRIPT 2 с сайта http://wtvwsapien.com. На этом сайте также есть раздел «Script Exchange», откуда вы можете взять новые образцы сценариев. ПРИМЕЧАНИЕ PrimalSCRIPT — мой любимый редактор, и не только из-за простоты использования и наличия в нем функций создания и отладки сценариев. При создании .wsf-файлов PrimalSCRIPT разделя- ет содержимое элементов <script> на отдельные «единицы» и скрыва- ет определения XML, окружающие «настоящие» команды. При сохра- нении файла PrimalSCRIPT автоматически добавляет структуры XML. Microsoft Script Editor Script Editor входит в Microsoft Office 2000, поэтому для его установки вам по- надобится программа Setup Office 2000. Для этого: 1. дважды щелкните значок Add/Remove Programs в Control Panel; 2. в диалоговом окне Add/Remove Programs нажмите кнопку Change Or Remove Programs; 3. в списке Microsoft Office щелкните кнопку Change, а в диалоговом окне Microsoft Office 2000 Maintenance Mode — Add Or Remove Feature;
28 ЧАСТЬ I Основы программирования сценариев 4. выберите элемент Microsoft Office/Office Tools/HTML Source Editing/Web Scripting и установите параметр Run From My Computer; 5. нажмите кнопку Update Now. Windows установит Script Editor с дистрибутивного компакт-диска Office. После установки Script Editor (но перед его запуском) нужно активизиро- вать функции поддержки сценариев (например, цветную подсветку синтак- сиса). Чтобы активизировать поддержку файлов сценариев (с расширения- ми .vbs-, .js- и .wsf), придется изменить значения реестра: 1. запустите Registry Editor (Regedit.exe) и найдите в реестре раздел HKEY_ LOCAL_MACHINE\Software\Microsoft\MSE\9.0\Editors\{C76D83F8-A489- 11 DO-8195-00A0C91BBEE3}\Extensions, который содержит параметры файлов, поддержка которых уже активна; 2. добавьте параметр vbs типа DWORD и установите его значение в 28 (в шестнадцатеричной системе) (рис. 2-10); J Рис. 2-10. Записи реестра для Script Editor. 5. добавьте аналогичные параметры js и wsh типа DWORD, повторив п. 2. Закрыв Registry Editor, можно попробовать запустить Script Editor (он так- же называется Microsoft Development Environment). Есть два способа запуска. Из приложения Office. Например, так: запустите Microsoft Word и из меню Tools выберите Macro, а затем — Microsoft Script Editor. И Запуск MSE.EXE напрямую или с помощью ярлыка. Файл MSE.EXE нахо- дится в папке Program Files\Microsoft Visual Studio\Common\IDE\IDE98 (имена папок могут варьировать в зависимости от того, в какой из лока- лизованных версий Windows вы работаете). После того, как Script Editor запущен, вы готовы к загрузке и редактированию файлов сценариев.
ГЛАВА 2 Инструментальные средства и методика разработки 29 Любую из предопределенных схем размещения окон редактора можно выбрать командой Define Window Layout из меню View. Вот редактор в ре- жим ме Design, когда окно Project Explorer расположено в левой, а окна с ис- ходным текстом — в правой панели окна редактора (рис. 2-11). Рис. 2-11. Script Editor с исходным текстом сценария. Чтобы загрузить файл сценария для просмотра, перетащите его в окно Project Explorer (или выберите команду Open File из меню File). Список имен уже загруженных файлов находится в окне Project Explorer (рис. 2-11, левая панель). Можно перезагрузить файл, дважды щелкнув соответствующий элемент списка в окне Project Explorer. Знание следующих хитростей позволит вам повысить эффективность разработки сценариев с помощью Script Editor. Для просмотра исходного текста документа в режиме Source View нужно выбрать вкладку Source в окне исходного текста. Если после загрузки .wsf- файла окно исходного текста пусто или если загружен js- или .vbs-файл, а редактор выводит сцепленные строки кода, видимо, все еще активен режим Design View. Я Содержимое .wsf-файла выводится с использованием цветовой кодиров- ки элементов сценария. Чтобы применить цветовую кодировку и к ,js- файлу, вставьте в его заголовок строку //<%. Для .vbs-файла в заголовок надо вставить строку ‘<% (рис. 2-11). Обе строки являются комментария- ми, но они сигнализируют программе Script Editor о вашем желании ис- пользовать цветовую кодировку (если добавить в шаблоны .vbs- и ,js- файлов строки ‘<% и //<%, то в новых сценариях цветовая кодировка и подсветка синтаксиса активизируются автоматически). Включив цвето- вую кодировку, вы сможете использовать функции поддержки языка ре-
30 ЧАСТЬ I Основы программирования сценариев дактора Script Editor. Набрав первые несколько символов ключевого сло- ва (например, Msg), нажмите Ctrl+Space. Редактор закончит ввод ключе- вого слова (в данном случае MsgBox) с помощью функции автоматичес- кого завершения. Если несколько ключевых слов начинаются с введенных вами символов, все они выводятся в окне Quickinfo (рис. 2-11). К Чтобы сохранить новый файл, щелкните на панели инструментов кноп- ку Save. В диалоговом окне Save As выберите тип файла HTML Files, но при вводе имени файла укажите расширение .vbs, .js или .wsf. Если расшире- ние сохраняемого файла отлично от .htm или .html, редактор сохранит содержимое окна исходного текста без тэгов HTML. Номер текущей строки можно узнать, щелкнув ее. Номер строки показан в строке статуса. Диалоговое окно New File, вызываемое командой New File из меню File или нажатием клавиш Ctrl+Shift+N, позволяет создать новый файл (это диалоговое окно также позволяет загружать существующие файлы и те, что загружались недавно). В главе 1 сказано, что можно создавать свои шаб- лоны .js-, .vbs- и .wsf-файлов: скопируйте файлы шаблонов в папку Program Files\Microsoft Visual Studio\Common\IDE\IDE98\NewFileItems, и затем вы смо- жете создавать новые сценарии на языках VBScript, JScript или Windows Script, выбрав его шаблон на вкладке New диалогового окна New File. Другие редакторы EditPlus является условно бесплатным 32-разрядным текстовым редактором для Windows 95/98/NT 4/2000. EditPlus прост в использовании и поддержи- вает подсветку синтаксиса для HTML, C/C++, Perl и Java. Список поддержи- ваемых языков может быть расширен. Самая лучшая функция EditPlus — ну- мерация строк загруженного текстового файла, активизируемая кнопкой на панели инструментов. 30-дневную ознакомительную версию EditPlus можно загрузить с сайта http://ivivw.editplus.com. EditPad — это небольшая программа, которая заменяет Notepad и позво- ляет редактировать текстовые файлы разных форматов. EditPad не поддер- живает нумерацию строк, но для перехода к заданной строке в ней есть команда Go То Line. EditPad может быть полезным дополнением к Windows 95/98/NT 4 (в версии Notepad из Windows 2000 уже есть команда Go То, так что EditPad не дает пользователям этой ОС никаких преимуществ). EditPad можно бесплатно загрузить с http://ivwzv.jgsoft.com. UltraEdit-32 — мощный условно бесплатный редактор для Windows 95/ 98/NT/2000. Программа поддерживает редактирование текстовых файлов с разными расширениями (.bat, .ini, .html и др.), а также такие функции редак- тирования сценариев, как цветная подсветка ключевых слов. В окне исход- ного текста можно активизировать нумерацию строк. 45-дневную ознакоми- тельную версию UltraEdit-32 можно загрузить с http://www.ultraedit.com. На сайте есть ссылки для загрузки различных версий UltraEdit. Среди прочих программ редактирования сценариев можно отметить CodeMagic, TextPad и NoteTab (хотя лично я ими не пользовался). CodeMagic
ГЛАВА 2 Инструментальные средства и методика разработки 31 — это интегрированная среда разработки (IDE) сценариев, довольно гибкая в настройке. Бесплатную первую версию программы вы загрузите с сайта http://www.petes-place.com/codemagic.html. TextPad и NoteTab — условно бес- платные редакторы. Существует и бесплатная версия NoteTab — NoteTab Light. Ни один из этих редакторов не поддерживает цветную подсветку. TextPad можно загрузить с http://www.textpad.com, a NoteTab — с http:// www.notetab.com. СОВЕТ Вывести на печать исходный текст сценария можно коман- дой контекстного меню Print. Используя один из редакторов сценари- ев, описанных в этой главе, вы можете распечатать исходный текст с номерами строк, что полезно в процессе отладки. Установка и удаление элементов управления ActiveX Помимо объектов таких приложений, как Microsoft Word и Microsoft Excel, и объектов, поддерживаемых самим WSH или Windows, можно использовать другие объекты, существующие в виде элементов управления ActiveX. Иног- да у этих элементов есть программа установки. Если вы создаете элемент управления ActiveX в такой среде разработки, как Visual Basic или Visual Basic 5 Control Creation Edition (ССЕ), компонент автоматически регистрируется на той машине, где производится разработ- ка, и сохраняется в ОСХ-файле. Регистрация элемента управления Прежде чем в сценариях использовать элемент управления ActiveX (ОСХ- файл), его надо зарегистрировать. Если разработчик OCX-файла не предос- тавил программу установки, которая зарегистрировала бы объект, вам пона- добится программа RegSvr32.exe. Она входит в комплект поставки некоторых приложений и ОС Microsoft (в том числе Windows 98/2000). Чтобы зарегист- рировать OCX-файл как элемент управления ActiveX, вызовите RegSvr32.exe: ResSvr32.exe C:\TestControl.ocx Программа находит файл, анализирует его содержимое и добавляет в реестр нужную информацию. После этого элемент управления ActiveX мож- но применять в сценариях WSH. В Windows 98/2000 программа RegSvr32.exe находится в папке System или System32. Вызвав RegSvr32.exe без указания файла объекта, вы увидите диа- логовое окно со списком параметров программы (рис. 2-12):
32 ЧАСТЬ I Основы программирования сценариев Рис. 2-12. Параметры RegSvr32.exe. СОВЕТ Дважды щелкнув файл \WSHDevGuide\Chapter02\OCXReg.reg, вы можете добавить в контекстное меню OCX-файлов команды Register OCX и Unregister OCX. Эти команды позволяют зарегистрировать эле- мент управления ActiveX из OCX-файла или удалить его регистраци- онные данные. Лицензирование элементов управления ActiveX Разрабатывая примеры для этой книги, я столкнулся с серьезной про- блемой лицензирования элементов управления ActiveX. Установив несколько OCX-файлов, загруженных с Интернет-сайтов, я не смог задействовать объекты из этих элементов управления ActiveX. Даже при корректной регистрации любая попытка выполнения метода CreateObject этих элементов управления приводила к ошибке периода выполнения Win32-Error 0x80040112. Эта ошибка почти не документирована в WSH 1, поэтому я долго не мог выяснить ее значение — отсутствие ли- цензии на элемент управления. Если у вас возникнет аналогичная ошибка, вам потребуется приобрести у своего поставщика лицензию на элемент управления. Подробнее о лицензировании я расскажу в книге Advanced Development with Microsoft Windows Script Host 2.0. Удаление элемента управления Co временем ваша система и реестр может загромождаться элементами уп- равления ActiveX, установленными с помощью RegSvr32.exe или созданны- ми в среде разработки Visual Basic или Visual Basic 5 ССЕ. Как удалить ненуж- ные элементы управления ActiveX? Просто удалить OCX-файлы в этом слу- чае мало. Компонент надо удалить полностью, т. е. удалить из реестра все записи для этого объекта. Для этого вызовите программу RegSvr32.exe так: RegSvr32.exe /и C'.TeBtControl.ocx Программа находит OCX-файл, а переключатель /и вынуждает ее удалить из реестра все записи для этого компонента ActiveX. После этого можно уда- лить OCX-файл без риска оставить в реестре неиспользуемые записи.
ГЛАВА 2 Инструментальные средства и методика разработки 33 СОВЕТ Если вы последовали предыдущему совету и импортировали файл OCXReg.reg, то для удаления регистрационных данных ОСХ-фай- ла щелкните его правой кнопкой и выберите из контекстного меню команду Unregister OCX. Подробнее об установке и удалении элементов управления ActiveX см. мою книгу Advanced Development with Microsoft Windows Script Host 2.0. Отладка сценариев Синтаксическая ошибка или ошибка периода выполнения заставляет WSH прекратить выполнение сценария и сообщить об ошибке (рис. 2-13). В со- общении указаны имя и путь файла сценария, а также категория и описание ошибки. Кроме того, там обычно приводится номер строки и столбца, в ко- торых возникла ошибка. Рис. 2-13. Сообщение об ошибке, прервавшей выполнение сценария в WSH 2. Найти строку, ставшую причиной ошибки, позволяют вышеописанные редакторы. Исправив ошибку, продолжайте проверку исходного текста сце- нария. Если синтаксических ошибок в нем больше нет, можно приступать к отладке. ПРИМЕЧАНИЕ Проиллюстрировать процесс проверки можно на при- мере файла ErrorTest.vbs из папки \WSHDevGuide\ChapterO2. В этой VBScript-npoipaMMe есть синтаксическая ошибка, которая вызывает соответствующее сообщение (рис. 2-13). Для корректного исполнения этого сценария в 13-й строке его исходного текста надо закрыть ка- вычки (“) в строковой константе. Трассировка программ Исправив все синтаксические ошибки, можно приступать к проверке функ- циональности сценария. В большинстве случаев, кроме простейших, испол- нение сценария скорее всего не даст ожидаемых результатов. Иногда полез- но выводить сообщения с промежуточными результатами, помещая для это- го в исходный текст соответствующие операторы. Каждый раз при исполне- нии такого оператора появляется окно сообщения. Эти операторы позволя- ют выводить промежуточные результаты и сообщения во время исполнения сценариев. Вот реализация такого подхода (листинг 2-1):
34 ЧАСТЬ I Основы программирования сценариев Файл: WSHDemo.vbs (Пример для WSH на VBScript) Автор: (с) G. Born Выводит сообщения с промежуточными результатами Следующие строки служат для активизации или деактивизации вывода сообщений при трассировке. Удалите знак комментария перед соответствующей строкой. ’ DebugFlag = False ' Отключить вывод сообщений при трассировке DebugFlag = True ' Включить вывод сообщений при трассировке j = О debug "Start:”, О, О For 1 = 1 То 10 ' Выполнить 10 раз. debug "Step:", 1, j j - j + 1 ’ Сложить все числа. Next debug "End:", 1, j WScript.Echo "Result:”, j Sub debug(text, count, val) If DebugFlag Then ‘ Режим отладки включен? WScript.Echo text, count, ” Interim result:", val End If End Sub *** Конец Листинг 2-1. WSHDemo.vbs. Это очень простая программа. Она подсчитывает в цикле сумму чисел от 1 до 10 и выводит результаты с помощью метода Echo. Однако при проверке полезно знать момент, когда программа входит в цикл, а также сколько раз выполняются операторы в теле цикла. Трассировку этих действий позволя- ет осуществлять метод Echo, вызываемый в теле цикла или в другом нужном месте. Чтобы максимально упростить код, для расчета всех сообщений при трассировке служит процедура debug. Таким образом, для вывода парамет- ров цикла программе требуется лишь один оператор: debug "Step:", i, j Первый параметр определяет текст, который появляется в окне сообще- ния. Другие параметры могут содержать значения, которые также выводят- ся в окне сообщения. Вызов процедуры debug происходит из разных мест программы (листинг 2-1). При вызове из тела цикла debug выводит значение индекса и промежуточный результат вычислений (рис. 2-14).
ГЛАВА 2 Инструментальные средства и методика разработки 35 I Windows Script Host Й Stop 3 ntotH’eidt 3 Рис. 2-14. Окно сообщения с трассировочными значениями. Во время проверки программы трассировочные значения должны выгля- деть, как показано выше (рис. 2-14). Если сценарий выполняется без ошибок, трассировочные сообщения становятся ненужными, поэтому их можно уда- лить из исходного текста. Но позже они могут понадобиться при внесении изменений в программу. Однако в WSHDemo.vbs не требуется удалять и за- менять операторы, отвечающие за трассировку, так как управлять выводом сообщений при трассировке позволяют параметры процедуры debug. В этой процедуре есть следующее условие: If DebugFlag Then ' Активизирован ли режим отладки? Вызов метода Echo и вывод сообщений осуществляется, только если зна- чение глобальной переменной DebugFlag равно True. В заголовке сценария переменной DebugFlag присваивается значение True-. ' DebugFlag = False ' Отключить вывод сообщений при трассировке DebugFlag = True ’ Включить вывод сообщений при трассировке В любой момент активен один из операторов, в то время как другой за- комментирован. Таким образом, вы можете переключать значение DebugFlag между True и False, перемещая знак комментария от одной строки к другой. Вывод сообщений при трассировке активизируется или подавляется в зави- симости от значения переменной Debugflag. ПРИМЕЧАНИЕ Файл WSHDemo.vbs (вместе с файлом WSHDemo.js) находится в папке \WSHDevGuide\ChapterO2. Работа с отладчиком Microsoft Script Debugger Методика, показанная в предыдущем разделе, пригодна только для отладки простых сценариев. Если при исполнении сценариев возникают ошибки периода выполнения или получаются неожиданные результаты, для трасси- ровки программы и ее переменных следует использовать отладчик. Отлад- чик Microsoft Script Debugger (его можно бесплатно загрузить с http://msdn. microsoft.com/scripting) позволяет проверять сценарии в документах HTML или файлах ASP (Active Server Pages), а также проверять сценарии WSH. ПРИМЕЧАНИЕ После загрузки Microsoft Script Debugger устанавлива- ется в папку \Program Files\Microsoft Script Debugger. Существуют раз- личные версии отладчика для Windows 95, Windows 98 и Windows NT. В Windows 2000 отладчик Microsoft Script Debugger уже включен в ОС. Можно использовать и отладчик, поставляемый с Microsoft Script Editor из Microsoft Office 2000.
36 ЧАСТЬ I Основы программирования сценариев Итак, как исполнить сценарий под управлением отладчика? WSH поддер- живает команды для запуска отладчика сценариев и исполнения сценариев под его управлением. Однако WSH 1 и WSH 2 в этом плане несколько отли- чаются. Для отладки .wsf-файлов служат специальные команды. В WSH 1 вы можете вставлять оператор Stop при использовании языка VBScript (или оператор debugger,в случае JScript). При исполнении этих опе- раторов отладчик вызывается автоматически. Если поместить в сценарий WSH 2, написанный на VBScript, оператор Stop или оператор debugger (в случае JScript), как это делалось в WSH 1, отладчик на это не среагирует. Для работы с отладчиком в WSH 2 надо вызывать сценарий с переключа- телем //D. Следующая команда вынуждает WSH активизировать отладку сце- нария: WScript.exe //D C:\WSHDevGuide\Chapter02\ErrorTest2.vbs В результате исполнения первого же оператора Stop (в VBScript) или debugger (в JScript) запускается отладчик, и управление передается ему (рис. 2-15). Далее возможно пошаговое исполнение сценария под управлением от- ладчика (см. также раздел «Отладочные функции» главы 1). Рис. 2-15. Операторы, активизирующие отладку сценариев. При нежелании использовать в программе операторы Stop и debugger можно вызвать отладчик с помощью переключателя //Х-. WScript.exe //X C:\WSHDevGuide\Chapter02\WSHDemo.vbs При этом WSH 2 запускает отладчик и передает ему управление. Встре- тив первую же исполняемую команду, отладчик останавливает сценарий (рис. 2-16).
ГЛАВА 2 Инструментальные средства и методика разработки 37 Рис. 2-16. Исполнение сценария под управлением отладчика. ПРИМЕЧАНИЕ В примерах ErrorTestl.vbs и ErrorTestl.js, содержащих- ся в nanKe\WSHDevGuide\ChapterO2, для отладки применяется опера- тор, который выводит сообщение. Файлы ErrorTest2.js и ErrorTest2.vbs из той же папки используют для этой цели операторы debugger и Stop соответственно. Отладка .wsf-файлов Один из способов отладки .wsf-файлов — добавить инструкцию <?job ...?>, зна- чение атрибута debug которой равно true (как сказано в главе 1) (листинг 2-2): <?хш1 version="1,0"?> ci- Файл: ErrorTest.wsf (Пример для WSH 2.0) Автор: (с) G. Во.гп -> cjob id="T1"> c?job debug="true"?> Cscript langua0e=”VBScript”> <I[CDATA[ Stop • WScript.Echo "Hello, VBScript" ]]> </script> Cscript language="JScript"> cl[CDATAE см. след. cmp.
38 ЧАСТЬ I Основы программирования сценариев debugger WScript.Echo ("Hello, JScript"): ]]> </script> </job> Листинг 2-2. ErrorTest.wsf. Этот сценарий может быть исполнен как с параметрами //X или //D, так и без них. При исполнении оператора Stop или debugger в результате двой- ного щелчка .wsf-файла происходит автоматический вызов отладчика. От- ключить отладку в WSH 2 (независимо от присутствия в командной строке сценария параметров //X или/ZD) позволяет инструкция: <?job debug="false"?> Этот оператор очень удобен, когда требуется подавить отладку .wsf-файлов, содержащих команды Stop или debugger. Как только управление исполнением сценария переходит к Microsoft Script Debugger, в его окне появляется исходный текст сценария (рис. 2-15). В окне отладчика можно просматривать исходный текст шаг за шагом, но нельзя редактировать. Для редактирования исходный текст нужно загрузить в отдельное окно. Команды отладчика Microsoft Script Debugger Для проверки сценариев служат несколько панелей инструментов и команд меню Microsoft Script Debugger (рис. 2-17). Ниже приводится их список с описанием (некоторые команды также можно вызвать с клавиатуры). К Run (запуск) исполняет операторы сценария до точки прерывания в сценарии. М Stop Debugging (остановить отладку) прерывает исполнение сцена- рия и завершает процесс отладки. М Break At Next Statement (остановиться при исполнении следую- щего оператора) гарантирует, что исполнение сценария не продолжит- ся до конца без остановок. Эта команда нужна для ручного управления исполнением сценария из окна отладчика Running Documents. Если ис- полнение сценария приостановлено при выводе сообщения, Break At Next Statement остановит исполнение сценария на следующем операто- ре, как только пользователь закроет окно сообщения. Step Into (F8) (шаг вперед) исполняет следующий оператор сценария. Step Over (Shift+F8) (шаг над) заставляет отладчик выполнить проце- дуру или функцию полностью, прежде чем управление вернется к вызы- вающему модулю. Если текущий оператор не является вызовом процеду- ры или функции, отладчик работает в режиме Step Into. Step Out (Ctrl+Shift+F8) (шаг до) исполняет все операторы процеду- ры до команды, возвращающей управление.
ГЛАВА 2 Инструментальные средства и методика разработки 39 й Toggle Breakpoint (F9) (установить точку прерывания) выбирает в окне отладчика исполняемый оператор и устанавливает или удаляет в строке выбранного оператора точку прерывания. Строки с точками пре- рывания помечены точками около левой границы окна отладчика. При достижении точки прерывания отладчик останавливает исполнение сце- нария. Н Clear All Breakpoints (удалить все точки прерывания) удаляет все точки прерывания, установленные в сценарии. Кнопка Command Window открывает окно, в котором можно напрямую вводить и исполнять команды. При нажатии кнопки Cail Stack открывается окно со списком активных процедур в стеке. Когда ваш сценарий имеет ис- ключительно линейную структуру (без вызовов процедур или функций), стек остается пустым. Остановиться при Остановить отладку Запуск Следующий оператор Точка прерывания Командное окно Работающие Стек вызовов документы Рис. 2-17. Кнопки на панели инструментов в окне отладчика. Пошаговое исполнение сценария При отладке полезен режим Step Into (режим пошагового исполнения). Что- бы исполнить следующую команду сценария, щелкните кнопку Step Into или нажмите F8. Следующий исполнимый оператор помечен стрелочкой около левой границы окна отладчика (рис. 2-17). Работа в режимах Step Over и Step Out Если ваш сценарий содержит проверенные процедуры и функции, для них бессмысленно использовать режим пошагового исполнения. Вместо этого
40 ЧАСТЬ I Основы программирования сценариев можно щелкнуть кнопку Step Over или нажать Shift+F8. Если следующий ис- полняемый оператор содержит вызов процедуры/функции, то вся процеду- ра/функция исполняется безостановочно. Исполнение останавливается лишь после возврата управления. Аналогично режиму Step Into работает команда Step Over, применяемая для исполнения других операторов, не содержащих вызовов процедур или функций. Если при исполнении процедуры/функции отладчик встречает точку пре- рывания, то завершить исполнение всех операторов процедуры или функ- ции позволяет кнопка Step Out или комбинация клавиш Ctrl+Shift+F8. Отлад- чик остановится на первом же операторе после вызова процедуры/ функции. Использование точек прерывания Точки прерывания позволяют прерывать исполнение сценария на опреде- ленных операторах. Установить точку прерывания можно, выбрав оператор в окне отладчика и нажав кнопку Breakpoint или F9. По возобновлении ис- полнения программы, отладчик вновь остановит ее, встретив строку с уста- новленной точкой прерывания. Просмотр стека вызовов Окно Call Stack (рис. 2-18) со списком всех активных процедур и функций открывает команда Call Stack из меню View или кнопка Call Stack на панели инструментов. Ниже показано, как выполняется процедура Message из сце- нария Calls, vbs. Рис. 2-18. Окно Call Stack. Вывод значений промежуточных результатов с помощью окна Command Окно Command позволяет изучать текущие значения переменных (или свойств), пока исполнение программы остановлено. Чтобы вывести значе- ние переменной сценария на VBScript, наберите имя этой переменной, по- ставив перед ним знак вопроса, например, ? color (рис. 2-19)- Значение переменной на JScript позволяет вывести в окне Command опе- ратор, например: WScriptEcho(color). Исполняя его, отладчик выводит окно сообщения со значением переменной color. Чтобы установить значение переменной, введите в окне команд оператор, присваивающий переменной нужное значение:
ГЛАВА 2 Инструментальные средства и методика разработки 41 Рис. 2-19. Вывод значений переменных в окне Command. Message = "Hello, world" Описанные выше методы облегчают отладку сценариев WSH, написанных на VBScript или JScript.
ГЛАВА 3 Основы программирования с использованием объектов Эта глава познакомит вас с основными понятиями программирования с ис- пользованием объектов (его также называют программированием на осно- ве компонентов), включая наборы, методы и свойства. Объекты Примерами объектов из реального мира могут быть автомобиль, дом, кни- га, стол. У каждого из них есть описывающие их свойства. Скажем, у автомо- биля — цвет, высота, вес и т. д. Другой аспект объектов реального мира за- ключается в том, что над ними можно совершать действия: машину можно водить, в доме — делать уборку, книгу — читать и т. д. В мире разработки ПО программы тоже могут использовать объектно- ориентированный поход при определении программных сущностей, кото- рые имеют некоторые свойства и выполняют определенные действия. Так, в приложении для бизнеса должен быть определен программный объект «клиент» для представления отдельного клиента. Объект «клиент» должен содержать данные, соответствующие свойствам реального клиента: имя, ад- рес, номер кредитной карточки и т. д. У него должны быть определены и специфичные для него свойства. Например, он должен размещать заказы и добавлять себя к БД клиентов. Одно из преимуществ, которые дает разработ- чикам объектно-ориентированный подход, — возможность написания про- грамм, точно моделирующих проблемы реального мира. Пример простого объекта Рассмотрим простой объект — диалоговое окно сообщения (рис. 1 -3). Его мож- но рассматривать как объект, поскольку у него есть данные (которые в нем появляются) и оно выполняет определенное действие (выводит информацию). У объекта есть и свойства, которыми можно манипулировать. Например, у окна есть положение, размер, текст заголовка, текст самого окна, цвет фона и т. д. Число свойств зависит от объекта. Свойства могут быть видимыми (по- казываемыми программисту) или невидимыми. Многие свойства объекта показываются, их можно прочитать или установить из сценария.
ГЛАВА 3 Основы программирования с использованием объектов 43 Рис. 3-1. Диалоговое окно — это объект. Объектная модель Объект может содержать другие объекты. Так, наше диалоговое окно (рис. 3-1) содержит две кнопки (ОК и Cancel) и значок вопросительного знака. Эти элементы являются субобъектами объекта «диалоговое окно». А теперь рассмотрим Microsoft Word, чтобы понять, как приложение од- новременно может быть объектом согласно определению объекта как сущ- ности, владеющей данными и выполняющей действия. Word является объек- том, так как у него есть данные (документы, слова, числа, формулы и т. д.), над которыми можно выполнять действия (открывать и закрывать докумен- ты, вставлять и удалять текст и т. д.). Для определения структуры объектов в рамках целого приложения мож- но использовать иерархический подход (рис. 3-2). Например, можно четко определить положение первого слова первой главы документа, если вы на- мерены его как-то использовать Объект Слово является субобъектом объекта Предложение, представляющего собой субобъект объекта Абзац, который в свою очередь является субобъектом объекта Документ, содержащегося в объекте Приложение. В программе вы можете ссылаться на эту иерархию следующим образом: Приложение.Документ.Абзац.Предложение.Слово Имена объектов в этой цепочке субобъектов разделены точками. Левее всех — объект Приложение, который является родительским объектом объ- екта Документ, и т. д. Зная иерархию объектов, вы можете обращаться к лю- бому объекту, определяя его точную позицию в иерархии объектов, извест- ной также как объектная модель (object model). Рис. 3-2. Объектная модель.
44 ЧАСТЬ I Основы программирования сценариев Наборы Показанная выше цепочка субобъектов может ввести в заблуждение. В такое приложение, как Word, можно загрузить одновременно несколько докумен- тов, а документ обычно состоит из нескольких абзацев. В абзаце чаще всего несколько предложений, а предложение состоит из более чем одного слова. Точнее говоря, объект Документ состоит из набора объектов Абзац, а объект Абзац — из набора объектов Предложение и т. д. (рис. 3*3)- Рис. 3-3. Объектная модель с наборами объектов. Набор (collection) состоит из нескольких субобъектов одного типа. Что- бы получить доступ к слову из документа, сначала надо найти абзац в набо- ре объектов Абзац, предложение — в наборе объектов Предложение и т. д. Если допустить, что нумерация объектов в наборе начинается с 0, то пер- вое слово документа (первое слово в первом предложении первого абзаца) можно идентифицировать так Приложение.Документы!0).Абзацы(О).Предложения(О). Слова(О) Заметьте: имена объектов стоят во множественном числе. Объект Докумен- ты является набором о&ъеклов Документ. Первый член набора Документы (первый объект Документ) обозначен так: Документы(О). Первый объект Документ может состоять из нескольких абзацев, поэтому далее был исполь- зован объект Абзацы, представляющий набор всех объектов документа. Сло- вом Абзацы(О) обозначен первый объект Абзац из набора Абзацы. СОВЕТ В объектных моделях некоторых программ Microsoft (напри- мер, в объектной модели Microsoft Word) имена, оканчивающиеся на s, обозначают наборы, а имена без окончания s — простые объекты. Получить доступ к объектам можно через корневой объект, которым обычно является объект Application.
ГЛАВА 3 Основы программирования с использованием объектов 45 Методы Мы познакомились с объектом «диалоговое окно». Объект form («форма») похож на диалоговое окно. У него есть свойства, такие как координаты ху. В принципе объектами можно манипулировать, используя свойства. Если вы измените свойства окна формы ху, то его положение на экране также изме- нится. Однако для этого нужно знать, что при изменении свойств ху объек- та его положение меняется. Намного лучше выполнять действия над объек- том с помощью методов. Это освобождает от необходимости знания прин- ципов реализации действий, выполняемых объектом. Скажем, переместить окно формы можно методом Move. Метод Show по- зволяет создать окно формы и установить его заголовок, цвет фона, поло- жение и размер. Другие методы дают возможность изменить объект и его поведение иначе. Наличие поддержки определенного метода зависит от объекта. ПРИМЕЧАНИЕ Метод представляет собой просто вызов процедуры или функции, ассоциированной с конкретным объектом. Свойства в свою очередь являются всего лишь переменными, принадлежащими объекту. Преимущество применения объектов в том, что вам нет дела до внутрен- них принципов их работы. Все, что вам нужно, — это знать имя объекта и какие свойства и методы он предоставляет. Так, вывести форму, содержащую две кнопки, значок, текст заголовка и текст окна можно с помощью одного (предопределенного) объекта «форма», установив свойства для текста заго- ловка, внутреннего текста, кнопок и значка. О несметном числе других де- талей, необходимых для создания и вывода формы, позаботится сам объект. Пример из практики А теперь вернемся к Microsoft Windows Script Host (WSH). У самого WSH есть несколько объектов. В период исполнения сценария WSH по умолчанию предоставляет объект WScript. Этот объект представляет исполняемый сце- нарий и поддерживает несколько методов и свойств. Например, выводом ди- алоговых окон во время исполнения сценария занимается метод Echo объек- та WScript. Для вывода простого диалогового окна можно записать оператор на VBScript: WScript.Echo "Hello, world" В этом операторе используется имя объекта WScript, отделенное точкой от имени метода (Echo). Параметр «Hello, world» содержит текст сообщения в диалоговом окне (в главе 6 я расскажу о других способах вывода диалого- вых окон из сценариев). ПРИМЕЧАНИЕ Метод Echo в приведенной выше строке на самом деле не что иное, как простой вызов процедуры на VBScript (он отличается от обычного вызова процедуры лишь тем, что использует имя объекта). Поэтому у этого метода тот же синтаксис, что и у вызова процедуры.
46 ЧАСТЬ I Основы программирования сценариев Доступные объекты Создавая сценарии, вы можете использовать любые объекты из объектной модели COM (Component Object Model), установленные на целевой машине. Это огромный набор объектов, предоставленный WSH, ОС Windows, про- граммами из Microsoft Office, элементами управления ActiveX и др. Эти объек- ты должны быть зарегистрированы в локальной системе. Чтобы создать ссыл- ку на объект, WSH использует идентификатор программы (ProgID) объекта в сценарии. Вы и сами можете создавать дополнительные объекты. Самый легкий под- ход — использовать Microsoft Windows Script Components (WSC). Например, Microsoft Visual Basic 5 Control Creation Edition (ССЕ) позволяет создавать объекты ActiveX для расширения возможностей WSH. (Обсуждение данной методики выходит за рамки книги; о WSC и Visual Basic ССЕ см. книгу Advanced Development with Microsoft Windows Script Host 2.0.) Для этого также служат C++, Active Template Library (ATL), Visual Basic и другие языки и инструменты. Получение информации об объектах, методах и свойствах Одна из проблем применения объектов в сценариях WSH заключается в том, что некоторые программисты не дают документацию на созданные ими объекты. Программа Microsoft OLE/COM Object Viewer позволяет получить информацию об объектах СОМ и элементах управления ActiveX, зарегист- рированных в вашей системе. Кроме того, предоставляемые объектами свой- ства и методы показывает Object Browser, поставляемый со средами разра- ботки Microsoft. Подробнее о OLE/COM Object Viewer и Object Browser см. в Advanced Development with Microsoft Windows Script Host 2.0. ПРИМЕЧАНИЕ В следующих главах я подробно разберу некоторые объекты и приведу примеры, в которых они используются.
ГЛАВА 4 Введение в VBScript Эта глава является кратким введением в Microsoft Visual Basic, Scripting Edition (VBScript). Она предназначена для тех, кто раньше никогда не работал с этим языком, а также для тех, кому нужны сведения о специальных языковых кон- струкциях VBScript (таких как оператор If). СОВЕТ Подробные сведения о VBScript приводятся Microsoft в спра- вочниках VBScript Language Reference и VBScript Tutorial. Они есть на прилагаемом CD, но я советую загрузить последнюю версию этой до- кументации с Web-сайта Microsoft (http://msdn.microsoft.com/scriptinf). Базовые возможности Вы познакомитесь с основными возможностями VBScript. Потом я расска- жу о более сложных функциях (в том числе о поддерживаемых новой — пя- той — версией обработчика языка сценариев). Операторы, непрерывные строки и комментарии VBScript является подмножеством языка Microsoft Visual Basic for Applications (VBA), поставляемого c Microsoft Office и Visual Basic. Microsoft определила синтаксис VBScript с использованием некоторых языковых конструкций из VBA. Если вы раньше писали на Visual Basic или создавали приложения для Office, то программирование на VBScript не должно вызвать у вас затруднений. Операторы Операторы надо вводить согласно правилам синтаксиса, определенным в VBScript. Вот пример допустимых операторов на VBScript: Valuel = 10 Valuel = Valuel +10 If Valuel > 100 Then Valuel = 100 Tax =0.1 : Price = Net * Tax В одной строке можно вводить несколько операторов подряд, разделяя их двоеточиями (:), как это сделано в последней строке кода. Однако не зло- употребляйте этой возможностью, иначе ваши программы станут нечита- бельными.
48 ЧАСТЬ I Основы программирования сценариев ПРИМЕЧАНИЕ VBScript в отличие JScript нечувствителен к регистру ключевых слов и операторов. Непрерывные строки Длинные операторы снижают читабельность сценариев. Длина следующего оператора, который выводит сообщение, превышает ширину этой страницы: WScript.Echo "You have entered a wrong name in the text box on the previous form. Please reenter the value in the text box." Если в программе слишком много длинных строк, при редактировании вы потеряете много времени на горизонтальную прокрутку текста. Лучше переносить операторы на следующую строку с помощью пробелов с симво- лом подчеркивания (_) в конце строки: WScript.Echo "You have entered a wrong name in the text box " & _ "on the previous form. Please reenter the value in the " & _ "text box." Обнаружив строку, оканчивающуюся символом подчеркивания, обработ- чик языка считает ее непрерывной и рассматривает следующую строку как часть текущего оператора. ПРИМЕЧАНИЕ Последняя строка непрерывного оператора не может оканчиваться символом подчеркивания. Нельзя также добавлять ком- ментарии к строке, содержащей символ подчеркивания. Чтобы вста- вить в программу длинную непрерывную строку текста, разбейте ее на подстроки и поставьте в конце каждой из них двойную кавычку (“). За- тем этот оператор можно разбить на несколько строк символом под- черкивания. Для конкатенации строк служат операторы & или +, подобную структуру я использовал в предыдущем примере. Комментарии Как сказано в главе 1, чтобы заставить VBScript проигнорировать строку или часть оператора, можно просто закомментировать этот оператор. На VBScript комментарии помечаются одинарной кавычкой (‘) или оператором REM. Обнаружив этот символ, интерпретатор VBScript игнорирует остаток стро- ки. Обе приведенные ниже строки содержат комментарии: ' Эта строка состоит из одного лишь комментария. Valuel = Net * Factor ' Комментарий в конце строки. Во второй строке комментарий стоит после оператора. VBScript испол- няет оператор, а комментарий в конце строки игнорирует. Структура программы на VBScript Программа на VBScript состоит из комментариев и операторов. Структура сценариев, используемых в качестве примеров к этой книге, показана ниже
ГЛАВА 4 Введение в VBScript 49 (листинг 4-1). Этот и другие примеры этой главы находятся на прилагаемом CD в папке \WSHDevGuide\ChapterO4. ' Файл: WSHDemo.vbs (Пример для WSH на VBScript) ’ Автор: (с) G. Born ’ Выводит простое диалоговое окно с помощью WSH '********************************************«*** Option Explicit Dim Message ' Инициализация переменной. Message = "Hurray, it worksl" WScript.Echo Message '*** Конец Листинг 4-1. WSHDemo.vbs. Добавление комментариев к сценариям считается хорошим тоном. Полу- чив сценарий от другого программиста, вы точно будете ему благодарны, найдя в заголовке программы описание выполняемых сценарием действий и другую полезную информацию. ПРИМЕЧАНИЕ Программы на VBScript можно использовать совмест- но с документами HTML и исполнять их в Microsoft Internet Explorer. Хотя Internet Explorer и Microsoft Windows Script Host (WSH) исполь- зуют один обработчик языка, наборы их объектов (точнее, их объек- тные модели) различны. Так, функции обработки ошибок, поддержи- ваемые Internet Explorer, бесполезны в среде WSH. Поэтому в заголов- ке стоит указывать, на каком языке и какой его версии написан сце- нарий, а также для какой среды он предназначен. Константы и переменные Константы и переменные служат для хранения значений в программах на VBScript. Способы определения констант и переменных обсуждаются в сле- дующих разделах. Константы Уверен, что в своих сценариях вы не обойдетесь без констант. Их можно не- посредственно использовать в операторах VBScript. Следующий код опреде- ляет константу: result = price + 100.0 В формуле к значению переменной price прибавляется 100, полученный результат присваивается переменной result. Число 100 — константа. В этой
50 ЧАСТЬ I Основы программирования сценариев общеизвестной методике разобраться легко. Однако у нее есть существен- ный минус. Допустим, исходный текст сценария состоит из несколько сот строк, в которых часто встречается число 100. А если потребуется заменить 100 на 110? Придется редактировать каждую строку исходного кода, в кото- рой есть эта константа. Можно применить функцию редактора «поиск с за- меной», но это отнимает много времени и может привести к ошибкам, по- скольку цифра 100 может использоваться и для других нужд. Этой проблемы можно избежать, объявляя константы в заголовке про- грамм на VBScript. При этом константе дается значащее имя, которое ис- пользуется в программе вместо числа или строки и никогда не меняется. Константы надо объявлять явно. В следующей строке константа объявляет- ся ключевым словом Const, а после него идет ее имя и значение: Const profit = 100.0 После этого именованную константу можно задействовать в любом дру- гом операторе программы на VBScript, скажем, так-. Price = NetPrlce * Amount + profit Преимущество именованных констант в том, что вместо замены значе- ния константы в строках, разбросанных по всему исходному коду, можно один раз изменить ее значение в объявлении. Значащее имя константы так- же облегчает работу с кодом. ПРИМЕЧАНИЕ Может показаться, что именованную константу мож- но использовать так же, как переменную. Но значение константы за- щищено от изменения во время исполнения кода. Поэтому имя кон- станты может стоять только в правой части оператора присваивания. В одной строке можно определять несколько констант: Const VAT = 0.16, Profit = 10 VBScript в отличие от Visual Basic и VBA поддерживает единственный тип данных — Variant. По умолчанию все именованные константы объявляются как открытые. Это значит, что объявленная в заголовке константа доступна всему сценарию. Область видимости константы, объявленной внутри про- цедуры, ограничена этой процедурой. Область действия, заданную по умол- чанию, можно изменить ключевыми словами Public и Private (см. ниже). СОВЕТ Числовые константы обычно записывают в десятичной сис- теме счисления. Однако можно использовать и константы, выражен- ные в шестнадцатеричной системе в формате &Нхххх, где хххх — ше- стнадцатеричное число. Например, число &Н0С соответствует числу 12 в десятичной системе. Константы-литералы, содержащие текстовые строки, следует заключать в двойные кавычки (как в случае “Hello, world”). Константы, представляющие собой время и дату, нужно заклю- чать между знаками * (например, *6/1/2000*).
ГЛАВА 4 Введение в VBScript 51 Внутренние константы В языке VBScript есть несколько предопределенных констант (их также на- зывают встроенными или внутренними), таких как vbOKOnly. Взгляните на оператор: MsgBox "Hello", 0 + 64, "Test" Именованные константы позволяют сделать его менее загадочным: MsgBox "Hello", vbOKOnly + vblnformatlon, "Test" Единственная хитрость в том, что для этого требуется знать точное имя внутренней константы. ПРИМЕЧАНИЕ Полный список внутренних констант см. в справочни- ке VBScript Language Reference. Переменные Переменные представляют собой ссылки на определенные участки памяти, в которых программы могут хранить значения. В отличие от констант зна- чение переменных может меняться во время работы программы. Перемен- ную можно использовать в программе, например: Prloe = 45 ' Установить цену. Diecount =17 При первом появлении переменной в программе VBScript создает пере- менную в памяти и присваивает ей начальное значение. VBScript поддержи- вает только переменные типа Variant. Это значит, что переменная может хранить любое значение, в том числе числовое и текстовое. Подтипы типа Variant VBScript поддерживает единственный тип данных — Variant. Этот особый тип данных способен содержать различную информацию: текстовые стро- ки, даты, логические значения (True или False), целые числа, числа с плава- ющей точкой и т. д. Формат значения типа Variant определяется самим зна- чением. Если вы присвоите переменной числовое значение, то ее формат будет числовым, значение даты будет храниться в соответствующем формате даты и т. д. Формат значения переменной типа Variant называется подтипом (subtype). Большинство операторов VBScript работают со значениями определен- ного подтипа и возвращают также значения определенного подтипа. На- пример, если вы сложите две числовых переменных, результат тоже будет числовым. Следующий оператор присваивает числовое значение перемен- ной Sumi-. Sumi = Prioe +15.0
52 ЧАСТЬ I Основы программирования сценариев Оператор + осуществляет конкатенацию двух строк: Message = "Thingl and " + "Thing2" Но при исполнении следующего оператора возникнет ошибка: Result = "Value " + Sumi Первая часть выражения — справа от оператора присваивания — является строкой, а переменная Sumi содержит значение числового типа. Интерпре- татор VBScript не может складывать строковые и числовые значения, поэто- му генерирует сообщение об ошибке (рис. 4-1). Рис. 4-1. Сообщение об ошибке, которое выводится при несоответствии типов. Здесь можно преобразовать переменную числового типа оператором: Result = "Value " + CStr(Suml) Функция VBScript CStr преобразует числовое значение переменной Sumi в строковое значение типа Variant. Полученную строку можно сложить с другой строкой, “Value", а результат присвоить переменной Result. ПРИМЕЧАНИЕ Конкатенация строк оператором + — не самая хоро- шая практика (хоть я иногда и пользуюсь ею). Оператор + складывает два операнда (если последние — строки, происходит операция конка- тенации). Лучший подход — объединить строки оператором & (на- пример, так: “Hello, ” & “world”). При объединении оператором & двух значений разного формата VBScript автоматически преобразует типы без использования функции CStr. Числа, определенные как константы, также можно рассматривать как строки. Константы следует заключать в кавычки. Взгляните на оператор: Text = "15” + "30" После его исполнения получится не число 45, значение переменной Text будет равно “1530”! Ели записать этот оператор согласно рекомендациям, данным на предыдущей странице, он станет гораздо понятнее: Text = "15" & "30" При взгляде на этот оператор сразу становится ясно, что он выполняет конкатенацию строк. Для преобразования данных из одного подтипа Variant в другой служат функции преобразования.
ГЛАВА 4 Введение в VBScript 53 ПРИМЕЧАНИЕ VBScript в отличие от Visual Basic или VBA не допускает предварительного определения подтипов переменных и назначает их автоматически. Однако функции Asc, CBool, CByte, CCur, CDate, CDbl, Chr, CInt, CLng, CSng, CStr, Hex, и Oct позволяют преобразовывать типы данных. Для запроса подтипа переменной служит функция VarType. Список всех подтипов типа Variant см. в учебнике VBScript Tutorial. Оператор Option Explicit По умолчанию VBScript разрешает неявное объявление переменных. При этом переменная создается и используется без ее предварительного объяв- ления операторами Dim, Private, Public или ReDim. Однако, разрешив неяв- ное объявление переменных в сценариях, вы рискуете пропустить допущен- ную при программировании ошибку. Так, если в имени переменной будет допущена опечатка, интерпретатор VBScript посчитает, что вы неявно объя- вили новую переменную и создаст ее. Допустим, в исходном тексте вы оши- бочно набрали Pris вместо Price, что и случилось в этом фрагменте: VAT = 16.0 Price = 0 Net = 115.00 Pris = Net * (1.0 + VAT/100) MsgBox Price, vbOKOnly, "Price" При этом программа будет работать не так, как вы ожидали. В результате опечатки в операторе присваивания рассчитанное значение цены будет при- своено новой переменной Pris вместо переменной Price, а в окне сообщения вместо 13 3-4 появится нулевой результат. Для обнаружения опечаток в именах переменных в первую строку про- граммы можно поместить оператор Option Explicit. Он сигнализирует интер- претатору, что разрешается использовать только те переменные, что были объявлены явно операторами Dim, Private, Public или ReDim. Если вы забуде- те объявить переменную явно, в окне сообщения об ошибке WSH покажет переменную, которую пытались объявить неявным образом. Таким образом, эта функция WSH позволяет обнаружить опечатки в именах переменных. Такая опечатка имеется в этом коде (листинг 4-2): '******А******************************************* ' Файл: ErrorTest2.vbs (Пример для WSH на VBScript) ’ Автор: (с) G. Born ’ Демонстрирует работу оператора Option Explicit ’ с помощью неявно объявляемой переменной '*****«*******************************«************ Option Explicit ' Объявить переменные. Dim Message см. след. стр.
54 ЧАСТЬ I Основы программирования сценариев Dim Title ' Инициализировать переменные. Message = "Hello, world" Titel = "WSH sample " ' Эта переменная не объявлена!I ' Вывести сообщение. MsgBox Meesage, vblnformation + vbOKOnly, Title '*** Конец Листинг 4-2. ErrorTest2.vbs. Слово Titel содержит опечатку. Когда интерпретатор доходит до строки, в которой присваивается значения этой переменной, выводится сообщение об ошибке (рис. 4-2.) Рис. 4-2. Сообщение об ошибке, возникающей при попытке использования неопределенной переменной. ПРЕДУПРЕЖДЕНИЕ При использовании оператора On Error Resume Next сообщения о необъявленных переменных не выводятся даже при наличии в сценарии оператора Option Explicit. Особенности использования оператора Option Explicit в .wsf-файлах Используя .wsf-файлы, убедитесь, что оператор Option Explicit есть в каждом из элементов <script .„> ... </script>. Иначе проверка наличия необъявленных переменных будет производиться только в тех элемен- тах, которые содержат оператор Option Explicit. Этот подводный ка- мень проиллюстрирован ниже программой из файла WSHDemo2.wsf: <?xml version="1.0”?> <l- Файл: WSHDemo2.wsf (Пример для WSH 2.0) Автор: (с) G. Born -> <Job id="T1"> <script language="VBScript”> <l[CDATA[ Option Explicit
ГЛАВА 4 Введение в VBScript 55 Dim name name = "Microsoft" WScript.Echo name ]]> </script> <script lanfluafle="VBSoript"> <1 [CDATA[ Text = "Hello, world" WScript.Echo Text ]]> </soript> </job> В первом элементе сценария есть оператор Option Explicit, поэто- му переменная пате должна быть объявлена явно. Во втором элемен- те Option Explicit отсутствует. Казалось бы, при исполнении сценария должна возникнуть ошибка, так как переменная Text не объявлена, но этого не происходит, поскольку Option Explicit определен только в пер- вом элементе сценария. Такого рода поведение допускает выборочное применение оператора Option Explicit в .wsf-файлах. Однако могут воз- никнуть неприятности, если забыть указать Option Explicits одном из последующих элементов <script>. Оператор Dim Ключевое слово Dim позволяет явно объявлять переменные на уровне про- цедуры, функции или сценария, а также объявлять массивы. Используя Option Explicit, все переменные нужно объявить в заголовке сценария (процедуры или функции) ключевым словом Dim-. Dim text Dim x Dim Price, Vat ПРИМЕЧАНИЕ Значение переменной автоматически инициализиру- ется при ее объявлении. Числовые переменные получают значение О, а строковым присваивается пустая строка (“”). Ключевые слова Public и Private Кроме оператора Dim, два других ключевых слова VBScript, Public и Private, позволяют объявлять переменные на уровне сценария. Область действия пе- ременных, объявленных на уровне сценария, можно расширить ключевым словом Public или ограничить ключевым словом Private. Public Test Private Price, Vat
56 ЧАСТЬ I Основы программирования сценариев Private ограничивает сферу действия объявленной переменной сценари- ем, в котором она используется. При использовании Public переменная бу- дет видима всем сценариям и процедурам из данного файла. В .vbs-файлах Private и Public действуют так же, как и оператор Dini. За- чем же они нужны? Дело в том, что ключевые слова Private и Public имеют важное значение для .wsf- и .htm-файлов. VBScript исходно разрабатывался для создания документов HTML, в которых может быть несколько сценари- ев, заключенных в тэги <scripf>. Ключевое слово Public позволяет объявить переменную, которая будет действительной за пределами локального сцена- рия (т. е. и в других сценариях этого же документа). ПРИМЕЧАНИЕ Недопустимо использовать ключевые слова Public и Private внутри процедур и функций — при этом возникает синтакси- ческая ошибка. Однако их можно применять при объявлении проце- дуры или функции, чтобы определить их сферу действия в явном виде (подробнее об объявлении процедур и функций см. раздел «Функции и процедуры»). Объявление массивов с помощью оператора Dim VBScript поддерживает массивы. Вот как они объявляются: Dim value(10) value(O) = 11 В первой строке объявлен массив из 11 элементов (индексация элемен- тов массива всегда начинается с 0). Имя первого элемента массива, таким образом, будет value(O). Во второй строке первому элементу массива присва- ивается значение 11. Область действия переменной в .wsf-файлах Описанные принципы определения области действия переменных применимы и к отдельным сценариям, составляющим единый .wsf- файл. В следующем примере (WSHDemo3.wsf) содержится одно зада- ние, состоящее из двух сценариев: <?xml version="1.0"?> <l- Файл: WSHDemo3.wsf (Пример для WSH 2.0) Автор: (с) G. Born -> <job id="T1"> «script language="VBScript"> <l[CDATA[ Option Explicit Dim name name = "Microsoft"
ГЛАВА 4 Введение в VBScript 57 WScript.Echo name ]]> </script> <script language="VBScript"> <1[CDATA[ Option Explicit Dim text text = "Hello, " WScript.Echo text & name ]]> </script> </job> Оператор Option Explicit присутствует в обоих сценариях, но пере- менная пате объявляется только в первом. Поскольку пате использу- ется и во втором сценарии, она обладает глобальной областью дей- ствия по отношению ко всем элементам <script> в этом .wsf-файле. Оператор Dim также позволяет объявлять многомерные массивы. Следу- ющий оператор объявляет двумерный массив: Dim value(10, 10) Value(0, О) — первый элемент в строке и столбце с номером 0. VBScript допускает объявление массивов с максимальным числом измерений, равным 60. Нижняя граница массива всегда установлена в 0. Объявляя массив опе- ратором Dim, можно задавать только его верхнюю границу. ПРИМЕЧАНИЕ Для определения динамических массивов после опе- ратора Dim надо ставить пустые скобки: Dim valueQ. Переопределить измерения динамического массива позволяет оператор ReDim. Имена переменных Имя переменной может иметь длину до 255 символов. Переменной можно дать любое имя, удовлетворяющее следующим правилам: первым символом имени должна быть буква (Test — допустимое имя, 123 — нет); Н в имени не должно быть пробелов, точек, запятых или специальных сим- волов (таких как!, ? и +); в качестве имен переменных нельзя использовать ключевые слова, такие как Sub, If, End и Dim. Присваивание ссылок на объект с помощью оператора Set В VBScript у оператора Set особое значение. Он обеспечивает доступ к объек- ту, присваивая ему ссылку:
58 ЧАСТЬ I Основы программирования сценариев Set objAdr = WScrlpt.Arguments Этот оператор присваивает переменной objAdr ссылку на объект, указы- вающую на свойство Arguments объекта WScrlpt. Она тоже является перемен- ной типа Variant, но у нее другой подтип данных — Object. Инициализиро- ванную переменную-объект можно использовать в различных операторах, например: MsgBox objAdr.Item(O) Этот оператор выводит в окне сообщения первый аргумент, переданный сценарию. ПРИМЕЧАНИЕ В общем случае при присваивании объекта какой- либо переменной оператором Set создается не новая копия объекта, а ссылка на него. Поскольку эти переменные являются ссылками на объект (а не его копиями), любые изменения объекта отражаются на всех переменных, ссылающихся на него. ПРИМЕЧАНИЕ Имена, методы и свойства объектов в операторах раз- деляются точками, например, так: objAdrJtem, где objAdr — ссылка на объект, a Item — свойство объекта (о программировании с помощью объектов см. главу 3). Операторы VBScript поддерживает несколько типов операторов: арифметические, логи- ческие, операторы сравнения и операторы конкатенации. Арифметические операторы VBScript поддерживает следующие арифметические операторы (табл. 4-1): Табл. 4-1. Арифметические операторы. Оператор Описание Пример Л Возведение в степень х = уЛпоказатель + Сложение х=а + Ь - Вычитание или знак отрицательного числа х = ?10 илих = а ? 100 * Умножение х = Ь ’ зо / Деление х = а/ b I Целочисленное деление х = а \ Ь Mod Модуль х = a Mod Ь ПРИМЕЧАНИЕ Если при конкатенации с помощью оператора + один из операндов равен Null, результат тоже будет равен Null. Подробнее об этом см. справочник VBScript Language Reference.
ГЛАВА 4 Введение в VBScript 59 Логические операторы VBScript также поддерживает некоторые логические операторы при вычис- лениях (табл. 4-2). Табл. 4-2. Логические операторы. Оператор Описание Пример Not HE x = Noty And И х = a And b Or ИЛИ х = a Or b Хог Исключающее ИЛИ х = а Хог b Eqv Эквивалентность х = aEqv b Imp Импликация х = a Imp b Логические операторы часто используются при ветвлении. Следующий оператор выполняет проверку двух условий: If а > 100 And а < 1000 Then При проверке обоих условий получаются логические значения True или False, которые затем сравнивает оператор And. Если в результате проверки обоих условий получилось значение True, выполняется ветвь If. Операторы Not, And, Or и Хог позволяют строить логические выражения, а так- же выполнять поразрядные операции над байтами и целыми числами. Ниже пред- ставлена таблица истинности оператора «логическое НЕ» (табл. 4-3). Табл. 4-3. Оператор «Логическое НЕ». Выражение А Not А True False False True Как видите, «логическое НЕ» возвращает значение, обратное логическо- му значению выражения (True или False). А вот таблица истинности опера- тора «поразрядное НЕ» (табл. 4-4): Табл. 4-4. Оператор «Поразрядное НЕ». Разряд Not 1 0 0 1 Оператор «поразрядное НЕ» считывает разряд и инвертирует его значе- ние. При этом 0 преобразуется в 1 и наоборот. Такие операции лучше всего показать на примере числа в двоичной или шестнадцатеричной системе. Десятичное число 3 может быть записано в двоичной системе как 0011 (если для представления числа используются четыре разряда). В результате испол- нения над ним оператора «поразрядное НЕ» получается 1100. Это двоичное число эквивалентно шестнадцатеричному числу ОСН или десятичному 12.
60 ЧАСТЬ I Основы программирования сценариев Оператор «логическое И» сравнивает два выражения и возвращает True, только когда оба сравниваемых выражения являются истинными. Вот ре- зультаты применения оператора «логическое И» (табл. 4-5). Табл. 4-5. Оператор «логическое И». Выражение А Выражение В A And В True True True True False False False True False False False False Оператор «поразрядное И» сравнивает два разряда. Если оба равны 1, в результате также получается 1. Возможные входные значения указаны в стол- бцах «разряд», а результЯаты — в столбце And (табл. 4-6). Табл. 4-6. Оператор «поразрядное И». Разряд Разряд And 1 1 1 1 0 0 0 1 0 0 0 0 Ниже показан пример использования оператора «поразрядное И»: MsgBox (3 And 7) В результате в окне сообщения выводится число 3. Выражение в скобках выполняет операцию «поразрядное И» над числами 3 и 7. (Для начинающих объясню: десятичное число 3 можно представить двоичным числом 0011, а десятичное 7 — 0111. Таким образом, в результате выполнения оператора получается 0011, что в десятичной системе эквивалентно 3 ) Оператор «логическое ИЛИ» сравнивает два выражения и, если хоть одно из них истинно, возвращает True. Ниже перечислены возможные комбина- ции входных значений и результатов выполнения над ними операции «ло- гическое ИЛИ» (табл. 4-7). Табл. 4-7. Оператор «логическое ИЛИ». Выражение A Выражение В A Or В True True True True False True False True True False False False Оператор «поразрядное ИЛИ» сравнивает два разряда. Если один из них равен 1, в результате также получается 1. Вот возможные результаты испол- нения оператора «поразрядное ИЛИ» (табл. 4-8):
ГЛАВА 4 Введение в VBScript 61 Табл. 4-8. Оператор «поразрядное ИЛИ». Разряд Разряд Or 1 1 1 1 0 1 0 1 1 0 0 0 Рассмотрим следующий оператор-. MsgBox (3 Or 7) В результате операции «поразрядное ИЛИ» в окне сообщения выводится число 7. Десятичное число 3 эквивалентно двоичному 00 И,а7 — 0111.В результате выполнения над этими числами оператора Or получается двоич- ное число 0111, или 7 (в десятичной системе). Оператор Хог («логическое исключающее ИЛИ») сравнивает два выраже- ния и возвращает True, если значения выражений различаются, или False, если выражения имеют одинаковые значения. Возможные результаты опе- ратора «логическое исключающее ИЛИ» таковы (табл. 4-9). Табл. 4-9. Оператор «логическое исключающее ИЛИ». Выражение А Выражение В AXorB True True False True False True False True True False False False В результате поразрядного выполнения оператора Хог получается 1, если входные разряды отличаются (табл. 4-10). Табл. 4-10. Оператор «поразрядное исключающее ИЛИ». Разряд Разряд And 1 1 0 1 0 1 0 1 1 0 0 0 Операторы сравнения Операторы сравнения служат для сравнения выражений (в которых могут быть числа, строки и т. д.) (табл. 4-11). Табл. 4-11. Операторы сравнения. Оператор Описание Пример < Меньше а < Ь > Больше а > b см. след. стр.
62 ЧАСТЬ I Основы программирования сценариев Табл. 4-11. {продолжение) Оператор Описание Пример = Равно а = Ь <= Меньше или равно а <= b >= Больше или равно а>=Ь о Не равно а О Ь Операторы сравнения используются при ветвления, а также в циклах, например: Do While а < 10 Loop If а > 100 Then End If ПРИМЕЧАНИЕ Используя операторы сравнения, не забывайте, что VBScript работает с переменными типа Variant. Если подтипы данных у операндов отличаются, VBScript автоматически их преобразует. В итоге неравные значения могут быть интерпретированы как равные. Старшинство операторов При вычислении значений выражений, состоящих из нескольких операто- ров, синтаксический анализатор VBScript использует неявное старшинство операторов. Например, при вычислении выражения: 1 + 2 « 3 + 4 синтаксический анализатор сначала вычисляет произведение 2'3, посколь- ку умножение имеет приоритет над сложением. Старшинство в арифмети- ческих операциях таково: высший приоритет имеет возведение в степень, далее идет операция отрицания, умножение с делением, целочисленное де- ление, абсолютное значение (модуль), сложение и вычитание и, наконец, конкатенация. Приоритет у всех операторов сравнения одинаков, они вы- полняются по порядку7 справа налево. Из логических операторов наивысшим приоритетом обладает Not, далее идут And, Or, Хог, Eqv и Imp. Если выраже- ние состоит из различных категорий операторов, то сначала выполняются арифметические операторы, затем операторы сравнения и в последнюю очередь — логические. ПРИМЕЧАНИЕ Изменить порядок выполнения можно с помощью скобок. При этом в любом случае сначала вычисляется часть выраже- ния, заключенная в скобки.
ГЛАВА 4 Введение в VBScript 63 Управляющие структуры Для управления ветвлением и циклами VBScript поддерживает управляющие структуры. lf...Then Для реализации ветвления с помощью операции сравнения служит блок If...Then. Если значение переменной а больше 100, то следующий оператор уменьшает его до 100: If а > 100 Then а = 100 Эта последовательность операторов также сравнивает переменную а с 100: If а > 100 Then а = 100 b = 20 End If Если ее значение больше 100, выполняются команды, находящиеся меж- ду операторами If...Пеп и End If, если же меньше или равно 100, исполнение программы продолжается с оператора, стоящего после строки End If. lf...Then...Else Этот оператор If...Tben..Else позволяет создать дополнительную ветвь услов- ного перехода. Приведенная ниже последовательность операторов проверя- ет значение переменной а-. If а > 100 Then а = 100 b = 20 Else а = а + 10 Ь = а \ 10 End If Если оно больше 100, выполняются операторы между If ...Then и Else, в про- тивном случае выполняются операторы между строками Else и End If. lf...Then...Elself Оператор If...Then..ElseIfno-3KonHCV организовать несколько вложенных бло- ков If. Приведенная ниже последовательность операторов проверяет не- сколько значений переменной а-. If а = 1 Then Ь = 100 с = 20 Elself а = 2 Then Ь = 200
64 ЧАСТЬ I Основы программирования сценариев с = 40 Elself а = 3 Then b = 300 с = 60 End If Если в результате исполнения оператора сравнения получается True, вы- полняются команды между строкой оператора сравнения и следующим бло- ком с ключевыми словами Elself или End If. Select Case Для проверки переменной на соответствие нескольким условиям служит ключевое слово Select Case. При этом в зависимости от значения перемен- ной можно исполнить один из блоков кода. Ниже тоже выполняется провер- ка значения переменной а: Select Case а Case 1 b = 100 с = 20 Case 2 b = 200 с = 40 Case 3 b = 300 c = 60 Case Else b = 0 c = 0 a = 1 End Select Операторы Case задают условия (числа), на соответствие (равенство) ко- торым проверяется переменная. Если при проверке условия получается True, выполняются операторы соответствующего блока Case. Если не выполняет- ся ни одно из условий, заданных операторами Case, может быть исполнен (необязательный) блок Case Else. Циклы Циклы служат для многократного исполнения блока операторов. Ниже опи- саны языковые конструкции VBScript, реализующие циклы. Do While Операторы Do While формируют цикл. Операторы в теле такого цикла будут исполнены, если выполняется условие, содержащееся в заголовке цикла. Если это условие не выполняется, интерпретатор продолжает исполнение с перво- го оператора, стоящего после ключевого слова Loop. Вот пример цикла Do While-.
ГЛАВА 4 Введение в VBScript 65 а = 1 Do While а < 10 а = а + 1 Loop Перед входом в цикл проверяется условие а < 10. Если оно выполняется, интерпретатор исполняет операторы в теле цикла, пока не встретит ключе- вое слово Loop. После этого условие в заголовке цикла проверяется повтор- но и т. д., пока оно не перестанет выполняться. Далее интерпретатор продол- жает исполнение программы с первого оператора, стоящего после ключе- вого слова Loop. Таким образом, если в результате проверки условия в заго- ловке цикла получится True, цикл будет выполняться, а если False — завер- шится. Do Until Цикл, создаваемый оператором Do Until, выполняется, если проверка усло- вия в заголовке цикла дает False. Как только при проверке условия получит- ся True, исполнение цикла прекратится. Такая последовательность команд формирует цикл Do Until-. а = 1 Do Until а > 10 а = а + 1 Loop Внутри цикла проверяется условие а> 10. Если оно не выполняется, ис- полняются операторы тела цикла, в противном случае исполнение програм- мы продолжается с оператора, стоящего после ключевого Loop. Do...Loop While Оператор Do..Loop While создает цикл, в котором проверка условия содер- жится в конце. Если это условие выполняется, цикл повторяется, в против- ном случае он завершается. Пример использования цикла Do..Loop While-. а = 1 Do а = а + 1 Loop While а < 10 В конце блока этого цикла проверятся условие а < 10. Если оно выполняет- ся, то снова обрабатываются все операторы между Do и Loop While, в против- ном случае выполняются операторы после цикла. Do...Loop Until Оператор Do..Loop Until также позволяет создать цикл с проверкой условия в конце блока цикла. Если это условие не выполняется, операторы цикла об- рабатываются снова. В противном случае цикл прекращается, и исполнение продолжается с первого оператора, стоящего после цикла:
66 ЧАСТЬ I Основы программирования сценариев а = 1 Do а = а + 1 Loop Until а > 10 В этой программе есть цикл, в конце которого проверяется условие а> 10. Он выполняется до тех пор, пока это условие не выполняется. Exit Do Завершить цикл Do можно оператором Exit Do, стоящим в теле цикла. Если его встречает интерпретатор, цикл прекращается, и исполнение программы возобновляется с оператора, стоящего после цикла. For...Next Оператор For позволяет организовать цикл, число повторов которого мож- но задать заранее. При каждом повторе исполняются все операторы в бло- ке For..Next. В этой программе на VBScript используется цикл For-. For 1 = 1 То 10 а = а + 1 Next Цикл выполняется 10 раз. Переменная i является индексом цикла. Размер инкремента индекса при каждом повторе определяется шагом цикла, по умолчанию равным 1. Однако конструкция For i = начало То конец Step х по- зволяет установить шаг, равный х. For Each... Next Конструкция For Each позволяет создать цикл для обработки всех элементов набора или массива. Для обработки каждого элемента набора или массива повторно выполняются все операторы тела цикла. В следующем фрагменте используется эта разновидность циклов: For Each х In Worksheets Next Exit For Для прекращения цикла For служит оператор Exit For. Если интерпретатор встречает его, исполнение продолжается с первой строки, стоящей после цикла. While...Wend Применив цикл While-Wend, можно многократно исполнить последователь- ность команд. Цикл завершается, если прекращает выполняться условие в строке с оператором While, например:
ГЛАВА 4 Введение в VBScript 67 Dim value value = 1 While value <10 value = value + 1 Wend Цикл повторяется до тех пор, пока значение переменной value не станет равно 10. ПРИМЕЧАНИЕ Вместо цикла While...Wend часто используют Do..Loop, представляющий собой намного более структурированную и гибкую конструкцию для организации циклов. Функции и процедуры В VBScript можно использовать встроенные функции и процедуры или опре- делить собственные. Ниже разъясняются основы создания и вызова пользо- вательских функций и процедур на VBScript. Функции Функции надо применять, когда вызывающая программа должна вернуть только один результат (это может быть как переменная, так и массив). Функцию можно объявить следующими операторами: Function Name(Parameters) Name = result End Function В теле функции ее возвращаемое значение должно быть присвоено пе- ременной с именем функции. Ниже для этого использован оператор Name = result. Все функции VBScript возвращают значения типа Variant. Определе- ние функции должно начинаться с ключевого слова Function, за которым должно следовать имя функции (например, GetValue) и необходимые для ее вызова параметры, заключенные в скобки. Примером использования функций является следующая программа на VBScript (листинг 4-3). '**•*••***••«««««•«•«***«•*««««««««««««•*«««««««* Файл: Function.vbs (Пример для WSH на VBScript) ‘ Автор: (с) G. Born ' Использование функций Option Explicit Dim i, j j = 0 см. след. стр.
68 ЧАСТЬ I Основы программирования сценариев For 1 = 1 to 10 ' Цикл с 10 повторами j = addx(i, j) ' сложить значения с помощью функции addx. Next WScript.Echo "Result: ”, j Function addx(val1, val2) addx = vail + val2 End Function '•»* конец Листинг 4-3. Function.vbs. Здесь используется функция addx с двумя параметрам, vail и val2. В ре- зультате исполнения функции значения параметров суммируются. Результат возвращается в виде значения функции, вычисленного следующим образом: addx = vail + val2 Имя функции addx встроено в ее заголовок. Результат операции vail ?val2 присваивается переменной с именем этой функции. Блок функции заканчи- вается оператором End Function, который прекращает выполнение функции и возвращает управление вызывающей программе. ПРИМЕЧАНИЕ VBScript также поддерживает необязательный опера- тор Exit Function. Если внутри функции выполняется этот оператор, исполнение функции прекращается, а управление возвращается вызы- вающему модулю. Порядок применения пользовательских функций не отличается от поряд- ка применения встроенных функций VBScript: имя функции с указанием нужных параметров, заключенных в скобки, помещают в правой части опе- ратора присваивания. В приведенной программе (листинг 4-3) вызов фун- кции осуществлял оператор: j = addx(i, j) Пользовательские функции позволяют расширить возможности VBScript. Допустим, вам надо рассчитать розничную цену нескольких товаров с уче- том налога на добавленную стоимость (НДС или VAT). Для этого можно оп- ределить функцию GetPrice-. Function GetPrice(Net, VAT) ' Вычислить цену с учетом налога. GetPrice = Net * (1.0 + VAT/100.0) End Function Значение процентной ставки НДС можно передать соответствующей функции. Чтобы использовать эту функцию в сценарии, нужно указать толь- ко ее имя и нужные параметры: Net = 10.0 Vat =16.0
ГЛАВА 4 Введение в VBScript 69 Price = GetPrice(Net, Vat) Pricel = GetPrice(100.0, 16.0) Как видите, в качестве параметров функции можно использовать и пере- менные, и константы. ПРИМЕЧАНИЕ Нельзя определять функции внутри определения дру- гой функции или процедуры. Функция должна быть объявлена на уров- не сценария. Локальные переменные, определяемые в теле функции, действительны лишь на время ее вызова. Встроенные функции VBScript поддерживает набор встроенных (внутренних) функций, порядок применения которых не отличается от применения пользовательских фун- кций. Следующий оператор присваивает переменной i значение ANSI-кода символаА 1 = Asc('A') Это преобразование осуществляет внутренняя функция А$с, параметром которой является сам символ. ПРИМЕЧАНИЕ Подробнее о пользовательских и встроенных функци- ях см. VBScript Language Reference. Процедуры Объявление процедуры имеет следующий синтаксис: Sub Name(Parameter) End Sub В отличие от функций процедуры не возвращают значений. Есть два под- хода при передаче переменных процедуре. Чтобы передать значение про- цедуре, можно выполнить одно из следующих действий. Объявить глобальную переменную на уровне сценария. Ее область дей- ствия будет распространяться и на процедуру. Передать переменную в виде параметра процедуры. Значение параметра можно менять в теле процедуры, прежде чем передать результат вызыва- ющему модулю (об этом подходе см. раздел «Передача параметров с по- мощью ByVai и ByRef»). Вот как использовать процедуру для расчета розничной цены с учетом НДС (листинг 4-4). ' Файл: Procedure.vbs (Пример для WSH на VBScript) ' Автор: (о) G. Born см. след. стр.
70 ЧАСТЬ I Основы программирования сценариев ' Использование процедуры Option Explicit Dim Price, Net, Tax Tax = 16.0 Net = 100.0 GetPrice Net, Tax ' Вычислить цену. WScript.Echo "Result: ”, Price Sub GetPrice(net1, taxi) Price = net1 * (1.0 + (tax1/100.0)) End Sub *** Конец Листинг 4-4. Procedure.vbs. Здесь несколько методов обмена данными с процедурой. Я определил на уровне сценария несколько глобальных переменных. Переменная Price яв- ляется глобальной и доступна внутри процедуры. Она применяется для воз- врата результата вызывающей программе. Для вызова самой процедуры нуж- ны два параметра, которые требуется указать после имени процедуры, раз- делив их запятой. ПРИМЕЧАНИЕ Для вызова процедуры не обязательно указывать ключе- вое слово Call. Если же вы его все-таки используете, параметры процеду- ры надо заключать в скобки. Так, операторы Call GetPrice(100.0, 0.16) и GetPrice 100.0,0.16 эквивалентны. Передача параметров с помощью ключевых слов ByVai и ByRef Чтобы указать, что параметр передается процедуре по значению (by value) или но ссылке (by reference), в объявлении процедуры или функции перед параметрами можно размещать ключевые слова ByVai или ByRef. При вызо- ве по значению процедуре передается копия параметра (значение констан- ты или переменной). Процедура может изменять значение переданной ко- пии, но при этом изменения не отражаются на значении оригинальной кон- станты или переменной. При вызове по ссылке процедуре передается адрес параметра в памяти (адрес константы или переменной). При передаче па- раметра по ссылке вызванная функция или процедура получает возможность изменить само значение параметра. Если для параметра не указано ни одно из ключевых слов ByVai или ByRef, VBScript по умолчанию использует ByRef. В примере Procedure 1.vbs (листинг 4-4) для возврата результата процеду- ры служит переменная Price, объявленная на уровне сценария. Однако напи- сание процедур, возвращающих значения с помощью глобальных перемен- ных, хорошим стилем назвать нельзя, так как при их использовании возни-
ГЛАВА 4 Введение в VBScript 71 кают существенные ограничения. Надо точно знать имя глобальной пере- менной, значение которой модифицируется процедурой. Если допустить опе- чатку в ее имени, сценарий работать не будет. Лучше передавать процедуре значения в виде параметров и использовать вызов по ссылке, чтобы получить результаты через параметры. Ниже показано, что процедура может вернуть результаты и без глобальных переменных (листинг 4-5). ' Файл: Procedurel.vbs (Пример для WSH на VBScript) ’ Автор: (с) G. Born ' Использование процедур '***********************' Option Explicit Dim Price, Net, Tax Tax = 16.0 Net = 100.0 Call GetPrice(Price, Net, Tax) ’ Вычислить цену. WScript.Echo "Result: ", Price Sub GetPrice(pris, net, tax) pris = net * (1.0 + (tax/100.0)) End Sub '*** Конец Листинг 4-5. Procedurel.vbs. Для вызова новой процедуры требуется третий параметр — Price, использу- емый для возврата результатов процедуры. В объявлении процедуры GetPrice он объявлен как pris и по умолчанию передается по ссылке (с помощью By Ref). Если значение pris изменяется при выполнении GetPrice, эти измене- ния сразу отразятся на значении переменной Price. Таким образом, резуль- тат вычислений процедуры можно использовать в программе, не привле- кая для обмена данными глобальные переменные. (В примере я вызвал GetPrice оператором Call только для наглядности — на работу процедуры он не влияет). Иногда процедуры не могут изменять значения в вызывающей програм- ме. Рассмотрим программу, которая определяет переменную tax. Этой пере- менной однажды присваивается значение 16, после чего она несколько раз используется при вызове процедуры. Если процедура случайно изменит ее значение, это будет концом для всей программы, поскольку вызывающей программе для работы требуется исходное значение переменной. После вызова процедуры значения переменных Net и Тал: должны оставаться неиз- менными (листинг 4-5). Чтобы предотвратить изменение значений глобаль- ных переменных при модификации параметров при исполнении процеду-
72 ЧАСТЬ I Основы программирования сценариев ры, можно объявить параметр как подлежащий передаче по значению (ли- стинг 4-6). 'а************************************************* ' Файл: Procedure2.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Использование вызова по значению 'А************************************************* Option Explicit Dim Price, Net, VAT VAT = 16.0 Net = 100.0 Call GetPrice(Price, Net, VAT) ' Вычислить цену. WScript.Echo "Result: ", Price, " VAT: ", VAT Sub GetPrice(ByRef pris, ByVai net, ByVai tax) pris = net * (1.0 + (tax/100.0)) tax = 17.0 End Sub •*** End Листинг 4-6. Procedure2.vbs. В объявлении процедуры указано, как должен быть передан каждый из параметров: с помощью ByVai или ByRef. Параметр pris передается по ссыл- ке (так как необходимо вернуть результат вызывающему модулю), а парамет- ры net и tax передаются по значению. Если при исполнении процедуры па- раметры net и tax будут модифицированы, эти изменения не отразятся на значении переменных сценария Net и VAT. «Подводный камень» при вызове процедур на VBScript Ниже осуществляются три вызова процедуры Test. 'А*********************************************** ' Файл: WSHDemo4.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Использование процедур на VBScript ************************************************* Option Explicit Dim x, у Sub Test(x, у) x = x + у
ГЛАВА 4 Введение в VBScript 73 End Sub х = 10 у = 20 ' Вызвать процедуру Test. Test(x, у) ' Недопустимый вызов WScript.Echo "х = " & х Test х, у ' Нормальный вызов WScript.Echo "х = " & х Call Test(x, у) ' Допустимый вызов WScript.Echo "х = ” & х '*** Конец Test определена как процедура с двумя параметрами. Значения этих параметров суммируются, а результат возвращается через первый па- раметр. Эта программа работает, поскольку оба параметра передают- ся по ссылке. Параметры процедуры на VBScript при передаче обычно не заклю- чаются в скобки, как в JScript. Верный вызов процедуры таков: Test х, у Если вы случайно заключите параметры в скобки, то при синтак- сическом анализе исходного текста обработчик VBScript сообщит об ошибке при использовании недопустимого оператора (рис. 4-3): Test(x, у) Рис. 4-3. При заключении параметров вызываемой функции в скобки выводится сообщение об ошибке. При вызове процедуры можно использовать скобки, но при этом надо указывать оператор Call: Call Test(x, у) Пока все хорошо. Но, обработчик языка не сообщает, увы, обо всех случаях использования скобок при вызове процедуры. Взгляните: см. след. стр.
74 ЧАСТЬ I Основы программирования сценариев ' Файл: WSHDemoS.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Использование процедур на VBScript ‘А********************************** Option Explicit Dim х Sub Test(x) x = x + 1 End Sub x = 10 ' Вызвать процедуру Test. Test(x) ’ Недопустимый вызов, ведущий к получению неверных результатов. WScript.Echo "х = " & х Test х ' Вызов, как и результат, в порядке. WSoript.Eoho "х = ” & х ’*** Конец В этой программе используется простая процедура Test с одним параметром — х. Переданное в нем значение увеличивается на 1. На- пример, если х равен 10, то в результате следующего простого вызова будет возвращено значение х=1Т. Test х Если же вызвать процедуру так, результат будет загадочным: Test(x) При этом вызове синтаксическая ошибка не возникает, но в резуль- тате получается 10, а не 11. Обнаружив такое поведение моих сцена- риев, я погрешил на VBScript. Однако выяснилось, что интерпретатор работает без ошибок — просто он не телепат. Проблема оказалась в том, что интерпретатор не может отличить список параметров (х) от выражения (х). Встречая сочетание символов (х), интерпретатор счи- тает, что программист желает вычислить как выражение все, что за- ключено в скобки. При этом интерпретатор вместо адреса перемен- ной х возвращает значение выражения х. Так что вместо оператора: Test х интерпретатор исполняет оператор, эквивалентный: Test 10
ГЛАВА 4 Введение в VBScript 75 В итоге значение переменной х не изменяется, и получается невер- ный результат — 10. Во избежание этого надо убрать скобки, в кото- рые заключены параметры процедуры. Дополнительные возможности В следующих разделах описаны дополнительные возможности VBScript. Часть из них поддерживают только обработчики сценариев версии 5 (они поставляются с WSH 2). Обработка ошибок Любая ошибка периода выполнения, возникающая при исполнении сцена- рия, фатальна, т. е. при этом сообщается об ошибке и исполнение сценария прекращается. Однако в любой версии версий VBScript такое поведение мож- но изменить оператором: On Error Resume Next Он заставляет обработчик сценариев подавить вывод сообщений об ошиб- ках, восстановиться после ошибки периода выполнения и продолжить ис- полнение сценария с оператора, следующего за вызвавшим эту ошибку оператором. Обработка ошибок периода выполнения на уровне процедур Обработка ошибок периода выполнения чувствительна к уровню (вло- женности) процедуры. Допустим, сценарий вызывает процедуру, кото- рая в свою очередь вызывает другую подпрограмму. Если в подпро- грамме возникает ошибка периода выполнения, обработчик сценари- ев проверяет, активизирована ли встроенная обработка ошибок (опе- ратором On Error Resume Next}. Если встроенная обработка ошибок не активизирована, интерпретатор переходит к вызову исходной проце- дуры и повторяет проверку. Если в этой процедуре встроенная обработ- ка ошибок также не активизирована, исполнение возвращается на уро- вень сценария. Если и на уровне сценария встроенная обработка оши- бок неактивна (оператор On Error Resume Next еще не исполнен), об- работчик языка вызывает встроенный обработчик ошибок, который выводит сообщение об ошибке с указанием ошибочной строки. После закрытия диалогового окна обработчик ошибок прекращает исполне- ние сценария. Чтобы использовать встроенную обработку ошибок, надо добав- лять оператор On Error Resume Next к каждой вызываемой процеду- ре (при вызове подпрограммы на новом уровне он становится не- активным).
76 ЧАСТЬ I Основы программирования сценариев Чтобы отключить внутреннюю обработку ошибок, можно вставить в ис- ходный текст сценария оператор: On Error GoTo О Во избежание получения неожиданных результатов, нужно как можно раньше отключить внутреннюю обработку ошибок (листинг 4-7). При использовании встроенной обработки ошибок сценарий должен пе- рехватывать ошибки периода выполнения и сообщать о них в явном виде. Взгляните на обработку ошибок в период выполнения в сценарии на VBScript (листинг 4-7). ’**************************************************** ' Файл: RunTimeError.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Имитирует ошибку периода выполнения, чтобы продемонстрировать ‘ обработку ошибок и «подводный ' камень», возможный при этом. 'а*************************************************** Option Explicit Sub Testi() Err.Raise 6 ' Имитировать ошибку переполнения. WScript.Echo "Testi executed" End Sub Sub Test2() ' Здесь ошибки периода выполнения не обрабатываются. On Error Resume Next Err.Raise 6 ' Имитировать ошибку переполнения. WSoript.Eoho "Level: Test2" & vbCrLf & "Erroroode: " & Err.Number & ”=" & Err.Description Err.Clear ' Сбросить код ошибки. End Sub ' Основная часть WScript.Echo "Testing in progress" On Error Resume Next Testi WScript.Echo "Level: Main (back from Testi)" & vbCrLf & _ "Errorcode: " & Err.Number & "=" & Err.Description Test2 WScript.Echo "Level: Main (back from Test2)" & vbCrLf & _ "Errorcode: " & Err.Number & "=” & Err.Description ' Вот «подводный камень»: в следующем операторе есть ' необъявленная переменная. Но он не вызывает ошибку периода
ГЛАВА 4 Введение в VBScript 77 ' выполнения, так как использован оператор On Error Resume Next. WScript.Echo "Hello" & world ' Диалоговое окно никогда не появится! On Error Goto 0 ' Отключить обработку ошибок периода выполнения на ' уровне сценария. Test2 ' В этой процедуре производится внутренняя обработка ошибок. Testi ' Исполнение сценария прекращается из-за ошибки ' периода выполнения. WScript.Echo "Ready" ’*** Конец Листинг 4-7. RunTimeError.vbs. Сценарий вызывает две процедуры: Testi и Test2. В Testi обработка ошибок периода выполнения не активизирована. Поэтому при возникновении такой ошибки обработчик сценариев возвращается к вызывающей программе. Имитацией ошибки периода выполнения занимается оператор: Err.Raiee 6 ' Имитировать ошибку при переполнении. Метод Raise объекта Err провоцирует ошибку периода выполнения с пе- реданным методу номером. В этом примере используется ошибка с кодом 6 (ошибка переполнения). Поскольку в Testi нет обработки ошибок периода выполнения, следующий оператор никогда не исполнится: WScript.Echo "Testi executed" Исполнение возвращается на уровень сценария, где происходит активи- зация обработки ошибок периода выполнения. Этот оператор выводит в диалоговом окне сведения о текущей ошибке,- WScript.Echo "Level: Main (back from Testi)" & vbCrLf & _ "Errorcode: " & Err.Number & ”=" & Err.Description Код ошибки получается из свойства Number объекта Err, а описание — из ErrDescription. Когда пользователь закроет диалоговое окно, сценарий вызывает проце- дуру Test2, которая также имитирует ошибку периода выполнения с помо- щью метода ErrRaise. Поскольку в этой процедуре обработка ошибок пери- ода выполнения активна, исполнение сценария не прерывается, и снова вы- водится диалоговое окно со сведениями о текущей ошибке. Когда пользова- тель закрывает диалоговое окно, исполнение процедуры возобновляется. Следующий оператор сбрасывает код ошибки: Err.Clear В результате следующее сообщение, вызов которого производится уже на уровне сценария, не показывает кода ошибки. После вызова обеих процедур с активной обработкой ошибок сценарий отключает обработку ошибок пе- риода выполнения на уровне сценария. В результате исполнения Test2 воз-
78 ЧАСТЬ I Основы программирования сценариев никает ошибка периода выполнения, но она обрабатывается в процедуре. Таким образом, после того как пользователь закрывает диалоговое окно, исполнение сценария продолжится. Далее сценарий снова вызывает Testi. Поскольку внутренняя обработка ошибок периода выполнения отключена, исполнение возвращается с уровня Testi на уровень сценария, а затем пере- ходит к встроенной процедуре обработки ошибок. В итоге выводится стан- дартное диалоговое окно сообщения об ошибке, и сценарий завершается. Регулярные выражения (в VBScript 5.0 и выше) В VBScript версии 5.0 и выше имеется поддержка регулярных выражений, позволяющих находить определенные фрагменты строк по шаблону или заменять одни фрагменты на другие. Для создания в сценарии объекта «ре- гулярное выражение» служит оператор: Set regEx = New RegExp После исполнения этого оператора переменная-объект содержит ссылку на объект «регулярное выражение». В дальнейшем с помощью методов этого объекта можно инициировать операции поиска по шаблону, замены и т. д. Рассмотрим простую программу, которая находит все буквы b в данном тексте. В этом случае шаблоном будет буква Ь. Об этом надо сообщить объек- ту через его свойство Pattern-. regEx.Pattern = "b" Для этого имя объектной переменной используется вместе с именем свой- ства, а значение свойства устанавливается по значению шаблона, т. е. Ь. Будьте осторожны с чувствительностью к регистру! Символы В и b не одно и то же. К счастью, свойство IgnoreCase можно установить как True или False. Следующий оператор делает процесс поиска по шаблону нечувстви- тельным к регистру: regEx.IgnoreCase = True Свойство Global позволяет определить, должен ли поиск соответствий вестись во всех строках текста или только в первой. Чтобы вывести сведе- ния обо всех совпадениях, это свойство надо установить как True-. regEx.Global = True После определения объекта «регулярное выражение», шаблона поиска и свойства Global, становятся доступными следующие методы. Test выполняет в заданной строке поиск фрагментов, соответствующих регулярному выражению, и возвращает булево значение (True или False), сообщающее, было ли найдено соответствие. Синтаксис метода: o6beKm.Test(cmpoKa), где строка — это строка, в которой осуществляет- ся поиск регулярного выражения.
ГЛАВА 4 Введение в VBScript 79 Execute осуществляет поиск регулярного выражения в заданной строке. Синтаксис метода: объектЕхесШе (строка), где строка — это строка, в которой выполняется поиск регулярного выражения. Replace заменяет текст, найденный при поиске регулярного выражения. Синтаксис: объектРер1асе (строка 1, строка2), где строка1 — это стро- ка, текст в которой подлежит замене, а строка2 — замещающий текст. Подробнее о применении этих методов и свойств см. справочник VB- Script Language Reference. Вот иллюстрация использования объекта RegExp (листинг 4-8): Файл: RegExpression.vbs (Пример для WSH на VBScript) Автор: (с) G. Born ' Поиск по шаблону в отроке с помощью объекта RegExp. ***************************************************** Option Explicit Const Test = "The quick brown fox jumps over the lazy dog..." Function RegExpTest(patrn, strng) Dim regEx, Match, Matches ' Создать переменные. Dim retStr ' Результат Set regEx = New RegExp ' Создать регулярное выражение. regEx.Pattern = patrn ' Задать шаблон. regEx.IgnoreCase = True ’ Задать чувствительность к регистру. regEx.Global = True ' Задать глобальный поиск. Set Matches = regEx.Executefstrng) ' Выполнить поиск. For Each Match in Matches ' Циклическая обработка набора ’ найденных соответствий. RetStr = RetStr & "Match found at position " RetStr = RetStr & Match.Firstlndex & ". Match Value is RetStr = RetStr & Match.Value & & vbCrLf Next RegExpTest = RetStr ' Вернуть результат. End Function WScript.Echo RegExpTest("b.", Test) '*** Конец Листинг 4-8. RegExpression.vbs. Функция RegExpTest (взята из VBScript Language Reference), создает объект «регулярное выражение», устанавливает свойства Pattern, IgnoreCase и Global, затем применяет к строке метод Execute. Этот метод возвращает набор най-
80 ЧАСТЬ I Основы программирования сценвриев денных сообщений в виде переменной-объекта. Можно обработать все эле- менты набора по очереди в цикле For Each-. For Each Match In Matches Next Этот цикл выполняется, пока не будут обработаны все члены набора Matches. Сбор результатов производится в текстовой переменной, возвращаемой в ка- честве значения функции. Эта функция вызывается в главной части сцена- рия, а результаты выводятся в простом диалоговом окне. Классы (только для VBScript 5.0) Классы позволяют создавать объекты, реализующие новые функции VBScript 5.0. Вероятно, вы знакомы со структурированными, определенными пользо- вателями типами переменных в других языках. Скажем, в Visual Basic струк- турированные переменные определяются так: Private Туре МуТуре MyName As String MyAge As String End Type Это определение позволяет создать переменную на основе типа МуТуре с помощью следующего оператора (у переменной customer есть члены customerMyName и customerMyAge): Dim customer As МуТуре Ha VBScript нельзя так работать с пользовательскими переменными. Но на VBScript 5-0 можно определять собственные структурированные перемен- ные с помощью классов. Например, данные о клиенте включают его имя, адрес, телефон и т. д. Чтобы организовать сбор этих данных с помощью сце- нария, можно создать группу переменных для описания клиента: Dim Name, Street, Zipcode, Phone Если у вас есть и поставщики, то для их описания потребуется второй набор переменных (префикс $ свидетельствует о том, что эти данные отно- сятся к описанию поставщика): Dim sName, sStreet, sZlpcode, sPhone А не будет ли намного лучше определить пользовательский тип данных с возможностью более полного описания элементов? В следующем фрагмен- те определяется структура данных с помощью новой конструкции Class-. Class МуТуре Dim Name Dim Street Dim Zipcode
ГЛАВА 4 Введение в VBScript 81 Dim Phone End Class Теперь в сценарии можно создавать экземпляры класса МуТуре и присва- ивать их новой переменной-объекту оператором: Set customer = New МуТуре У переменной-объекта customer полный набор членов класса (Name, Street, Zipcode и Phone). Можно записать оператор, дающий доступ к элементу Phone: customer.Phone = "(555) 803-7892" Это особенно удобно, если вам также нужна переменная для' описания другой сущности (например, поставщика) с теми же категориями данных, что и у клиента. Следующий оператор создает новый экземпляр класса Му- Туре, в котором можно хранить данные о поставщике: Set supplier = new МуТуре Этот оператор использован ниже (листинг 4-9)- Программа создает два экземпляра класса, присваивает членам класса значения и выводит их в диа- логовом окне. '****************************************«*********** ' Файл: ClassSample.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' С помощью классов - новой функции VBScript 5 - ' создаются структурированные переменные, имитирующие ' определенные пользователем типы данных. '*************************************************** Option Explicit Dim customer, supplier ' Определение класса. Class МуТуре Dim Name Dim Street Dim Zipcode Dim Phone End Class ’ Создадим новую переменную для описания клиента. Set customer = new МуТуре ' Присвоим значения. customer.Name = “Jo Brown" customer.Phone = "(555) 203-2466" см. след. cmp.
82 ЧАСТЬ I Основы программирования сценариев ' Создадим новую переменную для описания поставщика. Set supplier = new МуТуре ' Присвоим значения. supplier.Name = "Northwind Traders" supplier.Phone = "(555) 203-3457" WScript.Echo "Custoioer: " & customer.Name & " ” & _ customer.Phone & vbCrLf & _ "Supplier: " & supplier.Name & ” ” & _ supplier.Phone '*** Конец Листинг 4-9. ClassSample.vbs. Пример: расширяем возможности класса Для классов можно определять собственные свойства и методы. В VBScript для этого применяется та же методика, что и в Visual Basic. Она позволяет использовать ключевые слова Public и Private, а также Property. Вот пример, сделанный на основе образца, найденного в документации Microsoft. Класс определяет объект address: Claes addrese Public FiretName, LastName Private strEmailName Property Get EmailName EmailName = etrEmailName End Property Property Let EmailName(strName) StrEmailName BtrName End Property Property Get FullName FullName = FiretName & " " & LastName End Property Sub Add(First, Last) FiretName = First LaetNams = Last End Sub End Class У класса два открытых свойства, FirstName и LastName, доступных для чте- ния и записи. Чтение и запись этих свойств осуществляется без специальных команд. Класс также поддерживает свойство EmailName, доступное для чте- ния и записи, с которым ассоциированы некоторые команды. Свойство FullName доступно только для чтения, так как у него есть лишь оператор
ГЛАВА 4 Введение в VBScript 83 Property Get. Класс также определяет метод Add, который прибавляет имя к объекту. Все функции и подпрограммы класса открыты, если только они не объявлены как закрытые ключевым словом Private. Определив этот класс, можно создавать экземпляры объекта оператором: Set customer = New address Метод Add позволяет добавлять значения к экземпляру объекта: customer.Add "Frank", "Miller" Этот класс создается и используется в следующей программе (листинг 4-10): ***************************************************** ' Файл: ClassSamplel.vbs (Пример для WSH на VBSoript) ' Автор: (с) G. Born ' Использование классов - новой функции VBScript 5 ' (Создан на основе образца, напиоанного Andrew Cllnlck ' из Microsoft) '**************************************************** Option Explicit Dim customer ' Определение класса. Clase address Public FlretName, LaetName Private BtrEmallName Property Get EmallName EmallName = BtrEmallName End Property Property Let EmallName(strName) StrEmailName = etrName End Property Property Get FullName FullName - FlretName & " " & LaetNsms End Property Sub Add(Firet, Last) FlretName Flret LaetName = Last End Sub End Clase ' Создадим новую переменную для описания клиента. Set customer = New address см. след. стр.
84 ЧАСТЬ I Основы программирования сценариев ' Добавим нового клиента. customer.Add "Douglas", "Groncki" Установим адрес электронной почты. customer.EmailName = "dgroncki@microsoft.com" ' Выводим данные о клиенте. WScript.Echo customer.FullName & " " & customer.EmailName '*** Конец Листинг 4-10. ClassSamplel.vbs. Оператор With (только в VBScript 5.0) Для обращения к свойствам или методам объекта обычно используется син- таксис вида объект.свойство или объектметод, требующий явного указа- ния имени объекта в каждом операторе. Это поведение иллюстрирует сле- дующий код (он взят из примера RegExpression.vbs): Set regEx = New RegExp regEx.Pattern = patrn regEx.IgnoreCase = True regEx.Global = True ' Создать регулярное выражение. ' Задать шаблон. ' Задать чувствительность к регистру. ’ Задать глобальный поиск. Созданный экземпляр объекта присваивается переменной-объекту regEx. Хотя в следующих операторах используется только объект RegExp, вам при- ходится повторно набирать имя regEx, а интерпретатору VBScript — снова и снова осуществлять его синтаксический анализ, что неэффективно. Вмес- то этого оператором With можно однажды определить объект, после чего его можно применять в операторах. С учетом этого предшествующий код мож- но переписать: Set regEx = New RegExp With regEx .Pattern = patrn .IgnoreCaee = True .Global = True End With ’ Создать регулярное выражение. ' Задать шаблон. ' Задать чувствительность к регистру. ' Задать глобальный поиск. Теперь обработчик VBScript «знает», что все неквалифицированные ссыл- ки в пределах блока With являются ссылками на свойства и методы объекта regEx. Оператор With позволяет обработчику языка VBScript оптимизировать вызовы объекта, что дает возможность существенно сократить код и упрос- тить его сопровождение. ПРИМЕЧАНИЕ Версии VBScript до 5 0 не поддерживают оператор With, поэтому в большинстве примеров из этой книги он не использу- ется (для сохранения совместимости с WSH 1).
ГЛАВА 4 Введение в VBScript 85 У VBScript 5.0 есть несколько новых возможностей, среди которых ука- затели на функции для связывания процедуры с событиями, вызов объектов на других рабочих станциях и исполнение операторов для вычисления стро- ковых выражений. Эти функции мы используем ниже. Подробнее о допол- нительных возможностях VBScript см. справочник VBScript Language Re- ference и учебник VBScript Tutorial.
ГЛАВА 5 Введение в JScript Эта глава содержит краткое введение в Microsoft JScript. Если раньше вы ра- ботали с JavaScript или Java, то программирование на JScript не покажется вам трудным. В этой главе вы узнаете о структуре программ на JScript, научи- тесь использовать константы, переменные, функции и другие конструкции для программирования на JScript. ПРИМЕЧАНИЕ Подробнее о JScript см. в JScript Language Reference и JScript Tutorial. Одна из версий этих источников находится на прила- гаемом CD в папке \Docs\JScript. Самую последнюю версию этих фай- лов можно загрузить с Web-сайта Microsoft (http://msdn.microsoft.com/ scripting). Что такое JScript? JScript — это реализация спецификации ЕСМА-262, выполненная Microsoft. ЕСМА (European Computer Manufacturers Association) — европейская группа по разработке технологических стандартов в различных областях: от элек- троники до языков сценариев. ECMAScript представляет собой стандартный язык, соответствующий спецификации ЕСМА-262, изначально основанный на Netscape JavaScript 1.1 и JScript 2.0. JavaScript 1.5 также совместим со спе- цификацией ЕСМА-262. JScript — это реализация всех возможностей, опре- деляемых стандартом ЕСМА-262, с дополнительными функциями, обеспе- чивающими более полную поддержку Microsoft Windows, в частности вызов объектов СОМ. ПРИМЕЧАНИЕ Как и VBScript, JScript — интерпретируемый язык-, для исполнения сценария в WSH нужен лишь исходный текст в .js-файле. Как и C++, JScript — объектно-ориентированным язык. Структура программы на JScript Если вы работали с программами на JScript или JavaScript в документах HTML, вы заметите, что программы на JScript для WSH от них отличаются. Во-пер- вых, в программах на JScript для WSH нет тэгов HTML Весь сценарий полнос- тью хранится в .js-файле. Вот типичная программа на JScript (листинг 5-1).
ГЛАВА 5 Введение в JScript 87 Этот файл, как и другие примеры этой главы, находится на прилагаемом CD в папке \WSHDevGuide\ChapterO5. //*»***....................................... Ц Файл: OKCanoel.je (Пример для WSH на JScript) // Автор: (о) G. Born И Сценарий WSH, оседающий диалоговое окно с кнопками ОК и Cancel var mbOKCancel =1; // Объявляем переменные. var mblnformation = 64; var mbCancel = 2; var Text "Test sample": var Title = "Born's Windows Soript Host sample"; var WshShell = WSoript.CreateObject("WSoript.Shell"); var intDoIt » WehShell.Popup(Text, 0, Title, mbOKCancel + mblnformation); if (IntDoIt »» mbCancel) { WScrlpt,OuitO; } WScrlpt.Echo("Sample executed"); //..* Конец Листинг 5-1. OKCanceljs. В отличие от программ на JScript из документов HTML для сценариев WSH не требуется обработка событий. Комментарии Чтобы заставить интерпретатор игнорировать часть строки, можно поме- тить ее как комментарий. В начале комментария на JScript ставятся два пря- мых слэша: И Это комментарий. WScrlpt.OuitO; // Завершить сценарий. Для комментария можно выделить отдельную строку или поместить его после исполнимого оператора (см. вторую строку приведенного выше приме- ра). Встретив знак комментария, интерпретатор игнорирует остаток строки ПРИМЕЧАНИЕ JScript также поддерживает многострочные коммента- рии в формате /"... */. Однако в этой книге я их не использовал.
88 ЧАСТЬ I Основы программирования сценариев Операторы Операторы JScript должны вводится по правилам синтаксиса этого языка, имеющим ряд важных особенностей, отличных от правил синтаксиса VB- Script и других языков. ВАЖНО Ключевые слова, имена функций и переменных в JScript чув- ствительны к регистру, поэтому надо соблюдать ост орожность при на- писании операторов. Так, операторы res = Test(); и res = test(); не экви- валентны. Начинающие программисты часто забывают о чувствитель- ности к регистру и допускают синтаксические ошибки. Считается полезным закрывать операторы точкой с запятой (кроме опе- раторов перед скобкой, закрывающей блок кода, или управляющих опера- торов типа if и do). Чтобы упростить код, можно все операторы завершать точкой с запятой. Вот примеры операторов на JScript: value =10; value = value + 10; Tax = 0.1; Непрерывные строки В отличие от VBScript в JScript нет специальных символов, которые позво- ляют пометить оператор, занимающий несколько строк, поскольку конец оператора обозначается точкой с запятой (см. ниже): WScript.Echo("Hello". "I was here"); Если оператор содержит текстовую строку, то внутри нее не должно быть разрыва строки программы. Разбить текстовую строку на подстроки с пос- ледующей их конкатенацией позволяет знак +. Использование нескольких операторов в одной строке Как вы узнали из главы 4, в программах на VBScript операторы, стоящие в одной строке, разделяют двоеточием. В JScript для этого служат запятая или точка с запятой, как показано ниже на примере последовательности команд, создающей диалоговое окно с числом 35: var х = 15, у = 20; WScript.Echo(x + у); WScript.Echo("Done"); Но я советую избегать таких конструкций ради сохранения прозрачнос- ти и понятности ваших программ. Или вы сразу сможете разобраться, что делают операторы в следующей строке? for (var 1=0; 1 <= 10; 1++, j++)
ГЛАВА 5 Введение в JScript 89 В этой строке я создал цикл для увеличения значения переменной j и разде- лил его операторы запятой. Программа стала бы понятнее, если перенести в тело цикла оператор, увеличивающий значение переменной j. Константы Константы — это числа и строки в составе оператора программы на JScript. Есть несколько способов определения констант на JScript: Result = 15 + 10; Name = "Born"; Pi = 3.14; В первой стоке содержатся константы 15 и 10, которые затем складыва- ются, а результат присваивается переменной Result. Во второй строке пере- менной присваивается значение строковой константы «Вот», а в последней находится константа со значением 3-14- В JScript в отличие от VBScript не применяются предопределенные кон- станты. Чтобы задействовать в сценариях символьные константы (вроде vbOKOnly), объявите их как переменные. Ниже я проиллюстрирую эту мето- дику на примерах, чтобы сделать исходный текст программ понятнее. Переменные В JScript переменные служат для хранения значений в памяти и идентифи- кации их по имени. Прежде всего переменную надо объявить. Объявление может быть неявным (оператором присваивания) или явным (оператором var). Следующий код выполняет неявное определение переменных: Price = 17; Тах = 16; Однако лучше объявить переменные явно оператором var-. var text; // Объявить переменную без присваивания ей значения. var х = 19; Ц Объявить переменную и задать ее значение. var Price = 19; var у = Math.sin(x); var text2 = "Value "; Первый оператор объявляет переменную (но ее значение остается нео- пределенным). В других строках, кроме операторов, объявляющих перемен- ные, есть операторы присваивания, определяющие значение и тип каждой переменной. Область действия переменной Но зачем объявлять переменную оператором var, если для этого достаточ- но указать ее имя в операторе присваивания? Дело в том, что область дей- ствия переменной зависит от способа ее объявления; а от области действия
90 ЧАСТЬ I Основы программирования сценариев зависит доступность переменной в различных областях программы. Прави- ла определения области действия переменных таковы: переменная, объявленная внутри функции оператором var (например, varsumx = 0;), действительна только в пределах этой функции; М у переменной, объявленной внутри функции неявно (напрймер, Vat = 16;), глобальная область действия, т. е. вы можете использовать ее в любом ме- сте сценария; у переменной, объявленной на уровне сценария, глобальная область дей- ствия независимо от того, используется ли при объявлении оператор var. Советую при объявлении переменных внутри функции применять опе- ратор var, так как при этом ее область действия не выйдет за пределы функ- ции. Глобальную переменную или псевдоконстанту можно объявить в заго- ловке сценария оператором var. Это позволяет сделать сценарии понятнее и облегчает работу с ними. Имена переменных При выборе имени для переменной на JScript следуйте таким правилам. JScript чувствителен к регистру. Например, переменные Test и test не эк- вивалентны. Первым символом имени переменной должна быть буква, символ подчер- кивания (_) или знакдоллара ($). Например, имя Testl2 допустимо, a 12Test — нет. Остальные символы имени переменной могут быть буквами, цифрами, символами подчеркивания и знаками доллара. Пробелы и некоторые дру- гие символы (например, символы с диакритическими знаками, знаки +, -и') недопустимы. Так, имя Му пате недопустимо, так как содержит про- бел. Это имя можно записать иначе: Му_пате. Б имени переменной может быть бесконечное число символов. Однако лучше использовать от 8 до 15, чтобы снизить как объем работы по на- бору текста программы, так и возможность опечатки. Давайте переменным значащие имена. Вспомните ли вы спустя полгода, что представляет переменная xl? Такое имя, как temperature, понять на- много легче. Имена переменных не должны совпадать с зарезервированными ключе- выми словами языка JScript. Ниже приводится список зарезервированных слов, дополненный другими ключевыми словами JScript, использования которых в качестве имен переменных также следует избегать: abstract else instanceof switch boolean enum int synchronize break export interface this byte extends long throw case false native throws
ГЛАВА 5 Введение в JScript 91 catch final new transient char finally null true class float package tty const for private typeof continue function protected var debugger goto public void default if return while delete implements short with do import static double in super Если переменная объявлена, но значение ей еще не присвоено, интерпре- татор создаст переменную в памяти, однако ее значение будет установлено как undefined (неопределенное). При использовании неинициализирован- ной переменной в правой части оператора присваивания (см. пример ниже) возникают проблемы: var factor; var Price = 100 * factor; I/ Значение переменной еще не определено. Ц Переменной Price присваивается значение Ц "NaN." Поскольку значение переменной factor все еще не определено, интерпре- татор присваивает переменной Price значение NaN (аббревиатура от «Not а Number»). В результате исполнения второго оператора переменная Price так- же становится неопределенной. При объявлении переменной можно присвоить значение null или любое другое: var factl = null; var note = 3 * factl; II Присвоить специальное значение null. И Будет присвоено значение 0. Перед вызовом переменные надо инициализировать — это хорошая при- вычка. Не делая этого, вы рискуете использовать в своих вычислениях нео- пределенную переменную, как это случилось в приведенном ниже примере: var first_name = "Born"; var laet.name; var aMess = first_name + ” WScript.ЕсЬо(аМевз); И Инициализированная переменная Ц Неинициализированная переменная " + last_name; // Выводит сообщение "Born undefined” При этом также есть риск возникновения ошибок периода выполнения, что и происходит при исполнении этого кода: last_name = // Неявное объявление переменной var aMess = last_name + first_name; // Переменная first_name все еще не // определена При исполнении второй строки возникает ошибка периода выполнения, поскольку переменная first пате остается неопределенной.
92 ЧАСТЬ I Основы программирования сценариев Типы данных В JScript тип данных у переменных не фиксирован.- используется тип данных Variant. Поэтому при объявлении переменной определить тип данных в явном виде нельзя. Данные переменных типа Variant хранятся в соответствующем формате (числовом, строковом, формате даты и т. д.). Интерпретатор JScript выполняет операции над значениями с различными типами данных, приме- няя неявное преобразование типов. Например, выражение «Text» + 99 позво- ляет внедрить число в строку. JScript при этом неявно преобразует число 99 в строку «99» и выполняет конкатенацию двух строк, получая в результате строку «Text99>- Присвоить числовой переменной строковое значение, такое как «99», позволяют функции преобразования типовparselnt иparseFloat. Для присвоения числового значения строковой переменной в следующем фрагменте применяется неявное преобразование типов: var from = 1; var to = 10; var action = "Count from action += from + " to " + to + Этот код присваивает переменной action строковое значение «Countfrom 1 to 10.». Числовые значения при этом преобразуются в строковые. Следующая последовательность команд (взятая из JScript Language Re- ference) присваивает переменной х значение «0110»: var х = 0; х += 1 + "10"; Этот код довольно запутан, даже слишком, чтобы использовать его в про- граммах без риска сделать их малопонятными. Выражение 1 + «10» справа от оператора присваивания выполняет конкатенацию числового значения и строки. Интерпретатор JScript преобразует числовое значение 1 в строку «1» и возвращает в результате строку «110». После этого полученное строко- вое значение присваивается переменной х. Перед оператором присваивания стоит символ +, вынуждающий выполнить сложение нового значения с пре- дыдущим значением переменной х. Переменная х содержит числовое зна- чение 0, присвоенное ей в первой строке кода. Чтобы вычислить сумму х и значения выражения справа от оператора присваивания, текущее значение х преобразуется в строку «О». После этого оператор += выполняет конкате- нацию строк «О» и «110». В итоге получается «0110». Подтипы данных Для определения переменных и констант в JScript используется сравнитель- но немного подтипов данных. Числовые переменные позволяют вставлять такие константы, как 423 или 3-14159, прямо в исходный текст программы. JScript поддерживает как целые числа, так и числа с плавающей точкой. Константы могут быть записаны в различных системах счисления. Если число начинается с сим-
ГЛАВА 5 Введение в JScript 93 волов Ох (буква х, стоящая после О), то оно шестнадцатеричное (т. е. мо- жет состоять из символов от 1 до 9 и букв А, В, С, D, Е и F). Число, начина- ющееся с О (0 без буквы я), — восьмеричное (т. е. состоит только из цифр от О до 7). Десятичные числа представлены цифрами от О до 9. Числа с плавающей точкой могут быть записаны в виде десятичной дроби (дроб- ная часть отделяется точкой), к которой (не обязательно) может быть добавлен символ е или Е, отделяющий показатель степени числа (напри- мер, 1230,10.0Е20 и 20Е-10). Для представления положительных и отри- цательных значений служат символы + и И Булевские переменные содержат константу true или false. В частности, булево значение получается в результате операции сравнения. Строковые переменные определяются путем присвоения им строковых констант типа “This is a test” или ‘1234’- Строки заключаются в одинарные или двойные кавычки. Null Это специальное значение присваивается неинициализированным переменным. Подробнее о типах данных см. JScript Tutorial. Использование Escape-последовательностей в строках Некоторые символы, например, представленные клавишами Backspace и Enter, нельзя ввести прямо в строку. Такие символы, как одинарные и двой- ные кавычки, не будут работать в строках, поскольку они зарезервированы для обозначения начала и конца строк. К счастью, JScript позволяет внедрять подобные символы с помощью специальных комбинаций символов — es- cape-последовательностей (escape sequence) (табл. 5-1). Табл. 5-1. Еасаре-последовательности. Еасаре-последовательность______Значение__________________________ \Ь Пробел \f Подача страницы \n С новой строки \г Возврат каретки \t Табулятор V Символ одинарной кавычки \” Символ двойной кавычки \\ Обратный слеш В качестве escape-символа используется обратный слэш, а следующий за ним символ вставляется в строку. Поэтому, чтобы вставить в строку обрат- ный слэш, следует ввести два обратных слеша подряд (у двойного обратно- го слэша важное значение, например, если в строке содержится определе- ние пути). Строка «C:\name» не является допустимым описанием пути на JScript, так как сочетание символов \п будет интерпретировано как команда
94 ЧАСТЬ I Основы программирования сценариев «с новой строки». Вместо этого нужно записать «С:\\пате*. Отформатировать текст, выводимый в окне сообщения, позволяют символы \п\г (эквивалент vbCrLfm VBScript). Чтобы вставить в строку одинарную или двойную кавыч- ку, следует записать или Следующая строка вызывает ошибку периода выполнения: Text "Не saye: "WSH 18 оооН’"' В ней интерпретатор увидит две строки и константу, которая не разре- шится. Чтобы вставить в строку двойные кавычки, ее надо переписать таю Text "Не says: \"WSH Is oooll\"" Найдя последовательности символов интерпретатор вставит в нужные места двойные кавычки. Операторы В JScript любая часть оператора программы, интерпретируемая как единое значение, является простым выражением. JScript позволяет создавать состав- ные выражения путем комбинирования простых выражений одним или не- сколькими операторами. JScript поддерживает несколько типов операторов: присваивания, сравнения, арифметические, логические, а также операторы инкремента и декремента. Оператор присваивания Раньше мы использовали оператор присваивания (=) при определении пе- ременных. Следующий оператор объявляет переменную и присваивает ей значение 17: var tax = 17; В разделе «Операторы инкремента и декремента» вы узнаете, как комби- нировать оператор присваивания с другими операторами (например, что- бы получить оператор +=). Операторы сравнения Операторы сравнения применяются с оператором if (например, для провер- ки равенства двух значений) и возвращают булевские значения (true или false} (табл. 5-2). Табл. 5-2. Операторы сравнения. Оператор Описание — Равно != Не равно >= Больше или равно <= Меньше или равно
ГЛАВА 5 Введение в JScript 95 Табл. 5-2. (продолжение) Оператор Описание > Меньше Больше Вот пример использования оператора сравнения: If (tax « 17) flao 1; Если значение переменной tax равно 17, переменной flag будет присвоено значение 1. ПРИМЕЧАНИЕ При использовании операторов == и != иногда проис- ходит автоматическое преобразование типов. Подавить автоматичес- кое преобразование типов можно, записав операторы так: === и !==. Арифметические операторы Простейший арифметический оператор — + (мы им уже пользовались). В приведенных ниже фрагментах применяются арифметические операторы +, ?, ‘ и /: var price = 10 + 1; end_price = net * (1-0 + tax); net = price - discount; var rea = 100 / 25; При вычислении значений выражений с несколькими операторами JScript следует общим правилам (операторы * и / имеют приоритет перед + и -). Од- нако скобками можно выделить в составе выражения части, которые будут вычисляться прежде остальных. В JScript имеются следующие арифметичес- кие операторы (табл. 5-3): Табл. 5-3. Арифметические операторы. Оператор Описание Пример + Сложение а = а + Ь - Вычитание а = а ? Ь • Умножение а = а'Ь / Деление а = а / b % Деление по модулю а = а % b Эти операторы можно комбинировать с оператором присваивания = (аналогично тому, как это делается при программировании на языке С). Ска- жем, допустима запись += (это вы еще увидите, познакомившись с приведен- ными ниже примерами). ПРИМЕЧАНИЕ Для конкатенации строк на JScript служит оператор + (например, так: пате = «Gunter» + «Вот»;). В этом JScript отличается от VBScript, где для конкатенации лучше использовать оператор & (хотя
96 ЧАСТЬ I Основы программирования сценариев + там тоже работает). В JScript нет встроенного оператора для возве- дения в степень, подобного оператору А из VBScript. JScript поддержи- вает эту функциональность в методе Math.pow(ocHoeaHue, показатель). Операторы инкремента и декремента Уменьшить или увеличить значение переменной на 1 позволяют операторы инкремента (++) и декремента (—). Вот список этих и других операторов для прироста значений на JScript (табл. 5-4): Табл. 5-4. Операторы инкремента и декремента. Оператор Описание ++i, i++ Увеличивает значение переменной i на 1 —i, i— Уменьшает значение переменной i на 1 += Прирост путем сложения _= Прирост путем вычитания •= Прирост путем умножения /= Прирост путем деления %= Прирост путем деления по модулю Эти операторы практически незнакомы программистам на Паскале и БЕЙСИКе, но их очень любят С-программисты, так как они позволяют сэко- номить время при написании программ. И все же для присваивания и сло- жения значений лучше использовать более знакомые операторы (например: i - i + 7). Эквивалентные команды, сгруппированные по столбцам, приводят- ся ниже. В выражениях из левого столбца используются операторы инкре- мента или декремента, а выражения в правом столбце записаны с помощью стандартных арифметических операторов: а += Ь; а = а + b; а -= Ь; а = а - Ь; а ’= Ь; а = а ’ Ь; а /=Ь; а = а / Ь; а %= Ь; а = а % Ь; а = ++i; 1 = 1+ 1; a = i; а = i++ а = i; i = i + 1; а = —i i = i - 1; a = i; а = i— a = i; i = i - 1; Операторы инкремента и декремента особенно удобны при организации циклов. ПРИМЕЧАНИЕ Положение оператора ++ или — определяет тот мо- мент, когда значение переменной будет уменьшено или увеличено. В выражении а = ++Ь; оператор ++ стоит перед переменной, т. е. зна- чение переменной будет увеличено до того, как будет вычислен оста- ток выражения. При этом сначала увеличивается значение перемен- ной Ь, затем оно присваивается переменной а. В выражении а = Ь++;
ГЛАВА 5 Введение в JScript 97 оператор инкремента стоит после переменной, т. е. значение выраже- ния будет вычислено перед применением оператора инкремента. Во втором примере сначала присваивается значение h переменной а, и лишь затем происходит прирост значения Ь. Логические операторы Иногда необходимо использовать логические операторы (например, при выполнении поразрядных операций). Ниже приведен список логических операторов, поддерживаемых JScript (табл. 5-5). Табл. 5-5. Логические операторы. Оператор Описание && 1 I Логическое И Логическое ИЛИ Логическое НЕ » « »> & 1 Сдвиг разрядов вправо Сдвиг разрядов влево Сдвиг вправо без учета знакового разряда Поразрядное И Поразрядное ИЛИ А Поразрядное НЕ Поразрядное исключающее ИЛИ ПРИМЕЧАНИЕ Обсуждение принципов работы в VBScript операторов поразрядных операций И, ИЛИ и исключающее ИЛИ см. в главе 4- Старшинство операторов Если в выражении несколько операторов и они не заключены в скобки, при их исполнении JScript следует предопределенному порядку. Старшинство операторов (порядок действий) показано ниже в порядке возрастания их приоритета (табл. 5-6). Табл. 5-5. Порядок исполнения операторов в JScript. Оператор Символы Запятая Присваивание Условие Логическое ИЛИ Логическое И Поразрядное ИЛИ Поразрядное исключающее ИЛИ Поразрядное И = += -= *= /= %= «= »= »>= &= л= |= ? ; 1 && 1 & см. след. стр.
98 ЧАСТЬ I Основы программирования сценариев Табл. 5-5. (продолжение) Оператор Символы Равно, не равно == 1====== !== Отношение <<=>>= Поразрядный сдвиг « » »> Сложение, вычитание, конкатенация Умножение, деление •/% Отрицание, прирост !“-++ — Вызов, указание члена 0П- Управляющие структуры Думаю, линейные сценарии вам придется писать довольно редко. Гораздо чаще вы будете иметь дело со сценариями, использующими ветвление наря- ду с управляющими структурами, которые определяют, какая из ветвей под- лежит исполнению. Оператор If Оператор if можно использовать несколькими способами. Например, этот код проверяет условия: if (условие) { операторы, исполняемые в том случае, если условие выполняется } Условие следует заключать в скобки. В нем могут быть упомянутые выше операторы сравнения. Если условие выполняется, исполняются операторы из блока if. Если этот блок состоит только из одного оператора, его можно просто записать в следующей строке, не заключая в фигурные скобки. Бло- ки из нескольких операторов надо заключать в фигурные скобки: if (value <= 16.0) { WScript.Echo("Sorry, you lose the game"); value = 0 } Переменной value будет присвоено значение О, если ее текущее значение меньше или равно 16. Блок операторов заключен в фигурные скобки. Кста- ти, точку с запятой в последнем операторе блока можно и не ставить, так как конец оператора отмечен закрывающей фигурной скобкой. Создать условный переход с двумя ветвями позволяет структура if..else-. if (условие) { операторы, пополняемые в том случае, если условие выполняется
ГЛАВА 5 Введение в JScript 99 ) else { операторы, исполняемые в том случае, если условие не выполняется ) Оператор г/'проверяет условие. Если оно выполняется (в результате про- верки получается true), исполняются операторы из блока, стоящего после оператора if. Если условие не выполняется (в результате проверки получается false), исполняются операторы из блока else-. if (value <= 16.0) { WScrlpt.Eoho("Sorry, you lose the game”); value = 0 ) else { WScrlpt.Echo("Congratulations, you won”); ) СОВЕТ Если после if или else следует только один оператор, скобки можно опустить. Условный оператор JScript поддерживает условный оператор, который присваивает значение в зависимости от условия. Его синтаксис: (Условие) ? значение! : значение2 После заданного в скобках условия ставится знак вопроса. Если условие выполняется, используется значение, стоящее перед двоеточием (значение!). В противном случае используется второе значение. В следующей строке переменной status Оуррх присвоено значение «Adult», если значение age больше или равно 18. В противном случае будет присво- ено значение «Child». status = (age >=18) ? "Adult" : "Child”; Цикл for Цикл/or позволяет заданное число раз исполнить некоторый блок операто- ров. Число проходов цикла определяется счетчиком. Синтаксис цикла for-. for (начальное значение; условие; оператор инкремента) { операторы )
100 ЧАСТЬ I Основы программирования сценариев Вот пример цикла/оп for (var count = 1; count <= 100; count++) { оператор1; оператор2; операторе; При входе программы в цикл переменной count в заголовке цикла при- сваивается начальное значение. Необязательное ключевое слово var объяв- ляет локальную переменную для счетчика, используемого в теле цикла. При каждом проходе цикла значение переменной count увеличивается (операто- ром сомпг++) или уменьшается (оператором count—), что задано третьим ар- гументом цикла. Поскольку оператор ++ стоит после имени переменной, ее значение увеличивается в конце каждого цикла. Условие завершения цикла определяет второй аргумент (count <= 100). Взгляните на использование циклов в сценариях WSH (листинг 5-2). Не удивляйтесь, если программа покажется вам знакомой: ее VBScript-версию вы уже видели (листинг 2-1). И.................................................. // Файл: WSHDemo.jB (Пример для WSH на JScript) // Автор: (с) G. Born И // Выводит сообщения с промежуточными результатами И......................................*........... // Следующие строки служат для активизации или деактивизации И вывода сообщений при трассировке. Удалите знак комментария // перед соответствующей строкой. Ц var DebugFlag = false; // Отключить вывод сообщений при трассировке var DebugFlag = true; // Включить вывод сообщений при трассировке var j = 0; debug("Start:", 0, 0); for (var i = 1; i <= 10; i++) // 10 проходов цикла. { debugC’Step: ", i, j);7 j = j + i; // Сложить все числа. ) debug("End:", i, j); WScript.Echo("Result: ", j); function debug(text, count, val)
ГЛАВА 5 Введение в JScript 101 if (DebugFlag) // Активен ли режим отладки? WScript.Echo(text, count, "Interim result: ", val); } I/*** Конец Листинг 5-2. WSHDemojs. Цикл for...in Цикл fordn позволяет получить доступ к элементам массива или свойствам объекта. Его синтаксис: for (переменная in [объект | массив]) { операторы } После имени объекта-набора или массива на JScript следует ключевое слово in. Цикл for присваивает переменной переменная ссылку на каждый элемент набора или массива. После того, как все элементы будут обработа- ны, цикл завершается. Доступ к перечисляемым элементам Конструкция вида For Each элемент In имя_набора из Microsoft Visual Basic позволяет получить доступ к членам набора. Хотя в JScript есть структура for (ххх inyyy), она не дает доступа к членам набора. Вмес- то нее надо использовать о&немх Enumerator. var fso = WScript. CreateObjectC’Scripting. FileSystemObject”); // Получить набор Folders. var oFolder = fso.GetFolder("Test"); for (var oFiles = new Enumerator(oFolder.Files); loFiles.atEndO; oFiles. moveNextO) // Все файлы { } Переменной-объекту oFiles присваивается экземпляр объекта Enu- merator. Чтобы проверить, не достигнут ли конец набора, применяет- ся метод atEnd. Указатель на следующий член набора перемещается методом moveNext.
102 ЧАСТЬ I Основы программирования сценариев Цикл while Цикл while работает, пока выполняется условие в его заголовке: while (условие) { операторы } Условие в заголовке проверяется при каждом проходе цикла. Если при проверке условия получается true, исполняются операторы из блока {} (если в теле цикла находится лишь один оператор, то, как и в случае цикла for, фигурные скобки можно опустить). Следующий пример иллюстрирует ис- пользование цикла while-. var i = 0; while (i <= 10) // Попытаться исполнить 10 проходов цикла. { WScript.Echo ("Step: ", 1); i++; // Увеличить индекс. } Программа исполняет цикл до тех пор, пока значение индекса не станет равным 11. В каждом цикле выводится сообщение, которое показывает те- кущее значение индекса. Цикл do...while Цикл do...while похож на цикл while. Его можно использовать для повторной обработки блока операторов, которая будет выполняться, пока выполняет- ся заданное условие. Синтаксис цикла do...while таков: do { операторы } while (условие); Проверка условия осуществляется в конце цикла do...while. Это означает, что даже если условие не выполняется, цикл будет исполнен минимум один раз. Если условие в конце цикла выполняется, операторы из блока {} испол- няются снова (если тело цикла состоит из одного оператора, фигурные скоб- ки можно опустить). В следующем фрагменте (созданном на основе примера из JScript Tutorial) этот вид цикла применяется для обработки всех дисков, представленных набором объектов Drives-. function GetDriveListO { // Объявить локальные переменные.
ГЛАВА 5 Введение в JScript 103 var fso, s, sharename, objDrives, drive; И Задействовать объект FileSystemObject. fso = new ActiveXObject("Scripting.FileSystemObject"); // Получить набор Drives. objDrives = new Enumerator(feo.Drivee); s = // Инициализировать переменную для // хранения результата. do // Цикл { drive = objDrivee.item(); // Получить элемент, в = в + drive.DriveLetter; Ц Сохранить букву имени Ц диска в переменной, е += " - "; if (drive.DriveTyре == 3) // Сетевой диск? sharename = drive.ShareName; // Использовать имя И сетевого диска. elee if (drive.IsReady) 11 Локальный жесткий диск? sharename « drive.VolumeName; // Да, попользовать имя // тома. else sharename = "[Drive not ready]"; // Сменный диск? в += sharename + ”\n"; // Добавить отроку. objDrivee.moveNextO; И Перейти к следующему Ц элементу. } while (lobjDrivea.atEndO); И Проверить условие конца // цикла. return(s); Ц Завершить цикл и вернуть результат. } Оператор switch Оператор switch позволяет выбрать для исполнения один из нескольких бло- ков операторов в зависимости от значения выражения. Его синтаксис: ewitoh (выражение) { оаве метка : операторы оазе метка : операторы default : операторы }
104 ЧАСТЬ I Основы программирования сценариев Выражение помещается в начале конструкции. При этом будет выбрана та ветвь case, чей идентификатор (метка) совпадает со значением выраже- ния, и будут исполнены операторы из соответствующего блока. Если значе- ние выражения не совпадает ни с одним идентификатором блока, выполня- ются операторы ветви default. Оператор switch используется в такой последовательности команд: function Test(x) { switch (х) { case 1: case 2: caae 3: default: } } Здесь в качестве выражения используется переменная х. Если х= 1, вы- полняется первая ветвь, case 1:. Если х = 2, обрабатывается следующая ветвь и т. д. Предотвратить переход к исполнению следующей ветви позволяет опе- ратор break (так же, как и на С). Ключевые слова break и continue Для безусловного завершения цикла на JScript служит необязательное клю- чевое слово break (это функциональный аналог оператора Exit из VBScript). Если интерпретатор обнаружит это ключевое слово, текущий цикл завер- шится, а затем исполнится код, идущий за циклом. Ключевое слово continue, помещенное в цикл, имеет противоположный эффект. Если интерпретатор обнаружит это ключевое слово, управление сразу передается в начало цикла. При этом индекс увеличивается или умень- шается, и цикл выполняется повторно. Функции и объекты JScript поддерживает встроенные функции и объекты. Кроме того, JScript позволяет создавать собственные функции. Пользовательские функции С помощью функций исполнение нескольких операций объединяется под одним именем. При корректном завершении функция может вернуть резуль- тат. JScript поддерживает как встроенные, так и пользовательские функции. Синтаксис последних таков:
ГЛАВА 5 Введение в JScript 105 function test(napaMeTpu) { тело с операторами return [возвращаемый результат]; } Объявить функцию можно ключевым спором, function, за которым идет ее имя и список параметров, заключенный в скобки. Операторы, составляющие тело функции, надо заключать в фигурные скобки. Оператор return прекра- щает исполнение функции и (не обязательно) возвращает ее значение. Для вызова функции надо вставить в сценарий ее имя и параметры (в скобках). Чтобы использовать результат функции, нужно поместить вызов в правой части оператора присваивания. Если вызов функции поместить в строку отдельно, без дополнительных операторов, возвращаемый результат будет игнорирован. Следующий оператор вызывает функцию test и присва- ивает возвращаемое ей значение переменной result-. result = test(); Если у функции отсутствуют параметры, при вызове функции оставьте скобки пустыми. Несколько параметров отделяются друг от друга запятыми. Встроенные функции Встроенные функции JScript служат для обработки выражений и специаль- ных символов, а также для преобразования строковых и числовых значений. Функция eval исполняет команды JScript, содержащиеся в строке, пере- данной ей в качестве параметра. Она возвращает полученное в результате значение, например: value ? eval(«14?15»);. ФункцияparseFloat пытается пре- образовать полученную в качестве параметра строку в число с плавающей точкой. Если строковый параметр содержит недопустимый символ (т. е. сим- вол, отличный от +, -, 0—9,., или е), преобразуется лишь фрагмент строки между ее началом и недопустимым символом. Если параметр не является числом, возвращается NaN. Первый параметр функции parselnt — строка. Второй — код основания системы счисления (10 — десятичная, 8 — восьме- ричная, 16 — шестнадцатеричная и т. д.). При вызове с недопустимой стро- кой в качестве параметра эта функция возвращает значение NaN. Функция parselnt всегда возвращает целочисленное значение. ПРИМЕЧАНИЕ Подробнее о встроенных функциях языка JScript см. JScript Language Reference. Объекты Для обработки строк, выполнения математических операций и манипуляций значениями даты и времени JScript поддерживает несколько встроенных объектов. При присваивании переменной или свойству строкового значения применяется объект String [например, пате = new String (“Вот”);], у которо-
106 ЧАСТЬ I Основы программирования сценариев го есть несколько методов, позволяющих манипулировать строками. Мате- матические операторы доступны в виде методов и свойств объекта Math. На- пример, при исполнении оператора value = MathPI переменной value при- сваивается значение свойства PI. Объект Date служит для обработки значе- ний даты и времени. Так, оператор var Name = new Date(parameters); созда- ет новый объект «дата», a today = new DateQ — возвращает текущую дату. На JScript обработка объектов и массивов осуществляется одинаково. Получать доступ к объектам и наборам можно одними и теми же способа- ми. Чтобы получить доступ к методу или свойству объекта, надо использо- вать имя объекта с именем метода или свойства, разделив их точкой. Для вывода текста в окне сообщения служит метод Echo объекта Wscript. WScript.Echo("Hello"); ПРИМЕЧАНИЕ В отличие от VBScript параметры этого метода надо заключать в скобки. Доступ к объекту из набора также можно получить через индекс. Следу- ющие операторы эквивалентны: Res = Object.width; Res = Object[3J; // [3] должно быть эквивалентно индексу "width". Res = Object["width"]; При обращении к числовому индексу можно применять квадратные скоб- ки, однако при использовании значения индекса точку надо опустить Так, при исполнении следующего оператора возникнет синтаксическая ошибка: Res = Object. 3; Если объект содержит другой объект или свойство, схему именования можно расширить: var х4 = toDoToday.shoppinoList[3].substring^, 1); После свойства объекта ставится точка, за которой следует имя объекта ниж- него уровня. Массивы Массивы — это переменные, содержащие набор значений. Для создания и обработки массивов на JScript служит объект Array. var cities = new Array (10); Этот оператор создает переменную cities, в которой содержатся 10 эле- ментов массива с индексами от О до 9. Доступ к элементу можно получить через имя массива и индекс элемента: cities[0] = "Rome"; clties[1] = "New York"; cities[2] = "Detroit";
ГЛАВА 5 Введение в JScript 107 cities[3] = "Manila"; Число в скобках представляет собой значение индекса, который указы- вает элемент массива. Этот код позволяет определить число элементов мас- сива: number = name.length; Следующий оператор объявляет массив и инициализирует все его эле- менты: var cdaya = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"); Этот оператор создает новый массив и присваивает его элементам значения, заданные в скобках. ПРИМЕЧАНИЕ Дополнительные возможности JScript мы обсудим в следующих главах. Доступны для использования различные версии обработчиков языка JScript. В частности, в Microsoft Windows 98 и Internet Explorer 4 входит версия 3 обработчика языка. В составе Internet Explorer 5 имеется версия 5, а в WSH 2 и в Internet Explorer 5.1 используется обработчик версии 5.1.
ЧАСТЬ i i ИНТЕРАКТИВНАЯ РАБОТА СО СЦЕНАРИЯМИ
ГЛАВА 6 Создание простых диалоговых окон на WSH Диалоговые окна применяются в большинстве сценариев на WSH для выво- да результатов и получения информации от пользователя. В этой главе вы познакомитесь с методами создания диалоговых окон в сценариях WSH с помощью языков VBScript и JScript. Использование метода Echo В предыдущих главах мы создавали диалоговые окна на WSH методом Echo, который можно использовать при программировании как на VBScript, так и на JScript. Его синтаксис: WScript.Echo Parameters В WSH работающему сценарию автоматически доступен объект WScript, который поддерживает метод Echo. Вызов Echo можно помещать в операто- ры, скажем, так: WScript.Echo "Hello, world" Этот метод можно вызывать с одним или несколькими параметрами. Па- раметры отделяются друг от друга запятыми: WScript.Echo "Hello,", "world” Параметры позволяют передавать информацию, предназначенную для вывода в диалоговом окне. Тип данных параметров может быть разным. Так, первый параметр может содержать строковое значение, второй — числовое и т. д. Метод Echo осуществляет синтаксический анализ параметров, преоб- разует их значения в строки и выводит результаты в диалоговом окне, при этом автоматически вставляя пробелы между отдельными значениями. ПРИМЕЧАНИЕ В главе 3 сказано, что метод Echo представляет собой вы- зов процедуры, а значит, не возвращает значений. Поэтому в VBScript его параметры при передаче не заключаются в скобки, например: WScriptEcho «Hello, world». В программах на JScript параметры этого метода всегда сле- дует заключать в скобки: WScriptEcho (“Hello, world”);.
ГЛ AB A 6 Создание простых диалоговых окон на WSH 111 Использование метода Echo в программах на VBScript В программе на VBScript (листинг 6-1) простое диалоговое окно выводится методом Echo, который поддерживается объектом WScript (этот пример, как и большинство других примеров этой главы, есть на прилагаемом компакт- диске в папке \WSHDevGuide\ChapterO6). '*****************★****************************** Файл: Echo.vbs (Пример для WSH на VBScript) ’ Автор: (с) G. Born ' Использование метода Echo в программах на VBScript ************************************************* Option Explicit ' Объявить переменные. Dim price, vat, net vat = 16.0 net = 100.0 ’ Вычислить цену. price = net * (1.0 + vat/100.0) ' Вывести результаты. Поскольку объект WScript ’ доступен автоматически, больше ничего делать не надо. WScript.Echo "Price: ”, price, "US $ Tax: ", vat, _ "% ", price - net, " US $" •*** Конец Листинг 6-1. Echo.vbs. Эта программа рассчитывает розничную цену с помощью заданного зна- чения цены нетто и процентной ставки НДС и выводит результаты в диало- говом окне. Цена нетто и ставка НДС представлены переменными net и vat, объявленными оператором Dim в заголовке программы. Этим переменным присваиваются значения. Далее значение окончательной цены, полученное в результате простых вычислений, присваивается переменной price. Метод Echo выводит в диалоговом окне результат. WScript.Echo "Price: ", price, "US $ Tax: ", vat, _ "X ", price - net, ” US $" Параметры метода разделены запятыми. Команда разбита на две строки символом продолжения (_), которым оканчивается первая строка. Вот ре- зультат исполнения этого оператора (рис. 6-1):
112 ЧАСТЬ II Интерактивная работа со сценариями Рис. 6-1. Диалоговое окно, созданное методом Echo. ПРИМЕЧАНИЕ В главе 3 мы уже говорили, что точка разделяет име- на объекта (WScript) и метода (Echo). Эта же нотация используется для разделения имен объекта и свойства. Применение метода Echo в окне командной строки В Microsoft Windows сценарии можно запускать и в окне командной стро- ки. При использовании в качестве сервера сценариев CScript.exe метод Echo посылает всю выводимую информацию в окно командной строки (рис. 6-2). Поскольку CScript.exe является консольным приложением, оно не выводит диалоговых окон. Рис. 6-2. Вывод информации в окне командной строки с помощью метода Echo. Если результаты исполнения сценария нужно записать в файл (например, для протоколирования какого-либо процесса), можно изменить место назна- чения выводимой информацию. Консольные приложения, к которым относит- ся CScriptexe, записывают всю выводимую информацию в устройство stdout, которое по умолчанию посылает ее в окно командной строки. Однако с помо- щью операторов stdout, которые служат для перенаправления вывода (>, » и |), можно направить выводимую информацию в другое место. Так, эта команда перенаправляет выходную информацию метода Echo в текстовый файл: CScript.exe //NoLogo Echo.vbs > logfile.txt Команда выполняет два действия. Переключатель //NoLogo подавляет вы- вод заставки в окне командной строки после запуска сервера сценариев (о переключателях CScriptexe см. главу 1). Оператор перенаправления > logfile.txt вынуждает stdout записывать все данные, выводимые программой с помощью метода Echo, в файл logfile.txt, вместо того чтобы выводить ее в окне командной строки. Чтобы дописать информацию в конец существую- щего файла, надо использовать символы перенаправления вывода ». Вот
ГЛАВА 6 Создание простых диалоговых окон на WSH 113 окно командной строки с командами для перенаправления выводимой сце- нарием информации в текстовый файл (рис. 6-3). Содержимое текстового файла показано в окне Notepad, работающего в фоновом режиме. C:\WSH Deu C:\WSH Deu C:\WSH Deu Guide\Chapter06>CSci*ipt.exe //NoLogo Echo.ubs > logfile.txtg$H Guide\Chapter06>Notepad.exe logfile.txt Guide\Chapter06> ____________________________ Рис. 6-3. Перенаправление выходной информации метода Echo в окне командной строки и просмотр результатов с помощью Notepad. Метод Echo в программах на JScript При программировании на JScript метод Echo — единственный способ вы- вода диалогового окна, не требующий создания дополнительных объектов (так как WSH предоставляет объект WScript автоматически). Выше вы виде- ли диалоговое окно, выводимое методом Echo (рис. 6-1). Взгляните на при- мер использования Echo в программах на JScript (листинг 6-2). Параметры этого метода надо заключать в скобки, а оператор заканчивать точкой с запятой. //****“*......“*.......*.......*................ // Файл: Echo.js (Пример для WSH на JScript) // Автор: (с) G. Богл // // Использование метода Echo в программах на JScript // Объявить переменные. var price; var vat = 16.0; var net = 100.0; // Вычислить цену. price = net * (1.0 + vat/100.0); // Вывести результаты. Поскольку мы используем готовый объект // WScript, нам не нужно создавать его. WScript.Echo("Price: ", price, "US $ Tax: ”, vat, "X ", price - net, " US $"); //*** Конец Листинг 6-2. Echo.Js.
114 ЧАСТЬ II Интерактивная работа со сценариями Это еще один пример применения методов в сценариях. Для вызова ме- тода Echo использован объект WScript, при этом имена объекта и метода раз- делены точкой. Вывод результатов задан параметрами метода Echo, разделен- ными запятыми. Метод Echo автоматически преобразует все числовые зна- чения параметров в строковые. Текст заголовка диалогового окна и текст кнопки, закрывающей окно, создается самим методом (позже вы узнаете, как самостоятельно определить текст заголовка окна). Перевод строки при использовании метода Echo А как заставить метод Echo (или другие методы, о которых речь пойдет поз- же) переносить текст на другую строку? При передаче текста методу Echo среда периода выполнения автоматически выполняет форматирование и перевод строк, а параметры в диалоговом окне разделяются пробелами. Длинные фрагменты текста выводятся в виде нескольких строк, а более ко- роткие — в одной строке. К несчастью, у метода Echo (и у функции MsgBox, которую мы обсудим в следующем разделе) нет параметров, позволяющих явно задавать перевод строки при выводе информации. Но, как можете заметить, в диалоговом окне все же можно использовать перевод строки (рис. 6-4). Так как же задать раз- биение строк в диалоговых окнах? Рис. 6-4. Текст диалогового окна, расположенный в несколько строк. В этом случае решение довольно простое: разместить в тексте коды пе- ревода строки. Однако их реализация на JScript и VBScript различна. Для внедрения в строки специальных управляющих кодов в JScript существуют escape-последовательности. Задать перевод текста на новую строку позволя- ет escape-последовательность «\п». Чтобы расположить информацию, выво- димую методом Echo, в несколько строк, нужно вставить в параметры сим- волы «\п» (полный список escape-последовательностей строк на JScript см. в табл. 5-1). Этот подход использован в следующем операторе для разделения текста на две строки: WScript.Echo("Price: ", price, "US $ \nTax: ", vat, "X ", price - net, " US $"); Escape-строку можно указать и как отдельный параметр: WScript.Echc("Price: ", price, "US "\n", "Tax: ", vat, "X ", price - net, " US $"); VBScript не распознает escape-последовательность «\п». Вместо нее он поддерживает предопределенную именованную константу vbCrLf, содержа-
ГЛАВА 6 Создание простых диалоговых окон на WSH 115 щую символьные коды для перевода текста на новую строку. На VBScript ме- тод Echo с поддержкой перевода строки можно записать так: WScript.Echo "Price: ", price, "US $" & vbCrLf & _ "Tax: ", vat, "X ", price - net, " US $” Символ & задает конкатенацию именованной константы vbCrLf с други- ми подстроками. VbCrLf также можно вставить как отдельный параметр, на- пример так: WScript.Echo "Hello,”, vbCrLf, "world” Применение функции MsgBox в программах на VBScript Создавать в сценариях диалоговые окна методом Echo довольно просто: его нужно вызвать и передать в виде параметров предназначенную для вывода информацию. Однако у метода Echo нет параметров, позволяющих изменять вид диалогового окна. Возможно, вы захотите задать свой текст для заголовка окна, или, например, вставить дополнительные кнопки, кроме кнопки ОК. Если раньше вы работали с Microsoft Visual Basic или Visual Basic for App- lications (VBA), то, вероятно, вам знакома функция MsgBox, позволяющая выводить сообщения в диалоговом окне (JScript ее не поддерживает). Кро- ме того, MsgBox позволяет определять текст заголовка, значок, число кнопок и прочие параметры. К счастью, MsgBox реализована в VBScript, что позво- ляет задействовать в программах на VBScript все ее возможности. ПРИМЕЧАНИЕ Для вывода результатов MsgBox можно использовать как процедуру, а при вызове в виде функции она служит для получе- ния каких-либо значений от диалогового окна. Если вы не собираетесь использовать значения, возвращаемые MsgBox, ее можно вызывать так: MsgBox текст, кнопки, заголовок При этом можно задать следующие параметры. К Текст Обязательный параметр, определяющий текст, который будет по- казан в диалоговом окне. Для перевода выводимого текста на новую стро- ку в параметр можно вставить константу VBScript vbCrLf. М Кнопки Необязательный параметр, определяющий набор кнопок и вид значка диалогового окна. Если его опустить, VBScript покажет в окне единственную кнопку — ОК. Ш Заголовок Необязательный параметр, определяющий текст заголовка диалогового окна. Если он не задан, Windows выводит в заголовке назва- ние приложения.
116 ЧАСТЬ II Интерактивная работа со сценариями ПРИМЕЧАНИЕ Два дополнительных параметра MsgBox — helpfile и context — позволяют включить в диалоговое окно кнопку Help. По- скольку создание справочных файлов выходит за рамки этой книги, я оставлю эти параметры без объяснения (не думаю, что в отсутствие собственных справочных файлов их использование имеет смысл). Некоторые параметры можно не указывать, но задавать значение пара- метра Текст необходимо. Посмотрим, что будет, если опустить необязатель- ные параметры. Вот минимальная программа-пример (листинг 6-3) (соот- ветствующий файл MsgBox.vbs расположен на прилагаемом компакт-диске в папке \WSHDevGuide\ChapterO6) ' Файл: MsgBox.vbs (Пример для WSH на VBScript) ‘ Автор: (с) G. Born ‘ Вывод сообщения с помощью процедуры MsgBox '********«*******«*«************«*«*****«******•* Option Explicit ' Вызов с полным набором параметров. MsgBox "This Is step 1", 0, "WSH sample by G. Born" ' Теперь опустим второй параметр. MsgBox "This Is step 2", , "WSH sample by G. Born" ' А теперь - третий. MsgBox "This Is step 3”, 0 ’*** Конец Листинг 6-3. MsgBox.vbs. Эта программа создает три диалоговых окна. При первом вызове MsgBox заданы все параметры: MsgBox "This Is step 1", 0, “WSH sample by G. Born" Этот оператор создает простое диалоговое окно (первое на рис. 6-5). Первый параметр, «This is step 1», задает сообщение, показанное в окне. Вто- рой параметр установлен в 0, поэтому в этом окне единственная кнопка — ОК. Последний параметр содержит строку «WSH sample by С. Born», которая выводится в заголовке окна. Во втором вызове MsgBox параметр кнопки не задан, его место между дву- мя запятыми оставлено пустым: MsgBox "This is step 2”, , "WSH sample by G. Born" В результате этого вызова создано второе диалоговое окно из показанных (рис. 6-5). Оно во всем идентично первому, кроме текста. Опущен параметр
ГЛАВА 6 Создание простых диалоговых окон на WSH 117 кнопки или установлен в 0 (это его значение по умолчанию) — результат будет один и тот же. 1N»» WSH sample by G Bom Ibe * 1 WSH sample by G Bom Рис. 6-5. Диалоговые окна, созданные с помощью MsgBox. 3 This й VBScppt Если опустить третий параметр, задающий текст заголовка окна, получит- ся третье диалоговое окно (рис. 6-5): MsgBox "This is step 3", О В этом случае в заголовке будет только имя приложения. В WSH 2 обра- ботчик языка VBScript выводит там текст VBScript. ПРИМЕЧАНИЕ Если опустить второй и третий параметры при вызо- ве MsgBox, полученный результат будет напоминать вызов метода Echo, который создает диалоговое окно с кнопкой ОК и текстом заголовка, определяемым значением первого параметра. Echo и MsgBox отлича- ются лишь присутствием параметра, определяющего заголовок. В слу- чае Echo в заголовке диалогового окна будет текст Windows Script Host, поскольку этот метод предоставлен WSH. В заголовке диалогового окна, созданного MsgBox, выводится текст VBScript. Это говорит о том, что поддержку этой процедуры осуществляет обработчик языка. Определение значка и кнопок диалогового окна Для определения значка диалогового окна, числа кнопок и надписей на них служит второй параметр MsgBox. Значения этого параметра предопределе- ны в Windows как именованные константы, поддерживаемые VBScript. Ниже описаны константы MsgBox, определяющие вид значка (табл. 6-1). Табл. 6-1. Константы, определяющие вид значка диалогового окна, создаваемого с помощью MsgBox. Константа* Значок Описание 0 Нет Нет значка (по умолчанию) 16 или vbCritical {рис. стр. 125} Знак «СТОП» 32 или vbQuestion {рис. стр. 125} Знак вопроса 48 или vbExclamation {рис. стр. 125} Восклицательный знак 64 или vblnformation {рис. стр. 125} Информация
118 ЧАСТЬ II Интерактивная работа со сценариями * В первом столбце, кроме значения константы, содержится также числовое значе- ние. Можно использовать любое из них, но константы намного понятнее. Параметр кнопки содержит дополнительную константу, определяющую набор кнопок диалогового окна. Список предопределенных констант, вы- полняющих эту функцию, приводится ниже (табл. 6-2). Чтобы одновремен- но показать в диалоговом окне значок и кнопку(и), следует просто сложить константы из табл. 6-1 и 6-2. Табл. 6-2. Константы, определяющие кнопки диалогового окна, создаваемого с помощью MsgBox. Константа Описание 0 или vbOKOnly 1 или vbOKCancel 2 или vbAbortRetrylgnore 3 или vbYesNoCancel 4 или vbYesNo 5 или vbRetryCancel Кнопка ОК (по умолчанию) Кнопки ОК и Cancel Кнопки Abort, Retry и Ignore Кнопки Yes, No и Cancel Кнопки Yes и No Кнопки Retry и Cancel Этот оператор выводит диалоговое окно со значком «?» и кнопкой ОК: МвдВох "Question", vbOKOnly + vbQueetion, _ "MsgBox demo" Польза именованных констант очевидна: константы vbOKOnly + vbQues- tion ясно говорят о ваших намерениях, тогда как эквивалентная константа 32 довольно загадочна. Пример: выводим разные кнопки Следующая программа (листинг 6-4) создает диалоговые окна для демонст- рации каждой из шести доступной комбинации кнопок (в диалоговом окне на рис. 6-6 лишь три кнопки). Рис. 6-6. Диалоговое окно с тремя кнопками, созданное с помощью MsgBox. Файл: MsgBoxl.vbs (Пример для WSH на VBScript) Автор: (с) С. Born ’ Демонстрация диалоговых окон с кнопками *********** ***************** ************* Option Explicit Dim text
ГЛАВА 6 Создание простых диалоговых окон на WSH 119 text = "WSH sample by G. Born" ’ При каждом вызове MsgBox заданы все три параметра. MsgBox "vbOKOnly " & vbOKOnly, vbOKOnly, text MsgBox "vbOKCancel " & vbOKCancel, vbOKCancel, text MsgBox "vbAbortRetrylgnore " & vbAbortRetrylgnore, vbAbortRetrylgnore, text MsgBox "vbYesNoCancel " & vbYesNoCancel, vbYesNoCancel, text MsgBox ’’vbYesNo " & vbYesNo, vbYesNo, text MsgBox "vbRetryCancel " & vbRetryCancel, vbRetryCancel, text ’»*• Конец Листинг 6-4. MsgBoxl.vbs ПРИМЕЧАНИЕ Текст надписи на кнопках зависит от локализованной версии Windows. В табл. 6-2 даны надписи из версии для США. Установка фокуса на кнопке Чтобы закрыть диалоговое окно, на одной из его кнопок должен быть уста- новлен фокус. По умолчанию фокус переходит к крайней слева кнопке. При нажатии пользователем клавиши Enter кнопка, которая в данный момент была в фокусе, закрывает диалоговое окно. Фокус можно установить не только на кнопке по умолчанию. Так, в диа- логовом окне запроса на удаление файла, в котором есть кнопки ОК и Cancel, вероятно, надо установить фокус на кнопке Cancel, чтобы пользователь не удалил файл, нечаянно нажав Enter. Положение фокуса задается параметром кнопки. Ниже приведен список констант, позволяющих установить фокус на той или иной кнопке (табл. 6-3). Значение константы надо прибавить к сумме констант, определяющих вид значка и набор кнопок. Табл. 6-3. Константы MsgBox, управляющие фокусом кнопок. Константа* Устанавливает фокус на 0 или vbDefaultButtonl первой кнопке (по умолчанию) 25б или vbDefaultButton2 второй кнопке 512 или vbDefaullButton3 третьей кнопке ' Значение 768 (vbDefaultButtonf) устанавливает фокус на четвертой кнопке. Так как в обычных диалоговых окнах четвертая кнопка help отсутствует, я не стал вклю- чать ее в таблицу.
120 ЧАСТЬ II Интерактивная работа со сценариями СОВЕТ MsgBox также поддерживает константу vbSystemModal (ее значе- ние — 4096). Добавив ее к параметру кнопки (например: MsgBox “Hello”, vbOKOnly + vbSystemModal, “Foreground’”), вы вынуждаете Windows сделать это окно модальным. Определение кнопки, которой закрыто диалоговое окно Иногда надо знать, какую кнопку пользователь щелкнул, закрывая диалого- вое окно. Пользователь может закрыть диалоговое окно, щелкнув либо ОК, либо Cancel (рис. 6-7). Справа в диалоговом окне показано, какая из кнопок была использована. Возвращаемое значение функции MsgBox в программе на VBScript позво- ляет определить, какой из кнопок было закрыто диалоговое окно. Чтобы получить это значение, следует вызывать MsgBox так: result = MsgBox(prompt, buttons, title) Рис. 6-7. Диалоговое окно с двумя кнопками и диалоговое окно, показывающее, какую из кнопок щелкнул пользователь. Диалоговое окно слева было создано оператором: result = МвдВох("Please click a button", _ vbQuestion + vbOKCancel, _ "WSH MsgBox sample by G. Born") Значение, возвращенное функцией MsgBox, присвоено переменной. Пос- ле этого можно определить кнопку, которой было закрыто диалоговое окно, проверив значение переменной. Ниже представлен список значений, кото- рые может вернуть MsgBox. Возвращаемое значение зависит от набора кно- пок диалогового окна (табл. 6-4). Табл. 6-4. Коды, которые возвращает MsgBox. Константа Кнопка, которой было закрыто диалоговое окно 1 или vbOK 2 или vbCancel 3 или vbAbort 4 или vbRetry ОК Cancel Abort Retry
ГЛАВА 6 Создание простых диалоговых окон на WSH 121 Табл. 6-4. продолжение Константа Кнопка, которой было закрыто диалоговое окно 5 или vblgnore Ignore 6 или vbYes Yes 7 или vbNo No Можно использовать как числовое, так и символьное выражение констан- ты. Возможность определения нажатой кнопки означает возможность напи- сания программ, позволяющих пользователю выбирать параметры в пери- од выполнения. Следующая программа проверяет, какой кнопкой было зак- рыто второе диалоговое окно (листинг 6-5). Имя этой кнопки выводится в третьем диалоговом окне. Файл: MsgBox2.vbs (Пример для WSH на VBScript) Автор: (с) G. Born ' Проверка значения, возвращаемого MsgBox Option Explicit Dim Textl, Text2, Text3, Text4 Dim Title, result ' Определить текст. Title = "WSH MsgBox sample by G. Born” Textl = "Just a note: Windows Script Host" Text2 = "OK button clicked" Text3 = "Cancel button clicked" Text4 = "Please click a button" ’ Вызвать функцию MsgBox для создания диалогового окна ' с заданным текстом, кнопками и заголовком. Параметры MsgBox: ' текст: текст, который выводится в диалоговом окне ' кнопки: набор кнопок ' заголовок: текст заголовка диалогового окна MsgBox Textl, vblnformation + vbOKOnly, Title ' Проверить, какую кнопку нажал пользователь. ’ результат = МздВох(текст, кнопки, заголовок) result = MsgBox(Text4, vbQuestion + vbOKCancel, Title) ' Анализируем возвращенное значение. If result = vbOK Then WScript.Echo Text2 ' Выводим результат методом Echo. Else см. след. стр.
122 ЧАСТЬ II Интерактивная работа со сценариями WScript.Echo Text3 End If '**♦ Конец Листинг 6-5. MsgBox2.vbs. Сообщения, выводимые в диалоговых окнах, заданы переменными Textl, Text2 и т. д. Во время исполнения сценария выводятся три диалоговых окна. У первого есть только кнопка ОК, у второго — две кнопки, позволяющие зак- рыть это окно. В приведенной программе для проверки кода, который воз- вращает функция MsgBox, используются операторы: ' Анализируем возвращенное значение. If result = vbOK Then WScript.Echo Text2 ' Выводим результат с помощью метода Echo. Else WScript.Echo Texts End If Как только пользователь закроет диалоговое окно, программа проверит значение, возвращенное MsgBox, чтобы определить нажатую кнопку (ОК или Cancel). Если функция вернет vbOK, будет исполнен блок If, и результат будет показан в третьем диалоговом окне (создаваемом методом Echo). WScript.Echo Text2 Использованный в данном операторе метод WScriptEcho выводит в диа- логовом окне значение переменной Text2. Если же функция вернет vbCancel, будет исполнен блок E/se, и в диалоговом окне будет показано значение пе- ременной Texts. Пример: создаем на VBScript приветствие при регистрации в системе Рассмотрим другой пример использования MsgBox. Администратор может определить собственные сообщения-приветствия для машин под управлени- ем Windows 95/98/NT/2000. По умолчанию после регистрации в системе пользователь видит одно и то же сообщение. Мы определим собственную вер- сию диалогового окна, которое будет выводить новое сообщение каждый день в течение недели. Вот сообщения для воскресенья и понедельника (рис. 6-8). Такое диалоговое окно можно реализовать с помощью сценария, состо- ящего лишь из нескольких операторов. Рассмотрим их подробнее. Диалого- вое окно с заданным текстом заголовка выводит процедура MsgBox. Если вы не знаете, как получить имя пользователя, определите его как константу: Const title = "Hello, Jim!" ' Имя пользователя Затем определим две переменных, text и cNotes-.
ГЛАВА 6 Создание простых диалоговых окон на WSH 123 Dim text Dim cNotes Переменной text будет присвоено значение текущей даты. Сообщения на каждый день будут храниться в переменной cNotes. К сожалению, простая пе- ременная может содержать лишь одно значение (например, текстовую стро- ку). Чтобы выводить новые сообщения каждый день в течение недели, нуж- ны 7 отдельных строк, которые нельзя присвоить простой переменной од- новременно. Hello, Jim* !Н| Hello. Jim' ’3. act In M - L*‘’« te we* Рис. 6-8. Приветственные диалоговые окна с сообщениями для воскресенья и понедельника. Вместо нее мы используем массив, содержащий все строки. Массив — это переменная, которая может содержать несколько отдельных значений. На VBScript массив можно объявить так; Dim cNotes(10) Массив cNotes состоит из 11 элементов: cNotes(O), cNotes(l) и т. д. до cNotes(lO). Следующий код присваивает значения каждому из элементов массива: cNotes(O) = "Неу, it’s Sunday. Please take a rest, my friend." cNotesd) = "It’s Monday. Let’s begin the week.” MsgBox cNotes(O) & vbCrLf & cNotes(1) Чтобы заполнить массив таким способом, придется написать уйму опера- торов присваивания. Поскольку нам нужно задать всего 7 строк, по одной на каждый день недели, лучше вызвать функцию VBScript Array, которая позво- ляет определить все элементы массива единственным оператором: eNumber = Array(1, 2, 3, 4) Он присваивает элементам массива cNumber(O), cNumber(l), cNumber(2), and cNumber(3) значения 1, 2, 3, и 4; а заполнить наш массив поможет та- кой оператор: cNotes = Array( "Неу, it’s Sunday. Please take a rest, my friend.”, "It’s Monday. Let’s begin the week.", "Oops, it’s Tuesday. One day of the week is gone.", "Don’t worry, it’s Wednesday.", "Hurray, it’s Thursday.", _ "Thank goodness it’s Friday.", "Saturday! Why don’t you relax this weekend?")
124 ЧАСТЬ II Интерактивная работа со сценариями Переменная cNotes используется в качестве массива, содержащего сооб- щения для каждого дня недели. Следующий оператор выводит сообщения для воскресенья: MsgBox cNotes(O) Теперь нужно выяснить текущую дату и по ней определить день недели. Полученное значение можно использовать как индекс массива cNotes, что- бы получить верное приветствие. Функция VBScript Weekday возвращает код дня недели для заданной даты. Команда Weekday(Now()) возвращает 1 для воскресенья, 2 для понедельника, 3 для вторника и т. д. Заметьте: сообщение для воскресенья содержится в элементе массива cNotes(O). Поэтому для по- лучения из массива cNotes верного сообщения следует применить оператор cNotes(Weekday(Noiv()) - 1). В показанных диалоговых окнах (рис. 6-8) также выводится текущая дата, которую можно получить с помощью функции Now. Поскольку эта функция возвращает дату в заданном формате, другие функции VBScript позволяют извлечь из значения текущей даты число, месяц и год: text = WeekDayName(Weekday(Now()), False, 1) & _ ", " & MonttiName(Month(Now)) & " " & _ Day(Now()) & ", " & _ Year(NowO) День недели позволяет получить функция WeekDayName. Первый пара- метр этой функции — код дня недели. Второй определяет, будет ли возвра- щено полное или сокращенное название дня недели. Если он равен False, функция вернет полное название дня недели. Последний необязательный параметр определяет код дня, с которого начинается неделя. WeekDayName (Weekday(NowО), False, 1) возвращает строку, например Sunday или Monday. MonthName(Month(Now)) работает аналогично. Функция VBScript Month получает значение текущей даты от функции Now (которая передается как параметр). Month извлекает из переданной даты значение месяца, a Month- Name возвращает название месяца. Эти функции языка VBScript позволяют отформатировать дату так, как нужно. Можно опустить год или месяц и от- сортировать дату в зависимости от местного часового пояса. Вот этот пример целиком (листинг 6-6). Подробнее о функциях VBScript см. в справочнике VBScript Language Reference на CD, прилагаемом к книге. ' *i****A«**************************************** ' Файл: Welcome.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Ежедневно выводит новые приветствия ' с помощью MsgBox '*»********************************************** Option Explicit
ГЛАВА 6 Создание простых диалоговых окон на WSH 125 ' Определить константы и переменные. Const title » "Hello, Jimi” ' Имя пользователя Dim text Dim cNotes ' Теперь определим массив для ежедневных сообщений. cNotes = Array ( _ "Неу, it's Sunday. Please take a rest, my friend.", "It's Monday. Let's beoin the week.", _ "Oops, It'в Tuesday. One day of the week is gone.", "Don’t worry, it’s Wednesday.", _ "Hurray, it's Thursday.", _ "Thank goodness it’s Friday.", _ "Saturday! Why don’t you relax this weekend?") ' Определить дату в составе приветственного сообщения. text « WeekDayName(Weekday(Now()), False, 1) & _ ", " & MonthName(Month(Now)) & " " & _ Day(NowO) & ", " & _ Year(NowO) ' Добавить к дате нужное сообщение. text = text & vbCrLf & vbCrLf & cNotes(Weekday(Now()) - 1) ' Вывести сообщение. MsgBox Text, vbOKOnly + vblnformation, title '*** Конец Листинг 6-6. Welcome.vbs. ПРИМЕЧАНИЕ Чтобы увидеть диалоговые окна, которые создает эта программа, скопируйте файл Welcome.vbs в локальную папку жесткого диска. Перетащите значок этого файла в меню Start\Programs\Startup. При каждом старте Windows программы, содержащиеся в папке Startup, запускаются автоматически. Эта программа также запустится, и вы уви- дите приветственное сообщение. Использование метода Popup JScript, к сожалению, не поддерживает функцию MsgBox. Вместо нее можно вызвать метод Popup, поддерживающий WSH (на VBScript этот метод также можно использовать вместо функции MsgBox). Поскольку Popup — это метод, сам по себе он не является частью языка сценариев. Он входит в состав объектной модели WSH и поддерживается объектом WshShell (рис. 6-9)-
126 ЧАСТЬ II Интерактивная работа со сценариями Рис. 6-9. Объекты WScript и WshShell в составе объектной модели WSH. Применять метод Popup для создания пользовательских диалоговых окон, аналогичных тем, что мы создавали раньше функцией MsgBox, позволяет следующий оператор: объект.Popup параметры Но как получить имя объекта, чтобы подставить его в этот оператор? Объект WScript не поддерживает метод Popup, a WSH не предоставляет объект WshShell автоматически. Прежде чем использовать метод Popup, нужно создать экземп- ляр объекта WshShell и получить на него ссылку. Создавать экземпляры объект ов можно по-разному. В сценариях WSH для этого служит метод CreateObject объекта WScript. Параметром CreateObject является ProgID запрошенного объекта. Метод Popup предоставляется объек- том WshShell, который является производным объектом WScript. На JScript ссылка на экземпляр WshShell создается так: var WshShell = WScript.CreateObjectC'WScript.Shell"); Объект WScript поддерживает метод CreateObject с единст венным парамет- ром — ProgID. ProgID объекта WshShell определен как WScriptShell. Метод CreateObject ищет нужный объект в реестре. Если объект уже установлен, его экземпляр загружается в память, и CreateObject возвращает ссылку на него, ко- торая присваивается переменной (в нашем примере это переменная WshShell). Показанный выше оператор создает новый экземпляр объекта и сохра- няет ссылку на него в переменной-объекте. Эта переменная-объект позво- ляет получить доступ к методам и свойствам объекта. А в этом операторе, написанном на JScript, использован метод Popup: var WshShell = WScrlpt.CreateObjectC’WScript.Shell"); var IntDoIt; IntDoIt = WshShell.Popup(Message, 0, Title, vbOKCancel + vblnformation); После создания переменной-объекта WshShell можно выводить диалого- вые окна с методом WshShellPopup, синтаксис вызова которого: res = WshShell.Рорир(текст, таймаут, заголовок, кнопки);
ГЛ А В A 6 Создание простых диалоговых окон на WSH 127 У метода Popup следующие параметры. Текст содержит текст, который должен выводится в диалоговом окне. Аналогичен одноименному параметру функции MsgBox. Его можно сфор- мировать конкатенацией констант, подстрок и переменных. Таймаут определяет значение таймаута диалогового окна. Если пользо- ватель до истечения таймаута не закроет окно щелчком кнопки, сценарий закроет окно автоматически. Если задать значение О, таймаут будет от- ключен, и диалоговое окно должен будет закрыть пользователь. Заголовок задает текст заголовка диалогового окна. Кнопки определяет вид значка и набор кнопок диалогового окна. У это- го параметра те же значения, что и у одноименного параметра функции MsgBox из VBScript (константы, определяющие значки, кнопки и положе- ние фокуса см. в табл. 6-1 — 6-3). После закрытия диалогового окна метод Popup возвращает код кнопки, которой пользователь закрыл окно. ПРИМЕЧАНИЕ У метода CreateObject есть дополнительный параметр, связанный с обработкой событий, его описание здесь не приводится. В языках VBScript и JScript также есть похожие встроенные функции для создания объектов. В следующих главах я подробнее расскажу о методе CreateObject и встроенных функциях для создания объектов. После того как CreateObject создал переменную-объект WshShell, метод WshShellPopup стал доступен для вывода диалоговых окон. Но в JScript не используются предопределенные символьные константы (типа константы vbOKOnly из VBScript), поэтому задавать значки, кнопки и возвращаемые значения придется в виде комбинаций чисел, представленных выше (табл. 6-1 - 6-4): var vbOKCancel = 1; var vbOK = 1; var vblnformation = 64; var vbCancel = 2; Использование этих переменных как «псевдоконстант» делает сценарии на JScript понятнее и упрощает перенос программ между VBScript и JScript. ПРИМЕЧАНИЕ Метод Popup использует те же параметры и возвраща- ет те же значения, что и функция MsgBox, но число параметров и по- рядок их указания различны. Вот пример использования метода Popup в сценариях на JScript (лис- тинг 6-7). /Л***.***.****.**.**..***.*********************** Ц Файл: Popup.js (Пример для WSH на JScript) // Автор: (с) G. Born см. след. стр.
128 ЧАСТЬ II Интерактивная работа со сценариями И И Вывод диалогового окна с помощью метода Popup //************************************************ И Объявить переменные. var vbOKCancel = 1; var vbOK = 1; var vblnformation = 64; var vbCancel = 2; var result; var Message = "Click a button"; var Title = "WSH Popup sample"; 11 Создать переменную-объект WahShell. var WshShell = WScrlpt.CreateObject("WScrlpt.Shell"); result = WshShell.Popup( Message, 0, Title, vbOKCancel + vblnformation); // Вывести диалоговое окно. if (result == vbOK) 11 Проверить и вывести результаты. { WScript.Echo ("OK button clicked " + "(Code: " + result + ")"); ) else { WScript.Echo ("Cancel button clicked " + "(Code: " + result + ")"); ) WScript.Echo("We are ready"); //*** Конец Листинг 6-7. Popupjs. Следующий оператор использует метод Popup для создания диалогового окна: result = WshShell.Popup( Message, 0, Title, vbOKCancel + vblnformation); // Вывести диалоговое окно.
ГЛАВА 6 Создание простых диалоговых окон на WSH 129 Параметр кнопки задан псевдоконстантами vbOKCancel и vblnformation. После закрытия диалогового окна метод Popup возвращает код кнопки, ко- торую щелкнул пользователь. Этот оператор проверяет значение, которое вернул метод Popup-. if (result == vbOK) Если значение переменной result равно vbOK, метод выводит сообщение о том, что пользователь щелкнул кнопку ОК: WScript.Echo("0K button clicked " + "(Code: " + result + Если значение result не равно vbOK, выполняется блок else, и метод Echo вы- водит сообщение о том, что пользователь щелкнул кнопку Cancel. Использование метода Popup в программах на VBScript Большинство программистов на Visual Basic скорее всего будут применять в своих программах функцию MsgBox. Но при желании можно использовать и метод Popup, предоставляемый объектом WshShell (листинг 6-8). Я поста- рался не усложнять код, чтобы подчеркнуть использование метода Popup. ' Файл: Popup.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Создание диалогового окна с помощью метода Popup '*******************************«**************** Option Explicit Dim result Dim WshShell ' Нам нужен объект WshShell . Set WshShell = WScript.CreateObjectC'WScript.Shell") ' Использование метода Popup. result = WshShell.Popup("Click a button", _ 0. “WSH Popup sample", vbOKCancel + vblnformation) WScript.Echo "Return value ", result '*** Конец Листинг 6-8. Popup, vbs.
130 ЧАСТЬ II Интерактивная работа со сценариями Еще один пример использования метода Popup на JScript Рассмотрим другой пример использования метода Popup в программах на JScript. Мы создадим диалоговое окно-приветствие, которое выводит имя пользователя и текущую дату (рис. 6-10). Рис. 6-10. Окно-приветствие с текущей датой. Метод Popup позволяет определить текст заголовка и установить тайма- ут в 10 секунд, чтобы по прошествии этого времени окно закрылось без уча- стия пользователя. В следующих строках определяются псевдоконстанты, содержащие зна- чения параметра кнопки метода Popup-. var vbOKOnly = 0; // Кнопка OK var vblnformation = 64; // Значок Массив на JScript можно определить оператором: var cmonth = new Ar ray ("January", "February", "March", "April", "May", "June", "July”, "August", "September", "October", "November", "December"); Переменная cmonth является объектом, содержащим данные массива. Ключевое слово new Array создает массив и присваивает новой переменной- объекту cmonth указанные в скобках значения. Позже можно получить дос- туп к элементам массива с помощью индекса: WScrlpt.Echo(cmonth[0]); Следующие команды с помощью функций JScript получают значение даты и разбивают его на число, месяц и год: var mydate = new Date(); var weekday = mydate.getDayO; var day = mydate.getDateO; var month = mydate. getMonthO; var year = mydate.getYearO; // Создать переменную для даты. 11 Получить день недели. Ц Число // Месяц (индексация начинается с 0) И Год Переменная-объект для хранения даты создается в первой строке опера- тором пеги. lAe.TOj\Date возвращает ссылку на объект Date, которая присваи- вается переменной mydate. Следующая строка создает сообщение, которое выводится в диалоговом окне: var text = "Today is ” + cday[weekday] + ", " + cmonth[month] + " " + day + ", " + year + ”\n" + "Windows has been launched";
ГЛАВА 6 Создание простых диалоговых окон на WSH 131 Значения переменных weekday и month используются в качестве индек- са массивов. В результате с помощью конкатенации названий дня недели и месяца получается строка, присваиваемая переменной text. Эта строка выво- дится в виде сообщения в диалоговом окне: objAdr.Popup(text, 10, title, vbOKOnly + vblnformation); Если пользователь не закрывает диалоговое окно в течение 10 секунд, метод Popup закроет окно автоматически. Остальные подробности приво- дятся ниже (листинг 6-9). Подробнее о всех функциях JScript см. справочник JScript Language Reference на прилагаемом компакт-диске. Ц Файл: Welcome.js (Пример для WSH на JScript) И Автор: (с) G. Born И // Создание с помощью метода Popup окна-приветствия, И которое также содержит текущую дату И Определить "псевдоконстанты" для метода Popup. var vbOKOnly = 0; 11 Кнопка OK var vblnformation = 64; // Значок «Информация» И Создать массив переменных со строками сообщений. var cmonth = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"); var cday = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"); var name = "Born"; // Задать имя пользователя, var firetname = "G."; II Создать приветствие. var title = "Welcome, ” + firstname + " " + name; // Создать объект для использования метода Popup. var objAdr = WScript.CreateObject("WScript.Shell"); var mydate = new Date(); // Создать переменную для даты. var weekday = mydate. getDayO; // Получить день недели. var day = mydate.getDateO; // Число var month = mydate.getMonthO; // Месяц (индексация начинается // о 0) var year = mydate.getYear(); Ц Год см. след. стр.
132 ЧАСТЬ II Интерактивная работа со сценариями var text = "Today is " + cday[weekday] + ", " + cmonth[month] + " " + day + ", " + year + "\n" + “Windows has been launched"; // Создать диалоговое окно с помощью метода Popup; задать 10-секундный таймаут. objAdr.Popup(text, 10, title, vbOKOnly + vblnformation); //*** Конец Листинг 6-9. Welcome.js. ПРИМЕЧАНИЕ Чтобы запустить программу Welcome.js, скопируйте файл Welcome.vbs в папку Startup, следуя инструкциям, которые даны выше.
ГЛАВА 7 Работа с объектами WSH В главе 6 мы познакомились с основами программирования сценариев и изучили несколько программ, использующих объекты, методы и свойства. В этой главе мы обсудим способы автоматизации решения некоторых задач с помощью WSH. Вы научитесь читать свойства объекта WScript и выводить их в диалоговом окне, чтобы получить важную информацию от WSH и те- кущего сценария или обращаться к переменным окружения ОС. Вы также узнаете, как обращаться к аргументам сценария WSH и создавать объекты методами CreateObject и GetObject. В завершение вы научитесь запускать в сценариях внешние приложения методом Run. Использование объекта WScript WScript — это объект «приложение WSH». Он автоматически доступен во вре- мя работы сценария, поэтому ссылку для него создавать не надо. Объект поддерживает несколько свойств и методов. Раньше мы использовали его методы Echo и Quit. В этой главе мы рассмотрим получение доступа к свой- ствам этого объекта. Получение свойств WSH и сценария В главе 6 говорится, что определенные атрибуты WSH и сценария, работа- ющего в данный момент, доступны в виде неизменяемых свойств объекта WScript. При исполнении сценария в окне командной строки Windows с по- мощью CScript.exe сервер сценариев выводит в командной строке номер текущей версии. Это довольно важная информация, поскольку существуют различные версии WSH. Такие свойства, как путь к программе-серверу и ее имя также могут быть полезны. Ниже описаны свойства, поддерживаемые объектом Wscript (табл. 7-1). Табл. 7-1. Свойства объекта WScrlpt. Свойство_____Описание_____________________________________________ Application Возвращает интерфейс IDispatch объекта WScript. Arguments Возвращает объект-набор, содержащий аргументы сценария. FullName Содержит полный путь к серверу сценариев (CScript.exe или WScript.exe). см. след. стр.
134 ЧАСТЬ II Интерактивная работа со сценариями Табл.7-1. (продолжение') Свойство________Описание_______________________________________________________ Name «Дружественное» имя WScript (свойство по умолчанию). Path Имя каталога, в котором расположен сервер сценариев (CScript.exe или WScript.exe). ScriptFullName Полный путь к сценарию WSH, работающему в данный момент. ScriptName Имя файла сценария WSH, работающего в данный момент. Version Строка с номером версии WSH (не совпадает с номером версии об- работчика языка). ПРИМЕЧАНИЕ Подробнее о свойствах WScript см. справочник Win- dows Script Host Reference на прилагаемом компакт-диске (в папке \Docs\WSH) или обратитесь по адресу, http://msdn.microsoft.com/scriptmg. А теперь напишем сценарий, который получает свойства сервера и сце- нария и выводит их в диалоговом окне (рис. 7-1). Рис. 7-1. Свойства host и script объекта WScript. Получить свойства объекта WScript легко. Во время исполнения WSH ав- томатически предоставляет сценарию объект WScript. Следующий оператор считывает из объекта WScript свойство Application и присваивает его значе- ние переменной Name-. Name = WScript.Application Если сценарий работает в WSH, переменная будет содержать текст Windows Scripting Host (в случае WSH 1) или Windows Script Host (в случае WSH 2). Это свойство позволяет проверить, работает ли сценарий в среде WSH или, на- пример в Microsoft Internet Explorer как внешний сценарий ASP (Active Server Pages). ПРИМЕЧАНИЕ Свойства WSH позволяют получить имя сценария или путь к его файлу. Подробнее о свойствах WScript см. справочник Windows Script Host Reference.
ГЛАВА 7 Работа с объектами WSH 135 Получение свойств в программах на VBScript Ниже показана программа на VBScript, которая получает свойства объекта WScript (листинг 7-1). Для этого нужно указать лишь имена объекта (WScript) и свойства, разделенные точкой. Получить имя сервера и присвоить его пе- ременной позволяет оператор: text = WScript.Name В следующем примере переменная Message служит для сбора значений всех свойств в одной строке. При выводе константа I’bCrLf разбивает инфор- мацию на строки. В заголовке диалогового окна выводится имя сценария. Для этого в программе использовано свойство ScriptName. Как и другие при- меры этой главы, файл Properties.vbs находится на прилагаемом компакт- диске в папке \WSHDevGuide\ChapterO7. Файл: Properties.vbs (Пример для WSH на VBScript) Автор: (с) G. Born ' Вывод свойств объекта WScript ' в диалоговом окне ’****************************** Option Explicit Dim Message Dim Title ' Показать свойства объекта WScript. ' Начнем co свойств сервера. Message = "WScript host properties" & vbCrLf & vbCrLf Message = Message & "Application: " & WScript.Application & vbCrLf Message = Message & “Name: " & WScript.Name & vbCrLf Message = Message & "Version: " & WScript.Version & vbCrLf Message = Message & "FullName: " & WScript.FullName & vbCrLf Meesage = Message & "Path: ” & WScript.Path & vbCrLf ’ Определяем интерактивность. If (WScript.Interactive) Then Message = Message & "Interactive: True" & vbCrLf Else Message = Message & "Interactive: False" & vbCrLf End If ' Получить свойства сценария. Message = Message & vbCrLf Meesage = Message & "WScript script properties" & vbCrLf & vbCrLf Message = Meseage & "ScriptFullName: " & WScript.ScriptFullName & vbCrLf см. след. стр.
136 ЧАСТЬ II Интерактивная работа со сценариями Message = Message & "ScriptName: " & WScrlpt.ScriptName & vbCrLf ' Инициализировать заголовок окна. Title = "WSH sample " & WScrlpt.ScriptName & " - by G. Born" MsgBox Message, vblnformation + vbOKOnly, Title '»*« Конец Листинг 7-1. Properties.vbs. Получение свойств в программах на JScript Чтобы получить доступ к свойствам объекта WScript в программах на языке JScript, надо указать имена объекта и свойства, разделенные точкой (лис- тинг 7-2). Информация аккумулируется в переменной Message. Выводимый текст разбит на строки с помощью escape-последовательности «\п». //.»»»«»»....................................... // Файл: Properties.js (Пример для WSH на JScript) Ц Автор: (с) G. Born И И Вывод свойств объекта WScrlpt И в диалоговом окне у/*....*******....**********************»********.* var Measage, Title, tmp: var vblnformation = 64; // Пара нужных констант var vbOKOnly = 0; // Получить свойства объекта WScrlpt. И Прочитать свойства сервера. Message = "WScrlpt host properties\n\n"; Message = Message + "Application: " + WScrlpt.Application + "\n"; Message = Message + "Name: " + WScrlpt.Name + ”\n"; Message = Message + "Veraion: " + WScrlpt.Version + "\n"; Message = Mesaage + "FullName: " + WScrlpt.FullName + "\n"; Message = Message + "Path: " + WScrlpt.Path + "\n"; // Определяем интерактивность. if (WScrlpt.Interactive) Message = Message + "Interactive: true" + "\n" else Message = Message + "Interactive: false" + ”\n"; // Получить свойства сценария. Message = Message + "\n"; Message = Message + "WScrlpt script properties\n\n"; Message = Message + "ScriptFullName: " + WScrlpt.ScriptFullName + "\n”; Measage = Message + "ScriptName: " + WScrlpt.ScriptName + “\n";
ГЛ А В A 7 Работа с объектами WSH 137 // Инициализировать заголовок окна. Title = "WSH sample ” + WScript.ScriptName + ” - by G. Born"; var objAdr = WScript.CreateObjectC'WScript.Shell"); tmp = objAdr.Popup(Message, vblnformation + vbOKOnly, Title); //*** Конец Листинг 7-2. Properties.js. Получение свойств обработчика языка Помимо свойств сервера и сценария, могут потребоваться также свойства обработчика языка. Так, может понадобиться номер версии интерпретато- ра. Как в VBScript, так и в JScript есть функции, позволяющие проверить но- мер версии обработчика языка: ScriptEngine возвращает строку, идентифицирующую язык, поддержива- емый обработчиком; ScriptEngineMajorVersion в виде строки возвращает старший номер вер- сии обработчика языка; ScriptEngineMinorVerslon возвращает в виде строки младший номер версии обработчика языка; ScriptEngineBuildVerston возвращает номер сборки обработчика языка. Получение свойств обработчика языка в программах на VBScript Следующая программа на VBScript (листинг 7-3) запрашивает свойства об- работчика языка и выводит результаты в диалоговом окне (рис. 7-2). ************************************************ Файл: Engine.vbs (Пример для WSH на VBScript) Автор: (с) G. Born ' Вывод номера версии обработчика языка Option Explicit Dim txt ' Получить версию обработчика языка. txt = "language Engine: " & ScriptEngineO & vbCrLf txt = txt & “Version: " & ScriptEngineMajorVersionO txt = txt & "." + CStr(ScriptEngineMinorVersion()) & vbCrLf txt = txt & "Build: " + CStr(ScriptEngineBuildVersionO) см. след. стр.
138 ЧАСТЬ II Интерактивная работа со сценариями WSoript.Echo txt '*** Конец Листинг 7-3. Engine.vbs. Рис. 7-2. Свойства обработчика языка из объекта WScript. Получение свойств обработчика языка в программах на JScript Ниже показана программа на JScript, которая также получает свойства обра- ботчика языка (листинг 7-4). уу.***.*.***********.********.***.**************** // Файл: Engine.Js (Пример для WSH на JScript) // Автор: (с) G. Born // // Вывод версии обработчика языка //♦.............................................. var txt = "Language Engine: “ + ScriptEngineO + "\n" + "Version: " + ScriptEngineMajorVersionO + + ScriptEngineMinorVersionO + "\n" + "Build: ” + ScriptEngineBuildVersionO; WScript.Echo(txt); I/*** Конец Листинг 7-4. Enginejs. Обращение к аргументам сценария В главе 1 приводится разъяснение методов, позволяющих передавать сцена- рию аргументы, например, имена файлов или переключатели (см. раздел «Передача аргументов сценарию»), К этим аргументам можно обращаться и в сценарии. Пример сценария, который выводит переданные ему аргумен- ты, приведен без объяснения в главе 1. Давайте разберем его подробнее. Для обработки аргументов сценария служит объект WshArguments. Вот его свойства (табл. 7-2): Табл. 7-2. Свойства объекта WshArguments. Свойство Описание Count Возвращает число аргументов командной строки.
ГЛАВА 7 Работа с объектами WSH 139 Табл. 7-2. продолжение Свойство Описание Item Свойство по умолчанию, определяющее n-й аргумент командной строки, вызывающей сценарий. Length Возвращает число аргументов, используется для совместимости с JScript. Как получить доступ к этим свойствам? Увы, объект WshArguments недо- ступен непосредственно, поэтому для доступа к аргументам сценария при- дется задействовать свойство Arguments объекта WScript. Что же нужно для этого в программах на VBScript? Следующий оператор присваивает значение свойства Arguments объекта WScript переменной objArgs-. Set objArgs = WScrlpt.Arguments Необходимо указать ключевое слово Set, поскольку свойство представляет собой объект-набор, а переменная objArgs должна быть переменой-объектом. Переменная objArgs позволяет обращаться к объектам из этого набора и их свойствам. Следующий оператор обращается к первому объекту набора: Arg1 = obj Args(O) В этом случае переменной Argl будет присвоено значение свойства по умолчанию первого элемента набора — объекта objArgs(O). Кстати, до сих пор значение свойства всегда считывалось с помощью имен объекта и свой- ства, разделенных точкой (например: WScriptN'ame). Записанный выше опе- ратор отходит от этой схемы. Дело в том, что строки аргументов содержат- ся в свойстве Item объекта WshArguments, a Item — свойство этого объекта по умолчанию. Поэтому указанный оператор эквивалентен такому: Arg1 = objArgs. Item(O) Оба оператора возвращают переменной Argl аргумент сценария, хранящий- ся в виде строки в свойстве Item. Но как узнать число переданных аргументов, хранящихся в наборе? Если аргументы работающего сценария не заданы, набор свойства Arguments пуст, а при любой попытке обратиться к переменной-объекту objArgs(O) возникает ошибка периода выполнения. В соответствии с приведенными данными (табл. 7-2) объект WshArguments, доступный через свойство Arguments, также поддерживает свойство Count. Оно позволяет проверить число элементов на- бора, равное числу аргументов сценария. Вот как можно обратиться к пер- вому аргументу сценария: If objArgs.Count >= 1 Then ' Есть ли у сценария хоть один аргумент?? Argl = objArgs.Item(O) End If Но если аргументов, к которым нужно обратиться, больше двух, этот под- ход становится весьма трудоемким. Вместо этого для обработки всех аргу-
140 ЧАСТЬ II Интерактивная работа со сценариями ментов сценария надо использовать цикл. Следующий VBScript-код собира- ет значения всех аргументов в текстовой переменной: For i = 0 То objArgs.Count - 1 ' Цикл для обработки всех аргументов. text = text & objArge(i) & vbCrLf ‘ Получить аргумент. Next С помощью objArgs.Count получаем число элементов набора. Затем обра- батываем все элементы в простом цикле For. К элементу позволяет обращать- ся objArgs(i), так как objArgsltem(i) является свойством по умолчанию. Обращение к аргументам в программах на VBScript: Решение 1 Описанный подход используется в следующей программе (листинг 7-5). Если сценарию переданы какие-либо аргументы, их построчный список выводится в диалоговом окне (рис. 7-3). Этот сценарий получает число элементов набо- ра WshArguments, а затем обрабатывает каждый элемент простым циклом For. Рис. 7-3. Вывод аргументов сценария. Файл: Args.vbs (Пример для WSH на VBScript) Автор: (с) G. Born Вывод аргументов сценария в диалоговом окне Option Explicit Dim text, objArgs, i text = "Arguments" & vbCrLf & vbCrLf Set objArgs = WScript.Arguments ’ Создать объект. For i = 0 To objArgs.Count - 1 ‘ Обработать все аргументы в цикле, text = text & objArgs(i) & vbCrLf ' Получить аргумент. Next WScript.Echo text ' Показать аргументы. '*** Конец Листинг 7-5. Args.vbs.
ГЛАВА 7 Работа с объектами WSH 141 Можно передавать аргументы сценарию через ярлык в диалоговом окне Run или в окне командной строки (см. главу 1). В WSH 2 можно перетащить на значок файла сценария один или несколько файлов, и они станут аргу- ментами сценария. ПРИМЕЧАНИЕ Ярлык Args_vbs.lnk определяет командную строку для вызова сценария с заданными аргументами. Скопировав файлы Args.vbs и Args_vbs.lnk в локальную папку, установите соответствующие пути и в ярлыке. Обращение к аргументам в программах на VBScript: Решение 2 Для перечисления всех элементов набора (или массива) в программах на VBScript можно использовать цикл For Each.Jn, в котором обрабатывается каждый элемент: For Each 1 In WScript.Argumente ' Обработать все элементы в цикле. text = text & 1 & vbCrLf ’ Получить аргумент. Next Оператор For Each i In WScript-Arguments обрабатывает все элементы на- бора. Текущий элемент содержится в индексе цикла i. Поэтому прочитать аргументы сценария можно, используя значение переменной-объекта i по умолчанию. Этот код присваивает значение аргумента переменной Argl-. Arg1 = 1 Вот пример использования цикла For Each. Jn для обращения к аргумен- там в программах на VBScript (листинг 7-6): ************************************************* ' Файл: ArgBl.vbB (Пример для WSH на VBScript) ’ Автор: (с) G. Born ' Вывод аргументов сценария в диалоговом окне ************************************************* Option Explicit Dim text, objArgs, i text = "Arguments" & vbCrLf & vbCrLf Set objArgs = WSoript.Argumente ’ Создать объект. For Each i In objArge ' Обработать все аргументы в цикле, text = text A i & vbCrLf ’ Получить аргумент. Next WScript.Echo text ' Показать аргументы. •*** Конец Листинг 7-6. Argsl.vbs.
142 ЧАСТЬ II Интерактивная работа со сценариями ПРИМЕЧАНИЕ Ярлык Argsl_vbs.lnk вызывает сценарий с заданными аргументами. Обращение к аргументам в JScript-программах Свойство WScript-Arguments позволяет обращаться к аргументам в JScript-npo- граммах, но такой код несколько отличается от рассмотренных. Чтобы об- ратиться к свойству Arguments, не обязательно указывать ключевое слово Set. JScript автоматически создает нужный подтип данных для запрошенного значения. Поэтому получить набор WshArguments позволяет оператор: var objArgs = WScript.Arguments; // Создать объект. Он создает переменную и присваивает ей ссылку на объект. После этого можно обращаться к элементам: for (var 1=0; 1 < objArgs.length; 1++) // Обработать все элементы в цикле. text = text + objArgs(i) + ’\n’; // Получить аргумент. Этот код присваивает переменной text значение текущего элемента, со- держащегося в его свойстве Item объекта WshArguments (свойство этого объек- та по умолчанию). Заметьте: для определения числа элементов набора в сце- нариях на JScript вместо Count применяется свойство Length. Оно поддержи- вается для совместимости с JScript, поскольку при использовании Count в программах на JScript возникает ошибка периода выполнения. Ниже приведен сценарий полностью (листинг 7-7). Если исполнить его с заданными аргументами, появится диалоговое окно, аналогичное показан- ному выше (рис. 7-3). // Файл: Args.js (Пример для WSH на JScript) // Автор: (о) G. Born // И Вывод аргументов сценария в диалоговом окне //****......*................*................*..... var objArgs; var text = ”Arguments\n\n"; var objArgB = WScript.Arguments; // Создать объект. for (var i=0; i < objArgs.Length; i++) // Обработать все аргументы в цикле . text = text + objArgs(i) + '\n'; // Получить аргумент. WSoript.Eoho(text); // Показать аргумент. //••* Конец Листинг 7-7. Argsjs.
ГЛАВА 7 Работа с объектами WSH 143 ПРИМЕЧАНИЕ Ярлык Args Js.lnk вызывает сценарий с заданными ар- гументами. Обращение к переменным окружения ОС Windows 95/98/NT 4/2000 хранят некоторые сведения о системе в пе- ременных окружения. Переменная окружения содержит строковое значение. Команда Set позволяет выводить в окне командной строки переменные ок- ружения и их значения. Ниже показано окно командной строки с переменными окружения на машине с Windows 2000 (рис. 7-4). Изучая переменные среды на машинах с Windows 95/98, можно заметить, что они отличаются от переменных окру- жения Windows 2000. Windows 95/98 унаследовали свои переменные окру- жения от MS-DOS, поэтому переменных немного (например, PATH, PROMPT и WINDIR). Command Piompi х.ЖЖ Microsoft Windows 2000 (Version ‘5.00.21951 <C> Copyright 1985-1.999 Microsoft Corp. ♦ILl.USEHSPROFI LE “C:\Documents and Sett ing:;XAll Users rtPPDATA^C:xDocuments and SettingsxAdministratorxflpplication Data BLASTER-Й24И 12 D3 T4 ComnooPrograriFi ler.--C:\Program FilesXCommon Files COMPIJ TERNA MF -MflBCYl ComSper. C:\W1 NNTXsystcm32\emd.exe H0MEDR1UE C: HOMII’ATH-x LOGONSEROEH XXMRRCY1 HUMBER OF.PROCESSORS-1 OS Windows NT O:2LibPatb C:\WINHT\sVstem32\<is2\dll; Path C:\Wl NNT\-..-ystem32;C:\UINNT;C:\WlNNT\Sy:;tem32\Uhcm iPATHFXT~.COM; .EXE; .RAT; -CMI>; .VBS; .UDE;. JS;. JSE;-WSP; .WSH PROCESSOR ARCH 1TECTIIRE x«fe PROCESSOR IDENTIFIER xRG Family 6 Model 5 Stepping 3, Genuine Intel PROCESSOR LEVEL 6 PROCESSOR REVISION 0503 IProgramFi lei; - C:\Prograii» Files PROMPT 5P$G SMS. LOCAL DIR C:\WINNT Sgstembr iv«: • C- SystemRoot C:\WINNT 1 IMP C:xDOCOMF“lxflDM[NI,-’lxLOCALS~lxTen>p 1 M |> G : XDOCI1 MF1X A DM 1N1 ~1 X LOCO LS 1X T e n»» IISI RDOHA1N MARCY 1 IISI RNflMI- Admin i st rat or IIKI RPROFI LJ' C:\Doc orient:: and Setf ing.-iXAdl'tin i*.Л !*<>! ЛГ windir C:xWINNI i Рис. 7-4. Переменные окружения в Windows 2000. В Windows NT/2000 больше переменных окружения, чем в Windows 95/ 98. В Windows NT/2000 переменных окружения позволяют получить имя ОС, число процессоров, название платформы и т. д. Обращение к переменным окружения в сценарии Одно из назначений переменных окружения в том, что они сообщают сце- нарию, на какой платформе (Intel или Alpha) он работает. Также можно оп- ределить, какая ОС используется (Windows 98 или Windows 2000). Но при этом надо соблюдать осторожность, поскольку, как сказано выше, перемен- ные среды в Windows 2000 отличаются от таковых в Windows 95/98. Как обратиться к переменной окружения в сценарии? В конкретной си- стеме — с помощью свойства Environment объекта WshShell, которое возвра-
144 ЧАСТЬ II Интерактивная работа со сценариями щает объект-набор WshEnvironment. Согласно справочнику Windows Script Host Reference синтаксис свойства Environment таков: объект.Environment([etrType]) Индекс strType задает категорию переменной окружения. В Windows NT/ 2000 переменные окружения организованы по внутренним категориям: System, User, Volatile и Process. Поэтому в качестве индекса применяются строки «System», «User», «Volatile» или «Process». Для Windows 95/98 этот метод поддерживает только категорию «Process». Если индекс не указан, в Windows NT/2000 этот метод получает переменные окружения из категории System. В Windows 95/98 он получает переменные из категории Process, так как под- держивается только эта категория. Некоторые переменные окружения описаны ниже (табл. 7-3)- Следующие операторы позволяют обратиться к свойству Environment-. Set WshShell = CreateObject("WSoript.Shell") Set objEnv = WshShell.Envlroment("Process”) В первой строке создается ссылка на объект WshShell и присваивается переменной-объекту WshShell. С помощью этой переменной-объекта в сле- дующей строке производится обращение к свойству Environment, категория переменной окружения задана параметром оператора. Environment возвра- щает объект-набор, поэтому результат должен быть присвоен переменной- объекту по ключевому слову Set (в элементах набора содержатся значения переменных окружения из заданной категории). Команда в следующей строке получает значение конкретной переменной окружения: Text = objEnvC'PATH") Для исполнения этого оператора значением objEnv должен быть набор, полученный из свойства Environment, а значением индекса — имя перемен- ной окружения. В результате исполнения переменной Text присваивается значение переменной окружения PATH. Табл. 7-3. Некоторые переменные окружения различных ОС. Имя Описание System User Process Process (Windows NT/ (Windows NT/ (Windows NT/ (Windows 95/98) ____________________________2000)___________________2000)______________2000)_ COMSPEC Путь к командному 7__________________________________________________7 7 процессору (обычно cmd.exe или command.com). HOMEDRIVE Главный локальный 7 диск (как правило, С:\). HOMEPATH Каталог по умолча- 7 ниюдля пользова- телей (как правило, \users\default).
ГЛАВА 7 Работа с объектами WSH 145 Табл. 7-3. (продолжение) Имя Описание System User Process Process (Windows NT/ (Windows NT/ (Windows NT/ (Windows 95/98) 2000) 2000) 2000) NUMBER- OFPRO- Число процессоров v •/ на данной машине. CESSORS OS ОС, установленная V V на машине пользователя. PATH РАТНЕХТ Путь. ✓ ✓ Расширения испол- ✓ ✓ нимых файлов (как правило, .сот, .ехе, .bat и .cmd). PROCESSOR- Тип процессора на ARCHI- TECTURE машине пользователя. PROCESSOR- Идентификатор IDENTIFIER процессора поль- зовательской машины. PROCES- SORLEVEL Уровень процес- J J сора пользова- тельской машины. PROCESSOR- Версия процессора REVISION пользовательской машины. PROMPT Приглашение ✓ V командной строки MS-DOS (как правило, SPSG). SYSTEM- DRIVE Локальный диск, V на котором рас- положен систем- ный каталог (например, С:\). SYSTEMROOT Системный каталог' (например, C:\WIN- NT). То же, что и WINDIR. TEMP Каталог для хране- ✓ ✓ ✓ ния временных файлов(напри- мер, C:\temp). Есть во всех версиях Windows. В Win- dows NT находится в категориях User и Volatile. см. след. стр.
146 ЧАСТЬ II Интерактивная работа со сценариями Табл. 7-3. (продолжение) Имя Описание System User Process Process (Windows NT/ (Windows NT/ (Windows NT/ (Windows 95/98) 2000) 2000) 2000) ТМР Каталог для хране- ✓ ✓ ✓ ния временных файлов (например, C:\temp). Есть во всех версиях Win- dows. Категории: User и Volatile. W1NDIR Системный каталог ✓ ✓ ✓ в Windows NT (например, C:\WINNT). То же, что и SYSTEMROOT. ПРИМЕЧАНИЕ Список предопределенных переменных окружения с описанием их методов и свойств см. в справочнике Windows Script Host Reference. Обращение к переменным окружения в программах на VBScript Программа, показанная ниже (листинг 7-8), читает значения системных пе- ременных окружения и пользовательской переменной окружения и выводит их в диалоговом окне (в пользовательской переменной BLASTER хранятся аппаратные параметры звуковых плат). Этот сценарий будет работать в Windows 95/98/NT 4/2000 (если установ- лен WSH). Набор показанных переменных окружения зависит от платфор- мы ОС. Например, Windows 98 не работает с переменной OS (которая ука- зывают ОС). Взгляните на диалоговое окно, которое этот сценарий выводит в Windows 2000 (рис. 7-5). Поскольку некоторые переменные окружения (OS, BLASTER) на этой платформе не определяются, значение некоторых переменных не выводится (т. е. показаны только их имена). При исполнении сценария в Windows 95/98 значения некоторых переменных тоже не будут показаны. СОВЕТ Операционную систему позволяет определить переменная окружения OS. Если она не определена (т. е. возвращает пустую стро- ку), сценарий работает в Windows 95/98. В Windows NT также можно определить платформу (х8б или Alpha).
ГЛАВА 7 Работа с объектами WSH 147 [WSH sample Environment vbs - by G. Bern Рей CMNur-iyitw^C WiNNT.C \иад*Т\$0чтШ4«т tom .CfcfcDbja?,. W.WS.VOE.JSJSE: WSF.'wSH ftcmce 5j*"mO<wC CAWHHI W.-лим» Imia>y. С «MKT TEW- e^Cll»<t£-l\ACsMlN|-V4.(K«.$-TSr«f4> IMF С<СШС*1УЧ>М*|1*1Ч0С«13*ПГ«ч ОТ Wr<ia«_MT : «ЦламАМЙСЗН Рис. 7-5. Значения переменных окружения, полученные сценарием Environment.vbs. VBScript-программа обращается к переменным окружения (листинг 7-8): **************************************************** ' Файл: Environment.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Вывод значений переменных окружения с помощью ’ объекта WshShell Option Explicit Dim Message, Title Dim WshShell, objEnv ’Получить объект WshShell. Set WshShell = CreateObject("WScript.Shell") ’ Получить набор с помощью свойства Environment. Set objEnv = WshShell.EnvironmentC'Process”) ’ Прочитать значения переменных окружения. Message = "Environment variables" & vbCrLf & vbCrLf Message = Message & "Path: " & objEnv(”PATH”) & vbCrLf Message = Message & "Extensions: " & objEnv(”PATHEXT") & vbCrLf Message = Message & "Prompt: ” & objEnv("PROMPT") & vbCrLf Message = Message & "System Drive: ” & objEnv("SYSTEMDRIVE") & vbCrLf Message = Message & "System Root: " & objEnv("SYSTEMROOT") & vbCrLf Message = Message & "Windows Directory: " & objEnv("WINDIR") & vbCrLf Message = Message & "TEMP: " & objEnv("TEMP") & vbCrLf Message = Meseage & "TMP: " & objEnv(”TMP”) & vbCrLf Message = Message & "OS: " & objEnv(”0S”) & vbCrLf см. след. стр.
148 ЧАСТЬ II Интерактивная работа со сценариями ' Прочитать значение пользовательской переменной окружения. Message = Message & "Blaster: " & objEnv("BLASTER") & vbCrLf ' Инициализовать заголовок окна. Title = "WSH sample " & WScript.ScriptName & " - by G. Born" MsgBox Message, vblnformation & vbOKOnly, Title ’*** Конец Листинг 7-8. Environment.vbs. Обращение к переменным окружения в программах на JScript Следующая программа читает значения тех же переменных окружения, что и приведенная выше VBScript-программа, и выводит результаты в диалого- вом окне (листинг 7-9). Имейте в виду, что не все переменные определены на каждой платформе. //................................................... // Файл: Environment.js (Пример для WSH на JScript) // Автор: (с) G. Born // И Вывод значений переменных окружения с помощью // объекта WshShell //...................*............................... var Message, Title; var vblnformation = 64; var vbOKOnly = 0; II Получить объект WshShell. var WehShell = WScript.CreateObjectC'WScript.Shell"); // Получить набор с помощью свойства Environment. var objEnv = WshShell.Environment("Process"); // Прочитать значения переменных окружения. Message = "Environment variables\n\n"; Message = Message + "Path: " + objEnv("PATH”) + "\n"; Meesage = Meesage + "Extensions: " + objEnv("PATHEXT") + "\n"; Message = Message + "Prompt: " + objEnv(”PROMPT") + "\n"; Message = Message + "System Drive: " + objEnv("SYSTEMDRIVE") + "\n"; Message = Message + "System Root: " + objEnv("SYSTEMROOT") + "\n"; Message = Message + "Windows Directory: " + objEnv("WINDIR") + "\n”; Message = Message + "TEMP: " + objEnv("TEMP") + "\n”; Message = Message + "TMP: " + objEnv("TMP") + "\n";
ГЛАВА 7 Работа с объектами WSH 149 Message = Message + "OS: " + objEnv("OS") + "\n"; // Прочитать значение пользовательской переменной окружения. Message = Message + "Blaster: ” + objEnv("BLASTER") + "\n"; // Инициализовать заголовок окна. Title = "WSH sample " + WScript.ScriptName + " - by G. Born"; WshShell.Popup(Message, vblnformation + vbOKOnly, Title); //••• Конец Листинг 7-9. Environmentjs. Создание переменных окружения В окне командной строки можно задавать значения переменных окружения лишь для текущего процесса. Переменные окружения, созданные в окне командной строки, не постоянны — после завершения сеанса они теряют- ся. В Windows 95/98 можно установить постоянную переменную окружения командой Set в файле Autoexecbat. В Windows NT/2000 для установки зна- чений переменных окружения служит диалоговое окно Environment Va- riables (для этого дважды щелкните значок System на Control Panel, затем щелкните кнопку Environment Variables). Таким образом, создать постоянную переменную окружения в сценарии WSH нельзя, поскольку во время испол- нения сценария Windows создает копию основного окружения в адресном пространстве нового процесса и обращение к окружению означает обраще- ние к его локальной копии. После завершения процесса его адресное про- странство освобождается и переменные при этом теряются. Чтобы продемонстрировать преходящую природу переменных окруже- ния, я написал маленькую программу на VBScript, Environment!.vbs. При за- пуске она выводит диалоговое окно с вопросом: создать новую переменную окружения BORN? Если пользователь щелкнет кнопку Yes, сценарий создает новую переменную окружения: Set WshShell = CreateObjectC’WScript.Shell") Set objEnv = WshShell.EnvironmentC’Process") objEnv("BORN") = "Hello. WSH is euperl" Первый оператор создает ссылку на объект WshShell. Оператор во второй строке обращается к свойству Environment, содержащему набор всех пере- менной окружения из категории Process (эта категория выбрана, чтобы со- хранить функциональность сценария в Windows 95/98). Третий оператор создает новую переменную окружения — BORN и присваивает ей строку. Если эта переменная не существует, она создается в локальном окружении процесса WSH. Следующая программа (листинг 7-10) выводит список всех переменных окружения, найденных после создания новой переменной. Она делает это
150 ЧАСТЬ II Интерактивная работа со сценариями путем повторного считывания свойства Environment и обработки всех эле- ментов этого набора в цикле For Each.Jn. ПРИМЕЧАНИЕ Для анализа срока жизни переменной окружения сде- лайте так. В окне запроса на создание новой переменной и вывода списка всех переменных окружения, которое выводит программа En- vironment!.vbs, щелкните кнопку Yes. Появившееся окно со списком переменных оставьте открытым. Запустите копию этого сценария, но на этот раз щелкните No, чтобы предотвратить создание новой пере- менной. В списке во втором окне не будет элемента BORN. Это значит, что созданные в первом процессе переменные являются локальными. Если завершить сценарий и запустить его повторно, не создавая но- вую переменную окружения, то в окне снова будет отсутствовать эле- мент BORN. Этот эксперимент показывает, что срок жизни переменной определяется сроком жизни текущего процесса. ' Файл: Environment!.vbs (Пример для WSH на VBScript) ’ Автор: (с) G. Born ' Создает переменную окружения, считывает все переменные ' окружения из категории Process ' и выводит результаты в диалоговом окне ***************************************************** Option Explicit Dim Message, Title Dim WshShell, objEnv Dim 1, tmp ' Получить объект WshShell. Set WshShell = CreateObjeot("WScript.Shell") ' Получить набор о помощью свойства Environment. Set objEnv = WehShell. Environment "Process") Создать (временную) переменную окружения. tmp = MsgBox("Create environment variable BORN?", vbYeeNo + vbQuestion, _ "WSH sample - by G. Born") If tmp = vbYee Then objEnv(”BORN") = "Hello. WSH is superl" End If ' Прочитать список переменных окружения. Message = "Environment variables" & vbCrLf & vbCrLf For Each i In objEnv
ГЛАВА 7 Работа с объектами WSH 151 Message = Message & 1 & vbCrLf Next ' Инициализировать заголовок окна. Title = "WSH sample " & WScript.ScriptName & " - by 6. Born" MsgBox Message, vblnformation + vbOKOnly, Title Конец Листинг 7-10. Environment 1 .vbs. ПРИМЕЧАНИЕ Если сценарий с помощью метода Run запускает еще один сценарий, то переменная окружения, созданная дочерним сце- нарием, будет доступна родительскому сценарию. Удаление переменных окружения Объект Environment поддерживает метод Remove, удаляющий переменные окружения: Set WshShell » WScript,CreateObjectC'WScript.Shell") WshShell.Envi ronment("Process").Remove("PATH") Методу Remove доступны только локальные переменные окружения теку- щего процесса. Это означает, что переменная окружения удаляется только из этой копии окружения. Все глобальные переменные среды остаются без изменений. Следующая программа проверяет это поведение (листинг 7-11). На пер- вом этапе в диалоговом окне выводятся все переменные окружения (в их исходном состоянии). На втором в окружении создается новая переменная — BORN. После этого снова выводятся значения всех переменных окруже- ния. На третьем этапе сценарий удаляет переменные окружения BORN и PATH, а результат выводится в третьем диалоговом окне. Если снова запустить этот сценарий, можно убедиться, что переменная окружения PATH осталась. Сценарий WSH не может удалить переменную окружения навсегда. Файл: Environment2.vbs (Пример для WSH на VBScript) Автор: (с) Q. Born Создание и удаление переменных окружения из категории Process Option Explicit Dim Message, Title Dim WshShell, objEnv Dim i см. след. стр.
152 ЧАСТЬ II Интерактивная работа со сценариями ' Получить объект WehShell . Set WshShell = CreateObject("WScript.Shell") Получить набор с помощью свойства Environment. Set objEnv = WshShell. Environment "Process") ' Инициализировать заголовок окна. Title = "WSH sample " & WScript.ScriptName & " - by G. Born" ' Прочитать список переменных окружения. Message = "Environment variables (original state)" & vbCrLf & vbCrLf For Each i In objEnv Message = Measage & 1 & VbCrLf Next MsgBox Message, vblnformation + vbOKOnly, Title ' Создать (временную) переменную окружения. objEnv("BORN") = "Hello. WSH is euperl" ' Считать список переменных окружения. Meseage = "Environment variables (extended)" & vbCrLf & vbCrLf For Each i In objEnv Message = Message & 1 & vbCrLf Next MsgBox Message, vblnformation + vbOKOnly, Title ' Удалить переменные окружения. obj Env.Remove("BORN") obj Env.Remove("PATH") ' Считать список переменных окружения. Meseage = "Environment variables (after deleting)" & vbCrLf & vbCrLf For Eech i In objEnv Message = Mesaage & 1 & vbCrLf Next MsgBox Message, vblnformation & vbOKOnly, Title '*** Конец Листинг 7-11. Environment2.vbs.
ГЛАВА 7 Работа с объектами WSH 153 Раскрытие переменных окружения методом ExpandEnvIronmentStrlngs Существует еще один способ получения информации из переменных окру- жения. Если вам приходилось создавать пакетные файлы MS-DOS, то скорее всего вы знаете, как использовать значение переменной среды в команде пакетного файла. Например, эта команда устанавливает путь к редактору с помощью значения переменной окружения TEXT-. XTEXTX\Edit.com «DOCUMENT* Документ, который будет загружен в редактор, определяется переменной окружения DOCUMENT. Так можно поступить и в реестре Windows NT/2000. Например, в этой записи реестра Windows вместо %WINDIR% подставит путь к папке Windows: XWINDIRX\Notepad.exe «1 Если Windows установлена в папку C:\WINNT, команда будет раскрыта так: С:WINNT\Notepad.exe Х1 ПРИМЕЧАНИЕ Вместо символов %1 должно быть подставлено имя файла, выбранного в оболочке. У них ничего общего с переменными окружения. Преимущество заполнителя %WINDIR% в том, что команда останется дей- ствительной независимо от того, в какой каталог пользователь установит ОС. Вероятно, как программисту сценариев, вам покажется предпочтительнее построение команд с использованием путей, заданных в определенной фор- ме. Но нельзя быть уверенным, что определенные в сценарии абсолютные пути будут действительными в течение долгого времени и на разных маши- нах. Так, чтобы указать папку, в которую пользователь установил Windows, можно обратиться к переменной окружения WINDIR (в Windows 95/98), ко- торая создается при запуске системы и содержит текущий путь к папке Win- dows. Если вместо жестко заданных путей используется переменная окруже- ния WINDIR, сценарий всегда отыщет каталог Windows, невзирая на разли- чия между компьютерами. Как сценарий получит доступ к информации о папке Windows? И как ис- пользовать в выражениях значения других переменных окружения? Один из подходов — применить уже упомянутые методы и свойства для считывания значения переменных окружения, а затем вставить результат в выражение. Но прежде взгляните на более простое решение. В главе 6 мы использовали объект WshShell для доступа к методу Popup. Этот объект поддерживает и другие методы. Вот описание методов объекта WshShell (табл. 7-4):
154 ЧАСТЬ II Интерактивная работа со сценариями Табл. 7-4. Методы объекта WshShell. Метод Описание CreateShortcut ExpandEnvironmentStrings Popup RegDelete RegRead RegWrite Run Создает и возвращает объект WsbShortcut или WshURLShortcut. Раскрывает переменную из категории Process и возвра- щает полученную в результате строку. Выводит окно сообщения с заданным текстом. Удаляет из реестра заданный раздел или параметр. Считывает из реестра заданный раздел или параметр. Устанавливает заданный раздел или параметр реестра. Создает новый процесс, исполняющий заданную коман- ду в окне с указанным стилем. Параметром метода ExpandEnvironmentStrings, поддерживаемого объек- том WshShell, является строка. Если строка содержит имя переменной среды, заключенное между символами %, метод раскрывает его, подставляя вместо имени переменной ее значение, и возвращает полученную строку. Если в команду вставлено имя переменной окружения, ее можно легко раскрыть этим методом. Этот подход используется в программе на VBScript (листинг 7-12). В сце- нарии есть команда, раскрывающая переменную окружения %WINDIR%: Command = "XWINDIRX\Explorer.exe” ' Эта команда должна быть раскрыта Результат выводится в диалоговом окне (рис. 7-6). Рис. 7-6. Раскрытая переменная окружения. ПРИМЕЧАНИЕ Метод Run автоматически раскрывает все переменные окружения, вставленные в командную строку в формате Файл: Environments.vbs (Пример для WSH на VBScript) Автор: (с) G. Born Использование метода ExpandEnvironmentStrings объекта WshShell Option Explicit Dim Command Dim WshShell
ГЛАВА 7 Работа с объектами WSH 155 Command = "XWINDIRX\Explorer.exe" ' Эта команда должна быть раскрыта ' Получить объект WshShell. Set WshShell WScript.CreateObjeot("WScript.Shell") ' Теперь можно использовать метод ExpandEnvironmentStrings. WScript.Echo "Command: " & Command & vbCrLf & _ "Expanded: " & WshShell.ExpandEnvironmentStrings(Command) '*** Конец Листинг 7-12. Environment3.vbs. В программах на JScript можно использовать аналогичный подход, но команды, содержащие символы \, определяются с помощью escape-символов. Так, команду %WINDIR%\fixplorer.exe следует записать как %WINDIR%\\Explorerexe. Определив командную строку, можно получить ссылку на объект WshShell и присвоить ее переменной-объекту. Затем строку с именем переменной окру- жения можно передать методу ExpandEnvironmentStrings (листинг 7-13)- //••••*................................*.......... И Файл: Environments.je (Пример для WSH на JScript) И Автор: (о) G. Born И И Использование метода ExpandEnvironmentStrings И объекта WehShell И..........****.......*......................***** var Command = "XWINDIRXWExplorer.exe"; // Эта команда должна быть раскрыта И Получить объект WshShell. var WshShell WScript.CreateObject("WScript.Shell"); // Теперь можно использовать метод ExpandEnvironmentStrings. WScript.Echo("Command: " + Command, "\nExpanded: " + WshShell.ExpandEnvironmentStrings(Command)); //*** Конец Листинг 7-13. Environment3.js. Создание и освобождение объектов Если объект не предоставляется WSH автоматически (как в случае WScript), перед использованием его нужно «создать», т. е. загрузить его экземпляр в память и присвоить переменной-объекту ссылку на него. Следующий опера- тор на VBScript создает объект с помощью метода CreateObject: Set Object_variaMe = WScript.CreateObjectC’ProgID")
156 ЧАСТЬ II Интерактивная работа со сценариями В JScript используется другой синтаксис: var Objeot_variable = WScrlpt.CreateObjeot(”ProgID"); WSH экспонирует автоматически лишь одну переменную-объект — WScript. Все другие объекты надо создавать в явном виде. На VBScript переменную- объект (используемую для хранения объекта) создает ключевое слово Set. У переменной-объекта может быть любое допустимое имя (например, objAdr или WshObj). Следующий оператор на VBScript создает объект WshShell-. Set WshShell WScrlpt.CreateObjeotC'WSoript.Shell") Синтаксис аналогичного оператора на JScript отличается лишь тем, что вместо ключевого слова Set используется vаг и в конце строки ставится точ- ка с запятой. Вернемся к операторам, показанным в начале раздела. WScript.- CreateObject сообщает обработчику языка о намерении создать объект и по- лучить ссылку на него. В качестве параметра метода CreateObject передается идентификатор объекта (ProgID), заключенный в скобки. В приведенном операторе <WScriptShell» является идентификатором объекта WshShell. ПРИМЕЧАНИЕ Самая трудная часть этого процесса — получение ProgID объекта. Все ProgID, необходимые для примеров этой книги, уже включены в них. Вам придется добывать ProgID для «чужих» объек- тов из их документации. При отсутствии документации определить ProgID объект поможет утилита OLE/COM Object Viewer. Object Browser из Microsoft Visual Basic 5 Control Creation Edition (ССЕ) и Microsoft Office также позволяют получить ProgID компонента. Эти методы по- лучения ProgID обсуждаются в моей книге Advanced Development with Microsoft Windows Script Host 2.0. Может ввести в замешательство то, что в предшествующем операторе сло- во WScript встречается дважды. В WScript.CreateObject это слово является име- нем объекта, а в параметре «WScriptShell» оно представляет ProgID библио- теки объектов. ПРИМЕЧАНИЕ Используя метод CreateObject, не забывайте об иерар- хии объектов. В главе 6 отмечалось, что объекты могут содержать дру- гие объекты. Эти зависимости описываются объектной моделью. Так, приложение Microsoft Word может содержать в себе документ. Чтобы получить доступ к объекту «документ», надо выполнить метод CreateObject сначала для объекта «приложение», а затем для объекта «документ». Имей- те в виду, что применение метода CreateObject — лишь один из многих способов создания объектов, с которыми вы познакомитесь ниже. Метод CreateObject и библиотеки типов Используя метод CreateObject, вы автоматически прибегаете к помощи технологии Microsoft COM (Component Object Model). В основе СОМ
ГЛАВА 7 Работа с объектами WSH 157 лежит идея предоставления всей функциональности системы в виде интерфейсов объектов — наборов связанных функций. Сведения об этих объектах и их интерфейсах хранятся в библиотеках типов. Биб- лиотеки типов существуют как в виде отдельных файлов (с расшире- нием .tlb), так и в виде части файла с исполнимым кодом объекта. Чтобы вызвать метод CreateObject, надо точно описать местонахож- дение описания объекта и его интерфейса. Теоретически для этого нужно задать диск и путь к файлам библиотеки в виде аргумента ме- тода CreateObject. Но любое изменение пути приведет к ошибке в ме- тоде CreateObject. Microsoft выбрала более рациональное решение: хра- нить сведения о библиотеке объектов в реестре. Из главы 2 вы узнали, как пользователь может зарегистрировать такую библиотеку с помо- щью программы RegSvr32.exe. При регистрации программа установки заносит сведения об объектах библиотеки в реестр Windows. После это- го с помощью OLE/COM Object Viewer можно получить ProgID объекта (и путь к серверу объекта). Объект можно создать методом CreateObject, передав ему как пара- метр ProgID. Этот ProgID состоит из двух частей: ИмяБиблиотекиТипов.ИмяКласоа Перед точкой стоит имя библиотеки типов. В приведенных выше при- мерах использовалась библиотека типов WScript. В программах Word (Word), Microsoft Excel (Excel) и компонентах ActiveX доступны и другие библиотеки типов Библиотека типов содержит элементы, доступные для использования из внешних приложений. Эти элементы зарегистрирова- ны под определенным именем в составе класса или подкласса. Например, библиотека типов WScript содержит класс Shell. Поэтому, чтобы создать экземпляр класса Shell, для метода CreateObject надо задать параметр «WScriptShelb. Для доступа к Excel — параметр «ExcelApplication*, а в слу- чае Internet Explorer — «IntemetExplorerApplicationo. Исполняя метод CreateObject, интерпретатор через ProgID полу- чает из записей реестра путь к файлам библиотеки. Затем в память (в рабочий набор процесса) загружается экземпляр объекта (как часть библиотеки), и его исходящий интерфейс подключается к сценарию. Эти действия происходят закулисно и невидимы пользователю. Про- граммисту следует знать только то, что метод CreateObject создает объект и присваивает ссылку на данный объект переменной-объекту, заданной в операторе. Эта переменная-объект дает доступ к методам и свойствам объекта. Переменную-объект также можно использовать при последующих вызовах метода CreateObject, чтобы получить доступ к вложенным объектам. Отличия методов CreateObject и GetObject Объект WScript поддерживает два метода, позволяющих создать новую ссыл- ку на объект: CreateObject и GetObject. CreateObject создает объект и органи-
ЧАСТЬ II Интерактивная работа со сценариями зует для него обработку событий, a GetObject получает объект Automation из файла. Чем именно отличаются эти два метода? Метод CreateObject создает объект, заданный параметром strProgjD. Вы уже видели простой пример вызова CreateObject с одним параметром. У метода CreateObject есть также второй необязательный параметр: Set objAdr = WScript.CreateObjeot(strProgID[, strPrefix]) Первый параметр содержит ProgID объекта (например, <WScriptShell»). Необязательный параметр strPrefix может содержать строку префикса. Если он задан, после создания этого объекта метод соединяет его исходящий ин- терфейс со сценарием. Это соединение позволяет осуществлять обработку событий функциями обратного вызова, объявленными в сценарии. Напри- мер, если strPrefix установлен как «Test_» и у объекта срабатывает событие OnBegin, WSH вызывает функцию сценария Test_OnBegin [эта методика, ис- пользуемая в представленной ниже программе (листинг 7-14), подробно обсуждается в главе 9]. Доступ к объектам также дает метод GetObject, который получает объект Automation из файла или объекта, заданного параметром strProgID. Метод GetObject вызывается, когда есть текущий экземпляр объекта или нужно со- здать объект из уже загруженного файла. Если текущий экземпляр объекта не существует и не требуется создавать объект из загруженного файла, ис- пользуйте метод CreateObject. Синтаксис метода GetObject аналогичен CreateObject. Set objAdr WSoript.GetObjeot(etrPathname[, [strProg!D][, strPrefix]]) Параметр strPatbname задает путь к файлу, содержащему объект Automa- tion. Необязательный параметр strProgID содержит строку с ProgID объекта, что позволяет методу загружать объект с помощью записей реестра. Третий параметр соединяет сценарий и внешний интерфейс объекта. Второй и тре- тий параметры по значению аналогичны соответствующим параметрам ме- тода CreateObject. Использование метода DisconnectObject Когда вы создаете объект методом GetObject или CreateObject, он загружает- ся в память и остается соединенным с WSH до завершения сценария. Сцена- рий может подключить свой обработчик событий к исходящему интерфей- су объекта, используя второй необязательный параметр метода CreateObject. В результате объект сможет генерировать события, которые будут обрабо- таны обработчиком событий сценария. Метод DisconnectObject отсоединяет объект от процедуры обработки событий во время работы сценария: WScript.DisconnectObject Имя_объекта Здесь Имя_объекта — имя переменной-объекта. На VBScript также мож- но сбросить значение переменной-объекта: Имя объекта = Nothing
ГЛАВА 7 Работа с объектами WSH 159 Встроенные методы, создающие объекты Кроме метода CreateObject объекта WScript, языки VBScript и JScript поддерживают встроенные методы для создания объектов. В следую- щем фрагменте для соединения объекта со сценарием служит встро- енный метод VBScript: Dim oIE Set oIE = CreateObject("InternetExplorer.Application") Во второй строке нет имени объекта WScript-, в ней используется CreateObject, встроенный метод языка VBScript. Он создает ссылку на объект Internet Explorer Application (об объектах Internet Explorer мы еще поговорим). В JScript также есть встроенный метод создания ссылок на объект: var oIE = new ActiveXObject("InternetExplorer.Application"); Метод new языка JScript применяется к объекту ActiveXObject, что- бы создать новый экземпляр объекта и присвоить ссылку переменной- объекту oIE. Присвоить переменной-объекту ссылку на объект позволяют оба метода, как встроенный, так и WScriptCreateObject. Но метод CreateObject, предоставляемый объектом WScript, поддерживает дополнительный параметр, позволяющий организовать в сценарии обработку событий, что невозможно при использовании встроенных методов. Этот метод применяется в следующей программе (листинг 7-14). Он за- пускает Internet Explorer, загружая пустую страницу, и организует обработ- ку событий Internet Explorer DownloadBegin и OnQuit. Из-за вызова метода DisconnectObject процедура обработки событий lE OnQuit никогда не будет вызвана. Если закомментировать эту строку, то после вызова olE.Quit при исполнении примера будет показано диалоговое окно. Файл: Disconnect.vbs (Пример для WSH на VBScript) Автор: (с) G. Born Использование метода DisconnectObject для отсоединения обработчика событий из Internet Explorer Option Explicit Dim oIE ’ Запустить Internet Explorer и определить префикс обработчика событий. Set oIE = WScrlpt.CreateObject( ”InternetExplorer.Application", ”IE_") см. след. стр.
160 ЧАСТЬ II Интерактивная работа со сценариями oIE.navigate "about:blank" ' Пустая страница oIE.visible 1 ' Сделать приложение видимым ’ Приостановить исполнение сценария путем вывода сообщения. WScript.Echo "Please cliok OK" WScript.DisconnectObjeot oIE ' Отключить объект от Internet Explorer. oIE.Quit ' Завершить Internet Explorer. WSoript.Echo "Disconnected" ' Конец сценария. ' Здесь находятся обработчики событий Internet Explorer. Sub IE_DownloadBegin() ' генерируется при загрузке документа в Internet Explorer WScript.Echo "Event; Download begins" End Sub Sub IE_OnQuit() ' Это окно должно выводиться при выходе из Internet Explorer, но ' перед вызовом метода Quit для завершения Internet Explorer ' мы отключаемся от объекта, поэтому ' оно не выводится. WScript.Echo "Event: Quit Internet Explorer" End Sub '*»* Конец Листинг 7-14. Disconnect.vbs. Запуск других программ из сценария Для запуска из сценария WSH другого приложения служит метод Run, под- держиваемый объектом WshShell. Метод Run создает новый процесс и испол- няет команду, заданную параметром strCommand. С помощью второго пара- метра, intWindowStyle, можно задать стиль окна. У метода такой синтаксис: WshShell.Run(strCommand[, [intWindowStyle][, bWaitOnReturn]]) Параметр strCommand обязателен, поскольку он задает путь и имя приложе- ния или команды для исполнения. ПРИМЕЧАНИЕ Самое время упомянуть два момента. Во-первых, путь, содержащий пробелы, следует заключать в двойные кавычки, напри- мер-. «G\Test Folder\MyApp.exe». В противном случае вызов метода Run
ГЛАВА 7 Работа с объектами WSH 161 вызывает ошибку периода выполнения с выводом сообщения: «The system cannot find the file specified» (система не может найти указан- ный файл). Об этом шла речь в главе 1, и ниже в этой главе вы увиди- те пример на VBScript, демонстрирующий, как заключать путь в кавыч- ки. Во-вторых, метод Run автоматически раскрывает имена перемен- ных окружения, содержащихся в параметре strCommand. А эта последовательность команд заставляет сценарий раскрыть перемен- ную окружения %WINDIR%, которая содержится в Command, и запустить про- грамму Са1с.ехе: Set WshShell = WScrlpt.CreateObjectC’WScript.Shell") Command = "XWINDIRX\Calc.exe" WshShell.Run Command ПРИМЕЧАНИЕ Хотя переменная %WINDIR% возвращает верный путь к папке Windows, далеко не все приложения хранятся в этой папке. По- казанная выше команда прекрасно работает в Windows 95/98, но сбо- ит в Windows NT/2000, так как Са1с.ехе расположен в подкаталоге \System32. Поэтому лучше не использовать переменную окружения %WINDIR% в запускающих системные приложения Windows (такие как Calc) командах, которые ищут исполняемые файлы в папке Windows или в системной папке Windows в зависимости от платформы. В этом случае Windows осуществляет поиск в папке Windows и системной папке по умолчанию (\System в Windows 95/98 или \System32 в Win- dows NT/2000). Один из двух других необязательных параметров контролирует вывод окна приложения, а другой определяет, должен ли сценарий ожидать завер- шения исполняемого процесса. Необязательный параметр intWindowStyle задает стиль окна нового процесса. Этот параметр может быть целым чис- лом от 0 до 10. Если intWindowStyle не задан, окно получает фокус и выводит- ся в обычном режиме. Значения intWindowStyle таковы (табл. 7-5): Табл. 7-5. Значения параметра IntWindowStyle. Значение Константа Visual Basic Описание 0 VbHide Скрывает это окно и активизирует другое (показывает его и передает ему фокус). 1 VbNormalFocus Активизирует и показывает окно. Если процесс уже активен и его окно сверну- то или развернуто, то восстанавливает предыдущий размер и положение окна. 2 VbMinimizedFocus Активизирует окно и сворачивает его. Фокус переходит к кнопке на панели задач. см. след. стр.
162 ЧАСТЬ II Интерактивная работа со сценариями Табл. 7-5. (продолжение) Значение Константа Visual Basic Описание 3 VbMaximizedFocus Активизирует окно, разворачивает его и предает ему фокус. 4 5 VbNormalNoFocus Выводит окно в его предыдущем поло- жении и размере. Активное окно остается таковым. Активизирует окно с текущим размером и положением 6 7 8 9 10 VbMinimizedNoFocus Сворачивает окно и активизирует следу- ющее окно в z-порядке. Выводит окно в виде значка (сверну- тым). Активное окно остается таковым. Выводит окно в текущем состоянии. Активное окно остается таковым. Активизирует окно и выводит его. Если оно свернуто или развернуто, восста- навливает его исходный размер и поло- жение. Этот флаг должен быть задан при восстановлении свернутого окна приложения (его нельзя использовать с методом Run). Устанавливает состояние окна в зависи- мости от состояния программы, запус- тившей это приложение. Взглянув на эти параметры, можно подумать, что метод Run позволяет не только вызвать новый экземпляр приложения, но и переключиться на дру- гое приложение, работающее в фоновом режиме. Увы, Run всегда создает новый экземпляр процесса. Он не позволяет ни повторно активизировать окно работающего приложения, ни свернуть или развернуть его. Поэтому нельзя использовать всех значений из этой таблицы. Я также обнаружил, что стили окон работают только с теми приложениями, которые их поддержи- вают: Блокнот принимает все стили, но с Калькулятором возникают пробле- мы, так как его окно нельзя развернуть. Имейте в виду, что здесь также при- ведены именованные константы, определенные для обозначения стилей окон в Visual Basic. В сценариях WSH следует использовать числовые кон- станты, так как в языках VBScript и JScript эти именованные константы не определены. Необязательный параметр bWaitOnRetum метода Run относится к подти- пу Boolean (его значением может быть True или False). Этот параметр опреде- ляет, будет ли сценарий ожидать завершения исполняемого процесса. Если параметр bWaitOnRetum не задан или указано значение False, метод Run ис- полняет команду и сразу возвращает управление. Если значение bWaitOnRetum установлено в True, Run создает новый процесс, исполняет команду и ждет завершения запущенного процесса. В этом случае Run возвращает код ошиб-
ГЛАВА 7 Работа с объектами WSH 163 ки, полученный от завершившегося процесса. Если bWaitOnRetum отсутству- ет или равен False, Run возвращает код ошибки 0. ПРИМЕЧАНИЕ Код ошибки сценария можно задать методом Quit (см. ниже). Запускаем Notepad из сценария Давайте создадим несколько небольших сценариев. Notepad поддерживает стили окон, перечисленные выше (табл. 7-5). Следующий сценарий (листинг 7-15) запускает Notepad с помощью команд на VBScript. Далее сценарий за- пускает Notepad еще раз и сворачивает его окно (до кнопки на панели за- дач). Одна из команд сценария загружает в Notepad исходный текст сцена- рия, исполняемого в данный момент. ************************************************* ' Файл: Run.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Запуск NotePad с помощью метода Run ’************************************************ Option Explicit Dim WshShell Set WshShell = WScript.CreateObJect("WScrlpt.Shell") WshShell.Run "Notepad.exe", 1 WScript.Echo "Load sou roe code In a minimized window" WshShell.Run "Notepad.exe " & WScript.ScrlptFullName, 6 ’*** Конец Листинг 7-15. Run.vbs. Запуск Calculator из программы на JScript Следующий пример на JScript (листинг 7-16) запускает программу Calculator. Для работы сценария требуется несколько именованных констант, объявлен- ных как переменные в заголовке программы. Но Calculator не поддержива- ет все стили, поэтому стиль, сворачивающий окно, игнорируется. Заметьте также, что местонахождение файла Calcexe зависит от ОС, поэтому исполь- зование переменной окружения %WINDIR% в этом случае — не лучшая идея. При переносе примера, написанного на VBScript, на JScript, следует соблю- дать осторожность. Синтаксис этих языков различен: параметры метода Run следует заключить в скобки, а имена папок в пути — разделять символами Ц, поскольку JScript интерпретирует \ как escape-последовательность.
164 ЧАСТЬ II Интерактивная работа со сценариями Ц Файл: Run.js (Пример для WSH на JScript) // Автор: (с) G. Born // И Запуск Калькулятора с помощью метода Run. И Внимание: метод Run не поддерживает все Ц стили окон! var SW_SHOWNORMAL = 1; var SWJ4INIMIZE = 6; И Определить команду для вызова Calc.exe. Ц Внимание: не используйте XWINDIRXWCalc.exe, поскольку в Windows NT // и Windows 2000 файл Calc.exe хранится в XWINDIRX\\System32, // а в Windows 95 и Windows 98 - в папке Windows. var command = "Calc.exe" var WshShell = WScrlpt.CreateObjectC'WScript.Shell"); // Первая попытка WshShell.Run(command, SW.SHOWNORMAl); WScrlpt.Echo(”Launching Calculator minimized"); // He будет работать: окно Калькулятора уже развернуто! WshShell.Run(command, SW_MINIMIZE); //*** Конец Листинг 7-16. Runjs. Пути с пробелами Выше я упоминал, что метод Run не может вызвать приложение, если оно расположено в папке, путь к которой содержит пробелы. Если в пути есть пробелы, надо заключить его в двойные кавычки. Проведем эксперимент. Скопируйте какой-нибудь сценарий [скажем, Run.vbs (листинг 7-15)] в пап- ку C:\Test Folder и переименуйте файл в Testvbs. Затем попробуйте исполнить программу, запускающую файл Test.vbs методом Run (листинг 7-17). ***************************************************** ' Файл: RunTest.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Использование пути, содержащего пробелы с методом Run ***************************************************** Option Explicit
ГЛАВА 7 Работа с объектами WSH 165 ' Определить путь с пробелами. Const command = "C:\Test Folder\Test.vbs" Dim WshShell ' Создать объект WshShell. Set WshShell = WScrlpt.CreateObject("WScrlpt.Shell") ' Активизировать обработку ошибок периода выполнения в сценарии. On Error Resume Next ' Сначала попробуем использовать путь без двойных кавычек. WshShell.Run command, 1, True ' Возникает ошибка периода выполнения. If Err о 0 Then If Err = -2147024894 Then _ WScript.Echo "Calling & command, vbCrLf & _ "Error: The system cannot find the file specified" On Error Goto 0 ' Другие ошибки не обрабатываем ' А теперь заключим путь в двойные кавычки. WshShell.Run ... & command & .., 1, True WScript.Echo "Ready" '*** Конец Листинг 7-17. RunTest.vbs. Родительский сценарий дважды пытается исполнить Test.vbs. Первый вы- зов заканчивается неудачно, при этом выводится диалоговое окно с сообще- нием «файл не найден» (так как путь не был заключен в двойные кавычки). Вторая попытка вызова дочернего сценария успешна. В этой строке показа- но, как на VBScript значение переменной заключается в двойные кавычки. Поставить двойные кавычки можно так & имя & Внешние двойные кавычки “...” в выражении определяют границы строки. Пара внутренних двойных кавычек вынуждают VBScript вставить в строку один символ “. Метод Quit Метод Quit освобождает объект WScript (и таким образом завершает сцена- рий). Синтаксис вызова этого метода на JScript таков: WScrlpt.Quit(): Эквивалентный оператор на VBScript можно записать так WSoript.Quit
166 ЧАСТЬ II Интерактивная работа со сценариями После имени объекта ставится точка, а после нее — имя метода. Оба опе- ратора используют объект WScript, в результате чего сценарий завершается. После имени Quit можно задать дополнительный параметр, который на JScript надо заключать в скобки. В приведенном примере метод Quit вызы- вается без параметра, поэтому скобки в операторы оставлены пустыми. Параметр метода Quit определяет код завершения процесса. Если пара- метр не задан, WSH возвращает системе О. Задав в качестве параметра цело- численное значение (О или 1), можно уведомить ОС о завершении процес- са с ошибкой. Параметр О говорит о нормальном завершении процесса. Все положительные значения указывают на ошибку, которая привела к заверше- нию процесса. ОС Windows не проверяет этот код, но его можно проверить самому — например, при исполнении сценария в командной строке с по- мощью CScript.exe. Код ошибки можно проверить в командном файле, ис- пользуя функцию ERRORLEVEL. Метод Run также дает код завершения, если применять его, как описано в следующем разделе. ПРИМЕЧАНИЕ Не обязательно завершать сценарий методом Quit. Когда обработчик языка доходит до последней строки сценария, про- цесс завершается автоматически. Однако методом Quit можно завер- шить исполнение сценария в заданной точке. Ожидание завершения процесса и проверка кода завершения Следующая программа (листинг 7-18) запускает внешнее приложение и ждет окончания запущенного процесса. Если по завершении дочерний процесс возвращает код ошибки, родительский процесс проверяет его и выводит в диалоговом окне. ’ Файл: Test.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Возврат кода ошибки 'а*********************************************** Option Explicit WScript.Echo "Test script", vbCrLf, "We return error code 2" WScript.Quit 2 '*** Конец Листинг 7-18. Test.vbs. И все же для исполнения Testvbs требуется родительский сценарий. Его роль играет программа, представленная ниже (листинг 7-19). Сценарий ожи- дает завершения дочернего процесса, затем считывает код завершения и выводит его в диалоговом окне.
ГЛАВА 7 Работа с объектами WSH 167 Перед рассмотрением примера Run 1.vbs сделаю пару замечаний о функ- ции GetPatb. Для исполнения дочернего сценария Test.vbs родительский сце- нарий должен знать путь к нему. Допустим, что Test.vbs хранится в той же папке, что Run 1.vbs, что позволяет задавать путь к нему через свойство WScriptScriptFullName. GetPatb считывает свойство ScriptFullName, удаляет из пути имя файла и возвращает путь. К пути добавляется имя файла второго сценария, Testvbs. В результате получается команда для запуска сценария. Run 1.vbs также демонстрирует пример вызова сценария из другого сце- нария и обмена простой информацией (кодом ошибки, значение которого — в интервале 0-255) между дочерним и родительским сценарием. ПРИМЕЧАНИЕ Родительский сценарий может передавать информа- цию дочернему сценарию как аргументы. Их надо поместить в коман- ду, которая будет исполнена. Чтобы получить переданную информа- цию, дочерний сценарий должен прочитать эти аргументы. В результате исполнения метода Run с третьим параметром, равным True, будет создан новый процесс, и переданная в первом параметре команда бу- дет исполнена в адресном пространстве нового процесса. Затем сценарий будет ждать завершения нового процесса. Метод Run возвращает код завер- шения нового процесса: ErrCode = WshShell.Run(name, 1, True) После этого можно проверить код ошибки с помощью значения перемен- ной ErrCode. ’л******************************************************** Файл: RuM.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Запуск сценария, как в новом процессе, ожидание возврата ' кода завершения и вывод его значения в диалоговом окне ********************************************************** Option Explicit Dim WshShell, name, ErrCode ' Этот объект нужен для работы метода Run. Set WshShell = WScrlpt.CreateObject("WScrlpt.Shell") ' Получить путь исполнимой программы. ' Второй сценарий должен быть в той же папке, ' что и Runl.vbB. name = ... & GetPath & "Test.vbs” & .... ErrCode = WshShell.Run(name, 1, True) ' Ожидание. WScript.Echo "Error code received: ”, ErrCode ' Показать код ошибки.
168 ЧАСТЬ II Интерактивная работа со сценариями Function GetPath ' Эта функция определяет путь текущего сценария. ’ Она считывает путь, удаляет из него имя файла сценария и возвращает в результате запрошенный путь. Dim path path = WScrlpt.ScriptFullName ' Имя сценария GetPath = Left(path, InStrRev(path, "\")) End Function *** Конец Листинг 7-19. Runl.vbs. Ситуация, когда параметр bWaitOnReturn не работает Чтобы приостановить исполнение сценария до завершения запущенного дочернего процесса, можно задать параметр bWaitOnReturn равным True. Но если попытаться использовать его с программой Explorer.exe, ничего не по- лучится (листинг 7-20). Файл: Run2.vbs (Пример для WSH на VBScript) Авторг: (с) G. Born ' Запуск Calculator с помощью метода Run, ' ожидание закрытия Calculator и попытка ' выполнить те же действия над Windows Explorer '**********************************************! Option Explicit Const commandl = "Calc.exe" Const command2 = "Explorer.exe" Dim WshShell Set WshShell = WScrlpt.CreateObjectC'WScript.Shell") WScrlpt.Echo "Launch Calculator and pause script", vbCrLf & "until Calculator terminates" WshShell.Run commandl, 1, True ’ Подождать закрытия приложения. WScrlpt.Echo commandl, "closed", vbCrLf, vbCrLf & _ "Launch Explorer and try to pause the script", vbCrLf & "until the Explorer window terminates" WshShell.Run command2, 1, True ' He будет работать WScrlpt.Echo "The Explorer window is Btill open, " & _
ГЛАВА 7 Работа с объектами WSH 169 "so bWaitOnReturn doesn’t work” ’*** Конец Листинг 7-20. Run2.vbs. Этот сценарий выводит начальное диалоговое окно, которое следует за- крыть. После этого он запускает Calculator и приостанавливается до тех пор, пока пользователь не закроет окно Calculator. Ясно, что параметр bWaitOnReturn работает. После этого сценарий пытается выполнить те же действия над про- граммой Windows Explorer. Следующая команда запускает Explorer, но испол- нение сценария не останавливается: WshShell.Run oommand2, 1, True Вместо этого выводится следующее диалоговое окно. С первого взгляда это похоже на ошибку, но на самом деле причина в Explorer. Explorer.exe яв- ляется частью оболочки Windows, которая уже запущена и работает (напри- мер, выводит папку Рабочий стол). Поэтому окно Explorer выводится в но- вом экземпляре оболочки. В этом случае метод Run не запускает новый про- цесс, и параметр bWaitOnReturn не работает. Исполнение команд MS-DOS с помощью метода Run Метод Run позволяет исполнять команды MS-DOS в сценарии так же, как приложения Windows. Например, в Windows 95/98 можно использовать та- кую команду на JScript: WshShell.Run("Edit.com"); Этот оператор открывает окно редактора MS-DOS. Если добавить к коман- де имя файла документа, документ будет загружен в редактор. Поскольку путь не указан, Windows ищет файл программы в каталогах, заданных перемен- ной окружения PATH. СОВЕТ Свойства программы MS-DOS в Windows 95/98 можно устано- вить в .pif-файле. Для этого щелкните файл программы правой кнопкой, выберите из контекстного меню Properties. Далее выберите вкладку Program property и установите на ней нужные свойства программы. Когда вы, щелкнув кнопку ОК, закроете вкладку, Windows создаст в той же папке .pif-файл со свойствами программы для режима MS-DOS. У этого файла будет то же имя, что и у программы и (скрытое) расши- рение .pif. При запуске приложения Windows загружает .pif-файл и ус- танавливает в окне командной строки новые свойства сеанса MS-DOS. Вернемся к исполнению программ MS-DOS в сценарии. Можно ли делать это методом Run, как показано здесь? WshShell.Run "Dir С:\" Этот оператор не будет работать, так как программы с именем Dir.com или Dir.exe не существуют. Методу Run требуется исполнимый файл (.ехе,
170 ЧАСТЬ II Интерактивная работа со сценариями .com, .bat или .pif). В Windows 95/98 внутренние команды MS-DOS, такие как Dir, Сору и Rename, хранятся в командном процессоре Command.com (в от- личие от внешних команд типа Edit.com). Command.com находится в папке Windows. В Windows NT для обработки команд MS-DOS служит командный процессор cmd.exe. Чтобы исполнить внутреннюю команду MS-DOS, необ- ходимо запустить командный процессор и передать ему внутреннюю коман- ду MS-DOS (команда исполняется в окне командной строки). Команду вывода содержимого папки в Windows 95/98 можно записать так: C:\Windows\Command.com /к dir *.* Этот оператор предполагает, что Windows установлена в папке C:\Windows. Важно задать переключатель /k, указывающий командному процессору не закрывать окно MS-DOS. Чтобы автоматически закрыть окно MS-DOS после завершения исполнения команды, вместо /k укажите переключатель /с. СОВЕТ Полный список параметров, поддерживаемых Command.com, вы получите, набрав в командной строке Command.com /?. Но с этой командой связаны две проблемы. Во-первых, следует сделать этот оператор независимым от папки, куда установлена Windows. Для этого путь C:\Windows можно заменить переменной окружения %WINDIR%. Но есть и другая проблема. В Windows 95/98 в качестве командного процессора ис- пользуется Command.com, а в Windows NT/2000 — Cmd.exe. Кроме того, ме- стонахождение этих командных процессоров также различно. Чтобы гаран- тировать работу сценария на всех платформах, следует поместить в коман- ду переменную окружения %COMSPEC%, как показано ниже. Эта переменная окружения содержит имя и адрес командного процессора. В результате в командной строке всегда будет нужный командный процессор. command = "XCOMSPECX /к Команда MS-DOS хранится в переменной dos_command, а ее параметры — в переменной option. В следующей программе-примере (листинг 7-21) перемен- ная option содержит символ | и команду тоге, активизирующие фильтр MS-DOS. В результате применения этой комбинации параметров командный процессор MS-DOS перенаправляет информацию, выводимую командой Dir, фильтру тоге. Фильтр постранично выводит результаты. СОВЕТ Перенаправить выходную информацию команды Dir на прин- тер (например, для распечатки содержимого каталога) или в файл по- зволяет символ >. Он используется так же, как |. /Л................................................. И Файл: RunDOS.js (Пример для WSH на JScript) // Автор: (с) G. Born И // Исполнение команды MS-DOS с помощью метода Run //**..........................................
ГЛАВА 7 Работа с объектами WSH 171 var command, doB.command, option Ц Получить объект WshShell. var WshShell = WScrlpt.CreateObject("WScript.Shell"); // Создать команду для вывода содержимого // папки Windows. Ц Вложенная команда для вызова командного процессора Ц Совет: при использовании переменной окружения XCOMSPECX Ц сценарий будет работать не только в Windows 95/98, // но и в Windows NT/2000, поскольку XCOMSPECX // содержит имя и адрес командного процессора. command = "XCOMSPECX /к "; Ц Вот команда MS-DOS. dos^command = "dir ” + "XWINDIRX”; // Можно задать и другие параметры: // | more - постраничный вывод // > PRN: - перенаправление на принтер // > Dir.txt - перенаправление в файл И option = "| more"; // Использование постраничного вывода. Ц Исполнить команду. WshShell.Run(command + dos_oommand + option); //*** Конец Листинг 7-21. RunDOSjs.
ГЛАВА 8 Получение вводимой пользователем информации в сценариях WSH С методами создания простых пользовательских диалоговых окон вы позна- комились в главе 6. В этой главе приводится описание способов вызова ди- алоговых окон, получающих информацию от пользователя в сценариях WSH. Для вызова диалогового окна ввода VBScript поддерживает функцию InputBox, но WSH и JScript эту функцию не поддерживают. Поэтому, чтобы получить аналогичное диалоговое окно ввода при использовании этих язы- ков, придется проявить изобретательность. Вызов диалогового окна ввода на VBScript Для вызова диалогового окна ввода VBScript поддерживает функцию InputBox. result = 1приГВох(текст[, [заголовок], [умолчание], [поз-Х], [поз-У]]) У диалогового окна имеется текст сообщения, текст заголовка и простое текстовое поле (рис. 8-1). В текстовое поле пользователь может ввести текст и щелкнуть одну из кнопок. Рис. 8-1. Диалоговое окно ввода, созданное функцией InputBox. Параметры функции InputBox таковы. Текст Необходимый параметр, определяющий сообщение, которое вы- водится в диалоговом окне. Это сообщение представлено строкой «Please Enter A Path» (рис. 8-1). И Заголовок Необязательный параметр, определяющий текст заголовка диалогового окна.
ГЛАВА 8 Получение вводимой пользователем информации в сценариях WSH 173 Умолчание Необязательный параметр, задающий значение по умолча- нию для текстового поля. Поз-Х и Поз-У Необязательные параметры, определяющие положение верхнего левого угла диалогового окна. ПРИМЕЧАНИЕ InputBox поддерживает еще два необязательных пара- метра — belpfile и context. Оба служат для подключения к диалоговому окну ввода справочного файла (в формате .hip). Так как создание пользо- вательских справочных файлов выходит за рамки книги, я опускаю их описание. Если необязательный параметр не задан, VBScript использует значение по умолчанию. Чтобы опустить необязательный параметр, надо оставить его место между двумя запятыми пустым: InputBox("Hello", "Test", , 100, 200) В отличие от MsgBox параметра кнопки у функции InputBox нет. Резуль- тат, возвращаемый InputBox при закрытии диалогового окна, зависит от того, какую кнопку для этого щелкнул пользователь: ОК возвращает содержимое текстового поля (т. е. данные, введенные пользователем), a Cancel отменяет результаты ввода и возвращает пустую строку. Переменная result позволяет проверить, ввел ли пользователь действительную информацию. Эта последовательность команд проверяет значение переменной result и выводит результат: If result = "" Then ' Проверить, не нажата ли кнопка Cancel. WScript.Echo "Canceled" Else WScript.Echo "You entered: " & result End If Программа на VBScript, выводит диалоговое окно ввода с текстовым по- лем, у которого есть значение по умолчанию (рис. 8-1), доступное для изме- нения пользователем. После того, как пользователь закроет диалоговое окно, сценарий выводит второе диалоговое окно с результатами (рис. 8-2 слева) или с сообщением об отмене (рис. 8-2 справа). Рис. 8-2. Информация, полученная от пользователя с помощью функции InputBox. Текст в диалоговом окне объявлен в заголовке как глобальные перемен- ные. Хранение текста в переменных позволяет максимально упростить вы- зов InputBox. В программе Input.vbs для разделения выходной информации на две строки также используется константа vbCrLf (листинг 8-1). Как и дру-
174 ЧАСТЬ II Интерактивная работа со сценариями гие примеры из этой главы, файл Input.vbs находится на прилагаемом ком- пакт-диске в папке \WSHDevGuide\ChapterO8. '************************************************ Файл: Input.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Получение на VBScript информации, вводимой пользователем. '************************************«*********** Option Explicit Dim Message, result Dim Title, Textl, Text2 ' Определить переменные диалоговых окон. Message = "Please enter a path” Title = "WSH sample user input - by G. Born" Textl = "User input canceled" Text2 = "You entered:" & vbCrLf ' Все готово для использования функции InputBox; ’ InputBox(prompt, title, default, xpos, ypos), параметры: ’ prompt: Текст диалогового окна ’ title: Заголовок диалогового окна ’ default: Значение текстового поля по умолчанию ' xpos/ypos: Координаты верхнего левого угла диалогового окна. ’ Если какой-либо из параметров не задан, VBScript использует значение ’ по умолчанию. result = InputBox(Message, Title, "C:\Windows", 100, 100) ' Обработать введенную пользователем информацию. If result = "" Then ' Пользователь отменил ввод WScrlpt.Eoho Textl Else WScrlpt.Echo Text2 & result End If '*** Конец Листинг 8-1. Input.vbs. Вызов диалогового окна ввода на JScript JScript не поддерживает функцию языка VBScript InputBox, a WSH — методы получения информации от пользователя. Например, такая команда, которую вы могли видеть в сценариях HTML: var txt = window.prompt("WSH sample ", "Name: ");
ГЛАВА 8 Получение вводимой пользователем информации в сценариях WSH 175 не сработает, так как WSH не поддерживает ни объекта window, ни метода prompt. Но преодолеть эти ограничения можно. Решение для WSH 2: объединение VBScript и JScript В WSH 2 можно объединить несколько сценариев в одном .wsf-файле. Если JScript не поддерживает какую-либо функцию, поддерживаемую VBScript, можно объединить сценарии на этих языках в одном файле. Например, орга- низовать поддержку функции InputBox в сценариях на JScript, написав на VBScript пользовательскую функцию, которая подключается к .wsf-файлу: Function WSHInputBox(Message, Title, Value) ’ Обеспечивает поддержку в JScript функции InputBox, ' которую можно вызывать в программах на JScript так: ' var result = WSHInputBox("Enter a name", "Input”, test); WSHInputBox = InputBox(Message, Title, Value) End Function В этой программе задействована обычная пользовательская VBScript-фун- кция WSHInputBox (такое имя ей дано во избежание конфликта имен с ори- гинальной функцией InputBox из VBScript). У пользовательской функции три параметра: Message, содержащий текст диалогового окна, Title, определяющий текст заголовка, и Value — значение текстового поля по умолчанию. WSHIn- putBox передает параметры, полученные от вызывающей программы, соответ- ствующим параметрам функции InputBox из VBScript. В следующей строке результат, полученный от InputBox, присваивается WSHInputBox, что и опре- деляет значение, возвращаемое WSHInputBox. WSHInputBox = InputBox(Message, Title, Value) После того как функция WSHInputBox определена, ее можно использовать в программах на JScript. Следующий код определяет две переменные и вы- зывает новую функцию: var title = "InputBox function for JScript”: var prompt = "Enter a name:"; var reeult = WSHInputBox(prompt, title, “New York"); Введенная пользователем информация, полученная из диалогового окна, возвращается в переменной result. Если она равна null, пользователь щелкнул кнопку Cancel, любое другое значение — пользователь щелкнул кнопку ОК. В следующей программе (она будет работать только в WSH 2) все приве- денные выше фрагменты собраны в одном .wsf-файле (листинг 8-2). Оба сценария расположены в одном элементе <job>, но в различных элементах <script>. Следует размещать сценарии в пределах одного элемента <job>, поскольку область действия функции ограничена заданием, в котором оп- ределена эта функция или процедура. Инструкция в первой строке застав- ляет обработчик рассматривать содержимое файла как действительный до- кумент XML: <?xml version="1.0" encoding="IS0-8859-1"?>
176 ЧАСТЬ II Интерактивная работа со сценариями В результате содержимое элементов <script> должно размещаться в эле- ментах CDATA (см. главу 1). Взгляните на диалоговое окно ввода и два диа- логовых окна с результатами ввода (рис. 8-3). • InputBox function tot JScript Рис. 8-3. Диалоговое окно ввода и окна с его результатами, созданные в сценарии WSH 2. <?xml version="1.0“ encoding="IS0-8859-1"?> <job id="IncludeExample"> <script language="VBScript"> <![CDATA[ Function WSHInputBox(Message, Title, Value) ' Обеспечивает поддержку в JScript функции InputBox, ’ которую можно вызывать в программах на JScript так: ’ var result = WSHInputBoxCEnter a name", "Input", test): WSHInputBox = InputBox(Message, Title, Value) End Function ]]> </script> <script language="JScript"> <![CDATAf // Это сценарий на JScript, который считывает введенную // пользователем информацию и выводит ее в диалоговом окне. Ц Он создает диалоговое окно с помощью функции WSHInputBox, // написанной на VBScript. var vbOKOnly = 0; // Константы для метода Popup var vblnformation = 64; var title = "InputBox function for JScript"; var prompt = "Enter a name:"; I/ Создать объект WshShell (он нужен для метода Popup), var WshShell = WScript.CreateObject("WScript.Shell");
ГЛАВА 8 Получение вводимой пользователем информации в сценариях WSH 177 И Открыть диалоговое окно ввода с помощью функции, И определенной в .wsf-файле. var result = WSHInputBox(prompt, title, "New York"); // Проверить, не щелкнул ли пользователь кнопку Cancel, if (result != null) { // Кнопка Cancel не использовалась; получить введенную 11 информацию. var intDoIt = WshShell.Popup("You entered: " + result, 0, "Result", vbOKOnly + vblnformation); } else { /I Пользователь щелкнул кнопку Cancel. var intDoIt = WshShell. PopupC'Sorry, no input", 0, "Result", vbOKOnly + vblnformation); } //*** Конец ]]> </script> </job> Листинг 8-1. WSH2lnput.wsf. Метод prompt из Internet Explorer Решение для получения вводимой пользователем информации в программах на JScript, с которым вы познакомились, хорошо работает в WSH 2. Посколь- ку WSH изначально разрабатывался как «клей» для связывания различных объектов и методов в единое приложение, в JScript есть и другие способы получения данных от пользователя. Чтобы подготовиться к главе 9, где пойдет речь о формах, рассмотрим способы получения доступа к Microsoft Internet Explorer и применения метода, создающего окно ввода. Если раньше вы занимались программированием сценариев на JavaScript для документов HTML, вам, вероятно, знаком метод prompt, позволяющий получать вводимые пользователем данные: var result = prompt("Please enter a name", "Chicago"); У метода prompt два параметра: первый содержит строку, которая выводит- ся в диалоговом окне ввода, а второй задает значение по умолчанию для тек- стового поля. Объектная модель Internet Explorer поддерживает метод prompt, но в объектной модели WSH аналогичный метод не поддерживается. Поэтому для
178 ЧАСТЬ II Интерактивная работа со сценариями поддержки метода prompt в программах WSH на JScript надо применять ме- тодику «встраивания» объектов Internet Explorer в сценарии WSH (эту мето- дику также можно использовать в отношении других объектов — она будет работать в WSH 1 и WSH 2, если доступны соответствующие объекты). Чтобы задействовать Internet Explorer и его объекты в сценариях WSH, надо получить ссылку на объект Internet Explorer Application. Этот объект можно создать следующим оператором на JScript: var oIE » WScript.CreateObject("InternetExplorer.Application"); Он выполняет два действия: во-первых, загружает в память экземпляр объекта. Это означает, что запускается новый экземпляр Internet Explorer. Во- вторых, присваивает ссылку на этот объект переменной-объекту oIE, посред- ством которой впоследствии можно получить доступ к свойствам и методам объекта Application. К несчастью, Application не поддерживает метода prompt, являющегося методом объекта Script. Этот объект — производный от объекта Document, который в свою очередь является производным от Application. Поэтому преж- де нужно получить ссылку на объект Script. Вот часть объектной модели Internet Explorer (рис. 8-4): Рис. 8-4. Часть объектной модели Internet Explorer 4 и Internet Explorer 5. Чтобы создать ссылку на объект Document, надо загрузить документ в объект Application. Объект Script поддерживается автоматически независимо от того, содержит ли документ код сценария (поскольку Internet Explorer поддерживает также внутренние команды сценария). Поэтому доступ к ме- тоду prompt объекта Script можно получить из иерархии объектов. Но это не все. Чтобы объект Document стал доступен, надо загрузить до- кумент в браузер. Однако окно браузера на рабочем столе нам ни к чему — требуется только диалоговое окно ввода. Можно подумать, что загрузить до- кумент и свернуть окно браузера не так-то легко, но решение в этом случае довольно простое. Загрузить документ в объект Internet Explorer Application позволяет метод navigate этого объекта. Для этого нужно просто указать име- на объекта и метода, разделенные точкой, и необходимые параметры. Так, следующий оператор (на JScript) загружает документ в Internet Explorer:
ГЛАВА 8 Получение вводимой пользователем информации в сценариях WSH 179 oIE.navigate("about: blank"); В этой команде используется метод navigate, поддерживаемый перемен- ной-объектом oIE (она содержит ссылку на экземпляр объекта Application Internet Explorer’a). Переданный этому методу параметр таит в себе малень- кую хитрость: так как настоящий документ не нужен, передав в качестве па- раметра внутренний ресурс «about:blank->, можно заставить Internet Explorer вывести пустую страницу документа (тот же результат получится, если на- брать в строке адреса Internet Explorer URL about: blank). Спрятать или показать окно браузера позволяет свойство Visible объекта Application-. oIE.Visible = 0; Этот оператор устанавливает свойство Visible в 0, в результате чего окно браузера будет спрятано. Показать его позволяет значение Visible = 1. По- скольку по умолчанию Visible равно 0, оператор oIEVisible в нашей програм- ме не потребуется. Итак, можно попробовать получить ссылку на объект Script, чтобы выз- вать метод prompt. К несчастью, объекты Script являются дочерними по от- ношению к объекту Document, а он недоступен, пока Internet Explorer загру- жает документ. Так как два процесса (сценарий и браузер) работают асинх- ронно, любая попытка получить ссылку на объект Script может окончиться неудачей. Вместо этого сценарий должен дождаться окончания загрузки до- кумента в браузер. Можно применить свойство Busy, характеризующее внутреннее состоя- ние браузера. Оно позволяет просто и надежно проверить, готов ли браузер к вызову методов. Если свойство Busy установлено (равно true), то браузер еще не закончил загрузку документа (и вызовы пока не разрешены). Цикл, организованный следующими операторами, задерживает исполне- ние сценария до тех пор, пока Internet Explorer не станет готов к загрузке документа: while (oIE.Busy) {} Если браузер уже готов к выполнению следующих запросов, можно со- здать ссылку на объект Script оператором на JScript: var obj = oIE.Document.Script; После его исполнения переменной-объекту obj будет присвоена ссылка на объект Script. Теперь можно вызвать метод prompt таким оператором: var input = obj.prompt("Enter a name", "Chicago"); Первый параметр определяет текст диалогового окна, а второй содержит значение, вводимое по умолчанию (рис. 8-5).
180 ЧАСТЬ II Интерактивная работа со сценариями Lxploier Usei Ptompl ’'f-pjw «лав» " . гй С«ПМ1 | асЧ 5?, ./?'. ъ„„стЛ '.... ______________________________________________________ Рис. 8-5. Диалоговое окно ввода, вызванное на JScript методом prompt. Заголовок окна определяет Internet Explorer, поэтому строка «JavaScript Prompt:» вставлена браузером (в этом примере — Internet Explorer 5). ПРИМЕЧАНИЕ Я разобрал этот пример с Internet Explorer довольно подробно, поскольку многие программисты макросов не имеют поня- тия о преимуществах программирования с помощью объектов. Когда я только начинал использовать объекты, меня одолевали те же сомне- ния. Но как только я понял, что для внедрения в сценарий функции другого приложения требуется всего лишь шесть операторов на JScript, то решил, что программирование с помощью объектов — лучшая шту- ка на свете (после бутербродов, конечно). В книге Advanced Develop- ment with Microsoft Windows Script Host 2.0 я знакомлю читателя co сце- нариями, в которых с помощью аналогичных методик внедряются функции Microsoft Word, Microsoft Excel, Microsoft Outlook и других приложений. Чтобы упростить использование метода prompt на JScript, я поместил весь код, взаимодействующий с Internet Explorer, в одну простую функцию — MyPrompt (имя MyPrompt выбрано во избежание конфликта с оригинальным методом prompt). Вот она: // Вспомогательная функция, создающая окно приглашения к вводу, function MyPrompt(text, value) { // Создать объект «приложение Internet Explorer». var oIE = WScrlpt.CreateObject("InternetExplorer.Application"); oIE.navigate("about:blank"); // Пустой документ HTML. oIE.Visible = 0; // Сделать // Internet Explorer невидимым. while (oIE.Busy) {} // Важно дождаться, пока Internet // Explorer не освободится. var obj = oIE.Document.Script; // Получить объект «сценарий», var input = obj.prompt(text, value); // Открыть окно ввода. oIE.Quit(); // Закрыть объект Internet Explorer, return input;
ГЛАВА 8 Получение вводимой пользователем информации в сценариях WSH 181 Кроме операторов, о которых шла речь выше, функция вызывает метод Quit, который поддерживает объект Internet Explorer Application, чтобы завер- шить Internet Explorer и освободить объект. Это делается так: oIE.Quit(); Следующий оператор возвращает вызывающему сценарию введенную пользователем информацию, полученную от метода prompt: return input; Для вызова функции MyPrompt требуется один оператор: var temp = MyPrompt("Enter a name", "Chicago"); Если пользователь щелкнул кнопку OK, MyPrompt возвращает строку с по- лученной от пользователя информацией. Если пользователь щелкнул Cancel, MyPrompt возвращает null. Значение, возвращенное функцией MyPrompt, про- веряет следующий код: if (temp != null) 11 Проверить результат функции. Вот все эти фрагменты полностью: сценарий вызывает диалоговое окно ввода, проверяет введенную пользователем информацию и выводит второе диалоговое окно (листинг 8-3). //•*****........*****..............******........... Ц Файл: Inputl.js (Пример для WSH на JScript) Ц Автор: (с) G. Born // И Получение информации, вводимой пользователем, в программе на JScript Ц с помощью метода prompt. В сценарии используется Internet Explorer. //**................................................ 11 Вспомогательная функция, создающая окно приглашения к вводу, function MyPrompt(text, value) { Ц Создать объект «приложение Internet Explorer». var oIE = WScript.CreateObjectC’InternetExplorer.Application"); oIE.navigate("about:blank"); 11 Пустой документ HTML oIE.Visible = 0; // Сделать Internet Explorer // невидимым. while (oIE.Busy) {} 11 Важно дождаться, пока Internet Ц Explorer не освободится. var obj = oIE.Document.Script; // Получить объект «сценарий». var input = obj.prompt(text, value); 11 Открыть окно ввода. oIE.Quit(); // Закрыть объект Internet Explorer, return input; } см. след. стр.
182 ЧАСТЬ II Интерактивная работа со сценариями // Здесь находится главная программа. var temp = MyPrompt("Enter a name”, "Chicago"); if (temp != null) // Проверить результат. { WScrlpt.Echo(temp); } else WScrlpt.Echo("No input"); //*** Конец Листинг 8-3. Inputl.js.
ГЛАВА 9 Работа с формами Хотя объектная модель WSH и языков JScript и VBScript не поддерживает ме- тоды и функции для создания и вывода форм, пользовательские формы тем не менее могут быть реализованы в сценарии. Я начну эту главу с разъясне- ния применения Microsoft Internet Explorer в качестве интерфейса для выво- да содержимого HTML-файла на примере усложненного диалогового окна About. Далее я расскажу, как с помощью интерфейса Internet Explorer выво- дить HTML-формы под управлением сценария WSH. Вы также научитесь пользоваться обработкой событий в сценариях WSH. Создание диалогового окна About с помощью Internet Explorer В предыдущих главах вы научились выводить простые диалоговые окна на JScript и VBScript методами Echo и Popup. Но, к сожалению, такие диалого- вые окна не позволяют выводить длинный текст с прокруткой, добавлять ги- перссылки и значки. В главе 8 вы познакомились с методикой доступа к Internet Explorer в сценарии WSH, а в этой главе узнаете, как создавать и вы- водить формы, используя Internet Explorer в качестве интерфейса. Но снача- ла рассмотрим один простой пример. С помощью Internet Explorer и HTML- файла мы создадим диалоговое окно About («О программе»), не требующее от пользователя ввода информации. В HTML-файл можно добавить любые элементы. Вывод HTML-файла методом showModalDialog Метод showModalDialog программы Internet Explorer позволяет выводить HTML-файлы. Этот метод, поддерживаемый объектом window, создает про- стое диалоговое окно, в котором выводится содержимое HTML-файла. Ниже показан простой HTML-файл, содержащий код сценария для загрузки дру- гого HTML-файла и вывода его содержимого в виде диалогового окна (ли- стинг 9-1)- Этот и другие примеры из этой главы находятся в папке \WSH- DevGuide\ChapterO9 на прилагаемом к книге компакт-диске. <html> <soript> function lnit()
184 ЧАСТЬ II Интерактивная работа со сценариями { window.showModalDialog("Testi.htm"); } </script> <body onload="init()"> </body> </html> Листинг 9-1. Test.htm. Сценарий этой HTML-страницы содержит функцию init, вызывающую метод showModalDialog. Internet Explorer предоставляет объект window авто- матически. Для showModalDialog нужен путь к HTML-файлу, который следу- ет вывести в модальном диалоговом окне (модальным называется диалого- вое окно, которое, пока не будет закрыто, не позволяет переключиться об- ратно в главное приложение). Эта методика позволяет выводить HTML-фай- лы с любым допустимым содержимым. ПРИМЕЧАНИЕ Если путь к другому HTML-файлу не задан, браузер будет искать этот файл в каталоге загруженного родительского HTML- файла. Вот HTML-содержимое диалогового окна About (листинг 9-2): <html> <head> <meta http-equiv="Content-Type" content=’’text/html; charset=IS0-8859-1”> <meta name="GENERATOR” content="Microsoft FrontPage Express 2.0”> <title>About dialog</title> </head> <body bgcolor=”#FEFFE8" bgproperties="fixed"> <h2 align="center">About WSH Scripting Tools</h2> <p align="center"> <a href="http://www.borncity.de“> <font size="2"> by G, Born </font> </a> </p> <P align=”center"> <font size="2”> <img src=”Line.gif" width="472" height=“26"> </font> </p> <h2 align«”center">Help</h2> <p align="center'’> <strong> Sorry, we are (still) thinking
ГЛАВА 9 Работа с формами 185 </strong> </р> <р align="center"> <font size="2”>try: </font> <a h ref="http://msdn.microsoft.com"> <font size="2">msdn.microsoft.com/scripting</font> </a> <font size="2"> instead</font> </p> <form> <p align=”center"> <input type=”button" name="B1" value="Close" onclick=”window.close()"> </p> </form> </body> </html> Листинг 9-2. About.htm. Этот HTML-код создает диалоговое окно (рис. 9-1). Тэг <title> определяет первую часть текста заголовка. Другие тэги создают текст статичного заго- ловка. Гиперссылки в окне About вставлены с помощью тэга <«>, графичес- кая линия вставлена с помощью тега <img>. Рис. 9-1. Диалоговое окно About в Internet Explorer. Добавляем кнопку Close Комбинация тэгов <form> и <input> позволяет добавить в HTML-файл код кнопки Close: см. след. стр.
186 ЧАСТЬ II Интерактивная работа со сценариями <form> <р align="center"> <input type="button" name=”B1" value="Close" onclick="window.close()"> </p> </fortn> Важно использовать внутри тэга <input> тип button, а не submit. В про- тивном случае при щелчке кнопки Close в Internet Explorer 5 откроет- ся второе окно. Когда пользователь щелкает кнопку Close, происходит событие onclick, и его обработчик вызывает метод ivindow.close. К сожалению, при вызове window.close открывается диалоговое окно с сообщением, что Web-страница пытается закрыть окно и запросом согласия пользо- вателя. Поэтому я преобразовал HTML-файл в приложение HTML (НТА). НТА тоже можно исполнять в Internet Explorer 5, но, поскольку это локальное приложение HTML, некоторые защитные параметры будут отключены. Щелчок кнопки Close на странице НТА сразу закроет окно. Превратить документ HTML в НТА-файл просто: для этого нужно лишь заменить расширение .htm wm.html на .hta. Вывод диалогового окна About на языке VBScript Я написал небольъой сценарий на VBScript, чтобы продемонстрировать вызов метода showModalDialog из сценария WSH без вывода окна Internet Explorer. Как вам известно из предыдущих глав, Internet Explorer вызывают операторы: Set oIE = WScrlpt.CreateObject("InternetExplorer.Application") oIE.Navigate "about:blank" ' Пустой документ Do While (oIE.Busy) ' Важно: ждать, пока Internet Explorer не освободиться. WScrlpt.Sleep 200 Loop Оператор WScriptSleep в теле цикла приостанавливает исполнение сцена- рия на 200 миллисекунд в каждом цикле. Это снижает загрузку процессора (см. также главу 13). Поскольку окно браузера скрыто, нужно лишь получить ссылку на объект и установить свойство Navigate, так чтобы в окне был показан пустой доку- мент. Свойству Visible объекта. Application программы Internet Explorer остав- лено значение по умолчанию О (т. е. окно невидимо). Как только браузер будет готов, следующий оператор вызовет метод showModalDialog-. oIE.Document.Script.showModalDialog path & "About.hta" Метод showModalDialog является методом объекта Internet Explorer Script, который содержится в субобъекте Document объекта Application. Чтобы по- лучить доступ к методу, в сценарии надо указать полный путь от объекта Application до объекта Script. Переменная-объект oIE, однако, содержит ссыл-
ГЛАВА 9 Работа с формами 187 ку на объект Application. Поэтому нужно просто добавить имена объектов Documentscript и метода showModalDialog к имени переменной-объекта о1Е. Параметром метода является путь к документу HTML (в качестве необязатель- ных параметров можно задать ширину и высоту диалогового окна). Сценарий может передавать методу абсолютный путь (например, «C:\Test\ Abouthta») в URL. Если пользователь перенесет HTML-файл в другую папку или на другой диск, сценарий WSH останавливается, сообщая об ошибке периода выполнения. Намного лучше держать документ HTML в той же пап- ке, где хранится сценарий WSH. При этом можно определить путь к докумен- ту HTML, получив путь к сценарию WSH. Таким образом, пользователь может произвольно перемещать файлы, пока HTML-файл остается в той же папке, что и сценарий. Путь к сценарию определяют операторы на VBScript: path = WScript.ScriptFullName path = Left(path, InStrRev(path, "\")) Первый читает путь и имя файла сценария с помощью свойства Script- FullName объекта WScript. Функция InStrRev в следующей строке ищет первый символ \ справа налево, начиная с последнего символа строки. Найдя его, функция Left формирует подстроку, куда входят символы с первого до теку- щей позиции в строке. Этой функции требуется строка и указатель на пос- ледний действительный символ строки. Позицию последнего действитель- ного символа возвращает функция InStrRev. Таким образом, из строки выре- зается имя файла, а результат присваивается переменной path. Преимуще- ство метода showModalDialog в том, что после его вызова исполнение сцена- рия приостанавливается до тех пор, пока пользователь не закроет диалого- вое окно. Следующая команда выводит сообщение (оно появляется после того, как окно браузера будет закрыто): WScript.Echo "Dialog box is closed" oIE.Quit ' Закрыть Internet Explorer. Во второй строке браузер завершается методом Quit. В противном случае экземпляр Internet Explorer останется в памяти до конца работы сценария. Вот полный исходный текст, иллюстрирующий использование метода show- ModalDialog (чтобы использовать этот пример с Internet Explorer 4, нужно заменить имя в команде загрузки на About.htm) (листинг 9-3). ' Файл: About.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Вывод модального диалогового окна About ’ с документом HTML при помощи Internet Explorer 5. Option Explicit Dim oIE ’ Объект Internet Explorer. см. след. стр.
188 ЧАСТЬ II Интерактивная работа со сценариями Dim path Dim Title ’ Получить путь к файлу сценария, так как документ HTML, который выводится в диалоговом окне, должен быть ’ в той же папке. path = WScrlpt.ScriptFullName path = Left(path, InStrRev(path, "\")) ’ Запустить Internet Explorer. Set oIE = WScrlpt.CreateObject("InternetExplorer.Application") oIE.navigate "about:blank” ’ Пустой документ. ' Окно InternetExplorer скрыто (задано по умолчанию), поэтому ' не нужно настраивать его дополнительно. ’ Важно: ждать, пока Internet Explorer не освободится. Do While (oIE.Busy) WScrlpt.Sleep 200 ’ Пауза 200 мс. Loop ’ Вывести диалоговое окно методом showModalDialog. ' В случае Internet Explorer 4 замените About.hta на About.htm. oIE.Document.Script.showModalDialog path & "About.hta" ' Это сообщение выводится после закрытия диалогового окна. WScript.Echo "Dialog box is closed" ' Очистка. oIE.Quit ’ Закрыть Internet Explorer. Set oIE = Nothing ’ Сбросить переменную-объект. '•** Конец Листинг 9-3. About.vbs. Вывод диалогового окна About на JScript Перенести пример с VBScript на JScript довольно просто (листинг 9-4): // Файл: About.vbs (Пример для WSH на JScript) И Автор: (с) G. Born // И Вывод модального диалогового окна About Ц с документом HTML при помощи Internet Explorer 5. /у************************************************ И Получить путь к файлу сценария, так как документ HTML, Ц который выводится в диалоговом окне, должен быть
ГЛАВА 9 Работа с формами 189 И в той же папке. var path = WScrlpt.ScriptFullName; Ц Имя сценария. path = path.substr(0, path.lastIndexOf("\\") + 1); И Запустить Internet Explorer. var oIE = WScrlpt.CreateObject("InternetExplorer.Application"); oIE.navlgateC'about: blank"); Ц Пустой документ // Окно InternetExplorer скрыто (задано по умолчанию), поэтому // не нужно настраивать его дополнительно. // Важно: подождать, пока IE не освободится. while (oIE.Busy) {WScrlpt.Sleep(200); } // Вывести диалоговое окно методом showModalDialog. И Для Internet Explorer 4 замените About.hta на About.htm. oIE.Document.Script.showModalDialog(path + "About.hta"); И Это сообщение выводится после закрытия диалогового окна. WScrlpt.Echo("Dialog box is closed"); // Очистка. oIE.Quit(); // Закрыть Internet Explorer. //*** Конец Листинг 9-3. Aboutjs. Создание формы с помощью Internet Explorer и WSH А теперь применим только что описанную методику для создания формы, позволяющей получать информацию от пользователя. Нам снова понадобят- ся Internet Explorer и HTML-страница. HTML-форма может состоять из тек- стовых полей, переключателей, флажков и других элементов (пример фор- мы с двумя текстовыми полями — на рис. 9-2). Единственная сложность в том, чтобы получить доступ к форме в окне браузера из сценария WSH. Рис. 9-2. Форма для ввода. HTML-код для формы HTML-форма — это документ HTML, содержащий несколько специальных тэ- гов. Вставить в документ элементы формы можно с помощью Microsoft Front-
190 ЧАСТЬ II Интерактивная работа со сценариями Page Express или любого другого редактора HTML. Следующий HTML-код (ли- стинг 9-5) создает форму, показанную выше (рис. 9-2). <html> <head> <title>Form input - by G. Bornc/title> c/head> cbody bgcolor=”silver" scroll="no"> <form name="ValidForm"> Name: cinput name="fName" type="TEXT" size="5">&nbsp; Age: cinput name="fAge" type="TEXT" size="3"> </form> </body> </html> Листинг 9-5. HTML-код, создающий форму. Заголовок окна формы определяется в блоке <head> тэгом <title>. Цвет фона формы задан в тэге <body> атрибутом bgcolor, значение которого — «silver». Атрибут scroll=«no» заставляет Internet Explorer скрыть вертикальную полосу прокрутки. Команды, создающие форму, внедрены между тэгами <form> ...</form>. Атрибут первого тэга пате назначает форме уникальное имя, которое нам понадобится позже. Два элемента управления созданы в форме тэгами <input>. cinput name="fName" type=”TEXT" size="5"> Имя элемента управления определяет атрибут пате. Атрибут type опре- деляет тип элемента управления (текстовое поле, кнопка и т. д.); атрибут size определяет размер элемента управления (длину его строки в символах). Если записать все эти тэги HTML в файл и загрузить его в Internet Explorer, в ре- зультате будет показана форма. ПРИМЕЧАНИЕ Я не запрограммировал кнопку Close (как показано на примере диалогового окна About), так как при вызове метода window.close обработчиком события onclick появляется диалоговое окно браузера с вопросом, закрыть ли браузер. Преобразование .htm-файла в .hta не влияет на это, поскольку Windows не загрузит приложение НТА в ука- занном порядке. Я решил просто позволить пользователю закрыть окно щелчком кнопки по умолчанию Close, расположенной в верхнем правом углу окна браузера. Позже я покажу другое решение, исполь- зующее кнопку Close в форме. Вывод формы А теперь напишем на VBScript сценарий WSH, использующий форму. Этот сценарий запускает Internet Explorer, загружает HTML-файл, содержащий форму, и читает из нее информацию, вводимую пользователем.
ГЛАВА 9 Работа с формами 191 Эта последовательность команд загружает Internet Explorer и выводит форму: Set oIE = CreateObjeotC'InternetExplorer.Application", "IE_") oIE.Left = 50 ' Положение окна и другие свойства. oIE.Top = 100 oIE.Height = 100 oIE.Width = 280 oIE.MenuBar = 0 ' Отключить некоторые панели. oIE.ToolBar = 0 oIE.StatusBar = 0 ' oIE.Resizable = 0 ’ Запретить изменение размера. oIE.navigate path & "Form1.htm" ’ Форма oIE.Visible = 1 ' Показать окно документа. Ключевое слово Set в первой строке присваивает переменной ссылку на объект Internet Explorer Application. Переменная-объект дает доступ к объек- тной модели Internet Explorer со всеми ее свойствами. Второй параметр, пе- реданный методу CreateObject, определяет префикс процедуры-обработчи- ка событий. Это позволяет WSH подключить события, генерируемые объек- том, к обработчикам события из сценария (см. разделы главы 7, посвящен- ные CreateObject и DisconnectObject). Здесь эта методика позволяет опреде- лить, когда пользователь закрыл форму. Свойства Lejt, Top, Height и Width задают положение и размер окна в сце- нарии WSH. Чтобы отключить меню, строку статуса и др., надо установить соответствующие свойства Internet Explorer (MenuBar, ToolBar и StatusBar) равными О. ПРИМЕЧАНИЕ Оператор oIEResizable = О запрещает изменение раз- меров окна документа. Я закомментировал его, потому что Internet Explorer 5 и 4 версий некорректно визуализировал границы формы, когда это свойство было установлено. Следующий оператор загружает HTML-файл: oIE. navigate GetPathQ & "Form1.htm” Я переместил операторы (те же, что и в предыдущем примере), которые извлекают путь к текущей папке, в процедуру GetPatb. Выше сказано, что пока Internet Explorer загружает документ, объект Script недоступен. Поэтому надо проверить свойство Internet Explorer Busy с помощью показанного ниже кода. Сценарий выполняет следующий цикл до тех пор, пока Internet Explorer не сообщит о завершении загрузки формы: Do While (oIE.Busy) WScript.Sleep 200 Loop
192 ЧАСТЬ II Интерактивная работа со сценариями При загрузке документа Internet Explorer устанавливает это свойство как True и сбрасывает в False, когда загрузка завершена. В результате вызова ме- тода WScriptSleep при каждом проходе цикла исполнение сценария приос- танавливается (что снижет нагрузку на процессор). После загрузки формы возникает проблема: сценарий WSH и окно брау- зера, в котором выводится форма, — два независимых процесса. Поэтому сценарий WSH должен ждать, пока пользователь не закроет форму. Я решил принять следующую стратегию. Внутри основной процедуры переменной ready присваивается значение False. Сценарий выполняет цикл, пока значение этой переменной не ста- нет True. Внутри процедуры-обработчика события lE OnQuit переменной присва- ивается значение True. Процедура IE_OnQuit вызывается, когда пользова- тель закрывает окно программы. Internet Explorer автоматически генери- рует это событие, так как к исходящему интерфейсу объекта «браузер» сценарий подключен параметром «1Е_» метода CreateObject. Далее можно запросить состояние формы: Do While (Not ready) WScrlpt.Sleep 500 ' Пауза на 0.5 с. Loop При закрытии окна браузера происходит событие enclose. Процедура- обработчик события из сценария читает информацию, введенную пользо- вателем, и присваивает переменной ready значение True. После выхода из цикла сценарий просто вызывает функцию MsgBox, чтобы вывести инфор- мацию, полученную от пользователя (рис. 9-3). Рис. 9-3. Результаты, которые выводятся в диалоговом окне сценарием WSH. Теперь поподробнее рассмотрим процедуру обработки события: Sub IE_0n0uit() ' При завершении IE вызывается обработчик события. ' Это происходит, если пользователь щелкает кнопку ОК. ' Получить значения. name = "Name: " & oIE.Document.ValidForm.fName.Value age = "Age: " & oIE.Document.ValidForm.fAge.Value ready = True ' Показать, что форма закрыта. End Sub Первый оператор получает информацию, вводимую пользователем в тек- стовое поле Name, и сохраняет ее в глобальной переменной name. Ее мож- но использовать в основной процедуре сценария.
ГЛАВА 9 Работа с формами 193 Пара слов о том, как получить из текстового поля данные, введенные пользователем. Этот оператор применяет следующую иерархию объектов: oIE.Document.ValidForm.fName.Value oIE — это переменная-объект, указывающая на объект «приложение» Internet Explorer, в его субобъект Document загружена форма. В HTML-коде через ат- рибут пате я присвоил форме имя объекта ValidForm. То же самое я сделал с помощью элемента пате для каждого элемента управления. Имя Valid- FormfName идентифицирует первое текстовое поле формы, а атрибут Value этого объекта содержит введенную пользователем информацию в виде тек- стовой строки. Прочитав оба значения и сохранив их в глобальных перемен- ных, обработчик события устанавливает переменную ready в True. После это- го он завершается и позволяет Internet Explorer закрыть окно браузера. Вот полный текст сценария (листинг 9-6). Файл: Forml.vbs (Пример для WSH на VBScript) Автор: (с) G. Born Получение вводимой в форме информации с помощью Internet Explorer 4 или 5 Option Explicit Const Title = "WSH sample form input - by G. Born" Dim oIE ' Объект Internet Explorer. Dim path ' Путь к файлу сценария. Dim ready ' Состояние формы (True = форма закрыта) Dim Text2 Dim name, age ' Значения, получаемые из формы Text2 = "You entered:" & VbCrLf ’ Запустить Internet Explorer и подключить обработчик события. Set oIE = WScript.CreateObject("InternetExplorer.Application", "IE_") oIE.Left = 50 ' Положение окна и другие параметры. oIE.Top = 100 oIE.Height = 100 oIE.Width = 280 oIE.MenuBar = 0 ' Отключить меню. oIE.ToolBar = 0 oIE.StatusBar = 0 ’ Закомментировано, так как вызывает сбои при выводе границы окна. ' oIE.Resizable = 0 ' Запретить изменение размеров. oIE. navigate GetPathO & "Form1.htm" ' Загрузить форму. см. след. стр.
194 ЧАСТЬ II Интерактивная работа со сценариями oIE.Visible = 1 ' Показать окно. ’ Важно: ждать, пока Internet Explorer не освободится. Do While (oIE.Busy) WScrlpt.Sleep 200 ' Пауза 200 мс. Loop ready = False ' Форма все еще открыта. ' Подождать, пока пользователь не закроет форму с помощью ’ кнопки Close в верхнем правом углу окна. В результате ' при обработке события enclose переменной ready будет присвоено значение True. Do While (Not ready) ' Ждать, пока форма не будет закрыта. WScrlpt.Sleep 500 ' Пауза 500 мс. Loop ’ Вывести данные, полученные процедурой-обработчиком события. MsgBox Text2 & vbCrLf & name & vbCrLf & age, _ vbOKOnly + vblnformation + vbSystemModal, Title ' Теперь все готово. Сценарий-пример завершается. ' Сюда можно добавить свой код. ’ Обработчик события и вспомогательная функция. Sub IE_0nQuit() ' При завершении IE вызывается обработчик события. ’ Это происходит, если пользователь щелкает кнопку 0К. ’ Получить значения. name = "Name: " & oIE.Document.ValidForm.fName.Value age = "Age: " & oIE.Document.ValidForm.fAge.Value ready = True ’ Показать, что форма закрыта. End Sub Function GetPathO ' Получить путь к файлу сценария, так как форма (HTML-файл) ' должна быть в той же папке. Dim path path = WScrlpt.ScriptFullName GetPath = Left(path, InStrRev(path, "\")) End Function ’*** Конец Листинг 9-6. Forml.vbs.
ГЛАВА 9 Работа с формами 195 Вывод формы с помощью сценария WSH на JScript Если вы предпочитаете писать сценарии на JScript, можете перенести эту программу на JScript. В сценарий WSH придется внести некоторые измене- ния, поскольку в документе HTML находится независимый сценарий. Также необходимо обратить внимание на чувствительность имен объектов и ме- тодов к регистру. Кстати, JScript не поддерживает функцию VBScript Left, позволяющую из- влечь путь. Вместо нее следует использовать метод substr объекта String. По- ложение последнего символа \ возвращает метод lastlndexOf объекта String. Вот эквивалент программы Forml.vbs на языке JScript (листинг 9-7). // Файл: Forml.js (Пример для WSH на JScript) Ц Автор: (с) G. Born И // Получение вводимой в форме информации с помощью // Internet Explorer 4 или 5 //......о................................... var Text2 = "You entered:\n”; // Запустить Internet Explorer и подключить обработчик события. var oIE = WScrlpt. CreateObjectC'InternetExplorer. Application", "IE_"); oIE.Left = 50; // Положение окна и другие свойства. oIE.Top = 100; oIE.Height = 100; oIE.Width = 280; oIE.MenuBar = 0; // Отключить меню. oIE.ToolBar = 0; oIE.StatusBar = 0; // Закомментировано, так как вызывает сбои при выводе границы окна. И oIE. Resizable = 0 // Запретить изменение размеров. oIE.navigate(GetPath() + "Form1.htm"); // Загрузить форму. oIE.Visible =1; // Показать окно. И Важно: ждать, пока Internet Explorer не освободится. while (oIE.Busy) {WScrlpt.Sleep(200)} // Пауза var ready = false; // Форма все еще открыта. И Подождать, пока пользователь не закроет форму о помощью // кнопки Close в верхнем правом углу окна, В результате // при обработке события onclose переменной ready будет присвоено значение True. while (I ready) {WSoript.Sleep(500)} // Пауза. // Вывести данные, полученные процедурой-обработчиком события. см. след. стр.
196 ЧАСТЬ II Интерактивная работа со сценариями WScript.Echo(Text2 + "\n" + name + "\n" + age); // Теперь все готово. Сценарий-пример завертается. И Сюда можно добавить свой код. И Обработчик события и вспомогательная функция function IE_0nQuit() { Ц При завершении ТЕ вызывается обработчик события. Ц Это происходит, если пользователь щалкает кнопку ОК. // Получить значения. name = "Name: " + oIE.Document.ValidForm.fName.value; age = "Age: " + oIE.Document.ValidForm.fAge.value; ready = true; // Показать, что форма закрыта. } function GetPathO { // Получить путь к файлу сценария, так как форма (HTML-файл) И должна быть в той же папке. var path = WScript.ScriptFullName; path = path.substr(O, path.last!ndexOf("\\") + 1); return path; 1 //*** Конец Листинг 9-7. Forml.js. Вывод диалогового окна выбора файла Иногда сценарий должен давать пользователю возможность выбора файла для дальнейшей обработки. WSH не поддерживает метод, который выводил бы диалоговое окно выбора файла. В главе 12 я разъясню, как выбирать дис- ки, файлы и папки из диалогового окна Browse For Folder, но это не самое лучшее решение. Теперь, зная, как задействовать интерфейс Internet Explorer, можно прибегнуть к хшрости: форма с кнопкой Browse позволяет пользо- вателю выбрать файл в диалоговом окне Windows по умолчанию (рис. 9-4). Тэг HTML для вывода текстового поля с кнопкой Browse можно записать таю <input typa="file" slze="75" naioe="fFile"> Здесь использован такой же тэг <input> , что в предыдущем примере со- здал текстовое поле. Если атрибут type установлен как «file», в форме выво- дится текстовое поле с кнопкой Browse. Атрибут size определяет длину тек- стового поля, а пате — имя объекта этого элемента управления. Заголовок Browse выводится браузером автоматически (конкретный текст заголовка зависит от локализованной версии браузера).
ГЛАВА 9 Работа с формами 197 Форма состоит из текстового поля и кнопки Browse (рис. 9-4 слева). Если пользователь щелкает кнопку Browse, браузер открывает диалоговое окно Choose File (рис. 9-4 справа) и дает возможность выбрать файл. Когда пользо- ватель закроет диалоговое окно, в текстовом поле выводится выбранный файл с указанием пути к нему. File Selection Dialog |CAWSHDevCuide\Qinptert)1\'vBSc<iptvf>s Please Шег a path and a Qe name, or click Browse to select a file Confirm the selection by clicking the window's Close button ~~ ti - C..T - — ___ Fwtiww Script vbs < ----------- Рис. 9-4. Вывод диалогового окна Choose File в сценарии WSH. Код для обработки диалогового окна Choose File основан на предыдущем примере. Изменены лишь некоторые сообщения и имя текстового поля (ли- стинг 9-8). Ц Файл: Form2.js (Пример для WSH на JScript) Ц Автор: (с) G. Born И И Вывод диалога выбора файла с помощью Ц Internet Explorer 4 или 5 ................................. var Text2 = "File selected:\n"; Ц Запустить Internet Explorer и подключить обработчик события. var oIE = WScript.CraateObject("InternetExplorer.Application", "IE_"); var file = Ц Инициализировать имя файла. oIE.Left = 50; oIE.Top = 100; oIE.Height = 200; oIE.Width = 580; oIE.MenuBar = 0; Ц Положение окна и другие свойства. И Отключить меню. см. след. стр.
198 ЧАСТЬ II Интерактивная работа со сценариями oIE.ToolBar = 0; oIE.StatusBar = 0; // Закомментировано, так как вызывает сбои при выводе границы окна. // oIE.Resizable - 0 // Запретить изменение размеров. oIE.navigate(GetPath() + "Form2.htm"); // Загрузить форму. oIE.Visible =1; // Показать окно. // Важно; ждать, пока Internet Explorer не освободится. while (oIE.Busy) {WScript.Sleep(200)} // Пауза var ready = false; // Форма все еще открыта. // Подождать, пока пользователь не закроет форму с помощью // кнопки Close в верхнем правом углу окна. В результате // при обработке события onolose переменной ready будет И присвоено значение True. while (I ready) {WScript.Sleep(500)} // Пауза. // Вывести имя файла, полученное процедурой-обработчиком события. WScript.Echo(Text2 + ”\n" + file); // Теперь все готово. Сценарий-пример завершается. // Сюда можно добавить свой код. // Обработчик события и вспомогательная функция function IE_0nQuit() { // При завершении IE вызывается обработчик события. И Это происходит, если пользователь щелкает кнопку ОК. // Получить значения. file = oIE.Document.ValidForm.fFile.value; ready = true; // Указать, что форма закрыта. } function GetPathO { И Получить путь к файлу сценария, так как форма (HTML-файл) // должна быть в той же папке. var path = WSoript.SoriptFullName; path = path.eubstr(0, path.lastlndexOfCW') + 1); return path; } //*** Конец Листинг 9-8. Form2.js.
ГЛАВА 9 Работа с формами 199 Улучшаем форму У приведенных выше примеров был один недостаток: в них не реализована кнопка ОК, позволяющая пользователю подтвердить результаты ввода. Улуч- шенное решение должно соответствовать следующим правилам-. М документ HTML должен обеспечивать форму элементами управления, а поддержку обработки WSH должен обеспечивать минимальный сценарий; сценарий WSH должен обрабатывать форму и читать введенные в нее данные. При использовании этого подхода документ HTML содержит лишь не- большой сценарий, который поддерживает рудиментарные функции полу- чения сведений о состоянии формы. Обращение к значениям формы про- изводится прямо из сценария WSH (см. выше). Создание HTML-формы Первое, что нужно сделать для реализации формы, которая получает инфор- мацию от пользователя, — это создать документ HTML, который обеспечит форму нужными элементами. Документ HTML с формой проще всего создать в редакторах HTML, таких как Microsoft FrontPage или FrontPage Express. Пос- ле создания формы надо изменить исходный текст HTML и добавить не- сколько элементов сценария. Взгляните на HTML-форму с расширенными возможностями и диалоговое окно сценария WSH с полученной от формы информацией, которую ввел пользователь (рис. 9-5). Рис. 9-5. HTML-форма с расширенными возможностями и ее результаты в диалоговом окне сценария WSH.
200 ЧАСТЬ II Интерактивная работа со сценариями Вот тэги HTML, с помощью которых создается эта форма: <form name=”ValidForm"> <р> Name: &nbsp; cinput type="text” size="5" name="fName"> &nbsp; Age: &nbsp; cinput type="text" size="3" name="fAge"> cbr> Password: &nbsp; cinput type="password" size=”12" maxlength="8" name="fPassw"> &nbsp; &nbsp; cinput type="button“ name="Button1" value="0K’’> cbr> cinput type="checkbox" name="fPrinter" value=”1" checked> Printer &nbsp; cinput type="checkbox" name="fScreen" value="2"> Screen cbr> Remarks: cbr> ctextarea co1b="40" rows="5" name="fRemark"> c/textarea> </p> c/form> Форма реализована между тэгами <form> ... </form>. Атрибут name тэга <form> задает имя объекта (позже оно потребуется для доступа к элементам формы в сценариях). У каждого элемента формы есть уникальное имя, за- данное в собственном HTML-тэге. А вот как вставить текстовое поле: cinput type="text" size="5" name="fName"> Атрибут type задает тип элемента формы. Можно ограничить размер тексто- вого поля, установив атрибут size. Для каждого тэга нужно задать атрибут пате, чтобы позже идентифицировать соответствующий элемент в сценарии. Для текстовой области поля ввода надо установить тэги <textarea~> ...</ textarea>. Эти тэги идеальны для сбора большого объема текстовых данных. Комбинируя тэги <input> и <textarea>, можно создать любую форму по же- ланию. После создания формы необходимо поместить в документ HTML несколь- ко вспомогательных функций. Эта процедура инициализирует элементы формы при загрузке документа:
ГЛАВА 9 Работа с формами 201 Sub Window_OnLoad() ' Здесь мы можем инициализировать форму (не обязательно). Set TheForm = Document.ValidForm ’ Получить объект. TheForm.fName.Value = .... Инициализировать элемент управления fName. ready = 0 ' Пользователь не завершил ввод информации. End Sub При загрузке документа HTML вызывается процедура обработки события Windotv_OnLoad. Показанная выше процедура с помощью необязательного оператора получает ссылку на объект «форма» и присваивает ее перемен- ной-объекгу TheForm. Этот (необязательный) код помещает в первое тексто- вое поле (JName) пустую строку: TheForm.fName.Value = "" ' Инициализировать элемент управления fName. Можно также добавить операторы, инициализирующие другие элементы формы (в этом примере они не нужны). Последний оператор должен быть обязательно: ready = 0 ' Пользователь не завершил ввод информации. Содержащий форму браузер работает как асинхронный процесс, поэто- му нужен специальный механизм для координирования его с программами на VBScript/JScript. В этом примере переменная ready использована как флаг, который показывает, щелкнул ли пользователь в форме кнопку ОК. Когда форма загружена, переменная ready устанавливается в 0 (это означает, что форма все еще в режиме ввода). Пользователь может заполнить поля формы и щелкнуть кнопку' ОК, что приведет к освобождению формы и возврату управления сценарию. Выше сказано, что процесс браузера с документом HTML работает независимо от процесса сценария WSH. Чтобы заставить Internet Explorer закрыть окно браузера (перед этим он должен показать диалоговое окно предупреждения и запросить подтверждение у пользователя), к тэгу <input> кнопки ОК мож- но добавить: onclick = "window.close()" Как я говорил, попытка избежать такого поворота событий с помощью формы НТА в сценарии не принесла успеха, поэтому я выбрал другой под- ход: событие onclick должно обрабатываться внут ри сценария HTML в самом документе. В результате форму должен закрыть сценарий WSH. Следующий пример HTML-кода с помощью небольшой хитрости сообща- ет сценарию WSH о том, что пользователь щелкнул кнопку ОК. При щелчке вызывается процедура обработки события OnClick объекта Button 1, а пере- менной ready присваивается значение 1. Sub Button1_0nClick ' Если пользователь щелкает ОК, об этом надо сообщить сценарию ' WSH путем установки флага ready.
202 ЧАСТЬ II Интерактивная работа со сценариями ready = 1 ' Пользователь завершил ввод информации. End Sub Можно реализовать еще одну небольшую функцию, CheckVal, чтобы сце- нарий WSH проверял внутреннее состояние значения ready. Publio Function CheckValO ' Эта функция вызывается сервером, чтобы проверить, ' щелкнул ли пользователь кнопку ОК. CheckVal = ready End Function CheckVal возвращает значение переменной ready. Если оно равно 1, WSH знает, что пользователь щелкнул кнопку ОК. Вот исходный код HTML целиком (листинг 9-9): <html> <head> cmeta http-equiv="Content-Type" content="text/html; charset=iso-8859-1”> cmeta name=”GENERATOR" content="Microsoft FrontPage Express 2.0"> <title> Form input - by G. Born </title> </head> Cbody bgcolor="#COCOCO" scroll="no"> Cscript language="VBScript"> cl- Dim ready Public TheForm Sub Button1_0nClick ' Еоли пользователь щелкает OK, об этом надо сообщить сценарию ' WSH путем установки флага ready. ready = 1 ' Пользователь завершил ввод информации. End Sub Sub Window_OnLoad() ' Здесь мы можем инициализировать форму. Set TheForm = Document.ValidForm TheForm. fName. Value = ready = 0 ' Пользователь не завершил ввод информации. End Sub Public Function CheckValO ' Эта функция вызывается сервером, чтобы проверить, ' щелкнул ли пользователь кнопку ОК.
ГЛАВА 9 Работа с формами 203 CheckVal = ready End function </script> ch3> Form c/h3> <hr> <form name="ValidForm"> <P> Name: &nbsp; cinput type="text" size="5" name="fName"> &nbsp; Age: &nbsp; cinput type="text" size="3" name=”fAge"> cbr> Password: &nbsp; cinput type=’password" size="12" maxlength="8" name=“fPassw"> &nbsp; &nbep; Cinput type="button" name=”Button1" value="0K"> cbr> cinput type="checkbox” name=“fPrinter" value="1" checked» Printer Anbsp; cinput type=”checkbox" name="fScreen" value=”2"> Screen cbr> Remarks: cbr> ctextarea cols="40" rows="5" name="fRemark”> c/textarea> </p> c/form> c/hr> c/body> c/html> Листинг 9-9. Form3.htm. СОВЕТ Созданную форму можно сохранить как шаблон (так как в ней уже есть необходимый код сценария). Чтобы создать новую фор-
204 ЧАСТЬ II Интерактивная работа со сценариями му, загрузите сценарий в редактор, например, в Microsoft FrontPage. Затем внесите изменения и добавьте к форме элементы управления. После сохранения результата в новом HTML-файле останется лишь настроить сценарий WSH, чтобы он обрабатывал элементы управле- ния формы. Но код сценария HTML при этом останется неизменным. Вывод HTML-формы Теперь у нас есть документ, содержащий форму, и несколько функций сце- нария. Осталось лишь создать сценарии WSH, которые будут вызывать фор- му и получать вводимую пользователем информацию. Сценарий должен за- пустить экземпляр Internet Explorer, загрузить в него документ HTML и про- верить состояние флага документа ready. Основные методики решения этих задач вы уже видели в приведенных выше примерах. Пользователь может закрыть форму, заполнив ее поля и щелкнув кнопку ОК. На этом этапе нужен метод, с помощью которого сценарий WSH смог бы узнать, что пользователь щелкнул кнопку ОК. Ранее я познакомил вас с функцией, которая возвращает состояние флага ready. Следующие команды зацикливают сценарий, пока значение ready не станет равно 1 (что свиде- тельствует о нажатии кнопки ОК). ' Ждать, пока пользователь щелкнет кнопку ОК. ' Использовать функцию CheckVal. Do ’ Ждать результатов. Loop While (oIE.Document.Script.CheckValO = 0) Переменная-объект oIE указывает на объект Application процесса Internet Explorer, который является родительским объектом объектов Documentscript. После выхода из цикла доступны все данные, полученные от пользовате- ля. Вспомните из предыдущих примеров способ доступа к значению, введен- ному в форме. Доступ к значению первого текстового поля дает оператор: oIE.Document.ValidForm.fName.value Свойство value содержит значение, которое пользователь ввел в тексто- вое поле JName (в JScript имена чувствительны к регистру). Это значение всегда хранится в виде строки. Аналогичный код позволяет получить доступ к любому из элементов формы в сценарии WSH. Значения текстовых полей позволяют проверить информацию, вводимую пользователем. Если введен- ное значение неприемлемо, можно вывести соответствующее сообщение. Кстати, эта методика также позволяет записывать данные в элементы уп- равления формы, например, для инициализации значений текстовых полей в сценарии. Получив всю информацию из формы, ее можно закрыть: oIE.Quit Эта команда выполняет метод Quit объекта, на который ссылается пере- менная-объект oIE. В результате Internet Explorer закрывает документ HTML
ГЛАВА 9 Работа с формами 205 и завершает приложение. Значения, полученные от формы, выводит функ- ция MsgBox. Кстати, вызов этой функции с константой vbSystemModal не дает Windows перевести диалоговое окно на задний план. Полный исходный текст программы на VBScript таков (листинг 9-10): Файл: Form3.vbs (Пример для WSH на VBScript) Автор: (с) G. Born ' Получение данных, введенных в форму, с помощью ’ Internet Explorer 4 или 5 '***********************************************' Option Explicit Const Title = "WSH sample form input - by G. Born" Dim oIE ' Объект Internet Explorer ' Глобальные переменные для значений формы. Dim name, age, password, printer, screen, remark Dim Text2 Text2 = "You entered:" & vbCrLf ' *** Запустить Internet Explorer. *** Set oIE = WScript.CreateObject("InternetExplorer.Application") oIE.Left = 50 ' Положение окна и другие свойства. oIE.Top = 100 oIE.Height = 380 oIE.Width = 450 oIE.MenuBar = 0 ' Отключить меню. oIE.ToolBar = 0 oIE.StatusBar = 0 ' Закомментировано, так как вызывает сбои при выводе границы окна. ’ oIE.Resizable = 0 ' Запретить изменение размеров. oIE.navigate GetPath() & "Form3.htm" ' Форма oIE.Visible = 1 ' Показать окно. ' Важно; ждать, пока Internet Explorer не освободится. Do While (oIE.Busy) WScrlpt.Sleep 200 ’ Пауза 0.2 с. Loop ’ Попытка инициализации значения текстового поля из сценария. oIE.Document.ValidForm.fRemark.Value = "No remarks" ' Ждать, пока пользователь щелкнет кнопку 0К. см. след. стр.
206 ЧАСТЬ II Интерактивная работа со сценариями ' Использовать функцию CheckVal. On Error Resume Next ' Обработка закрытия IE. Do ’ Ждать, пока пользователь щелкнет кнопку ОК. WScript.Sleep 200 ' Пауза 0.2 с. Loop While (oIE.Document.Script.CheckVal() = 0) Если из-за закрытия формы возникнет ошибка, выйти из сценария. If Err о 0 Then WScript.Echo "Sorry, a run-time error occurred while checking" & " the OK button ” & vbCrLf & _ "Error: ” & Err. Number & " " & _ "I guess the form was closed; no input values..." WScript.Quit ’ конец сценария. End If On Error GoTo 0 ' Отключить обработку ошибок. ’ Пользователь щелкнул 0К; получить значения. name = "Name: " & oIE.Document.ValidForm.fName.Value age = "Age: " & oIE.Document.ValidForm.fAge.Value password = "Password: " & oIE.Document.ValidForm.fPassw.Value printer = "Printer: " & oIE.Document.ValidForm.fPrinter.Value _ & " Status: " & oIE.Document.ValidForm.fPrinter.Checked screen = "Screen: " & oIE.Document.ValidForm.fScreen.Value & " Status: ” & oIE.Document.ValidForm.fScreen.Checked remark = "Remarks: " & oIE.Document.ValidForm.fRemark.Value MsgBox Text2 & vbCrLf & name & vbCrLf & _ age & vbCrLf & password & vbCrLf & _ printer & vbCrLf & screen & vbCrLf & _ remark, vbOKOnly + vblnformation + vbSystemModal, Title oIE.Ouit ‘ Закрыть Internet Explorer. Set oIE = Nothing ' Сбросить переменную-объект. ' Все готово. Function GetPathO ' Получить путь к файлу сценария, так как форма (HTML-файл) ' должна быть в той же папке. Dim path path = WScript.ScriptFullName GetPath = Left(path, InStrRev(path, "\")) End Function '*** Конец Листинг 9-9. Form3.vbs.
ГЛАВА 9 Работа с формами 207 Реализация на JScript Реализация этой программы на JScript (листинг 9-11) используется анало- гичный подход. Не забывайте: имена переменных чувствительны к регистру. //*****“......*.................. И Файл: Form3.js (Пример для WSH на JScript) Ц Автор: (с) G. Born И И Получение данных, введенных в форму, с помощью И Internet Explorer 4 или 5 И....................................... var vbOKOnly = 0; // Константы VB для диалогового окна. var vblnformation = 64; var vbSystemModal = 4096; var Title = "WSH sample form input - by G. Born"; var Text2 = "You entered:\n"; // ... Запустить Internet Explorer. *** var oIE = WScrlpt.CreateObject("InternetExplorer.Application"); oIE.left=50; // Положение окна oIE.top = 100; oIE.height = 380; oIE.width = 450; И и другие свойства. oIE.menubar = 0; oIE.toolbar = 0; И Отключить меню. oIE. statusbar = 0; oIE.navigate (GetPathO + "Form3.htm"); // Форма. oIE.visible = 1; // Показать окно. И Важно: ждать, пока Internet Explorer не освободится. while (oIE.Busy) {WScrlpt.Sleep(200);} И Попытка инициализации значения текстового поля из сценария. oIE.Document.ValidForm.fRemark.value = "No remarks"; 11 Ждать, пока пользователь щелкнет кнопку ОК. И Использовать функцию CheckVal. try { while (oIE.Document.Script.CheckVal()==0) {WScrlpt.Sleep(200);} //Ждать. } catch (e) { см. след. стр.
208 ЧАСТЬ II Интерактивная работа со сценариями WScrlpt.Echo("Sorry, a run-time error occurred while checking" + ” the OK button \n” + "I guess the form was closed; no input values...”); WScrlpt.Quit(); // Конец сценария. } И Пользователь щелкнул ОК; получить значения. name = "Name: " + oIE.Document.ValidForm.fName.value; age = "Age: " + oIE.Document.ValidForm.fAge.value; password = "Password: " + oIE.Document.ValidForm.fPassw.value; printer = "Printer: " + oIE.Document.ValidForm.fPrinter.value + " Status: " + oIE.Document.ValidForm.fPrinter.checked; screen = "Screen: " + oIE.Document.ValidForm.fScreen.value + " Status: " + oIE.Document.ValidForm.fScreen.checked; remark = "Remarks: " + oIE.Document.ValidForm.fRemark.value; var WshShell = WScrlpt.CreateObject("WScript.Shell"); WshShell.Popup (Text2 + "\n" + name + "\n"+ age + "\n" + "\n" + password + "\n" + printer + "\n" + screen + "\n" + remark,0, Title, vbOKOnly + vblnformation + vbSystemModal); oIE.Quit(); // Закрыть Internet Explorer. function GetPath () { // Получить путь к сценарию. var path = WScrlpt.ScriptFullName; // Имя сценария path = path.substr(0, path.last!ndexOf("\\") + 1); return path; ) //*** Конец Листинг 9-11. Form3.js. Теперь вам известны основные методики расширения возможностей сце- нариев WSH с помощью пользовательского интерфейса. В книге Advanced Development ivith Microsoft Windows Script Host 2.0 я дополню их формами ActiveX (данная тема выходит за рамки этой книги). Я также покажу, как ис- пользовать в сценариях индикатор выполнения, гистограммы и другие эле- менты.
ЧАСТЬ I I I ОСОБЫЕ ВОЗМОЖНОСТИ СЦЕНАРИЕВ
ГЛАВА 1 О Создание ярлыков Эта глава посвящена методам объекта WshShell, позволяющим создавать яр- лыки на рабочем столе, в меню Start и в других местах Microsoft Windows. Вы также узнаете, как представлять URL в виде ярлыков. Ярлыки: основные понятия Ярлыки в Windows обеспечивают связь с приложением, файлом или папкой. Обычно для создания ярлыка в Windows пользователю достаточно перетащить, удерживая правую кнопку, значок файла или папки в другую папку, на рабочий стол (Desktop) или в меню Start и выбрать в контекстном меню команду Create Shortcuts) Неге. Другой способ создания ярлыка — щелкнув правой кнопкой файл или папку, выбрать в контекстном меню команду Create Shortcut. В результате появляется файл-ярлык с расширением .Ink. Он содержит такие свойства, как значок и пути для целевого и рабочего каталогов. Если щелкнуть правой кнопкой значок ярлыка и выбрать Properties, появится окно свойств (рис. 10-1): Рис. 10-1. Вкладка Shortcut окна свойств.
ГЛАВА 10 Создание ярлыков 211 Для манипуляции файлами-ярлыками и их свойствами в Windows служат API-функции. В WSH созданием ярлыков занимаются методы объекта WshShell. Применение метода CreateShortcut Новый ярлык в WSH создается методом CreateShortcut объекта WshShell- Set WshShell = WScrlpt.CreateObjectC'WScript.Shell") Set object = WahShell.CreateShortcut("shortcut_file.lnk") Первый VBScript-оператор создает экземпляр объекта WshShell и сохра- няет ссылку в переменной WshShell. Во втором операторе к объекту WshShell применяется метод CreateShortcut. Методу CreateShortcut требуется параметр — имя файла создаваемого яр- лыка. Метод порождает объект WshShortcut, но реальный файл-ярлык при этом не создается. Затем переменной присваивается полученный экземпляр объекта. В следующих операторах вы можете задать для него свойства. Что- бы сохранить изменения (при создании нового файла или обновлении су- ществующего), вы должны применить к этому объекту метод Save. ПРИМЕЧАНИЕ Применение метода CreateShortcut с именем нового ярлыка не приводит к созданию .Ink-файла, пока не вызван метод Save. Если файл, заданный как параметр метода CreateShortcut, уже существу- ет, свойства этого файла изменятся на те, что устанавливаются для объекта WshShortcut. Создание ярлыка для текущего файла-сценария Для простоты создадим ярлык, имеющий ссылку на его собственный исход- ный файл. Файл-ярлык будет храниться в той же папке, что и сценарий. В начале работы сценария программа попросит пользователя подтвержде- ние на создание файла-ярлыка. Если тот щелкнет кнопку ОК, сценарий оп- ределит путь для текущего файла-сценария с помощью такого VBScript-кода: path = WScrlpt.ScriptFullName path = Left(path, InStrRev(path, "\")) Эти операторы читают имя файла-сценария вместе с путем и убирают из него собственно имя файла. Кроме того, вам нужно имя файла без расширения: Lnk_Tltle = WScrlpt.ScriptName Lnk_Title = Left(Lnk_Title, InStrRev(Lnk_Title, ".") - 1) Первый оператор читает имя файла сценария. Во втором выполняется поиск в строке, начиная с ее конца, точки, разделяющей имя файла и его расширение. Затем расширение удаляется из строки VBScript-функцией Left. Для создания ярлыка вам нужен объект WshShell-. Set WshShell = WScrlpt.CreateObject("WScrlpt.Shell")
212 ЧАСТЬ 111 Особые возможности сценариев Этот объект является подобъектом WScript (и не имеет ничего общего с Windows-объектом Shell, который мы рассмотрим в следующих главах). Те- перь можно применить к объекту WshShell метод CreateShortcut-. Set Shortcut = WshShell.CreateShortcut(path & Lnk_Title & ".Ink") В параметре метода CreateShortcut объекта WshShell указывается путь и имя нового .lnk-файла. Эта информация берется из переменных path и Lnk_Title. При выполнении метода CreateShortcut ссылка на новый объект WshShortcut присваивается переменной Shortcut. ПРИМЕЧАНИЕ В этот момент файла-ярлыка на диске пока нет. Все, чем вы располагаете, — это экземпляр объекта WshShortcut, определенный в переменной объекта. Затем вы можете задать свойства для объекта WshShortcut. Для создания реального файла-ярлыка служит метод Save. Создав экземпляр объекта WshShortcut, можно указать его свойства: Shortcut.TargetPath = WScript.ScriptFullName Свойство TargetPath определяет путь файла, на который указывает ярлык. В нашем примере в качестве такового устанавливается текущий файл сцена- рия путем присвоения свойству TargetPath свойства ScriptFullName объекта WScript. Во втором операторе задается рабочий каталог ярлыка: Shortcut.WorkingDirectory = path Для свойств, не заданных в сценарии (таких, как стиль окна или «горячая клавиша»), принимаются значения по умолчанию. Теперь для объекта «ярлык» методом Save создается новый .Ink-файл: Shortcut.Save Этому методу параметры не требуются. Вот полная и подробная реали- зация сценария (листинг 10-1). Как и другие примеры в этой главе, данный файл находится на прилагаемом к книге компакт-диске в папке \WSHDev- Guide\Chapter 10. 'it********************************************** ' Файл: Shortcut.vbs (Пример для WSH на VBScript) ’ Автор: (с) G. Born ' Создание ярлыка для текущего файла в ' папке файла сценария 'А************************************ Option Explicit Dim Text, Title, Lnk_Title, Shortcut Dim WshShell ' Переменная-объект. Dim status, Ready_txt, path
ГЛАВА 10 Создание ярлыков 213 ’ Определяем сообщения для пользователя. Ready_txt = "Shortcut created" Text = "Creates a shortcut to this script file in the current folder" Title = "WSH sample - by G. Born" status = MsgBox(Text, vbOKCancel + vblnformation, Title) If (status <> vbOK) Then WScrlpt.Quit 1 ' Нажата кнопка Cancel. End if ' ••• Получаем путь для файла сценария. path = WScrlpt.ScriptFullName path = Left(path, InstrRev(path, "\")) ' Получаем имя файла сценария без расширения. Lnk_Title = WScrlpt.ScriptName Lnk_Title = Left(Lnk_Title, InStrRev(Lnk_Title, ".") - 1) ' Создаем новый объект WshShell, чей метод CreateShortcut нам нужен. Set WshShell = WScrlpt.CreateDbject("WScrlpt.Shell") ' Создадим ярлык методом CreateShortcut. Set Shortcut = WshShell.CreateShortcut(path & Lnk_Title & ".Ink") ' Задание свойств ярлыка. Сначала устанавливаем целевую папку. Shortcut.TargetPath = WScrlpt.ScriptFullName ' Задаем рабочий каталог. Shortcut.WorkingDirectory = path Shortcut.Save ’ Создаем ярлык. WScript.Echo Ready_txt ' Сообщение о выполнении. '•** Конец Листинг 10-1. Shortcut.vbs. Реализация на JScript Версия на JScript, показанная ниже (листинг 10-2), использует те же объек- ты, методы и свойства — разница только в синтаксисе: И........................................*........ Ц Файл: Shortcut.js (Пример для WSH на JScript) Ц Автор: (с) G. Born см. след. стр.
214 ЧАСТЬ III Особые возможности сценариев И И Создание ярлыка для текущего файла в И папке файла сценария И................................................. var vbOKCancel = 1; 11 Создаем переменные. var vblnformation = 64; var vbCancel - 2; var L_Welcome_MsgBox_Message_Text = "Creates a shortcut to this script file in the current folder"; var L_Welcome_MsgBox_Title_Text = "WSH sample - by G. Born"; Welcome(); // Выводим диалоговое окно Welcome. И Получаем путь для сценария. var path = WSoript.ScriptFullName; path = path.substr(0, path.lastIndexOf("\\") + 1); // Получаем имя файла сценария, отбрасывая расширение. var Lnk_Title = WSoript.ScriptName Lnk_Title = Lnk_Title.substr(O, Lnk_Title.lastIndexOf(".")); 11 Получаем объект WshShell. var WshShell = WScrlpt.CreateObjectC'WScript.Shell"); 11 Создаем объект “ярлык". var Shortcut = WshShell.CreateShortcut(path + Lnk_Tltle + ".Ink"); 11 Задаем свойства ярлыка. Shortcut.TargetPath = WScrlpt.ScriptFullName; Shortcut.WorklngDirectory = path; Shortcut.Save(); // Сохраняем файл ярлыка. WScrlpt.Echo("Shortcut created"); ///////////////////////////////////////////////////////////// // 11 Welcome // function WelcomeO { var WshShell = WScrlpt.CreateObjectC'WScript.Shell"); var intDoIt; IntDoIt = WshShell.Popup(L_Welcome_MsgBox_Message_Text, 0, L_Welcome_MsgBox_Title_Text, vbOKCancel + vblnformation);
ГЛАВА 10 Создание ярлыков 215 if (IntDoIt == vbCancel) { WScript.Quit(1); 11 Нажата кнопка Cancel. } } 11*** Конец Листинг 10-2. Shortcut.js. Ярлыки: идем дальше Теперь, изучив основные действия по созданию ярлыка посредством WSH, рассмотрим, как с помощью объекта WshShortcut и других объектов создать ярлыки в одной из папок, априори существующих в Windows, таких как Desktop, меню Start и т. п., которые обобщенно называются специальными папками (special folders). Применение объекта SpecialFolders Метод CreateShortcut требует, чтобы вы задали путь к целевой папке. Однако точное указание специальной папки, например, для рабочего стола (Desk- top) или меню Start, может вызвать затруднения. Поскольку папка Windows (в Windows 95/98) содержит вложенные пап- ки с именами Start Menu и Desktop для всех элементов меню Start и Desktop, можно было бы взять переменную среды WINDIR и дополнить ее путем для нужной вложенной папки. Однако, если в среде Windows 95/98 заведено несколько пользователей, оболочка Windows создает в подкаталоге \Profiles индивидуальные специальные папки для каждого пользователя. Кроме того, некоторые программы, например, Tweak UI и даже Microsoft Internet Explorer, позволяют изменить размещение специальной папки, а Windows 2000 поддерживает несколько специальных папок в разных местах. К счастью, существует способ поиска специальных папок — это свойство SpecialFolders объекта WshShell, возвращающее объект WshSpecialFolders с на- бором путей для всех специальных папок. Из этого набора можно получить путь к любой папке, для которой вы хотите создать ярлык на рабочем столе или в меню Start. Вот специальные папки объекта WshSpecialFolders, которые встречаются в Microsoft Windows NT 4/2000 (табл. 10-1): Табл. 10-1. Специальные папки в Windows Имена папок__________Описание_____________________________________________ AllUsersDesktop Хранят данных для всех пользователей. Некоторые подката- AllUsersStartMenu логи есть только в Windows NT и Windows 2000. Есть и та- AllUsersPrograms кие, что встречаются и в Windows 98. AllUsersStartup см. след. стр.
216 ЧАСТЬ III Особые возможности сценариев Табл. 10-1. (продолжение') Имена папок Описание Desktop Содержит все ярлыки, созданные текущим пользователем на рабочем столе. Favorites Указывает на меню Favorites. Fonts Указывает на папку, содержащую все установленные шриф- ты (файлы и файлы-ярлыки для шрифтов в других папках). MyDocuments Указывает на папку пользователя Му Documents. NetHood Пустая папка, используемая в качестве шаблона для сетевой среды. PrintHood Пустая папка, используемая для отображения принтеров в сети. Programs Указывает на подкаталог, куда помещаются определенные для пользователя пункты подменю Programs меню Start. Recent Указывает на папку Recent Files. SendTo Указывает на папку SendTo. StartMenu Указывает на определенную для пользователя папку Start Menu. Startup Указывает на определенную для пользователя папку Startup. Templates Указывает на папку ShellNew, содержащую шаблоны для со- здаваемых файлов. С помощью этих имен вы получите размещение специальной папки из набора WshSpecialFolders. Реальное имя папки, возвращаемое WshSpecial- Folders, может отличаться от приведенного здесь. ПРИМЕЧАНИЕ WshShell-SpecialFolders(strFolderName) возвращает Null, если папки, указанной в strFolderName, нет. Так, в Windows 95 нет пап- ки AllUsers\Desktop; для strFolderName = AllUsersDesktop свойство Spe- cialFolders возвратит Null. Вывод списка всех специальных папок В следующем примере выводится диалоговое окно со списком всех специ- альных папок на локальном компьютере. Как видите, специальные папки на данных компьютерах находятся в разных местах (рис. 10-2). Кроме того, имена папок зависят от того, какая локализованная версия Windows установ- лена на машине. Диалоговое окно слева на иллюстрации относится к немец- кой Windows 98, а окно справа — к Windows 2000 (текущий зарегистриро- вавшийся пользователь — Administrator). Диалоговое окно Windows 2000 по- казывает две специальные папки для рабочего стола и меню Start. Для доступа к свойству SpecialFolders служит объект WshShell-, его создает оператор: Set WshShell = WScrlpt.CreateObject("WScript.Shell") Метод CreateObject создает копию объекта WshShell и присваивает ссыл- ку на этот объект переменной WshShell. Этот объект позволяет получить свойство SpecialFolders, содержащее набор WshSpecialFolders.
ГЛАВА 10 Создание ярлыков 217 Рис. 10-2. Пути для специальных папок в Windows 98 (слева) и Windows 2000 (справа). Свойства Count и length объекта WshSpecialFolders содержат число элемен- тов в этом наборе. ПРИМЕЧАНИЕ Объект WshSpecialFolders имеет два одинаковых свой- ства Count и length для совместимости с VBScript и JScript. Обычно Count применяется в VBScript, a length — в JScript. Для перебора всех элементов набора в VBScript можно применить опера- тор цикла ForEach.Jn-. For Each 1 In WshShell.SpecialFolders WScrlpt.Echo 1 Next Этот цикл будет выводить все специальные папки набора в отдельных диалоговых окнах. Переменная г содержит элемент (путь), получаемый из набора WshSpecialFolders. Вот как получить пути для всех специальных папок и отображения их в одном диалоговом окне (листинг 10-3). ' Файл: SpecialFolder.vbs (Пример для WSH на VBScript) ’ Автор: (с) G. Born ' Применение свойства SpecialFolders объекта WshShell ' для вывода списка всех специальных папок в диалоговое окно 'А**************************************************** Option Explicit Dim Text, Title, 1 Dim WshShell ’ Переменная-объект. см. след. cmp.
218 ЧАСТЬ III Особые возможности сценариев Text = "The following special folders have been found:" & _ vbCrLf & vbCrLf Title = "WSH sample - by G. Born” Создаем объект WshShell, с помощью которого мы получим доотуп ' к объекту WshSpecialFolders. Set WshShell = WScript.CreateObject("WSoript.Shell") ' Получаем пути для специальных папок. For Each i In WshShell.SpecialFolders Text = Text & i & vbCrLf Next WScript.Echo Text ' Показываем результат. '*** Конец Листинг 10-3. SpecialFolder.vbs. Реализация на JScript Вот реализация на языке Jscript (листинг 10-4): ...................................................... Ц Файл: SpecialFolder.js (Пример для WSH на JScript) И Автор: (с) G. Born И Ц Применение свойства SpecialFolders объекта WshShell И для вывода спиока всех специальных папок в диалоговое окно var Text = "The following special folders have been found:\n\n"; var Title = "WSH eample - by G. Born"; I/ Создаем объект WshShell, о помощью которого мы получим Ц доступ к объекту WshSpecialFolders. var WshShell = WScript.CreateObject("WScript.Shell"); I/ Получаем пути для специальных папок. var objAdr = WshShell.SpecialFolders III Внимание: такой цикл не годится Ш for (var i in objAdr). /// { Ш WScript.Echo ("*" + i + ”\n“); III ) Ш Поэтому мы будем делать так: for (var i = 0; i < objAdr.length; i++) { Text = Text + objAdr(i) + "\n";
ГЛАВА 10 Создание ярлыков 219 } WScrlpt.Echo(Text); // Показываем результат. И*** Конец Листинг 10-4. SpecialFolder.js. Поиск пути для специальной папки Свойство SpecialFolders позволяет получить путь для указанной вами специ- альной папки. Набор WshSpecialFolders не только получает путь, но и возвра- щает локализованные имена папок, поэтому ваш сценарий не зависит от локализованных версий Windows. Следующая пара операторов VBScript отображает путь к папке Desktop: Set WshShell = WScrlpt.CreateObject("WScrlpt.Shell”) WScript.Echo "Desktop: " & WshShell.SpeclalFoldersC'Desktop”) В первой строке создается экземпляр объекта WshShell, который предостав- ляет свойство SpecialFolders. Во второй — запрашивается элемент набора WshSpecialFolders через свойство SpecialFolders. В нашем примере имя папки Desktop используется как индекс, показывающий, что объект WshSpecialFolders должен возвратить только один элемент из набора. Поскольку Item является свойством по умолчанию для объекта WshSpecialFolders, вам не нужно задавать имя свойства Item, чтобы получить путь к папке Desktop. В следующей VBScript-программе (листинг 10-5) этот подход служит для получения нескольких специальных папок и отображения результатов в ди- алоговом окне (рис. 10-3). '****************************************************** ' Файл: SpecialFolderl.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Применение свойства SpecialFolders объекта WshShell * для вывода в диалоговое окно списка заданных ' специальных папок ******************************************************* Option Explicit Dim Text, Title Dim WshShell Text = "The following special folders have been found:" & _ vbCrLf & vbCrLf Title = "WSH sample - by G. Born” ' Создаем объект WshShell, с помощью которого мы получим доступ ’ к объекту WshSpecialFolders. см. след. стр.
220 ЧАСТЬ III Особые возможности сценариев Set WshShell = WScrlpt.CreateObjectC’WScript.Shell") ’ Получаем пути для специальных папок. Text = Text & "Desktop: ’’ & WshShell.SpeclalFoldersC’Desktop”) & vbCrLf Text = Text & "Startmenu: ” & _ WshShell.SpecialFolders("Startmenu") & vbCrLf Text = Text & “Startup: " & _ WshShell.SpecialFoldersC’Startup") & vbCrLf Text = Text & "MyDocuments: " & _ WshShell.SpecialFoldersC'MyDocuments") & vbCrLf Text = Text & "Templates: " & WshShell.SpecialFoldersC'Templates") & vbCrLf WScrlpt.Echo Text ' Показываем результат. '*** Конец Листинг 10-5. SpecialFolderl .vbs. Рис. 10-3. Пути для некоторых специальных папок. Реализация на JScript А вот реализация на языке Jscript (листинг 10-6): /Л*....*..*.*..*...........*........................ // Файл: SpecialFolderl.js (Пример для WSH на JScript) // Автор: (с) G. Born // // Применение свойства SpecialFolders объекта WshShell // для вывода в диалоговое окно списка заданных // специальных папок var Text = "The following special folders have been found:\n\n”; var Title = "WSH sample - by G. Born"; // Создаем объект WshShell, с помощью которого мы получим // доступ к объекту WshSpecialFolders. var WshShell = WScrlpt.CreateObjectC’WScript.Shell”);
ГЛАВА 10 Создание ярлыков 221 И Получаем пути для специальных папок. Text = Text + "Desktop: " + WshShell. SpecialFoldersC'Desktop") + "\n"; Text = Text + "Startmenu: " + WshShell.SpecialFoldersC'Startmenu") + "\n"; Text = Text + "Startup: " + WshShell.SpecialFolders("Startup") + "\n”; Text = Text + "MyDoouments: " + WshShell.SpecialFolders("MyDocuments") + "\n"; Text = Text + "Templates: " + WshShell.SpecialFolders("Templates") + "\n"; WScript.Eoho(Taxt); // Результат. //*** Конец Листинг 10-6. SpecialFolderl js. Создание ярлыка на рабочем столе Перейдем к созданию ярлыка на рабочем столе. В нашем примере будет со- здан ярлык для стандартного редактора Windows. При выполнении приме- ра на экране появится диалоговое окно для подтверждения создания этого ярлыка. Если щелкнуть ОК, код сценария: 1. создаст объект WshShell для доступа к свойству SpecialFolders и методу CreateShortcut-, 2. найдет путь для папки текущего рабочего стола с помощью свойства SpecialFolders объекта WshShell-, 3- создаст объект WshShell. В следующем VBScript-коде создается ссылка на объект WshShell, отыски- вается путь для папки Desktop, задается заголовок для файла-ярлыка и вызы- вается метод CreateShortcut-. Set WshShell = WScript.CreateObject("WScript.Shell") DesktopPath = WshShell.SpecialFoldersC'Desktop") Lnk_Title = "\Editor.lnk" Set Shortcut = WshShell.CreateShortcut(DesktopPath & Lnk_Title) Переменная DesktopPath содержит путь для папки Desktop, a Lnk_Title — имя .ink-файла. Далее вы установите несколько свойств объекта WshShortcut. В свойстве TargetPath нового объекта задается команда, выполняемая при двойном щелчке значка ярлыка: Shortcut.TargetPath = WshShell.ExpandEnvi ronmentStrings("XWINDIRX\Notepad.exe") Метод ExpandEnvironmentStrings расширяет строку переменной %WINDIR%. Иначе говоря, метод находит папку Windows, содержащую редактор Windows
222 ЧАСТЬ III Особые возможности сценариев Notepad.exe. После того, как к папке добавлена строка «\Notepad.exe», форми- рование исполняемой команды завершено. Теперь зададим для ярлыка рабочий каталог, который приложения ис- пользуют для хранения временных и других файлов. Shortcut.WorklngDirectory = WshShell.ExpandEnvironmentStrings(”%WINDIRX\Temp”) Мы установили подкаталог Windows\Temp для этого свойства, потому что редактору рабочий каталог не нужен. Свойство WindowStyle определяет режим, в котором будет показано окно приложения после активизации ярлыка: Shortcut.Windowstyle = 1 Это свойство может принимать одно из трех значений: 1 = обычное (normal); 13 = развернутое (maximized); 7 = свернутое (minimized). Эти стили могут быть применены только в случае, когда окно приложе- ния было закрыто в предыдущем сеансе в режиме Обычное (Normal). В свойстве IconLocation задается ссылка на значок для данного ярлыка: Shortcut.IconLooation = _ WshShell.ExpandEnvironmentSt rings("XWINDIRX\Notepad. exe, 0") Эта команда устанавливает в качестве значка ярлыка первый значок из файла Notepad.exe. ПРИМЕЧАНИЕ В Windows файлы EXE и DLL могут содержать несколь- ко значков, номера которых начинаются с 0. Кроме того, вы можете использовать такие библиотеки значков, как Moricons.dll и Shell32.dll, находящиеся в папке Windows или во вложенной в нее папке \System. Но помните, что расположение этих файлов зависит от ОС. Так, в Windows 2000 эти файлы находятся в подкаталоге \System32, а в Win- dows 95/98 — в \System. Свойству IconLocation вы можете также при- своить путь для .bmp- или .ico-файла. Когда свойства заданы, можно создать файл ярлыка методом Save. Вот полная реализация сценария на языке VBScript (листинг 10-7): Файл: Shortcutl.vbs (Пример для WSH на VBScript) Автор: (с) G. Born Создание ярлыка для редактора Windows на рабочем столе Option Explicit Dim Text, Title, Lnk_Title Dim WshShell ' Переменная-объект.
ГЛАВА 10 Создание ярлыков 223 Dim status, Ready_txt Dim Shortcut, DesktopPath Ready_txt = "Shortcut to the Windows Editor on the Desktop” Text = "Creates a shortcut to the Windows Editor on the Desktop" Title = "WSH sample - by G. Born" ’ Спрашиваем пользователя, создавать ли ярлык. status = MsgBox(Text, _ vbOKCancel + vblnformation, Title) If (status <> vbOK) Then WSoript.Quit 1 ’ Нажата кнопка Cancel. End If ' Создаем объект WshShell, о помощью которого мы получим доступ ' к объекту WshSpecialFolders. Set WshShell = WScript.CreateObjeot("WScript.Shell") ' Получаем путь для папки Desktop ' о помощью объекта WshSpecialFolderB . DesktopPath = WshShell.SpeoialFolders("Desktop") ' Получив путь для папки Desktop, для создания ярлыка ' мы применяем метод CreateShortcut . Lnk_Title = "\Editor.lnk" Set Shortcut « wehShell.CreateShortout(DesktopPath & Lnk_Title) ' Задаем свойства ярлыка. ' Целевая папка. Shortcut.TargetPath = WshShell.ExpandEnvi ronmentStringe("XWINDIRX\Notepad.exe") ' Рабочий каталог. Shortcut.WorkingDirectory = _ WshShell.ExpandEnvi ronmentSt rings(”XWINDIRX") ' Стили окна Windows 1 = обычное, 3 = развернутое, 7 = свернутое Shortcut.Windowstyle = 1 ' Значок ярлыка. Shortcut.IconLocation = _ WshShell.ExpandEnvironmentStrings("XWINDIRX\\Notepad.exe, 0") Shortcut.Save ' Создаем файл-ярлык. WScript.Echo Ready_txt ' Сообщение о выполнении. '**» Конец Листинг 10-7. Shortcut! .vbs.
224 ЧАСТЬ III Особые возможности сценариев Реализация на JScript А вот реализация на языке JScript (листинг 10-8): //•******•«***•*****•а**************************** // Файл: Shortcut!.js (Пример для WSH на JScript) // Автор: (с) G. Born // // Создание ярлыка для редактора Windows // на Рабочем столе //************************************************ var vbOKCancel = 1; // Задаем переменные. var vblnformation = 64; var vbCancel = 2; var L_Weloome_MsgBox_Message_Text = "Creates a shortcut to the Windows Editor on the Desktop"; var L_Welcome_MsgBox_Title_Text = "WSH sample - by G. Born"; WelcomeO; // Показываем диалоговое окно Welcome. // Метод для создания ярлыка. var WshShell = WScript.CreateObject("WScript.Shell"); // С помощью объекта WshSpecialFolders получаем путь для Desktop, var DesktopPath = WshShell.SpecialFoldersC'Desktop"); // Создаем файл-ярлык на рабочем столе, var Shortcut = WshShell.CreateShortcut(DesktopPath + "\\Editor.Ink"); // Задаем свойства объекта; в XWINDIRX задана папка Windows. Shortcut.TargetPath = WshShell.ExpandEnvi ronmentSt rings("XWINDIRX\\Notepad.exe"); Shortcut.WorkingDirectory = WshShell.ExpandEnvi ronmentSt rings("XWINDIRX"); Shortcut.Windowstyle = 1; // Обычное окно. Shortcut.IconLocation = WshShell.ExpandEnvironmentStrings("XWINDIRX\\Notepad.exe, 0"); Shortcut.Save(); // Сохраняем ярлык. WScript.Echo("Shortcut to the Windows Editor on the Desktop"); /////////////////////////////////////////////////////////// // // Welcome //
ГЛАВА 10 Создание ярлыков 225 function WelcomeO { var WshShell = WScrlpt.CreateObject("WScript.Shell"); var IntDoIt; IntDoIt = WshShell.Popup(L_Welcome_MsgBox_Message_Text, 0, L_Welcome_MsgBox_T itle_T ext, vbOKCancel + vblnformation ); if (IntDoIt == vbCancel) { WScrlpt.Quit(); } } //*** Конец Листинг 10-8. Shortcut 1 .js. Создание ярлыка в меню Start Теперь добавим ярлык в меню Start. Но сначала нужно создать новую запись (или группу) в группе Programs меню Start. А затем поместим в нее ярлык для Notepad. ПРИМЕЧАНИЕ Для создания ярлыка в новой группе в отличие от со- здания в уже существующей, такой, например, как Accessories, требу- ется несколько дополнительных шагов. Перед применением метода CreateShortcut нужно убедиться, что новая группа существует. В принципе эта задача ненамного трудней предыдущей: надо вызвать метод CreateShortcut, передав ему в качестве параметра путь для целевой пап- ки и имя файла-ярлыка. Файл ярлыка назовем Editor.lnk. Не хватает только пути для папки, где будет размещаться ярлык. Этот путь должен указывать на группу \Programs\Born меню Start. Для поиска пути Startmenu\Programs можно использовать свойство Spe- cialFolders объекта WshShell. Но так как нам нужно поместить ярлык в груп- пу, в путь нужно добавить имя подкаталога. ВНИМАНИЕ Попытка создания ярлыка в несуществующей папке мето- дом Save объекта WshShortcut приведет к ошибке периода выполнения. Как убедиться, что папка для создаваемого ярлыка существует, и как со- здать папку для новой группы программ? Можно вызвать метод и создать папку командой MS-DOS вроде MD. Но есть и более элегантный способ (в VBScript-коде): Sub MakePath(pathx) On Error Resume Next ' Создаем папку, если ее нет.
226 ЧАСТЬ III Особые возможности сценариев Dim fso, f Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.CreateFolder(pathx) Set fso = Nothing Set f = Nothing On Error GoTo 0 End Sub Эту процедуру следует вызывать с параметром, содержащим полный путь для папки, например, «C:\Windows\Bom\». Если во время выполнения возник- нет ошибка, благодаря оператору On Error Resume Next программа перейдет к выполнению следующего оператора. ПРИМЕЧАНИЕ О работе с объектом FileSystemObject см. главу 12. Затем создается объект FileSystemObject. Его методы позволяют манипули- ровать файлами и папками. Метод CreateFolder создает папку, имя которой передается ему в качестве параметра. Если папка существует, возникнет ошиб- ка периода выполнения, и, благодаря оператору On Error Resume Next, сце- нарий перейдет к следующему оператору, не изменив ничего в файловой системе. Если папки не было, она будет создана. Вы вызовете процедуру MakePatb, передав ей в качестве аргумента путь для папки Born, а затем примените метод CreateShortcut-. MakePath Path Set Shortcut = WshShell.CreateShortcut(Path & "Editor.Ink”) Получив объект WshShortcut, вы можете задать для него свойства. Редак- тор Notepad находится в папке Windows в файле Notepad.exe, поэтому путь для этого файла вы можете получить, как показано в предыдущем примере. Кроме уже рассмотренных свойств ярлыка, можно задать свойство Hotkey, которое устанавливает клавишу быстрого вызова (hot key) ярлыка: Shortcut.Hotkey = "Alt+Ctrl+E" В этом коде устанавливается сочетание клавиш для запуска редактора Notepad. ВАЖНО Быстрый вызов можно использовать только для ярлыков на рабочем столе и в меню Start. Обнаружив быстрый вызов, Windows просматривает эти папки. Вы должны убедиться, что заданное вами сочетание клавиш не используется в других программах, иначе быст- рый вызов не сработает. В результате вызова метода Save объекта WshShortcut будет создан ярлык в меню Start. Убедиться в его наличии можно, открыв меню. В ветви Programs/ Bom должен появиться новый элемент для запуска редактора Windows. Взгля- ните на реализацию примера на VBScript (листинг 10-9): '*******************t***************************** ' Файл: Startmenu.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born
ГЛАВА 10 Создание ярлыков 227 ' Создание ярлыка для редактора Notepad ' в группе команд Born меню Start ************************************************** Option Explicit Dim Text, Title Dim WshShell ' Переменная-объект. Dim statue, Ready_txt Dim Shortcut, Path Ready_txt = "Shortcut created" Text = _ "Creates a shortcut to Notepad on the Start menu (Group ""Born”")" Title = "WSH sample - by G. Born" ' Спрашиваем пользователя, создавать ли ярлык, status = MegBox(Text, _ vbOKCancel + vblnformation, Title) If (status <> vbOK) Then WScript.Quit 1 ' Нажата кнопка Cancel. End If ' Создаем объект WshShell, с помощью которого мы ' получим доступ к объекту WshSpecialFolders. Set WshShell = WScript.CreateObject("WScript.Shell") ’ Получаем путь для папки Startmenu/Programs ’ с помощью объекта WshSpecialFolders. Path = WSHShell.SpecialFolders("Programs") ' Внимание: элемент попадает в папку Programs\Born. Path = Path & "\Born\" ’ Проверяем наличие пути; если его нет, создаем группу. MakePath Path ' Нам известен путь для меню Start; создаем ярлык ' методом CreateShortcut . Set Shortcut = WshShell.CreateShortcut(Path & "Editor.Ink") ' Задаем свойства ярлыка. ' Целевая папка. Shortcut.TargetPath = WshShell. ExpandEnvi ronmentStringsCXWINDIRX\Notepad.exe") ' Рабочий каталог. см. след. стр.
228 ЧАСТЬ III Особые возможности сценариев Shortcut.WorkingDirectory = WshShell.ExpandEnvi ronmentSt rings("XWINDIRX") ' Стиль окна Windows 1 = обычное, 3 = развернутое, 7 = свернутое Shortcut.Windowstyle = 1. ' Значок ярлыка. Shortcut.IconLocation = _ WshShell.ExpandEnvironmentStrings("XWINDIRX\Notepad. exe, 0") ' Быстрые клавиши для ярлыка. Shortcut.Hotkey = "Alt+CtrL+E" Shortcut.Save ’ Создаем ярлык. WScript.Echo Ready_txt ' Сообщаем о выполнении задания. Sub MakePath(pathx) On Error Resume Next ' Создаем папку, если ее нет. Dim fso, f Set fso = CreateObjectCScripting.FileSystemObject") Set f = fso.CreateFolder(pathx) Set fso = Nothing Set f = Nothing On Error GoTo 0 End Sub '*** Конец Листинг 10-9. Startmenu.vbs. Реализация на JScript Реализация на языке JScript показана ниже (листинг 10-10). Для проверки наличия папки внутри функции MakePath я обратился к методу FolderExists (см. о нем главу 12). Для перехвата ошибок периода выполнения (начиная с версии 5.0) можно использовать блок операторов try...catch (похожий на On Error Resume Next в VBScript). И Файл: Startmenu.js (Пример для WSH на JScript) И Автор: (с) G. Born И И Создание ярлыка для редактора Notepad И в группе команд Born меню Start var vbDKCancel = 1; И Объявляем переменные.
ГЛАВА 10 Создание ярлыков 229 var vblnformation = 64; var vbCancel = 2; var L_Welcome_MsgBox_Message_Text = "Creates a shortcut on the Start menu"; var L_Welcome_MsgBox_Title_Text = “WSH eample - by G. Born"; Welcome(); // Показываем диалоговое окно Welcome. // Получаем объект с методом для создания ярлыка var WshShell = WScript.CreateObject("WScript.Shell"); // Получаем путь для папки Startmenu/Programs И с помощью объекта WshSpecialFolders. var Path = WshShell.SpecialFolders("Programs"); // Внимание: Элемент попадает в папку Programs\Born. Path = Path + "\\Born\\"; // Проверяем наличие пути; если его нет, создаем группу. MakePath(Path); // Нам известен путь для меню Start; создаем ярлык // методом CreateShortcut. var Shortcut = WshShell.CreateShortcut(Path + "Editor.Ink"); // Задаем свойства ярлыка; сначала - целевой путь. Shortcut.TargetPath = WshShell.ExpandEnvi ronmentStrings("XWINDIRX\\Notepad.exe"); // Рабочий каталог Shortcut.WorkingDirectory = WshShell.ExpandEnvi ronmentStrings("XWINDIRX"); // Стиль окна Windows 1 = обычное, 3 = развернутое, 7 = свернутое. Shortcut.Windowstyle = 1 И Значок ярлыка. Shortcut.IconLocation = WshShell.ExpandEnvironmentStrings(”XWINDIRX\\Notepad.exe, 0”); // Быстрые клавиши для ярлыка. Shortcut.Hotkey = "Alt+Ctrl+E”; Shortcut.Save(); // Создаем файл-ярлык. WScript.Echo(”Shortcut file created"); см. след. стр.
230 ЧАСТЬ III Особые возможности сценариев ////////////////////////////////////////////////////////// И // Welcome И function WelcomeO { var WshShell = WSoript.CreateObjeot("WScrlpt.Shell"); var IntDoIt; intDoIt = WehShell.Popup(L_Welcome_MsgBox_Meseage_Text, 0, L_Welcome_MsgBox_Title_Text, vbOKCancel + vblnformation ); if (IntDoIt == vbCancel) { WScrlpt.Quit(); } function MakePath(pathx) { 11 Создаем папку, еоли ее нет. var fso = new AotiveXObject("Scripting.FileSystemObject") if (Ifso.FolderExists(pathx)) { var f = fso.CreateFolder(pathx); f = null; ) fso = null; //*** Конец Листинг 10-10. Startmenu.js. Так же вы можете создать ярлыки и в других специальных папках (напри- мер, в папке Му Documents или Favourits). Нужно только через свойство Wsh- SbelLSpecialFolders получить путь для соответствующей папки. СОВЕТ Создать ярлык в меню Start в Windows NT или Windows 2000 можно как для текущего пользователя, так и для группы или для всех пользователей. Вы можете доработать предыдущий сценарий так, что- бы он запрашивал расположение специальной папки Start Menu для текущего пользователя и добавлял туда ярлык. Чтобы создать ярлык для группы пользователей, надо начать с запроса размещения папки Start Menu для текущего пользователя, а затем перейти на два уровня вверх по дереву папок и перебрать все вложенные папки. Каждая соответ- ствует какой-либо учетной записи пользователя. Вы можете найти пап- ку Start Menu для соответствующего пользователя и обновить в ней ярлык Если проделать это для папки All Users\Start Menu, то ярлык бу- дет доступен в меню Start всем пользователям.
ГЛАВА 10 Создание ярлыков 231 Создание ярлыка с аргументами Открыв окно свойств ярлыка, вы сможете вручную добавить параметры в поле ввода Target. Например, по команде C:\Windoii-s\Notepad.exe C:\Text\Bom.txt бу- дет запущен Notepad, в который загрузится файл Born.txt. Для добавления к команде ярлыка дополнительных аргументов служит свойство Arguments объекта WshSbortcut. Не путайте его с одноименным свой- ством объекта WScript. В следующем примере мы создадим ярлык для Notepad в группе Programs/Born меню Start. Если пользователь выберет эту команду в главном меню, загрузится исходный код данного сценария. Поэтому ярлык должен содержать как дополнительные аргументы путь и имя файла-ярлыка. Аргументы для объекта «ярлык» можно задать в свойстве Arguments-. Shortcut.Arguments = WScrlpt.ScriptFullName Здесь имя файла сценария присваивается свойству Arguments. Созданный файлом сценария в меню Start элемент Programs/Born/... запускает Notepad и загружает в него исходный код сценария. Метод Save создает имя файла- ярлыка из объекта и добавляет к команде ярлыка свойство Arguments. Следующий код на VBScript создает ярлык для Notepad в меню Start, вклю- чая в команду имя файла сценария (листинг 10-11): *************************************************** ' Файл: Startmenul.vbs (Пример для WSH на in VBScript) ' Автор: (с) G. Born ' Создание ярлыка для Notepad в группе ’ команд Born меню Start *************************************************** Option Explicit Dim Text, Title Dim WshShell ' Переменная-объект. Dim status, Ready_txt Dim Shortcut, Path Ready_txt = "Shortcut created" Text = "Creates a shortcut to Notepad in the Start menu group Born" Title = "WSH sample - by G. Born” ’ Спрашиваем пользователя, создавать ли ярлык. status = MsgBox(Text, vbOKCancel + vblnformation. Title) If (status <> vbOK) Then WScrlpt.Quit 1 ' Нажата кнопка Cancel. End If ' Создаем объект WshShell, с помощью которого мы ' получим доступ к объекту WshSpecialFolders. см.след.стр.
232 ЧАСТЬ III Особые возможности сценариев Set WshShell = WScript.CreateObject("WScript.Shell") ' Получаем путь для папки Start Menu/Programs ' через объект WshSpecialFolders. Path = WshShell.SpecialFolders("Programs") ' Внимание: элемент попадает в папку Programe\Born. Path = Path & "\Born\" ' Проверяем наличие пути; если его нет, создаем группу. MakePath Path ' Нам известен путь для меню Start; создаем ярлык ' методом CreateShortcut. Set Shortcut = WehShell.CreateShortcut(Path & "Editor.Ink") ' Задаем свойства ярлыка. ' Целевая папка Shortcut.TargetPath = WshShell.ExpandEnvi ronmentSt rings("XWINDIRX\Notepad.exe") ' Задаем аргументы для программы. ’ Загружаем файл сценария в Notepad. Shortcut.Arguments = WScript.ScriptFullName ' Рабочий каталог Shortcut.WorkingDirectory = _ WshShell.ExpandEnvi ronmentSt rings("XWINDIRX") ' Стиль окна Windows 1 = обычное, 3 = развернутое, 7 = свернутое. Shortcut.Windowstyle = 1 ' Значок ярлыка. Shortcut.IconLocation = WshShell.ExpandEnvironmentStringsCXWINDIRX\Notepad.exe, О”) ' Быстрые клавиши для ярлыка Shortcut.Hotkey = "Alt+CtrL+E" Shortcut.Save ' Создаем ярлык. WScript.Echo Ready.txt ' Сообщаем о выполнении задания. Sub MakePath(pathx) On Error Resume Next ' Создаем папку, если ее нет. Dim fso, f Set fso = CreateObject(”Scripting.FileSystemObject”) Set f = fso.CreateFolder(pathx) Set fso = Nothing
ГЛАВА 10 Создание ярлыков 233 Set f = Nothing On Error GoTo 0 End Sub ’»«* Конец Листинг 10-11. Startmenu 1 .vbs. СОВЕТ Метод Save записывает набор свойств сценария в .Ink-файл ярлыка. Не требуется задавать в сценарии все свойства Shortcut. Свой- ство, не изменяемое в сценарии, в .Ink-файле остается прежним. Это можно проверить, активизировав Startmenu 1.vbs, а затем Startmenu.vbs. Оба сценария создают один и тот же файл-ярлык. Вторая программа лишь обновляет существующий файл, так как в ней не предусмотрено изменение свойства Arguments. Если открыть меню Start и выбрать пункт Born\Editor, запустится Notepad, и в него загрузится файл Startmenu l.vbs. В нем уже есть старый набор свойств, и для изменения этого поведения нужно явно задать для данного свойства пустую строку. Реализация на JScript Ниже показана реализация на языке JScript (листинг 10-12): И Файл: Startmenul. js (Пример для WSH на JScrlpt) Ц Автор: (с) G. Born И И Создание ярлыка для Notepad в группе // команд Born меню Start var vbOKCancel =1; // Объявляем переменные. var vblnformation = 64; var vbCancel = 2; var L_Welcome_MsgBox_Messa0e_Text = "Creates a shortcut on the Start menu”: var L_Welcome_MsgBox_Title_Text = "WSH sample - by G. Born": WelcomeO; // Выводим диалоговое окно Welcome. I/ Получаем объект с методом для создания ярлыка, var WshShell = WSoript.CreateObjectC'WScript.Shell”); // Получаем путь для папки Start Menu/Programs И с помощью объекта WshSpecialFolders. var Path = WshShell.SpecialFoldersC'Programs"); см. след. стр.
234 ЧАСТЬ III Особые возможности сценариев // Внимание: элемент попадает в папку Programs\Born. Path = Path + "\\Born\\"; И Проверяем наличие пути; если его нет, создаем группу. MakePath(Path); // Нам известен путь для меню Start; создаем ярлык // методом CreateShortcut. var Shortcut = WehShell.CreateShortcut(Path + "Editor.Ink"); И Задаем свойства ярлыка; сначала - целевой путь. Shortcut.TargetPath = WehShell.ExpandEnvi ronmentSt rings("XWINDIRX\\Notepad. exe"); // Здесь располагаются аргументы для сценария. И Загружаем файл сценария в Notepad. Shortcut.Arguments = WScript.ScriptFullName; // Рабочий каталог Shortcut.WorkingDireotory = WshShell.ExpandEnvironmentStrings("XWINDIRX"); // Стиль окна Windows 1 = обычное, 3 = развернутое, 7 = свернутое Shortcut.Windowstyle = 1; И Значок ярлыка Shortcut.IconLcoation = WshShell.ExpandEnvlronmentStrings("XWINDIRXWNotepad.exe, 0"); /I Быстрые клавиши для ярлыка Shortcut.Hotkey = "Alt+CtrL+E"; Shortcut.Save(); // Создаем файл-ярлык. WScript.Echo("Shortcut file created."); ///////////////////////////////////////////////////////// // // Welcome // function WelcomeO { var WshShell = WSoript.CreateObject("WScript.Shell"); var intDoIt; intDoIt = WehShell.Popup(L_Welcome_MsgBox_Message_Text, 0, L_Welcome_MsgBox_Title_Text, vbOKCancel + vblnformation );
ГЛАВА 10 Создание ярлыков 235 if (intDoIt == vbCancel) { WScrlpt.Quit(); } function MakePath(pathx) { // Создаем папку, если ее нет. var fso = new ActiveXObjectCScripting.FileSystemObject") if (Ifso.FolderExists(pathx)) { var f = fso.CreateFolder(pathx); f = null; } fso = null; } //»«* Конец Листинг 10-12. Startmenu 1.js. ПРИМЕЧАНИЕ Способ перебора всех ярлыков на рабочем столе или в меню Start мы рассмотрим в главе 12, посвященной средствам ра- боты с файлами через объект FileSystemObject. А пока вы можете сде- лать то же самое, получив путь для целевой папки и перебрав все .Ink- файлы в специальной папке с помощью объекта FileSystemObject. После чего вы можете сделать что-то с этими файлами (например, переиме- новать или удалить). Считывание свойств ярлыка Если вам понадобится прочитать или изменить файл-ярлык, то искать фун- кции доступа к свойствам вроде GetShortcut или ReadShortcut в Windows Script Host Reference не стоит — их там нет. Однако, гоняя примеры для этой гла- вы, я обнаружил, что применение метода CreateShortcut к существующему файлу-ярлыку не изменяет его свойств. Это обстоятельство натолкнуло меня на мысль использовать объект CreateShortcut для доступа к существующим файлам-ярлыкам. Взгляните на операторы: Set Shortcut = WshShell.CreateShortcut(lnk_file) WScript.Echo Shortcut.TargetPath В первой сгроке создается объект «ярлык», имя которого подставляется в ме- тод CreateShortcut. Во второй — считывается свойство TargetPath этого объек- та. Если файл, указанный в переменной Ink Jile, уже есть, метод CreateShortcut
236 ЧАСТЬ III Особые возможности сценариев считывает параметры из .Ink-файла. Итак, код в этой строке выводит диалого- вое окно, в котором отображается путь, ранее заданный для этого ярлыка. Свойство Arguments содержит набор дополнительных аргументов ярлы- ка. Свойство Description поддерживается объектом WshShortcut, но в окне свойств оно отображается только в Windows 2000; файлы-ярлыки в Windows 95/98 не имеют этого элемента в своих окнах свойств. ПРИМЕЧАНИЕ Объект WshShortcut не поддерживает свойств, применя- емых в Windows 2000 для запуска процесса в отдельном адресном про- странстве или под другой учетной записью пользователя (рис. 10-1). В следующем VBScript-коде CreateShortcut помогает извлечь из файла-яр- лыка все свойства и отобразить результаты в диалоговом окне (рис. 10-4). Если свойство не задано, эта строка в диалоговом окне остается пустой. Свойство IconLocation возвращает значение *,0», если значок не установлен. В этом случае ярлык берет из соответствующей ЕХЕ-программы значок по умолчанию. Рис. 10-4. Отображение свойств ярлыка. Этот сценарий поддерживает буксировку (drag-and-drop). Пользователь может перетащить к нему значок существующего файла-ярлыка. Когда пользо- ватель отпустит левую кнопку мыши, сценарий активизируется с именем отбуксированного файла. Затем сценарий отобразит свойства файла, если это .Ink-файл. Техника извлечения аргументов, переданных в сценарий, рассматривает- ся в главе 7. Следующий код проверяет наличие при запуске сценария хотя бы одного аргумента: Set objArgs = WScrlpt.Arguments ' Создаем объект. If objArgs.Count < 1 Then ' Аргументы не найдены: предупреждаем ' пользователя и завершаем сценарий. WScrlpt.Echo " Sorry, no arguments were found!" , _ vbCrLf & vbCrLf, "Please drag the shortcut to the script's icon", _ "or call the script using:", vbCrLf & vbCrLf, _ ”<host> GetShortcutProperties.vbs shortcut_flle", _ vbCrLf & vbCrLf.
ГЛАВА 10 Создание ярлыков 237 "(Example: CScript.exe GetShortcutProperties.vbs C:\Editor.lnk)" WScript.Quit ' Выход из сценария. End If После того как вы получили свойство Arguments, вам доступен набор Arguments через переменную объект objArgs. По свойству Count этого объек- та можно судить о наличии объектов в наборе. Если таковых нет, сценарий завершается выводом диалогового окна, сообщающего пользователю, как запускать программу сценария (рис. 10-5). Рис. 10-5. Это диалоговое окно появляется, когда у сценария нет аргументов. Получив аргумент из набора WScriptArguments (данный сценарий рассчи- тан только на одно имя файла), вам нужно проверить, является ли он фай- лом ярлыка. В нашем примере окончание имени файла сравнивается с рас- ширением .Ink следующей функцией: Function IsLnk(name) ' Ищем в конце файла строку .Ink. ' Если находим, возвращаем True иначе False. If (LCase(Right(name, 4)) = ".Ink") Then IsLnk = True Else IsLnk = False ' ".Ink" не найдено End If End Function Функцию можно вызывать, указывая ей корректное имя файла. Она воз- вращает True или False в зависимости от расширения файла. Функция берет последние четыре символа в имени файла, преобразует их в строчные бук- вы и сравнивает их с «.Znfe». В основной части сценария проверка имени фай- ла выглядит так: If Not IsLnk(ob]Args(0)) Then ' Смотрим, имеет ли файл расширение .Ink. WScript.Echo "Sorry, but & objArgs(O) & _ "' isn’t a shortcut file.” WScript.Quit End If Функция IsLnk вызывается с первым элементом набора Arguments. Если передано несколько аргументов, остальные игнорируются. Однако в сцена- рий несложно добавить обработку нескольких файлов, отбуксированных к значку файла-ярлыка.
238 ЧАСТЬ III Особые возможности сценариев ПРИМЕЧАНИЕ Если пользователь буксирует файл к сценарию, вы предполагаете, что имя файла корректно, а сам файл существует, по- этому вы проверяете только расширение файла. Но было бы лучше проверять и существование файла. Это делается с помощью объекта FileSystemObject, который мы рассмотрим позже, а пока мы пропустим этот шаг. Кроме того, важно знать, является ли файл корректным яр- лыком. Эту проверку выполняют методы объекта Windows Shell. По завершении проверок сценарий может получить доступ к существу- ющему файлу-ярлыку, выполнив оператор: Set Shortcut = WshShell.CreateShortcut(objArgs(0)) Теперь вы готовы считать и отобразить свойства объекта WshShortcut, при- своенного переменной объекта Shortcut. Вот данный сценарий полностью (листинг 10-13): ************************************************************** ’ Файл: GetShortcutProperties.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Извлечение свойств для файла-ярлыка, переданного ' в качестве аргумента ************************************************************** Option Explicit Const Title = “Shortcut property viewer - by G. Born" Dim WshShell ' Переменная-объект Dim objArgs, Shortcut ' Создаем новый объект WshShell. Set WshShell = WScript.CreateObject("WSoript.Shell") ’ Пытаемся извлечь аргументы. Set objArgs = WScript.Arguments ' Создаем объект. If objArgs.Count < 1 Then ' Аргумент не найден; предупреждаем ' пользователя и завершаем сценарий. WScript.Echo " Sorry, no arguments were found!" , vbCrLf b vbCrLf, "Please drag the shortcut to the script’s icon”, "or call the script using:”, vbCrLf & vbCrLf, "<host> GetShortcutProperties.vbs shortcut_file”, vbCrLf & vbCrLf, "(Example: CScript.exe GetShortcutProperties.vbs C:\Editor.lnk)" WScrlpt.Quit ' Выход из программы. End If ' Извлекаем аргумент, переданный в сценарий. If Not IsLnk(objArgs(0)) Then ' Сравниваем расширение файла с .Ink. WScript.Echo "Sorry, but " & objArgs(O) & _
ГЛАВА 10 Создание ярлыков 239 " isn't a shortcut file.” WScript.Quit End If ’ Пробуем создать файл-ярлык в данном месте ' методом CreateShortcut; до вызова метода Save ' обновление не происходит. Set Shortcut = WshShell.CreateShortcut (objArgs(O)) MsgBox "Файл: " & objArga(O) & vbCrLf & vbCrLf & _ "Arguments: " & vbTab & Shortcut.Arguments & vbCrLf & _ "Description: ” & vbTab & Shortcut.Description & vbCrLf & "Full name: " & vbTab & Shortcut.FullName & vbCrLf & "Hotkey: " & vbTab & Shortcut.Hotkey & vbCrLf & _ "IconLocation: " & vbTab & Shortcut.IconLocation & vbCrLf & "Target: " & vbTab & Shortcut.TargetPath & vbCrLf & _ "Windowstyle: ” & vbTab & Shortcut.WindowStyle & vbCrLf & _ "Working directory: " & vbTab & Shortcut.WorkingDirectory & _ vbCrLf, vbOKOnly + vblnformation, Title Function IsLnk(name) ' Ищем в конце файла .Ink. ' Еоли находим, возвращаем True, иначе False. If (LCaee(Right(name, 4)) = ".Ink”) Then IsLnk = True Elee IsLnk = False ’ ".Ink" не найдено. End If End Function '*** Конец Листинг 10-13. GetShortcutProperties.vbs. Реализация на JScrlpt Ниже показана реализация на языке JScript (листинг 10-14), только функция IsLnk использует новое средство — метод GetExtensionName объекта FileSys- temObject. Имя файла должно быть передано в качестве параметра. В этой реализации функции IsLnk передается два параметра: имя файла и расшире- ние .Ink. //.............. // Файл: GetShortcutProperties.js (Пример для WSH на JScrlpt) // Автор: (с) G. Born И И Извлечение свойств для файла-ярлыка, переданного // в качестве аргумента см. след. стр.
240 ЧАСТЬ III Особые возможности сценариев // Создаем новый объект WshShell. var WshShell = WScript.CreateObjectCWScript.Shell"): // Пытаемся извлечь аргументы. var objArgs = WScript.Arguments; // Создаем объект. if (objArgs.length < 1) // Аргумент не найден; предупреждаем // пользователя и завершаем сценарий. { WScript.Echo(" Sorry, по arguments were found!\n\n", "Please drag the shortcut to the script's icon", "or call the script using:\n\n", "<host> GetShortcutProperties.vbs shortcut_file\n\n”, "(Example: CScript.exe GetShortcutProperties.vbs C:\Editor.lnk)”); WScript.Quit(); // Выход из сценария. } // Извлекаем аргумент, переданный в сценарий. if (!IsLnk(objArgs(0), "Ink")) 11 Сравниваем расширение // файла с .Ink. { WScript. EchoC'Sorry, but \ + objArgs(O) + "\' isn't a shortcut file”); WScript.Quit(); > // Пробуем создать файл-ярлык в данном месте Ц методом CreateShortcut; до вызова метода Save Ц обновление не происходит. var Shortcut = WshShell.CreateShortcut(objArgs(0)); WScript.Echo(“File: " + objArgs(O) + "\n", "\nArguments: " + Shortcut.Arguments, "\nDescription: " + Shortcut.Description, “\nFull name: " + Shortcut.FullName, "\nHotkey: ” + Shortcut.Hotkey, ”\nIconLocation: " + Shortcut.IconLocation, "\nTarget: " + Shortcut.TargetPath, ”\nWindowStyle: " + Shortcut.Windowstyle, "\nWorking directory: ” + Shortcut.WorkingDirectory); ///////////////////////////////////////////////////////// // I/ IsLnk // // Проверяем, имеет ли указанный файл данное расширение. // Возвращаем True или False. function IsLnk(name, ext) {
ГЛАВА 10 Создание ярлыков 241 var fso = new ActiveXObject("Scripting.FileSystemObject"); var s = fso.GetExtensionName(name); var s1 = s.toLowerCase(); if (s1 == ext) { return (true); } else { return (false); } } I/*** Конец Листинг 10-14. GetShortcutPropertiesjs. СОВЕТ Пример GetShortcutProperties может пригодиться для опреде- ления номера значка для файла-ярлыка, так как в Windows подобного средства нет. Обновление ярлыка Это несложно. Достаточно применить к существующему ярлыку метод CreateShortcut, а затем считать свойство или установить для него новое зна- чение. Метод Save обновляет файл ярлыка. В следующем примере на VBScript имя файла-ярлыка принимается как параметр. Затем для значка, применяемого для этого файла, устанавливает- ся новое значение. В WSH 2 можно передать параметр, перетащив файл-яр- лык на значок сценария. Для простоты мы возьмем значок по умолчанию из файла Shell32.dll, который есть во всех версиях Windows. ПРИМЕЧАНИЕ Местоположение Shell32.dll зависит от версии. В Win- dows 95/98 он лежит в подкаталоге \System, а в Windows NT/2000 — в \System32. Сценарий должен начинаться с проверки версии ОС. В данном примере это делает функция IsWinNT-. ' IsWinNT проверяет, какая установлена версия Windows: ' Windows 95, Windows 98 или Windows NT, Windows 2000. ' Возвращает True или False. ' Требует объект WshShell. Function IsWinNT Dim objEnv Set objEnv = WshShell.Environment("Process") If objEnvC’OS”) = ”Windows_NT" Then IsWinNT = True Else IsWinNT = False
242 ЧАСТЬ III Особые возможности сценариев End If End Function Для работы этой функции нужно, чтобы в основной части сценария была описана переменная WshShell, а затем ее нужно сопоставить с экземпляром объекта WshShell. Переменная WshShell позволяет извлекать переменные сре- ды для процесса. Наша функция запрашивает переменную среды OS. По- следняя существует только в Windows NT/2000, и в обеих ОС ее значение — Windows_NT. В зависимости от полученного значения функция возвращает True или False. Остальная часть программы аналогична предыдущему примеру. Сцена- рий принимает два аргумента. Первый должен быть именем файла или фай- лом-ярлыком. Второй (необязательный) аргумент может содержать путь и имя файла значка. Запустить сценарий позволяют команды: WScript.exe D:\ChangeShortcutIcon.vbs D:\C.lnk F:\WINNT\Explorer.exe,О WScript.exe D:\ChangeShortcutIcon.vbs D:\C.lnk D:\B.ico Если пользователь перетащит .Ink-файл на значок сценария, то будет взят значок по умолчанию из файла Shell32.dll. Получив параметры, сценарий создает объект «ярлык» (где сохраняются свойства существующего .Ink-фай- ла). Затем свойству присваивается второй аргумент, и эту модификацию со- храняет метод Save. Вот весь сценарий (листинг 10-15), а его реализацию на JScript попробуй- те выполнить самостоятельно. *********************************************************** ' Файл: ChangeShortoutloon.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Изменение значка для ярлыка редактора рееотра, ' находящегося (значка) на рабочем столе *********************************************************** Option Explicit Const Ready_txt = "Shortcut ioon changed" Const Text = "Change shortcut icon?" Const Title = "Shortcut icon changer - by G. Born" Dim WshShell ' Переменная-объект. Dim objArgs, Shortcut Dim Arg(2) Dim status, i ' Создаем новый объект WshShell. Set WshShell = WSoript.CreateObjectC'WScript.Shell") ' Инициализируем путь для значка (если получен только один аргумент). ' Дописываем переменную ореды для получения значка ' по умолчанию (из Explorer). Arg(1) = WshShell.ExpandEnvironmentStringB(”XWINDIRX")
ГЛАВА 10 Создание ярлыков 243 ' Определяем операционную систему. If IsWlnNT Then Arg(1) = Arg(1) & "\System32\Shell32.dll, 19" Else Arg(1) = Arg(1) & "\System\Shell32.dll, 19" End If ' Извлекаем аргументы. Set objArgs = WScript.Arguments ' Создаем объект. If objArgs.Count < 1 Then ' Аргумент не найден; предупреждаем ' пользователя и завершаем сценарий. WScript.Echo "Changes the icon of a given shortcut", vbCrLf & vbCrLf, "Sorry, no arguments were found!" , vbCrLf, "Please drag the shortcut to the script’s icon", "or call the script using:", vbCrLf & vbCrLf, ”<host> ChangeShortcutlcon.vbs shortcut_file ioon_file”, vbCrLf & vbCrLf, _ "(Example: CScript.exe ChangeShortcutlcon.vbs C:\Editor.lnk " & "D:\Bmp\Book.bmp)" WScript.Quit ' Выход из программы. End If ' Пробуем получить аргументы, переданные сценарию. Еоли еоть только один ' аргумент, используем определенный выше значок по умолчанию. For 1 = 0 to objArge.Count - 1 ' Цикл по воем аргументам. Arg(i) = objArgs(i) ’ Получаем аргумент. Next If Not IeLnk(Arg(O)) Then ' Проверяем, имеет ли файл расширение .Ink. WScript.Eoho "Sorry, but & Arg(O) & isn't a shortcut file." WScript.Quit End If ' Спрашиваем пользователя, модифицировать ли ярлык. BtatuB = MsgBox(Text, _ vbYesNo + vbQueBtion, _ Title) If (statue <> vbYee) Then WSoript.Quit 1 ' Нажата кнопка No. End If ' Нам известен путь для файла-ярлыка и местоположение значка. ' Обновляем ярлык методом CreateShortcut. Set Shortcut = WshShell.CreateShortout(Arg(0)) ' Изменяем значок ярлыка. Shortcut.IconLooation = Arg(1) см. след. стр.
244 ЧАСТЬ III Особые возможности сценариев Shortcut.Save ' Сохраняем обновленный файл. WScript.Echo Ready_txt ' Сообщаем о выполнении задания. Function IsLnk(name) ' Проверяем расширение файла .Ink. ' Возвращаем True или False. If (LCase(Right(name, 4)) = ".Ink") Then IsLnk = True Else IsLnk = False ’ ".Ink" не обнаружено. End If End Function ' IsWinNT проверяет, что установлено: Windows 95/98 ' или Windows NT/2000. Возвращает True или False. ' Требует объект WshShell. Function IsWinNT Dim objEnv Set objEnv = WshShell. EnvironmentC'Process") If objEnv(”0S") = "Windows_NT" Then IsWinNT = True Else IsWinNT = False End If End Function ’*** Конец Листинг 10-15. ChangeShortcutlcon.vbs. Создание ярлыка для Web-узла Ссылка (link) на Web-узел, размещаемая на рабочем столе, является ярлыком особого типа. Если в качестве расширения файла использовать не .Ink, a .url, Windows создаст ссылку на Web-узел. Вы узнаете этот ярлык, поскольку он использует значок Web-документов. В WSH есть средства для создания ярлыка этого типа, например, метод CreateShortcut и свойство TargetPath объекта WshShell. Следующая VBScript- программа создает на рабочем столе ссылку на Web-узел (листинг 10-16). Этот пример отличается от предыдущего тем, что файл ярлыка имеет рас- ширение .url, а в свойство TargetPath не включен путь. '*************************************************** ’ Файл: URLShortcut.vbs (Пример для WSH на VBScript) ’ Автор: (с) G. Born Создание на рабочем столе ярлыка для URL
ГЛАВА 10 Создание ярлыков 245 Option Explicit Dim Text, Title, olIRL Dim WshShell ' Переменная-объект. Dim status, Ready_txt, path Ready_txt = "URL shortcut created" Text = "Create URL shortcut on the Desktop?" Title = "WSH sample - by G. Born" ’ Спрашиваем пользователя, создавать ли ярлык. status = Ms0Box(Text, vbYesNo + vblnformation, Title) If (status <> vbYes) Then WScrlpt.Quit 1 ' Нажата кнопка No. End If ' Создаем объект WshShell, с помощью которого мы ’ получим доступ к объекту WshSpecialFolders. Set WshShell = WScrlpt.CreateObjectC’WScript.Shell") ' Получаем путь для папки Desktop ' через объект WshSpecialFolders. Path = WshShell.SpecialFolders("Desktop") ’ Создаем ярлык методом CreateShortcut. Set oURL = WshShell.CreateShortcut(path & "\Microsoft.URL") ’ Задаем свойства ярлыка. oURL.TarfletPath = "http://www.microsoft.com” oURL.Save ' Сохраняем ярлык. WScrlpt.Echo Ready_txt ’ Сообщаем о выполнении задания. '*** Конец Листинг 10-16. URLShortcut.vbs. Реализация на JScript Ниже показана реализация на языке Jscript (листинг 10-17): Ц Файл: URLShortcut.js (Пример для WSH на JScrlpt) Ц Автор: (с) G. Born И // Создание на рабочем столе ярлыка для URL .................................................. см. след. стр.
246 ЧАСТЬ III Особые возможности сценариев var vbOKCancel = 1; var vblnformation = 64; var vbCancel = 2; var L_Welcome_MsgBox_Message_Text = "Creates a URL shortcut on the Desktop"; var L_Welcome_MsgBox_Title_Text = "WSH sample - by G. Born"; WelcomeO; // Выводим диалоговое окно Welcome. // Получаем объект о методом для ооздания ярлыка, var WshShell = WScript.CreateOb]ect("WScript.Shell"); // Получаем путь для Desktop с помощью WshSpecialFolders. var Path = WshShell.SpecialFoldersC'Desktop"); // Создаем ярлык на рабочем столе, var oURL = WshShell.CreateShortcut(Path + "\\Microsoft.URL"); // Задаем свойства ярлыка. Сначала - целевой путь. oURL.TargetPath = "http://www.mlcrosoft.com”; oURL.Save(); // Сохраняем ярлык. WScript.Echo("Shortcut created"); ///////////////////////////////////////////////////////// // // Welcome // function WelcomeO { var WshShell = WScript.CreateObject("WScrlpt.Shell”); var IntDoIt; IntDoIt = WshShell.Popup(L_Welcome_MsgBox_Message_Text. 0, L_Welcome_Msg Box_Tltle_Text, vbOKCancel + vblnformation ); if (IntDoIt == vbCancel) { WSorlpt.Qult(); } } //*** Конец Листинг 10-17. URL.Shortcut.js.
ГЛАВА 1 1 Дополнительные возможности WSH В этой главе вы познакомитесь с дополнительными возможностями Microsoft Windows Script Host (WSH). Вы научитесь получать имя текущего пользовате- ля, домена или компьютера в сети, а также подключать такие сетевые устрой- ства, как диски и принтеры, и устанавливать с ними связь при входе в сис- тему. Кроме того, вы узнаете, как с помощью сценариев получить доступ к системному реестру, чтобы дополнить Windows новыми средствами и авто- матизировать ряд задач. Как получить имя пользователя, домена или компьютера Для просмотра имени пользователя, домена или компьютера в Windows слу- жит окно свойств ярлыка Network Neighborhood. Эту информацию позволя- ют также получить свойства объекта WshNetwork, который создается, как подобъект WScript-. Set WshNetwork = WScrlpt.CreateObject("WScript.Network") Через переменную WshNetwork доступны следующие свойства объекта: ComputerName — имя рабочей станции; UserName — имя текущего пользователя рабочей станции. Свойство UserDomain доступно только для машин, включенных в сеть с доменной структурой, такую как Microsoft Windows NT Server/2000 Server. Если рабочая станция работает под Windows 95/98 и подключена к сети ра- бочей группы, WSH возвращает пустую строку (рис. 11-1, справа). На компь- ютере с Windows 2000 это свойство содержит только имя рабочей станции и не включает имя рабочей группы (рис. 11-1, слева). Рис. 11-1. Свойства сети (слева — Windows 2000; справа — Windows 98).
248 ЧАСТЬ III Особые возможности сценариев Проблемы при получении имени пользователя В группе новостей для WSH появились сообщения о трудностях полу- чения имени пользователя. При отработке сценария регистрации в си- стеме свойство UserName оказывается пустым. Эта особенность при- суща Windows 95/98, так как сценарий регистрации запускается до того, как вы физически зарегистрировались в сети. Решение состоит в том, чтобы запустить следующий цикл ожидания момента, когда свойство окажется заполненным: Set WshNetwork = WScrlpt.CreateObjectC'WScript.Network") User = .... Инициализируем значение. Do While User = ..... Цикл длится, пока не появится имя пользователя. User = WshNetwork.UserName ' Считываем свойство. WScrlpt.Sleep 200 ' Приостановка для снижения нагрузки на процессор. Loop Метод Sleep понадобился здесь, чтобы в ходе выполнения цикла дать процессору возможность решать и другие задачи. О методе Sleep см. главу 13. Следующая VBScript-программа (листинг 11-1) извлекает упомянутые свойства и отображает их в диалоговом окне. Подобно остальным примерам этой главы, Network.vbs находится в папке \WSHDevGuide\Chapterl 1 на при- лагаемом к книге CD. Файл: Network.vbs (Пример для WSH на VBScript) Автор: (с) G. Born Отображение имен пользователя, домена и рабочей группы Option Explicit Dim Text, Title Dim WshNetwork ' Переменная-объект. Text = "Networking Information" & vbCrLf & vbCrLf Title = "WSH sample - by G. Born” ' Создаем новый объект WshNetwork для доступа к свойствам сети. Set WshNetwork = WScrlpt.CreateObjectC'WScript.Network") Text = Text & "Computer name : " & WshNetwork.ComputerName & vbCrLf Text = Text & "Domain : " & WshNetwork.UserDomain & vbCrLf Text = Text & "User name : " & WshNetwork.UserName & vbCrLf MsgBox Text, vbOKOnly + vblnformation, Title *** Конец Листинг 11-1. Network.vbs.
ГЛАВА 11 Дополнительные возможности WSH 249 Реализация на JScript BoTjScript-версия предыдущего примера (листинг 11-2): /Л*...*.......................................... // Файл: Network.js (Пример для WSH на JScript) // Автор: (с) G. Born II // Отображение имен пользователя, домена // и рабочей группы var Text = "Networking information\n\n"; // Создаем новый объект WshNetwork для доступа к свойствам сети, var WshNetwork = WScript.CreateObject("WScript.Network''); Text = Text + "Computer name : " + WshNetwork.ComputerName + "\n"; Text = Text + "Domain : " + WshNetwork.UserDomain + "\n"; Text = Text + "User name : ” + WshNetwork.UserName + "\n"; WScript.Echo(Text); //*** Конец Листинг 11-2. Network.js. Подключение к сетевому принтеру Подключившись к сети, можно связать локальную станцию с сетевым прин- тером. Эта операция называется подключением принтера. Windows позво- ляет напрямую соединиться с сетевым принтером или поставить в соответ- ствие локальный порт удаленному принтеру. (Последний способ рекомен- дуется, только когда требуется поддержка сетевого принтера для MS-DOS- программ.) В WSH 2 у объекта WshNetwork есть два метода для подключения сетевого принтера в Windows: AddPrinterConnection тл AddWindowsPrinterConnection. Если вам не придется печатать на сетевом принтере из приложений для MS-DOS, вызовите MoioRAddWindowsPrmterConnection. Сначала нужно создать экземпляр объекта WshNetwork командой (на VB- Script): Set WshNetwork = WScript.СreateObject("WScript.Network") В Windows 95/98 для AddWindowsPrinterConnection применяется синтаксис: WshNetwork.AddWindowsPrinterConnection(strPrinterPath, strDriverName[, strPort]) Первый параметр — это путь для принтера в формате UNC (например, \\ROM'ptP500}. Во втором параметре указывается драйвер принтера, а в тре-
250 ЧАСТЬ III Особые возможности сценариев тьем (необязательном) — локальный порт для подключения (например, LPT1). ПРИМЕЧАНИЕ Для работы метода AddWindowsPrmterConnection в Win- dows 95/98 требуется установить на данном локальном компьютере драйвер принтера. Иначе появится сообщение об ошибке «Unknown printer driver» («Неизвестный драйвер принтера»), В Windows NT/2000 у метода AddWindoiusPrinterConnection только один параметр: WshNetwork.AddWlndowsPrlnterConnectlon(strPrinterPath) Этот параметр должен содержать путь для сетевого принтера (например, \\ROM\HP500~). Не нужно указывать ни локальный порт, ни драйвер принтера. Если предполагается печать из MS-DOS-программ, подключите локаль- ный порт принтера к сетевому принтеру, вызвав в сценарии для WSH метод AddPrinterConnection объекта WshNetwork: Set WshNetwork = WScrlpt.CreateObject("WScrlpt.Network") WshNetwork.AddPrinterConnection "LPT1", "\\R0M\HP500” В первой строке создается экземпляр объекта WshNetwork, присваивае- мый переменной WshNetwork. В следующей строке вызывается метод Add- PrinterConnection этого объекта. Этот метод требует минимум два аргумен- та: имя локального ресурса (например, LPT1 или LPT2} и имя подключаемо- го сетевого ресурса в формате UNC. (Universal Naming Convention, или UNC, определяет универсальные правила именования, в которых формат сетевой ссылки имеет вид \\имя_станции\путъ.} Так, на своей машине я выбрал ре- сурс \\JIOM\HP500, который ссылается на принтер \HP500, находящийся на рабочей станции \\ROM. Подключение принтера с помощью AddWindowsPrinterConnection Этот VBScript-сценарий соединяет принтер с сетевым устройством в Win- dows NT/2000 (листинг 11-3). Файл: MapPrinterl.vbs (Пример для WSH на VBScript) Автор: (о) G. Born ' Подсоединение к сетевому принтеру ' с помощью метода AddWindowsPrinterConnection ’ в Windows NT/2000 '*********************************************' Option Explicit ' Const printer = "\\R0M\HP500" Const printer = "\\Wlen\HPLJ"
ГЛАВА 11 Дополнительные возможности WSH 251 Dim Text, Title, icon Dim WshNetwork ’ Переменная-объект Title = "WSH sample - by G. Born” ' Создаем новый объект WshNetwork для доступа к свойствам сети. Set WshNetwork = WScrlpt.CreateObjectC'WScript.Network") On Error Resume Next WshNetwork.AddWindowsPrinterConnection printer Select Case Err.Number Case 0 Text = "Printer connected to .... & printer & ...," icon = vblnformation Case -2147023688 Text = "Error: Network resource .... & _ printer & ... doesn't exist." icon = vbCritical Case -2147024811 Text = "Error: Mapping to .... & printer & ... already exists." icon = vbCritical Case Else Text = "Error: Code " & Err.Number & " " & Err.Description icon = vbCritical End Select On Error GoTo 0 ' Отменяем обработку ошибок периода выполнения. MsgBox Text, vbOKOnly + icon, Title '*** Конец Листинг 11-3. MapPrinterl .vbs. Подключение принтера с помощью AddPrinterConnection Чтобы установить соответствие между сетевым принтером и локальным пор- том (для поддержки сетевой печати в программах MS-DOS), используйте метод AddPrinterConnection объекта WshNetwork-. WshNetwork.AddPrinterConnection "LPT1", "\\R0M\HP500" Первый параметр в этом операторе на VBScript задает имя локального пор- та, второй — сетевой ресурс в формате UNC. Вы можете установить постоян- ное подключение принтера — для последовательности сеансов или времен- ное (когда подключение теряется при перезагрузке). Если установить флажок Reconnect At Logon в диалоговом окне Capture Printer Port при ручном подклю- чении принтера, принтер будет подключаться при каждом входе в систему:
252 ЧАСТЬ III Особые возможности сценариев Метод AddPrinterConnection позволяет также установить подключение принтера для любого пользователя, передав его имя в качестве четвертого параметра и пароль в пятом, необязательном, параметре. Так, ниже создает- ся подключение для пользователя Bilk WshNetwork.AddPrinterConnection "LPT1", "\\R0M\HP500", , "Bill", "Pegasus" Здесь пропущен третий параметр, о чем свидетельствует дополнительная запятая на его месте. В этом случае метод использует значение False, озна- чающее временное подключение. ПРИМЕЧАНИЕ Возможность задавать 11мя пользователя и пароль кажет- ся удобной, но их узнает любой получивший доступ к исходному тексту сценария. Поэтому пароли в сценариях лучше не указывать. Обработка ошибок периода выполнения Связь локального порта с сетевым ресурсом через AddPrinterConnection может привести к ошибке периода выполнения, если принтер уже из- вестен системе. Независимо от того, пытаетесь вы заново подключить порт к ресурсу или нет, вы получите сообщение о том, что локальный ресурс уже используется. В VBScript эту проблему решает оператор On Error Resume Next-. Set WshNetwork = WScrlpt.CreateObjectC'WScript.Network”) On Error Resume Next WshNetwork.AddPrinterConnection "LPT1", "\\R0M\HP500" On Error GoTo 0 Если принтер уже подключен и в третьей строке возникнет ошиб- ка периода выполнения, то, благодаря наличию оператора On Error Resume Next во второй строке, интерпретатор просто перейдет к вы- полнению следующей строки кода. Однако сценарий может известить пользователя об ошибке через VBScript-объект Err. Если возникла ошибка периода выполнения, биб- лиотека присвоит код ошибки объекту Err. Код ошибки можно узнать, прочитав свойство Number этого объекта: On Error Resume Next ’ Обрабатываем ошибки периода выполнения. WshNetwork.AddPrinterConnection "LPT1", \\R0M\HP500 If Err.Number <> 0 Then WScrlpt.Echo "Error: ” & CStr(Err.Number) End If On Error GoTo 0 ' Отменяем обработку ошибок периода выполнения. Этот код отобразит сообщение об ошибке, если метод AddPrin- terConnection вызвал ошибку периода выполнения.
ГЛ А В A 11 Дополнительные возможности WSH 253 Сценарий на VBScript устанавливает с помощью AddPrinterConnection со- ответствие между локальным портом, определенным константой port, и се- тевым принтером, заданным константой printer (листинг 11-4). Ошибки пе- риода выполнения в сценарии перехватывает оператор On Error Resume Next. Если порт принтера уже связан, сценарий известит пользователя о невоз- можности подключения. Вы можете дополнить этот код операторами удале- ния текущего соединения и установки нового подключения. 't************************************************************* ' Файл: MapAddPrinterConnection.vbe (Пример для WSH на VBScript) ' Автор: (с) G. Born ’ Подключение порта LPT1 к сетевому ' принтеру * ************************************************************** Option Explicit ' Const printer = "\\ROM\HP5OO" Const printer = ”\\Wien\HP500" Const port = "LPT1” Dim Text, Title, icon Dim WshNetwork ' Переменная-объект. Title = "WSH sample - by G. Born” ' Создаем новый объект WshNetwork для доступа к свойствам сети. Set WshNetwork = WScript.CreateObject("WSoript.Network") On Error Resume Next WshNetwork.AddPrinterConnection port, printer Select Case Err.Number Caee 0 Text = "Printer .... & port & .. connected to .... & _ printer & ......" icon = vblnformation Case -2147023688 Text = "Error: Network resource ... & printer & ... doesn’t exist." icon = vbCritical Case -2147024811 Text "Error: Mapping ... & port & ... to ... & printer & ... already exists." ioon = vbCritioal Case Else Text = "Error: Code " & Err.Number & " " & Err.Description icon = vbCritical см. след. стр.
254 ЧАСТЬ III Особые возможности сценариев End Select On Error Goto 0 ' Отменяем обработку ошибок периода выполнения, MsgBox Text, vbOKOnly + icon, Title '*** Конец Листинг 11-4. MapAddPrinterconnection.vbs. ПРИМЕЧАНИЕ При появлении неизвестной ошибки сценарий полу- чит ее код. Отрицательное значение (скажем, -2147023688) свидетель- ствует об ошибке COM-объекта (потому что установлен старший бит). Иногда полезно извлечь vbObjectError из отрицательного значения, что- бы получить более ясное представление об ошибке. Можно также пре- образовать исходное значение ошибки из десятичной формы в шест- надцатеричную. Если эта ошибка не описана в справке по VBScript, по- ищите ее в Microsoft Knowledge Base (http://wwiv.microsoft.com). Реализация для JScript Те же методы подключения принтера годятся и в JScript. Блок try ... catch в JScript 5 перехватывает ошибки периода выполнения следующим образом: try { WshNetwork. AddPrinterConnectionCLPTI", "\\\\R0M\\HP500”); 1 catch (err) { if (err 1=0) // Проверяем объект "ошибка". WScrlpt.Echo("Error: " + err); > В блок by {...} включаются все операторы, способные привести к ошибкам периода выполнения. Эти операторы должны находиться внутри блока, огра- ниченного фигурными скобками. Если один из них стал причиной ошибки периода выполнения, диалоговое окно с сообщением об ошибке не появля- ется, и управление передается оператору catch, который присваивает код ошибки переменной, указанной в качестве параметра оператора catch (err). Переменной err вы можете дать любое имя. Операторы для ветви catch, обрабатывающие ошибку, также заключают- ся в фигурные скобки, образуя блок. В представленном выше фрагменте опе- ратор ^выполняет сравнение переменной err с О. Диалоговое окно с сооб- щением об ошибке выводится только в случае ошибки периода выполнения. Этот код устанавливает подключение принтера; в случае появления ошиб- ки периода выполнения выводится информационное окно (листинг 11-5):
ГЛАВА 11 Дополнительные возможности WSH 255 у************************************************** // Файл: MapPrinter.js (Пример для WSH на JSoript 5) Ц Автор: (о) G. Born И Ц Подключение порта принтера LPT1 к сетевому принтеру // и перехват ошибок периода выполнения var port = "LPT1" var printer = "\\\\WIEN\\HPLJ" // Создаем новый объект WshNetwork для доступа к свойствам сети. var WshNetwork = WScrlpt.CreateObjectC'WScript.Network"); I/ Перехват ошибок периода выполнения, try { // Пробуем добавить соединение. WshNetwork.AddPrinterConnection(port, printer); ) catch (e) // Перехватываем возможную ошибку периода выполнения. { if (е 1= 0) // Отображаем сообщение об ошибке. WScrlpt.Echo("Error connecting printer", port, "to”, printer, "\n\nError code: ” + e); WScrlpt.QuitO; ) WSoript.EchoC'Printer port \"" + port + "\" connected to + printer); //*•• Конец Листинг 11-5. MapAddPrinterConnection.js. Удаление подключения принтера Метод RemovePrinterConnection объекта WshNetwork разъединяет с прин- тером: object.RemovePrinterConnection strName, [bForce], [bUpdateProfile] Параметр strName может быть локальным ресурсом (таким как порт прин- тера) или удаленным принтером. Во втором булевом параметре вы можете задать значения True или False, определяющее, будет ли удалена связь, если принтер еще используется. Вы можете также задать в третьем (необязатель- ном) параметре bUpdateProfile значение True или False. В случае True подклю- чение удаляется из профиля пользователя. Вот как метод удаляет подключение для порта локального принтера LPT1 (ЛИСТИНГ 11-6):
256 ЧАСТЬ III Особые возможности сценариев Файл: UnMapPrinter.vbs (Пример для WSH на VBScript) Автор: (c) G. Born Удаление подключения к принтеру Option Explicit Const port = "LPT1" Dim Text, Title, icon Dim WshNetwork ' Переменная-объект. Title = "WSH sample - by G. Born" ' Создаем новый объект WshNetwork для доступа к свойствам сети. Set WshNetwork = WScrlpt. CreateObjectC'WScript. Network”) On Error Resume Next WshNetwork.RemovePrinterConnection port Select Case Err.Number Case 0 Text = “Printer & port & ......... connection removed" icon = vblnformation Case -2147023688 Text = "Error: Network resource . & printer & _ ... doesn’t exist." icon = vbCritical Case Else Text = "Error: Code ” & Err.Number & ” ” & Err.Description icon = vbCritical End Select On Error Goto 0 ' Отменяем обработку ошибок периода выполнения. MsgBox Text, vbOKOnly + icon, Title '*** Конец Листинг 11-6. UnMapPrinter.vbs. Создание списка всех подключенных принтеров Список всех подключенных к компьютеру принтеров формируется свой- ством EnumPrinterConnections. Оно возвращает набор, содержащий инфор- мацию о текущих подключенных принтерах: Set oDevices = WshNetwork.EnumPrinterConnections
ГЛАВА 11 Дополнительные возможности WSH 257 Переменная oDevices(O) содержит имя порта первого принтера. Перемен- ная oDevices(l) содержит имя подключенного сетевого ресурса в формате UNC. В последующих переменных в таком же порядке — имя порта и имя соответствующего сетевого ресурса — расположена информация об осталь- ных подключениях. Ниже представлен цикл выборки всех элементов набора с последующим отображением полученной информации в диалоговом окне (рис. 11-2). Внут- ри каждого шага цикла, равного 2, извлекаются имя порта и подключенно- го к нему сетевого ресурса (листинг 11-7): '*«*******«««******«**«*«***««***««****«*«**««****««****««* ’ Файл: ListPrinterMapping.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ’ Создание списка подключений с помощью EnumPrinterConnectlons '********************************************************** Option Explicit Dim Text, Title, 1 Dim WshNetwork, oDevices ' Переменная-объект. Title = "WSH sample - by G. Born" ’ Создаем новый объект WshNetwork для доступа к свойствам сети. Set WshNetwork = WScript.CreateObject("WScript.Network") ' Список подключений. Text = "Printer mapping” & vbCrLf Set oDevices = WshNetwork.EnumPrinterConnectlons For 1 = 0 To oDevices.Count - 1 Step 2 Text = Text & oDevices(i) & " " & oDevices(i+1) & vbCrLf Next MsgBox Text, vbOKOnly + vblnformation. Title '*** Конец Листинг 11-7. ListPrinterMapping.vbs. Рис. 11-2. Список подключенных принтеров (в Windows 2000).
258 ЧАСТЬ III Особые возможности сценариев Реализация для JScrlpt Это реализация на JScrlpt из файла ListPrinterMapping.js (листинг 11-8): .......................................................... // Файл: LiBtPrinterMapping.js (Пример для WSH на JScrlpt) Ц Автор: (о) G. Born // // Создание списка подключений с помощью EnumPrinterConnectlons .......................................................... // Создаем новый объект WshShell для доступа к свойствам сети. var WshNetwork WSoript.CreateObjeot(”WScript.Network"); // Список подключений. Text = "Printer mapping \n"; var oDevioee = WshNetwork. EnumPrinterConnectionsO; for (var 1=0; 1 <= oDevloes.length-2; 1 = 1+2) { Text = Text + oDevioes(i) + " " + oDevices(i+1) + "\n"; WScrlpt.Echo(Text); //*** Конец Листинг 11-8. ListPhnterMappingjs. Установка принтера по умолчанию Метод SetDefaultPrinter в WSH 2 позволяет задать принтер по умолчанию: Set WshNetwork = WScrlpt.CreateObjectC'WScript.Network") WshNetwork.SetDefaultPrinter "\\Wien\HP500" ПРИМЕЧАНИЕ Экспериментируя с этим методом в Windows 2000, я столкнулся с недоразумением. Если принтера нет, метод вызывает ошибку периода выполнения. Но мои попытки обработать ее с помо- щью On Error Resume Next оказались безуспешными. При возникнове- нии ошибки сценарий прерывался без сообщений, даже когда для ана- лиза кода ошибки я вставлял такие операторы, как If Err О О Then или WScriptEcho EmCode. В результате я вынужден был убрать из данного сценария обработку ошибок вообще. Следующий код помещает в диалоговое окно (рис.11-3) список всех прин- теров, найденных в системе (листинг 11-9)- Пользователь может ввести номер для выбора нужного элемента списка, после чего соответствующий принтер назначается принтером по умолчанию, а диалоговое окно отображает этот результат.
ГЛАВА 11 Дополнительные возможности WSH 259 de efaufl pi inlet 1 . WWIEh' г U4i. 1 C«xd Рис. 11-3. Установка принтера по умолчанию. ’ Файл: Defaultprinter.vbs (WSH sample in VBScript) ' Автор: (c) G. Born ’ Установка принтера по умолчанию (в WSH 2) Option Explicit Dim Text, Title, 1, j, trap, printer Dim WshNetwork, oDevices ' Переменная-объект. Title = "WSH sample - by G. Born" ' Создаем новый объект WshShell для доступа к свойствам сети. Set WshNetwork = WScrlpt.CreateObjectC'WScript.Network") ' Считываем сведения о всех принтерах. Set oDevices = WshNetwork.EnumPrinterConnections Text = "Available printers" & vbCrLf j = oDevices.Count For i = 0 To j - 1 Step 2 Text = Text & (1/2) & vbTab Text = Text & oDevlces(i) & vbTab & oDevices(i+1) & vbCrLf Next ’ Показываем все доступные принтеры и предлагаем ’ пользователю выбрать один из них. tmp «= InputBox(Text, "Set default printer", 0) If tmp = "" Then WScript.Echo "No user input, aborted" WSoript.Quit End If tmp = Clnt(tmp) см. след. cmp.
260 ЧАСТЬ III Особые возможности сценариев If (tmp < 0) Or (tmp > (j/2 - 1)) Then WScript.Echo "Wrong value, aborted” WScript.Quit End If printer = oDevices(tmp*2 + 1) ' Выбираем имя принтера. ' Устанавливаем принтер по умолчанию. WshNetwork.SetDefaultPrinter printer MsgBox "Set default printer to " & printer, vbOKOnly + vblnformation, Title ’*** Конец Листинг 11-9. DefaultPrinter.vbs. Подключение сетевых дисков Так же, как и принтеры, в сети можно совместно использовать диски и пап- ки. Поскольку в Windows эти сетевые ресурсы можно подключить к локаль- ным дискам, вы можете работать со старыми программами, не поддержива- ющими сетевые UNC-адреса, или просто использовать для доступа к диско- водам буквы D:, Е: И Т. Д. Рассмотрим сценарий, который подключает три общедоступных сетевых ресурса к устройствам X:, Y: и Z:. Затем программа отображает в диалоговом окне список всех подключенных дисков (рис. 11-4). Рис. 11-4. Подключение дисков. Подключить сетевой ресурс (диск или папку) к локальному устройству позволяет метод MapNetworkDrive объекта WshNetwork. Первый его параметр — имя локального устройства (буква диска и двоеточие), второй задает се- тевой ресурс в формате UNC. В двух необязательных параметрах задаются имя пользователя и пароль. Указывая эти параметры, вы рискуете рассекретить свой пароль. О синтак- сисе MapNetworkDrive метода см. в Windows Script Host Reference. ПРИМЕЧАНИЕ Метод MapNetworkDrive вызывает ошибку периода выполнения, если локальное устройство уже подключено или если UNC-путь к сетевому ресурсу некорректен.
ГЛАВА 11 Дополнительные возможности WSH 261 Ошибки периода выполнения при создании подключения перехватыва- ет последовательность VBScript-команд: Set WshNetwork = WScrlpt.CreateObjectC'WScript.Network") On Error Resume Next WshNetwork.MapNetworkDrive "X:", \\ROM\C ErrCheck Err.Number Первый оператор создает объект WshNetwork. Благодаря On Error Resume Next, интерпретатор при появлении ошибки продолжит работу сценария со следующего оператора. В т ретьей строке метод MapNetworkDrive подключает сетевой диск к локальному устройству. Процедура ErrCheck в послед! юй стро- ке известит пользователя об ошибке периода выполнения в специальном окне (а не в информационном окне с сообщениями об ошибках, завершаю- щем сценарий). Для создания списка подключенных локальных дисков в этом примере служит Mexe>p,EnumNetworkDrives, возвращающий объект с набором для всех подключенных дисков. Следующий оператор создает набор: Set oDrives = WshNetwork.EnumNetworkDrives Затем поочередно обрабатываются все элементы набора: For 1 = 0 То oDrives.Count - 1 Step 2 If oDrives(i) <> ” " Then Text = Text & oDrives(i) & " " & oDrives(i+1) & vbCrLf End If Next Первый элемент набора возвращает имя локального диска, второй — путь в формате UNC для подключенного сетевого ресурса. Поэтому шаг цикла равен 2. Вот полная реализация на VBScript (листинг 11-10): ' Файл: MapDrives.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Подключение сетевых дисков и создание их списка ' в диалоговом окне '************************************************* Option Explicit Const machine = "\\Wien" Dim Text, Title, 1 Dim WshNetwork, oDrives ' Переменная-объект. Text = "Drive mapping" & vbCrLf & vbCrLf Title = ’’WSH sample - by G. Born" см. след. стр.
262 ЧАСТЬ III Особые возможное™ сценариев ' Создаем новый объект WshNetwork для доступа к свойствам сети. Set WshNetwork = WScrlpt.CreateObjectC'WScript.Network") ' Подключение некоторых дисков. On Error Resume Next WshNetwork.MapNetworkDrive "X:", machine & ”\C" ErrCheck Err.Number WshNetwork.MapNetworkDrive “Y:", machine & “\D" ErrCheck Err.Number WshNetwork.MapNetworkDrive "Z:”, machine & ”\E“ ErrCheck Err.Number ' Получение набора из свойства EnumNetworkDrives. Set oDrives = WshNetwork.EnumNetworkDrives For 1 = 0 To oDrives.Count - 1 Step 2 If oDrlves(i) <> " " Then Text = Text & oDrlves(i) & " " & oDrives(i+1) & vbCrLf End If Next MsgBox Text, vbDKOnly + vblnformation, Title ' Показываем ошибку. Sub ErrCheck(nr) Select Case nr Case 0 ' Нет ошибки Case -2147024829 WSoript.Eoho "Error: Network resouroe doesn't exist" Case -2147024811 WSoript.Eoho "Error: Drive already mapped” Саве Else WSoript.Eoho "Error: " & CStr(nr) End Seleot End Sub '*** Конец Листинг 11-10. MapDrives.vbs. Реализация на JScript Предотвратить появление ошибки периода выполнения при обращении к метру MapNetworkDrive для уже подключенного диска позволяют операторы: WshNetwo rk.RemoveNetwo rkD rive("X:"); WshNetwork.MapNetworkDrive(”X:”, ”\\\\ROM\\C");
ГЛАВА 11 Дополнительные возможности WSH 263 Следующий код удаляет подключение диска и создает новое назначение (листинг 11-11), Если подключения нет, метод RemoveNetworkDrive генери- рует ошибку периода выполнения. Для обработки ошибок периода выпол- нения методы RemoveNetworkDrive и MapNetworkDrive помещены в отдель- ные процедуры. В этих процедурах сценарий продолжает работу благодаря блоку обработки ошибок try...catch, а сами ошибки отображаются в окне. п................................................ И Файл: MapDrlves.js (Пример для WSH на JScript) И Автор: (с) G. Born И И Подключение сетевых дисков и создание их списка И в диалоговом окне //•*•*•.....*............“*•...................... var machine = "\\\\Wien\\"; И Создаем новый объект WshNetwork для доступа И к свойствам сети. var WshNetwork = WScript.CreateObject("WScript.Network"); // Удаляем подключения для предотвращения ошибок И периода выполнения. DisconnectDriveC'X:"); DiBconnectDriveC'Y: "); Disconnectsrive("Z;"); И Создаем подключения для некоторых сетевых устройств. ConneotDriveC'X:", machine + "С”); ConnectDriveC'Y: ”, machine + "D">; ConneotDriveC'Z:", machine + ”E">; I/ Создаем список всех подключенных устройств. Text = "Mapped drives \n"; var oDevices = WshNetwork. EnumNetworkDriveeO; for (var 1=0; 1 <= oDevices.length - 2; 1 = i + 2) { Text = Text + oDevices(i) + “ " + oDevices(i+1) + "\n”; } WScript.Echo(Text); function DisoonnectDrive(drive) { try { см. след. стр.
264 ЧАСТЬ III Особые возможности сценариев WshNetwo rk.RemoveNetwo rkDrive(d rive); } catch (e) { if (e != 0) Ц Отображаем сообщение об ошибке. WScrlpt.Echo("Remove " + drive, "\nError code : ", e.number, e.description); } function ConnectDrive(drlve, resource) { try { WshNetwork.MapNetworkDrive(drive, resource); } catch (e) { if (e != 0) // Отображаем сообщение об ошибке. WScrlpt.Echo(“Map " + drive + " to " + resource, "\nError code : ", e.number, e.description); } } //*** Конец Листинг 11-11. MapDrivesjs. Сценарии регистрации Чтобы настроить среду пользователя (подключить сетевые устройства, принтеры и т. д.) можно выполнить сценарий WSH при входе в Windows. В Windows 2000 администратор может также установить выполнение сцена- риев при запуске и завершении системы, при входе и выходе пользователя из системы (с помощью Microsoft Management Console). Эту тему мы рас- смотрим в главе 13- Доступ к реестру Windows Доступ к реестру Windows можно получить через объект WshShell. Реестр Windows — это база данных, в которой хранится информация о конфигу- рации системы. ВНИМАНИЕ Изменение реестра может повлечь серьезное повреждение ОС. Поэтому к выполнению и изменению представленных ниже сцена- риев нужно подходить особенно осторожно. Советы по сохранению и восстановлению реестра см. в книге Inside the Microsoft Windows 98 Registry (Microsoft Press, 1998).
ГЛАВА 11 Дополнительные возможности WSH 265 Вам не нужно напрямую обращаться к файлам реестра, поскольку для доступа к реестру в API Windows имеются специальные функции, для кото- рых реестр является иерархическим деревом разделов, подразделов и пара- метров. Эту древовидную структуру можно увидеть и в редакторе реестра (Registry Editor). Ниже показана часть реестра в редакторе реест ра (рис. 11-5). В левой пане- ли — иерархия разделов, в правой — значение текущего раздела. В реестре Windows 95/98 шесть основных (корневых) разделов. В Windows NT/2000 их пять (их называют ульями). Все корневые разделы начинаются с HKEY_, а вхо- дящие в них подразделы группируются по категориям. Registry Editoi а*0«*Ну Е* ¥»* £»w»itat ijTio Корневой раздел Подраздел Текущий -s раздел My Computer fegj HKEY_CLASSES_ROOT $ О HKEY-CURRENT-USER •f) GJ HKEY_LOCAL. MACHINE ® (J HKEYJJSERS —й-Cj HKEY-CURRENT-CONFIG Software Й CJ System Er! О Cui rent ContrcISet fe£l Control Enum (5 GJ SERVICES a ATIRAGE3 | ... — i асзДШЦД = • •• □ Mon800l &•(£) MNMDD (Default) Attach... ля! Attach... лД Attach... Defaul... gj Defaul... ^Defaul... Defaul... Defaul... Defaul... &Й Defaul... REG_SZ REG-DW... REG_DW... REG-DW... REG_DW... REG.DW... REG.DW... REG.DW... REG-DW... REG.DW... REG_DW... (value not set) окаюооооо(о) 0x00000000(0) 04X0X001 (1) 0x00000010(16) (ЫХШХООЮ) (ЬОССООО® (85) 04X000000(0) 0x00000320(800) 0x00000000(0) 0x00000258(600) ____Type______L..l.P*4 . Параметр Тип Значение Рис. 11-5. Разделы и параметры в редакторе реестра. Каждый раздел может содержать любое число подразделов (или не содер- жать вовсе). Раздел имеет значение по умолчанию; если значение по умол- чанию не установлено, в правой панели редактора реестра вы увидите Default и строку (value not set). В редакторе реестра вы можете описать собственные параметры, имена которых составляются из букв, цифр от О до 9 и подчер- кивания (_). В параметрах могут храниться данные нескольких типов. К String (REGSZ) содержит строковое значение, которое заключается в двойные кавычки (например, «C:\WINDOWS\EXPLORER£XE->). К Binary (REG BINARY) предназначен драйверам и приложениям, кото- рым требуются двоичные данные. В редакторе реестра двоичные данные имеют вид последовательности байтов в шестнадцатеричном формате (например, 01 03 01 00АВ 00...) длиной от 1 до 64 Кб. Порядок двоичных данных таков, что младший байт стоит в начале цепочки.
266 ЧАСТЬ III Особые возможности сценариев СОВЕТ WSH-метод RegWrite поддерживает запись двоичных значений не более 4 байт. Если требуется записать в реестр значение типа Binary большей длины, запишите .reg-файл (с помощью объекта FileSystemObject — см. главу 12) с нужными элементами. Затем методом Run импортируйте этот файл (скажем, WshShellRun <RegEdit.exe D:\patareg», ,True~). DWORD (REGDWORD) — специальный тип двоичных данных постоян- ной длины в 32 бита. Значения DWORD показаны в редакторе реестра как числа в шестнадцатеричном и десятичном форматах. Windows NT/2000 поддерживают еще два типа данных: REG_EXPAND_SZ предназначен для расширяемых (expandable) строк, a REG_MULTI_SZ — для составных (multiple) строк. REG FULL RESOURCE DESCRIPTOR — новый тип данных в Windows 2000 — описывает ресурсы аппаратного обеспечения (в WSH не поддерживается). ВНИМАНИЕ Пользователю не следует модифицировать двоичные па- раметры (и любые связанные с ними параметры реестра), так как смысл этих данных понятен только соответствующей программе. Очень вы- сок риск ввести неверные данные и повредить систему в целом. Насто- ятельно рекомендую обновлять двоичные значения реестра только через Control Panel или с помощью установочных программ. Доступ к реестру в WSH Доступ к реестру (его разделам и параметрам) из WSH-сценария обеспечи- вают методы объекта WshShell-. RegRead, RegWrite и Regpelete. Создать новый раздел позволяет оператор: WshShell.RegWrite ”HKCR\.1G_B0RN\", "" Здесь метод RegWrite создает подраздел .1G_BORN в разделе HKEY_CLASSES_ ROOT. В первом аргументе указывается имя записываемого раздела или па- раметра, начинающееся с полного или сокращенного (если таковое име- ется) имени одного из шести корневых разделов (табл. 11-1): Табл. 11-1. Имена корневых разделов. Краткое имя Полное имя нкси HKLM HKCR HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_CLASSES_ROOT HKEYUSERS HKEY_CURRENT_CONFIG HKEYJDYNDATA Подразделы разделяются символом «\» (обратный слеш). Поскольку в пер- вом аргументе RegWrite можно передать как имя раздела, так и имя парамет-
ГЛАВА 11 Дополнительные возможности WSH 267 ра, и поскольку существуют очень разные типы данных, система должна определить, что записать — раздел или параметр. Если строка в первом аргументе кончается символом «\», WSH считает, что нужно записать раздел. Если раздела нет, он будет создан. Иначе ме- тод не совершает никаких действий. Отсутствие в конце строки символа «\» (например, «HKCR\.lG_BORN\Test») означает задание параметра. Метод рассматривает строку как команду записи параметра в указанный раздел. Если такого параметра нет, он бу- дет создан с указанным именем и значением. ПРИМЕЧАНИЕ При создании элемента регистр букв сохраняется. Но при обращении к именам разделов и параметров регистр букв не име- ет значения. Во втором аргументе метода указываются данные для элемента (раздела или параметра), имя которого задано в первом аргументе. Третий параметр описывает тип данных параметра: WshShell.RegWrite "HKCR\.1G_B0RN\TeBt", "Hello, world", "REG.SZ" Этот оператор создает в ^33flgyieHKEY_CLASSES_ROOT\lG_BORN параметр Test со строковым значением «Hello, world». Следовательно, в третьем аргументе должен быть указан тип данных REG_SZ. Другие типы: REG_EXPAND_SZ, REG_ DWORD и REG_BINARY. Windows 95/98 поддерживают только REGJDWORD и REG_BINARY. ПРИМЕЧАНИЕ О типах данных для элементов системного реестра см. документацию Platform SDK (обратитесь, например, по адресу http:// msdn.microsoft.com/library/default.asp). Для считывания значения параметра служит метод RegRead: sregval = WshShell.RegRead("HKCR\.1G_B0RN\Test") Этот метод, которому нужно передать полное имя параметра, включающее имя раздела, возвращает значение параметра. Если указанного раздела нет, возникает ошибка периода выполнения. Позже я покажу, как перехватывать подобные ошибки и проверять наличие раздела. Удалить параметр или раздел можно методом RegDel-. WshShell.RegDelete "HKCR\.1G_B0RN\Test” В аргументе указывается путь для параметра или раздела. Если строка кончает- ся символом «\», аргумент рассматривается как имя раздела. Если в удаляемом разделе есть подразделы или параметры, все они удаляются автоматически. ВНИМАНИЕ Если раздел или параметр отсутствуют, метод генериру- ет ошибку периода выполнения (описана ниже).
268 ЧАСТЬ III Особые возможности сценариев Доступ к реестру из VBScript Рассмотрим простой пример применения описанных выше методов. Снача- ла сценарий создает раздел, потом параметр. После запуска сценарий спра- шивает, создавать ли подраздел .1GBORN в разделе HKEY_CLASSES_ROOT. В случае утвердительного ответа создается новый раздел (существующий ос- тается без изменений). Поскольку в Windows такой, как у нас, раздел обыч- но не встречается, проблем с доступом к реестру возникнуть не должно. Прежде чем параметр запишется или удалится из раздела, появится другое диалоговое окно. Диалоговые окна помогут следить за каждым шагом, пропуская при же- лании функции удаления параметра или раздела. Создав раздел и параметр, можете проверить их наличие в разделе HKEY CLASSES ROOT с помощью редактора реестра (рис. 11-6). Рис. 11-6. Элементы системного реестра. ВАЖНО В Windows NT/2000 сценарий должен иметь разрешение на доступ к разделу (на чтение, запись и удаление), которым обладает администратор. В Windows 2000 можно создать ярлык для файла сце- нария. В окне свойств ярлыка можно установить разрешение на вы- полнение сценария для другого пользователя. Таким образом, админи- стратор разрешает выполнять сценарий на уровне пользователя, пе- редав сценарию права доступа на уровне администратора. Взгляните на полную реализацию сценария на VBScript (листинг 11-12). Здесь, кстати, раздел всегда имеется в реестре, поэтому скорее всего ошиб- ка периода выполнения не возникнет. Позже вы можете удалить из реестра созданные элементы, используя редактор реестра или этот же сценарий. Файл: Registry.vbs (Пример для WSH на VBScript) Автор: (с) G. Born Доступ к системному реестру
ГЛАВА 11 Дополнительные возможности WSH 269 Option Explicit Dim Root, key, valname, valx, Response, sregval ' Инициализируем переменные. Root = "HKEY_CLASSES_ROOT" key = "\.1G_BORN\" valname = "Test" valx ="Hello, world" ' Создаем объект WshShell. Dim WshShell Set WshShell = WScrlpt.CreateObjectC'WScript.Shell") ' Запрашиваем у пользователя разрешение на создание раздела. Response = MsgBox("Create key?", vbYesNo + vbQuestion + vbDefaultButton2, "Registry access") If Response = vbYes Then ' Нажата кнопка Да (Yes) ' Создаем раздел или параметр. WshShell.RegWrite Root & Key, "" ' Сообщаем об успехе. MsgBox "Key " & Root & Key & " created" End If ' Запрашиваем разрешение на создание параметра. Response = MsgBox(”Create value?", vbYesNo + vbQuestion _ + vbDefaultButton2, "Registry access") If Response = vbYes Then ' Нажата Да (Yes) ' Создаем строковый параметр. WshShell.RegWrite Root & Key & valname, valx, "REG.SZ" WshShell.Popup "Value ” & Root & Key & valname & " created" ’ Пробуем считать значение параметра. sregval = WshShell.RegRead(Root & Key & valname) MsgBox "Value " & valname & " & sregval End If ' Запрашиваем разрешение на удаление параметра. Response = MsgBox(“Delete value?”, vbYesNo + vbQuestion + vbDefaultButton2, "Registry access") If Response = vbYes Then ' Нажата Да (Yes). WshShell.RegDelete Root & Key & valname MsgBox "Value " & valname & " deleted" End If ' Запрашиваем разрешение на удаление раздела. Response = MsgBox("Delete key?", vbYesNo + vbQuestion + см. след. стр.
270 ЧАСТЬ III Особые возможности сценариев vbDefaultButton2, '’Registry access") If Response = vbYes Then ’ Нажата Да (Yes). WshShell.RegDelete Root & Key MsgBox "Key " & key & ” deleted" End If ’*** Конец Листинг 11-12. Registry.vbs. Реализация на JScript Единственная разница между реализациями примера на VBScript и на JScript в том, что на JScript нужно указывать не один символ «\», а два, так как в JScript одинарный символ «\» начинает escape-последовательность (листинг 11-13). //************************************************ Ц Файл: Registry.js (Пример для WSH на JScript) И Автор: (о) G. Born И И Доступ к системному рееотру //“““............................................. var vbOKCancel = 1; var vblnformation = 64; var vbCancel = 2; 11 Инициализируем переменные. var Root = "HKEY_CLASSES_RO0T"; var key = "\\.1G_B0RN\\"; var valname = "Test"; var valx ="Hello, world”; var result; // Создаем объект WshShell. var WshShell = WScrlpt.CreateObjectC’WScript.Shell”); // Запрашиваем у пользователя разрешение на создание раздела, result = WshShell.Popup("Create key?", 0, "Registry access”, vbOKCancel + vblnformation); if (result != vbCancel) { // Используем в качестве типа "REG_SZ“ И (или "REG_BINARY" или "REG.BINARY"). WshShell.RegWrite(Root + key + valname, valx, "REG_SZ"); WshShell.Popup("Inserted: " + Root + key + valname); // Пробуем считать значение параметра. sregval = WshShell.RegRead(Root + key + valname);
ГЛАВА 11 Дополнительные возможности WSH 271 WshShell.Popup("Value: " + sregval): } Ц Запрашиваем разрешение на удаление параметра. result = WshShell.Popup(“Delete value?", 0, "Registry access", vbOKCancel + vblnformation): if (result l= vbCancel) { WshShell.RegDelete(Root + key + valname): WehShell.Popup("Deleted: “ + Root + key + valname); } I/ Запрашиваем разрешение на удаление раздела. result » WshShell.PopupC'Delete key?”, 0, "Registry access", vbOKCanoel + vblnformation): if (result 1= vbCancel) { WshShell.RegDelete(Root + key); WshShell.Popup("Deleted: " + Root + key); } //»** Конец Листинг 11-13. Registry.js. Обработка ошибок периода выполнения при доступе к системному реестру В сценариях Registry.vbs и Registry.js не возникает проблем при чтении из реестра, так как сначала в них создается раздел .1GBORN и уже затем из него считываются данные. В реальных задачах вы рано или поздно столкнетесь с такой ситуацией: если раздела или параметра, указанного в операции чте- ния, нет, WshShelLRegRead вызывает ошибку периода выполнения. VBScript позволяет перехватить такую ошибку оператором On Error Resume Next, а для анализа кода ошибки служит свойство Number объекта Err. Считывание раз- дела реестра с обработкой ошибок может выглядеть так: On Error Resume Next ' Пробуем прочитать параметр. Если его нет, ' перехватываем ошибку периода выполнения. sregval = WshShell.RegRead(Root & Key & valname) If Err.Number <> 0 Then MsgBox "Value doesn’t exist" WScript.Quit ' Завершаем сценарий. End If
272 ЧАСТЬ III Особые возможности сценариев Код на VBScript, представленный ниже, применяет эту технику при считы- вании информации из раздела реестра. Помещенный в него код обработки ошибок позволяет проверить наличие раздела. Чтобы увидеть, как это рабо- тает, запустите сценарий и щелкните кнопку No в диалоговом окне, которое запрашивает разрешение на создание раздела или параметра. Требуемый раз- дел или параметр не создаются, а при попытке прочитать несуществующий параметр возникает ошибка периода выполнения. Сценарий обрабатывает ошибку и выводит сообщение об отсутствии указанного раздела. Вот полная реализация сценария (листинг 11-14): ' Файл: Registry).vbs (Пример для WSH на VBScript) ‘ Автор: (с) G. Born ' Доступ к реестру и перехват ошибок периода ' выполнения при обращении к отсутствующему разделу Option Explicit ' Внимание: разрешаем обработку ошибки периода ' выполнения для всего сценария. On Error Resume Next Dim Root, key, valname, valx, Response, sregval ' Инициализируем переменные. Root = "HKEY_CLASSES_ROOT" key = "\.1G_BORN\" valname = "Test" valx ="Hello, world" Создаем объект WshShell. Dim WshShell Set WshShell = WScript.CreateObject("WScript.Shell") ’ Спрашиваем у пользователя, создавать ли раздел. Response = MsgBox("Create key?", vbYesNo + vbOuestion + vbDefaultButton2, "Registry access") If Response = vbYes Then ’ Нажата кнопка Да (Yes). ’ Создаем раздел/параметр. WshShell.RegWrite Root & Key, "" ' Сообщаем об успехе. WshShell.Popup "Key " & Root & Key & " created" End If ' Спрашиваем, создавать ли параметр. Response = MsgBox("Create value?”, vbYesNo + vbQuestion + vbDefaultButton2, "Registry access")
ГЛАВА 11 Дополнительные возможности WSH 273 If Response = vbYes Then ' Нажата Да (Yes). ' Создаем строковый параметр. WshShell.RegWrite Root & Key & valname, valx, "REG_SZ" MsgBox "Value “ & Root & Key & valname & ” created" ' Считываем значение. sregval = WshShell.RegRead(Root & Key & valname) MsgBox "Value " & valname & " & sregval Else ' Пробуем считать значение. Если параметра нет, ' перехватываем ошибку с помощью объекта Err. sregval = WshShell.RegRead(Root & Key & valname) If Err.Number <> 0 Then MsgBox "Value doesn't exist" WScript.Quit Else MsgBox "Value " & valname & " & sregval End If End If ' Спрашиваем, удалять ли параметр. Response = MsgBox("Delete value?", vbYesNo + VbQuestion + vbDefaultButton2, "Registry access") If Response = vbYes Then ' Нажата Да (Yes). WshShell.RegDelete Root & Key & valname MsgBox "Value " & valname & ” deleted" End If ' Спрашиваем, удалять ли раздел. Response = MsgBox("Delete key?", vbYesNo + vbQuestion + _ vbDefaultButton2, "Registry access") If Response = vbYes Then ' Нажата Да (Yes). WshShell.RegDelete Root & Key MsgBox "Key ” & key & " deleted" End If '*** Конец Листинг 11-14. Registry 1 .vbs. Проверка наличия раздела Обработка ошибок, показанная выше, слишком трудоемка, так как требует обработки всех кодов ошибок для каждого оператора чтения из реестра. Намного удобнее применить функцию, проверяющую наличие раздела или параметра. В VBScript такая функции реализована в нескольких строках кода: Function KeyExists(key) Dim key2
274 ЧАСТЬ III Особые возможности сценариев On Error Resume Next key2 = WshShell.RegRead(key) If Err <> 0 Then KeyExists = False Else KeyExiste = True End If On Error GoTo 0 End Function Вы передаете функции, которая читает раздел или параметр, в качестве аргумента выражение, содержащее имя раздела или параметра. В зависимо- сти от значения объекта Err функция возвращает True или False. Эта новая функция представлена ниже (листинг 11-15). Программа пред- лагает пользователю ввести имя раздела или параметра и проверяет, суще- ствует ли этот раздел или параметр. Если да, значение элемента отобража- ется в диалоговом окне (рис. 11-7, наверху). В противном случае выводится сообщение об ошибке (рис. 11-7, внизу). Имена разделов должны оканчиваться символом «\». Если ввести HKCR\bmp, появится сообщение, что раздел не существует, так как метод RegRead тре- бует, чтобы разделы оканчивались этим символом. Если ввести HKCR\bmp\, программа считает значение раздела .bmp в ветвиHKEY-CLASSES_ROOT. Этот элемент реестра описывает тип .bmp-файлов. j Enta j | I- ....... - ... ij||HKCR\.bmpS| ---------------------------------------------- Рис. 11 -7. Диалоговые окна для доступа к разделу системного реестра. ' Файл: Registry2.vbs (Пример для WSH на VBScript) ’ Автор: (с) G. Born
ГЛАВА 11 Дополнительные возможности WSH 275 ' Доступ к реестру и применение KeyExist для ' проверки наличия раздела или параметра ’************************************************ Option Explicit Dim key1 Dim WshShell ’ Получаем объект WshShell для методов доступа к реестру. Set WshShell = WScript.CreateObJeot("WScrlpt.Shell") ' Запрашиваем у пользователя имя раздела. key1 = InputBoxCEnter a key (for instance HKCR\.bmp\)”, "Key”, "HKCR\") If KeyExists(key1) = True Then MsgBox "Key: " & key1 & " Value: " & WshShell.RegRead(keyl) Else MsgBox "Key: " & key1 & ” doesn't exist" End If Function KeyExists(key) Dim key2 On Error Resume Next key2 = WshShell.RegRead(key) If Err <> 0 Then KeyExists = False Else KeyExists = True End If On Error GoTo 0 End Function '»** Конец Листинг 11-15. Registry2.vbs. Реализация на JScript В JScript нет функции ввода, поэтому следующий сценарий (листинг 11-16), реализованный в виде .wsf-файла, применяет технику получения пользова- тельского ввода, описанную в главе 8. Функция проверки наличия раздела реестра реализована на JScript. <?xml version="1.0" encoding="IS0-88S9-1"?> cl- Файл: Registry2.wsf (WSH 2) Автор: (о) G. Born -> <Job id»"T1”> см. след. стр.
276 ЧАСТЬ III Особые возможности сценариев <script language=”VBScript"? <1[CDATAE Function WSHInputBox(Message, Title, Value) Предоставляет функцию InputBox сценарию на JScrlpt ’ Вызывается из JScript следующим образом: var result = WSHInputBox("Enter a name", "Input”, test); WSHInputBox = InputBox(Message, Title, Value) End Function ]]> </script> «script language^'JScript"? <![CDATA[ function KeyExists(obj, key) { // Проверяет наличие раздела, try { var key2 = obj.RegRead(key); } catch (e) { if (e != 0) // Ошибка, return false; } return true; } ]]> </script? «script language=”VBScript"> «![CDATAE Dim key1 Dim WSHShell ' Получаем объект WshShell для методов работы с реестром. Set WSHShell = WScrlpt.CreateObjectC'WScript.Shell”) ' Запрашиваем у пользователя имя раздела. key1 = WSHInputBoxC’Enter a key (for instance HKCR\.bmp\) ”, "Key", "HKCR\") If KeyExists(WSHShell, key1) = True Then MsgBox "Key: " & key1 & " Value: ” & WSHShell.RegRead(keyl) Else MsgBox "Key: " & key1 & " doesn't exist" End If ]]> «/script? «/job? Листинг 11-16. Registry2.wsf.
ГЛАВА 11 Дополнительные возможности WSH 277 Доступ к реестру в WSH В предыдущей программе из разделов реестра считываются только простые параметры. Согласно Windows Script Host Reference методы считывания и записи в реестр поддерживают следующие типы данных: REGSZ — простое строковое значение; Я REG MULTISZ — значение из нескольких строк; поддерживается толь- ко Windows NT/2000, WSH 2 не поддерживает работу с такими парамет- рами; М REG EXPAND SZ — расширяемое строковое значение; поддерживается только в Windows NT/2000; REG DWORD — параметр типа DWORD; значение, передаваемое методу RegWrite, должно быть целого типа; М REG BINARY — двоичный поток данных; значение, передаваемое методу RegWrite, должно быть целого типа и содержать поток данных. Вы можете использовать эти типы для считывания параметров, а некоторые из них — для создания параметров, что будет ниже продемонстрировано. А что происходит при создании нового раздела? Если вы создаете раздел в редакторе реестра, параметр по умолчанию не определен. После записи нового раздела реестра посредством RegWrite параметру по умолчанию при- сваивается пустая строка: WshShell.RegWrite "HKCR\.123\", "" Если вы хотите, чтобы так же было и в сценарии, сделайте так. Не созда- вая нового раздела, вставьте в реестр новый параметр и раздел. После уда- ления параметра останется новый раздел с параметром Default, которому присвоено (значение не присвоено) (value not set). Вы можете создать новый параметр, включая его раздел оператором: ’ Создаем параметр напрямую и неявно пустой параметр по умолчанию. WshShell.RegWrite "HKCR\.123\Test", "Hello, world", "REG_SZ" Оператор создает параметр Test в разделе HKEY CLASSES_ROOT\.l2). Если раз- дел создается одновременно с параметром, параметр по умолчанию не задан. Считывание параметров посредством RegRead также може т вызвать про- блемы. Во-первых, если вы попытаетесь считать параметр по умолчанию данного раздела, WSH 2 вызовет ошибку периода выполнения, если параметр не определен. Код ошибки такой же, как для несуществующего параметра. Чуть ниже (листинг 11-19) вы познакомитесь с программой RegAccessTest.vbs, по- казывающей, как это работает. Работа с двоичными параметрами При записи в реестр посредством WSH параметров типа REG_BINARY вы ог- раничены 4-байтными элементами, так как аргумент, передаваемый при со- здании параметра, должен быть длинным целым. При считывании парамет-
278 ЧАСТЬ III Особые возможности сценариев ров, содержащих REG_BINARY, метод RegRead возвращает массив байтов, ко- торый может быть обработан в цикле For Each. Следующий сценарий (лис- тинг 11-17) записывает параметр REG_BINARY, а затем его же считывает. Файл: BinaryRead.vbs (Пример для WSH на VBScript) Автор: (с) G. Born Считывание двоичного элемента из реестра Windows и отображение его на экране Option Explicit 01m WshShell, value, entry, text ' Создаем объект WshShell для доступа к реестру. Set WshShell = WScrlpt.CreateObject("WSoript.Shell") ' Добавляем двоичный параметр типа REG_BINARY. WshShell.RegWrite "HKCR\.123\Binary", 123456789, "REGJBINARY" ' Считываем параметр. value = WshShell.RegRead("HKCR\.123\Binary") ' Извлекаем элементы из параметра. text = "Entry is of type " & typename(value) & vbCrLf For Each entry In value text = text & entry & vbCrLf Next MsgBox text, vbOKOnly, "Read REG_BINARY entry" WshShell.RegOelete "HKCR\.123\" WScrlpt.Echo "Key removed" '*** Конец Листинг 11-17. BinaryRead.vbs. Работа с параметрами REG_MULTI_SZ WSH не поддерживает параметры REG_MULTI_SZ. Можно создать параметр типа REG_MULTI_SZ, но нельзя ввести в него настоящий многострочный эле- мент. Параметр REG_MULTI_SZ позволяет прочитать метод RegRead, который возвращает массив, содержащий строки. Чтобы показать эти параметры в диалоговом окне, сценарий должен обработать этот массив. Следующий код с помощью предварительно описанного раздела реестра считывает пара- метр (листинг 11-18).
ГЛАВА 11 Дополнительные возможности WSH 279 Файл: MultiStrRead.vbs (Пример для WSH на VBScript) Автор: (о) G. Born Считывание элемента REG_MULTI_SZ из реестра Windowa и отображение его на екране Option Explicit Dim WshShell, val, entry, text ' Создаем объект WahShell для доступа к реестру. Set WahShell = WScrlpt.CreateObjectC'WScript.Shell") ’ Считываем параметр REG_MULTI_SZ. val = WshShell.RegRead _ ("HKLM\Syatem\Cu r rentCont rolSet\Cont rol\Se rviceG roupOrde r\l1st") ' Обрабатываем параметры. text « "Entry ie of type " & typename(val) & vbCrLf For Each entry In val text text & entry & vbCrLf Next MsgBox text, vbOKOnly, "Read REG_MULTI_SZ entry" ’»** Конец Листинг 11-18. MultiStrRead.vbs. Доступ к параметрам и разделам Программа на VBScript (листинг 11-19) обращается к параметрам и разде- лам реестра средствами WSH. Сценарий создает новый раздел с именем HKCR\.123 и некоторые параметры типов REGSZ, REG_DWORD, REG_BINARY и REG_EXPAND_SZ. На каждом шаге параметры, добавляемые в реестр, ото- бражаются в диалоговом окне, позволяя отслеживать изменения в реестре из редактора реестра. Далее сценарий создает на одном шаге новый параметр в разделе HKCR\.123, порождая для него пустой параметр Default. Метод RegRead вызывает ошибку периода выполнения. Этот сценарий позволяет проследить работу методов доступа к реестру. ' Файл: RegAccessTest.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Доступ к различным типам в реестре Windows (в WSH 2) Option Explicit см. след. стр.
280 ЧАСТЬ III Особые возможности сценариев Dim WshShell Dim value ’ Создаем объект WshShell для доступа к реестру. Set WshShell = WSoript.CreateObjectC’WScript.Shell") Сначала создаем пустой раздел. Заметьте, что параметр по умолчанию устанавливает неявно равным "". WshShell.RegWrite ”HKCR\.123\”, value = WshShell.RegRead("HKCR\.123\") WScrlpt.Echo "Key HKCR\.123 written ..." & vbCrLf & _ "Default value: ", value Присваиваем параметру по умолчанию "Default value". WshShell.RegWrite "HKCR\.123\", "Default value" value = WshShell.RegRead(“HKCR\.123\") WScrlpt.Echo "Key HKCR\.123 default value written ..." & vbCrLf & "Default value: ”, value Теперь добавляем параметр Test типа REG_SZ. WshShell.RegWrite "HKCR\.123\Test", "Hello, world”, ”REG_SZ" value = WshShell.RegRead(”HKCR\.123\Test") WScrlpt.Echo "Key HKCR\.123 value ’Test’ written ..." & vbCrLf & _ "Test value: ", value ’ Теперь добавляем параметр Number типа REG_DWORD. WshShell.RegWrite "HKCR\.123\Number", 8000, "REG_DWORD” value = WshShell.RegRead("HKCR\.123\Number”) WScrlpt.Echo "Key HKCR\.123 value ’Number’ written ...” & vbCrLf & "Number value: ", value ’ Теперь добавляем параметр Binary типа REG_BINARY. WshShell.RegWrite "HKCR\.123\Binary”, 123456789, "REG_BINARY” Мы не можем считать двоичный параметр: возвращает ошибочное ’ значение, которое нельзя использовать. ’value = WshShell.RegRead ("HKCR\.123\Binary") value = "not readable" WScript.Echo "Key HKCR\.123 value ’Binary’ written ..." & vbCrLf & "Binary value: ", value Теперь добавляем расширяемый параметр TextEx типа REG_EXPAND_SZ. WshShell.RegWrite "HKCR\.123\TestEx", "XWINDIRX\Notepad.exe”. "REG_EXPAND_SZ" value = WshShell.RegRead(”HKCR\.123\TestEx”) WScrlpt.Echo "Key HKCR\.123 value ’TestEx’ written ...” & vbCrLf & "Test value: ”, value WshShell.RegDelete ”HKCR\.123\" WScrlpt.Echo "Key HKCR\.123 removed ..."
ГЛАВА 11 Дополнительные возможности WSH 281 ' ### Теперь делаем вторую попытку. ### ' Создаем параметр напрямую; это вызывает появление ' пустого параметра по умолчанию. WshShell.RegWrite "HKCR\.123\Test", "Hello, world", "REG_SZ" value = WshShell.RegRead("HKCR\.123\Test") WScript.Echo "Key HKCR\.123 value 'Test' written ..." & vbCrLf & _ "Test value: ", value ' Попытка считать параметр no умолчанию ' вызывает ошибку периода выполнения. On Error Resume Next value = WshShell.RegRead(”HKCR\.123\”) If Err <> 0 Then WScript.Echo "Error ", Err.Number, Err.Description Else WScript.Echo "Key HKCR\.123 read ...” & vbCrLf & _ "Default value: ", value End If On Error GoTo 0 WshShell.RegDelete ”HKCR\.123\" WScript.Echo "Key HKCR\.123 removed ...” ’*** Конец Листинг 11-19. RegAccessTest.vbs. Перечисление разделов и параметров реестра WSH не позволяет выполнить перечисление параметров и подразделов внут- ри раздела. Однако нужную информацию позволяют получить API-функции. Microsoft предлагает модуль Regobj.dll, предоставляющий сценарию доступ к API-функциям через объектную модель. ПРИМЕЧАНИЕ Модуль Regobj.dll имеется в папке \Tools\RegObj на прилагаемом к книге компакт-диске. В сопутствующем файле Microsoft Word есть краткое введение в объектную модель RegObj. Она позволяет не только выполнить перечисление раздела, но и получить доступ к реестру удаленного компьютера. Regobj.dll можно скопировать с Web- узла Microsoft, если у вас есть лицензия на Microsoft Visual Basic. (Ищите слово Regobj. dllj Экземпляр объекта можно получить, выполнив команду: Set objReg = WScript.CreateObjectC'RegObj .Registry”) Если DLL зарегистрирована в системе, ссылка на экземпляр объекта свя- зывается с переменной объекта objReg. После этого в сценарии можно задей-
282 ЧАСТЬ III Особые возможности сценариев ствовать свойства и методы объекта RegObj. Метод RegKeyFroniString извле- кает содержание данного раздела. Ему требуется передать в качестве аргу- мента имя раздела: Set RootKey = objReg.RegKeyFromString(keyl) Полученный этим методом набор можно обработать в цикле For Eacb.Jn. Для перечисления всех подразделов данного раздела достаточно выполнить: For Each oVal In RootKey.SubKeys ’ Цикл no элементам набора. name = name & oVal.Name & vbCrLf Next Набор SubKeys содержит все разделы данного родительского раздела. Свойство Name элемента набора содержит имя раздела. Если вы намерены считать параметры данного раздела, организуйте такой цикл: For Each oVal In RootKey.Values ' Цикл no элементам набора. name = name & oVal.Name & vbTab & oVal.Value & vbCrLf Next Свойство Values возвращает набор, содержащий все параметры данного раздела. Свойство Name данного элемента позволяет получить имя парамет- ра. Свойство Value этого элемента дает его значение. ВАЖНО Новый тип m^evpo^REG_FULL_RESCVRCE_DESCRIPTOR, при- меняемый в Windows 2000, Regobj.dll не под держивается. При попытке получить такой параметр возникнет ошибка периода выполнения. Следующий сценарий на VBScript перечисляет подразделы в заданном разделе, а затем — его параметры (листинг 11-20). '************«********4*************************** ’ Файл: Enumerate.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ’ Применение Regobj.dll для перечисления подразделов ' и параметров в разделе реестра Windows '************************************************* Option Explicit ’ Описываем два раздела. Const key1 = "\HKEY_Classes_Root\Folder" Const key2 = _ ”\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run” Dim objReg Dim RootKey Dim name Dim oVal ' Создаем объект-ссылку на Regobj.dll.
ГЛАВА 11 Дополнительные возможности WSH 283 Set objReg = WScript.CreateObjectC'RegObj.Registry") ' Получаем свойство объекта "родительский раздел". Set RootKey = objReg.RegKeyFromString(key1) name = "Registry key " & key1 & " entries are" & vbCrLf For Each oVal In RootKey.SubKeys ’ Цикл no элементам набора. name = name & oVsl.Name & vbCrLf Next MsgBox name, vbOKOnly, "WSH Registry Enumerate sample" ' Получаем свойство объекта "раздел". Set RootKey = objReg.RegKeyFromString(key2) name ° "Registry key " & key2 & " value entries are" & vbCrLf For Eaoh oVal In RootKey.Values ' Цикл по элементам набора. name * name & oVal.Name & vbTab & oVal.Value & vbCrLf Next MsgBox name, vbOKOnly, "WSH Registry Enumerate sample" '••• Конец Листинг 11-20. Enumerate.vbs. ПРИМЕЧАНИЕ Чтобы задействовать файл Enumerate.vbs, нужно заре- гистрировать Regobj.dll с помощью программы Regsvr32.exe (см. гла- ву 2). Regobj.dll находится на прилагаемом к книге компакт-диске. Доступ к реестру на удаленном компьютере WSH не поддерживает доступа к удаленному реестру. К счастью, такую воз- можность предоставляет файл Regobj.dll. Создав экземпляр объекта RegObj, можно получить экземпляр объекта RegObj для объекта «удаленный реестр»: Set objRemots = objReg.RemoteRegistry(host) У метода RemoteRegistry один параметр — имя хоста (например, \\Rom). Переменная objRemote позволяет вызвать и другие методы: Set RootKey = objRemote.RegKeyFromString(keyl) Метод RegKeyFromString вызывается точно так же, как при доступе к ло- кальному реестру. Одно отличие: переменная objRemote содержит экземпляр удаленного объекта. Представленный ниже код (листинг 11-21) выполняет те же функции, что и следующий за ним (листинг 11-20). Только в последнем
284 ЧАСТЬ III Особые возможности сценариев осуществляется связь с реестром удаленного хоста \\Wien. Для выполнения сценария в вашей среде измените имя хоста. * ************************************************ ' Файл: RemoteReg.vbs (Пример для WSH на VBScript) ’ Автор; (с) G. Born ' Применение Regobj.dll для перечисления подразделов ' и параметров в разделе реестра Windows на ’ удаленном компьютере Option Explicit ' Описываем два раздела. Const key1 = “\HKEY_CLASSES_ROOT\Folder" Const key2 = "\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" Const host = "\\Wien" Dim objReg Dim RootKey, objRemote Dim name Dim oVal ' Создаем объект-ссылку на Regobj.dll. Set objReg = WScrlpt.CreateObject("RegObj.Registry") ' ### Устанавливаем связь с удаленным реестром. ### Set objRemote = objReg.RemoteRegistry(host) ’ Получаем свойство объекта “родительский раздел”. Set RootKey = objRemote.RegKeyFromString(key1) name = “Registry key ” & key1 & “ entries on “ & _ host & “ are" & vbCrLf For Each oVal In RootKey.SubKeys ' Цикл no элементам набора. name = name & oVal.Name & vbCrLf Next MsgBox name. vbOKOnly, “WSH Registry Enumerate sample" ’ Получаем свойство объекта "раздел". Set RootKey = objRemote.RegKeyFromString(key2) name = "Registry key " & key2 & " value entries on" & _ host & " are" & vbCrLf For Each oVal In RootKey.Values ’ Цикл по элементам набора.
ГЛАВА 11 Дополнительные возможности WSH 285 паше = name & oVal.Name & vbTab & oVal.Value & vbCrLf Next MsgBox name, vbOKOnly, "WSH Registry Enumerate sample” '*** Конец Листинг 11-21. Remote Reg. vbs. ПРИМЕЧАНИЕ Чтобы получить доступ к реестру на удаленном ком- пьютере, последний должен поддерживать удаленный доступ к реест- ру. В Windows 2000 удаленный доступ к реестру является частью ОС, а в Windows 95/98 нужно установить службу Remote Registry. Если сце- нарий вызвал ошибку периода выполнения «Ап unexpected error has been returned from the registration database» («Регистрационная база данных вернула неизвестную ошибку»), значит, удаленный компьютер недоступен (из-за отсутствия связи или службы). Кроме того, если сце- нарий не имеет надлежащих разрешений для пользователя, появляет- ся ошибка периода выполнения с сообщением о недоступности раз- дела. В этом случае попробуйте выполнить сценарий с правами адми- нистратора. Изменение пути для установки Windows 98 При установке Windows 98 в реестр записывается путь для исходных уста- новочных файлов. Он находится в разделе ветви HKEY_LOCAL_MACHINE-. \SOFTWARE\Mic rosoft\Wlndows\CuгrentVe rsion\Setup Этот раздел содержит параметр SourcePath, где записан установочный путь. Если вам понадобится добавить к системе компонент Windows, про- грамма Setup возьмет библиотечные файлы из места, указанного в парамет- ре. Если путь неправилен (из-за того, что место источника изменилось), Windows потребует ввести другой путь. Если установка ОС производилась с компакт-диска, вам предложат вставить этот диск в CD-ROM-привод. Некоторых пользователей не устраивает такое поведение, и они копиру- ют содержимое компакт-диска в локальную папку на жестком диске, рассчи- тывая, что Windows обратится к этим файлам при следующей установке. Увы, Windows продолжает запрашивать компакт-диск. Похожая ситуация возни- кает при установке нового диска или ZIP-устройства, поскольку тогда Win- dows присваивает компакт-диску другую букву. OEM-системы часто хранят установочные файлы в папке на локальном жестком диске. Если вы удалите эту папку, освобождая место на диске, Setup сообщит об ошибке, когда вы попытаетесь добавить компонент Windows. ПРИМЕЧАНИЕ Эти сценарии вынуждают вас вводить в диалоговом окне путь для установочных файлов всякий раз, когда вы добавляете компонент Windows, так как путь при последнем сеансе установки не запоминается.
286 ЧАСТЬ III Особые возможности сценариев Преодолеть эту преграду вам поможет сценарий, который считывает ус- тановочный путь, записанный в системный реестр (листинг 11-22). А пользо- ватель изменяет его, задавая новое значение в окне ввода (рис. 11-8). Рис. 11-8. Диалоговое окно для задания установочного пути. После закрытия окна новый путь вносится в реестр. При следующем се- ансе установки Windows будет читать библиотечные файлы из нового пути. Файл: SetlnstPath.vbs (Пример для WSH на VBScript) Автор: (с) G. Born ' Задание пути для установочного компакт-диска Windows ' (Этот сценарий связан о определенным риском!) 'ft************************************************** Option Explicit Dim WshShell Dim Root, key, valname, valx Dim text, title ' Переменные для доступа к рееотру. Root = "HKEY_LOCAL_MACHINE" key = "\SOFTWARE\Miorosoft\Windows\CurrentVersion\Setup\" valname = "SourcePath” valx ="" text = "Change installation path" & vbCrLf & vbCrLf & _ "Change the path for installation files." title = "WSH sample - by G. Born " ' Создаем объект WshShell. Set WshShell = WScript.CreateObject("WScript.Shell") ' Получаем из реестра установочный путь. valx = WshShell.RegRead(Root & key & valname) ' Предлагаем пользователю изменить этот путь. valx = InputBox(text, title, valx) If valx <> Then ' Проверка на пустую строку. WshShell.RegWrite Root & Key & valname, valx, "REG_SZ"
ГЛАВА 11 Дополнительные возможности WSH 287 End If ’*** Конец Листинг 11-22. RemoteReg.vbs. Сокрытие имени последнего зарегистрировавшегося пользователя При входе в Windows имя последнего пользователя отображается в диалого- вом окне регистрации. Многие администраторы предпочитают скрывать это имя, так как люди, не допущенные к работе в системе, могут применять его для входа в систему. Утилита Tweak UI и System Policy Editor, поставляемые с Windows, поддерживают функцию отображения и сокрытия имени последне- го пользователя в диалоговом окне регистрации. Windows 95/98 хранят эту информацию в разделе ветви HKEY_LOCAL_/1ACHINE: \SOFTWARE\Mlo rosoft\Wlndows\Cuг rentVe rslon\Wlnlogon Если раздел содержит параметр DontDisplayLastUserName и его значение — 0x0000001, имя последнего пользователя не показывается в окне регистра- ции. (См. Inside the Microsoft Windows 98 Registry) Следующая JScript-программа прячет имя последнего пользователя (ли- стинг 11-23)- Когда сценарий стартует, вы видите диалоговое окно с вопро- сом, показать это имя или нет. //•«««***««««*•»««***««»««**«»««**»«•***«»«•«*«*•««« Ц Файл: HIdeUserName.js (Пример для WSH на JScrlpt) Ц Автор: (с) 6. Born // // Отображение и сокрытие имени последнего пользователя /Л*......*......................................... var vbYesNo = 4; var vbOK = О var vblnformation = 64; var vbCancel = 2; var vbYes = 6 // Инициализация переменных. var Root = "HKEY_LOCAL_MACHINE"; var key = "\\SOFTWARE\\Microsoft\\Windows\\CurrentVerslon\\Wlnlogon\\"; var valname = "DontDisplayLastUserName'’; var result; var WshShell = WScrlpt.CreateObjectC’WScript.Shell"); result = WshShell.Popup( ’’hide last user in logon dialog box?\n\n\r” + см. след. стр.
288 ЧАСТЬ III Особые возможности сценариев "Hide last user’s name in logon dialog box", 0, "Windows 98 - powered by G. Born”, vbYesNo + vblnformation ); if (result == vbYes) { WshShell.RegWrite(Root + key + valname, "1”, ”REG_S2"); WshShell.PopupC’Show user name disabled" + "\n\n\rHide last user's logon name", 0. "http://www.borncity.de", vbOK); ) else { WshShell.RegWrite(Root + key + valname, "1", "REG.SZ"); WshShell.RegDelete(Root + key + valname); WshShell.Popup("Enable user name" + "\n\n\rShow last user's logon name", 0, "http://www.borncity.de”, vbOK); ) //*** Конец Листинг 11-23. HideUserNamejs. Получение имени рабочей группы в Windows 98 Если ваш компьютер работает в составе сетевой рабочей группы, можно вы- яснить, к какой рабочей группе относится текущий пользователь. Увы, мето- дов извлечения сведений о рабочей группе в WSH нет. Однако имя пользова- теля, домена и компьютера можно получить методами объекта WshNetwork. Возьмем, например, Windows 98. Информация о домене хранится в рее- стре Windows 98 в разделе ветви HKEY LOCAL MACHINE-. \SYSTEM\Cu г rentCont rolSet\Se rvices\VxD\VNETSUP Параметр содержит имя группы в виде строки, которую можно считать и показать (рис. 11-9). Рис. 11-9. Диалоговое окно с информацией о сети (в Windows 98).
ГЛАВА 11 Дополнительные возможности WSH 289 Следующая программа на VBScript довольно проста (листинг 11-24). За ее основу взят файл Network.vbs, куда добавлена функция KeyExists (ее мы уже ис- пользовали). Сценарий считывает информацию из свойств объекта WshNetwork, а затем ищет в реестре параметр Workgroup. Если он есть, его значение встав- ляется в строку. Результаты выводятся в диалоговое окно. Файл: GetDomain.vbs (Пример для WSH на VBScript) Автор: (с) G. Born ' Отображение имен пользователя, домена ’ и рабочей группы ’ft****************************** ******* Option Explicit Dim Text, Title Dim WshNetwork Dim key1 Dim WshShell ' Переменная-объект. ’ Создаем объект WshShell для доступа к реестру. Set WshShell = WScript.CreateObject("WScript.Shell") Text = "Networking information" & vbCrLf & vbCrLf Title = "WSH sample - by G. Born" ' Создаем новый объект WshNetwork для доступа к свойствам сети. Set WshNetwork = WScript.CreateObject("WScript.Network") Text = Text & "Computer name : " & WshNetwork.ComputerName & vbCrLf Text = Text & "Domain : " & WshNetwork.UserDomain & vbCrLf Text = Text & "User name : " & WshNetwork.UserName & vbCrLf Text = Text & "Workgroup name : “ ' Определяем, есть ли параметр Workgroup. key1 = "HkEY_LOCAL_MACHINE\System\CurrentControlSet" & "\Services\VxD\VNETSUP\Workgroup" If (keyExists(keyl) = True) Then Text = Text & WshShell.RegRead(keyl) End If Text = Text & vbCrLf MsgBox Text, vbOkOnly + vblnformation, Title 'йййййййййййййййййййййййййййййййййййййййййййййй ’ Вспомогательная функция проверки наличия раздела. йййййййййййййййййййййййййййййййййййййййййййййй см. след. стр.
290 ЧАСТЬ III Особые возможности сценариев Function KeyExists(key) Dim кеу2 On Error Resume Next key2 = WshShell.RegRead(key) If Err <> 0 Then KeyExlsts = False Else KeyExlsts = True End If On Error GoTo 0 End Function '*** Конец Листинг 11-24. GetDomain.vbs. Реализация на JScrlpt Ниже показано, как получить имя пользователя, домена, компьютера и ра- бочей группы посредством JScript (листинг 11-25). Функция KeyExists явля- ется реализацией VBScript-функции KeyExists на JScript. //*».............................................. И Файл: GetDomaln.js (Пример для WSH на JScrlpt 5) // Автор: (с) G. Born И // Отображение имен пользователя, домена, компьютера И и рабочей группы 1f ************************************************* Ц Создаем объект WshShell для доступа к реестру. var WshShell = WScrlpt.CreateObjectC'WScript.Shell"): var Text = "Networking lnformatlon\n\n"; var Title = "WSH sample - by G. Born"; 11 Создаем новый объект WshNetwork для доступа к свойствам сети, var WshNetwork = WScrlpt.CreateObjectC’WScript.Network"); Text = Text + "Computer name : " + WshNetwork.ComputerName + "\n"; Text = Text + "Domain : " + WshNetwork.UserDomaln + "\n"; Text = Text + "User name : " + WshNetwork.UserName + "\n"; Text = Text + "Workgroup name : "; 11 Определяем, есть ли параметр Workgroup. key1 = "HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\" + "Servlces\\VxD\\VNETSUP\\Workg roup"; If (KeyExlsts(WshShell, key1)) Text = Text + WshShell.RegRead(keyl)
ГЛАВА 11 Дополнительные возможности WSH 291 Text = Text + "\n"; WSoript.Echo(Text); //«шшшштшшшшшшшшшш И Вспомогательная функция проверки наличия раздела. //############################################## function KeyExists(obj, key) { var key2; try { key2 = obj.RegRead(key) catch(e) if (e l= 0) return false; } return true; // Раздел не найден. } //»** Конец Листинг 11-25. GetDomain.js.
ГЛАВА 1 2 Использование файловой системы и команд ввода-вывода В этой главе я расскажу, как в Microsoft WSH обращаться к дискам, файлам и папкам с помощью объекта FileSystemObject. Вы также узнаете, как копиро- вать, перемещать и удалять файлы и папки, используя методы и свойства это- го объекта. Далее мы рассмотрим, каким образом WSH 2 поддерживает ме- тоды для чтения и записи текстовых файлов. В завершение мы разберем под- держку оболочкой диалоговых окон выбора файлов. Объектная модель FileSystemObject Объект FileSystemObject (кратко fso) доступен как в VBScript, так и в JScript. Вот его субобъекты, методы и свойства (табл. 12-1): Табл. 12-1. Объектная модель FileSystemObject. Объект или набор Описание Drives Набор всех дисков (логических и физических), установлен- ных на машине, включая приводы со сменными носителями (например, дисковод гибких дисков). Drive Объект, методы и свойства которого позволяют обращаться к диску (локальному фиксированному, подключенному сетево- му, CD-ROM или дисководу гибких дисков), получать размер свободного места на носителе и т. д. Folders Набор всех вложенных папок данной папки. Folder Объект, методы которого используются для создания, переме- щения, переименования и удаления папок, а свойства — для получения имен папок, путей и т. п. Files Набор всех файлов в папке. File Методы этого объекта позволяют создавать, удалять, переиме- новывать и перемещать файлы, а его свойства — получать имена файлов и пути. FileSystemObject Главный объект объектной модели FileSystemObject, поддержи- вает все методы и свойства для доступа к файловой системе. TextStream Методы этого объекта позволяют читать и записывать тексто- вые файлы. У объекта FileSystemObject (он находится в библиотеке Scrrun.dll) нет ме- тодов для доступа к двоичным файлам. Двоичные файлы можно читать и
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 293 записывать, только используя методы, предназначенные для работы с тексто- выми файлами, со всеми вытекающими отсюда трудностями, такими как необходимость преобразования всех данных, отсутствие методов прямой обработки двоичных типов данных и т. д. Самые новые сведения об объект- ной модели FileSystemObject см. в справочниках по языкам VBScript и JScript для обработчиков языков 5 версии. Создание FileSystemObject Чтобы получить доступ к объектам, методам и свойствам объектной моде- ли FileSystemObject, надо создать переменную-объект и присвоить ей ссыл- ку на объект FileSystemObject. Этот объект сам по себе является частью язы- ка, поэтому ссылку на него позволяют получить встроенные методы VBScript или JScript. Как вам известно, синтаксис оператора для создания и присваивания ссылки на объект на языке VBScript таков: Dim fso Set fso = WScrlpt.CreateObject("Scripting.FileSystemObject") Метод CreateObject объекта WScript загружает экземпляр объекта в память, а ссылка на него присваивается переменной-объекту fso. Следующий оператор на языке JScript создает ссылку на объект FileSys- temObject-. var fso = WScrlpt.CreateObject("Scripting.FileSystemObject"); Он создает переменную-объект fso, экземпляр объекта и присваивает пе- ременной-объекту ссылку на него. Встроенные методы для создания объекта FileSystemObject Присвоить переменной-объекту ссылку на FileSystemObject, кроме ме- тода WScript.CreateObject, могут встроенные методы VBScript или JScript (см. главу 7). На VBScript можно использовать встроенную функцию CreateObject: Set fso = CreateObject("Scripting.FileSystemObject”) Ha JScript можно создать новый экземпляр объекта, применив ме- тод new к объекту ActiveXObject и присвоив полученную ссылку пере- менной-объекту: var fso = new ActiveXObject("Scripting.FileSystemObject"); Методы объекта FileSystemObject После создания объекта FileSystemObject станут доступны его методы, свой- ства и субобъекты. Метод CreateFolder позволяет создать новую папку, Create- TextFile — новый текстовый файл и т. д. Такие элементы, как файлы и папки, удаляют методы DeleteFile и DeleteFolder. Объект FileSystemObject также под- держивает методы для копирования и перемещения файлов и папок.
294 ЧАСТЬ III Особые возможности сценариев ПРИМЕЧАНИЕ ОбъектFileSystemObjectдублирует часть функциональ- ности своих субобъектов, что обеспечивает бульшую гибкость при на- писании сценариев. Так, можно копировать файлы методом CopyFile объекта FileSystemObject или методом Сору, поддерживающим объект File. Параметры соответствующих методов различных объектов, кото- рые представляют файлы и папки, немного различаются. Поэтому для выяснения верных параметров метода, может быть, придется заглянуть в справочник по языку. Методы GetDrive, GetFolder и GetFile объекта FileSystemObject позволяют обращаться к дискам, папкам и файлам. Следующие операторы на VBScript создают ссылку на файл: Dim fso, oFlle Set fso = CreateObjectC’Scripting.FileSystemObject") Set oFile = fso.GetFile("C:\Test.txt”) А вот эквивалент на JScript: var fso = new ActiveXObjectC'Scripting.FileSystemObject"); var oFile = fso.GetFile("C:\\Test.txt"); В обоих случаях используется метод GetFile объекта FileSystemObject (он находится в переменной-объекте fso). Он возвращает ссылку на объект пере- менной oFile, после чего эту переменную можно использовать для доступа к файлу. Обращение к дискам Объект FileSystemObject позволяет обращаться к любому из дисков компью- тера (т. е. ко всем дискам, доступным из Windows, включая жесткие, гибкие и CD-ROM, а также подключенные сетевые диски, обозначенные буквой ло- гического диска). Выводим список всех дисков компьютера Давайте напишем сценарий WSH, который с помощью FileSystemObject будет выводить список букв, типов и меток томов для всех дисков, зарегистриро- ванных на машине. Для приводов с поддержкой сменных носителей (напри- мер, компакт- или гибких дисков) надо выполнять проверку наличия носи- теля в приводе. Обнаружив сетевой диск, сценарий будет выводить сетевой путь UNC. В диалоговом окне выводится список всех дисков на одной из моих тест-систем (рис. 12-1). ПРИМЕЧАНИЕ Для некоторых дисков (например, для F) не показана метка тома, так как я ее им не назначал. У дисководов А и G метки нет, потому что в них не вставлены носители (гибкий и компакт-диск, со- ответственно).
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 295 Рис. 12-1. Список дисков компьютера. Чтобы перечислить все доступные диски в системе, нужен экземпляр объекта FileSystemObject, а также ссылка на объект Drives. Экземпляр объек- та FileSystemObject создается так: Set fso = WScript.CreateObject("Scripting.FileSystemObject") После этого переменная-объект/яэ читает свойство Drives, которое возвра- щает набор объектов Drive. Следующий оператор возвращает набор Drives, который содержит все диски, найденные на локальной машине: Set oDrive = fso.Drivee Простой цикл позволяет обратиться к каждому диску из набора: For Each i In oDrive Next При каждом проходе цикла переменная-объект получает один объект «диск». Поэтому она позволяет получить доступ к свойствам диска в цикле. Например, такой оператор выдает букву диска: driveletter = i.Driveletter Тип диска можно получить через свойство DriveType объекта, на который ссылается переменная-объект й Туре = i.DriveType Тип диска закодирован целочисленным значением из интервала 0-п. Вот коды допустимых типов дисков (табл. 12-2): Табл. 12-2. Типы дисков. Константа* Значение Описание Unknown 0 Неизвестный тип диска (тип диска не определяется). Removable 1 Привод со сменным носителем (например, гибкий или ZIP-диск). Fixed 2 Фиксированный диск. Этот тип также включает сменные жесткие диски. Remote 3 Сетевой диск. Выводится только для подключенных ресурсов (совместно используемых дисков и папок). см. след. стр.
296 ЧАСТЬ III Особые возможности сценариев Табл. 12-2. (продолжение) Константа* Значение Описание CDROM 4 Привод CD-ROM. CD-R и CD-RW не различаются. RAMDisk 5 Виртуальный диск (RAM-диск). Виртуальный диск со- здается в памяти с помощью специального драйвера. В столбце «Константа» перечислены имена констант, использованных для обозна- чения типов дисков в библиотеке Scrrun.dll. Столбец «Значение» содержит список значений, возвращаемых свойством DriveType. Ни VBScript, ни JScript не поддержи- вают константы, определенные в библиотеке типов. Надо явно определить эти кон- станты в .vbs- и .js-файлах сценариев. В случае WSH 2 элемент <reference> в .wsf-фай- лах позволяет создать ссылку на библиотеку типов. Ниже я покажу, как это сделать. Свойство VolumeName позволяет получить метку (также называемую мет- кой тома), которая назначается носителю при форматировании. Если диск этого типа поддерживает сменные носители, для получения метки в привод должен быть вставлен носитель. В отсутствие носителя свойство VolumeName не имеет смысла. Однако можно проверить наличие носителя свойством IsReady. Если носитель установлен, оно возвратит True. Имя подключенного сетевого диска не содержит сведений о реальном имени ресурса, так как буква, ассоциированная с сетевым диском, назнача- ется пользователем вручную. Однако через свойство ShareName можно оп- ределить путь UNC к ресурсу. Следующая программа (листинг 12-1) выводит список всех обнаружен- ных на компьютере дисков. Этот и другие примеры к главе 12 вы найдете в папке \WSHDevGuide\Chapterl2 на прилагаемом к книге компакт-диске. Файл: ListDrives.vbs (Пример для WSH на VBScript) Автор: (с) G. Born ’ Вывод списка дисков компьютера ’ с помощью FileSystemObject. '******************************* Option Explicit ' Константы типов дисков Const Unknown = О Const Removable = 1 ' Сменный носитель Const Fixed = 2 ’ Фиксированный носитель (жесткий диск) Const Remote = 3 ' Сетевой диск Const CDROM = 4 ’ CD-ROM Const RAMDisk = 5 ' RAM-диск Dim Text, Title Dim fso, oDrive, curDrive ' Переменные-объекты. Dim drtype(6) drtype(O) = " Unknown " irtyped) = " Removable "
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 297 drtype(2) = " Fixed " drtype(3) = " Remote ” drtype(4) = - CDROM ” drtype(5) = '' RAMDisk " Text = "Drives” & vbCrLf & vbCrLf Title = "WSH sample - by G. Born" ' Создать объект FileSystemObject, чтобы получить доступ к файловой системе. Set fso = WScrlpt.CreateObject("Scripting.FileSystemObject”) Set oDrive = feo.Drivee ' Получить набор Drives. For Each curDrive In oDrive ' Все объекты "диск”. Text = Text & curDrive.Driveletter & vbTab ' Буква диска. Text = Text & drtype(curDrive.DriveType) Select Case curDrive.DriveType ’ Идентифицировать тип диска. Case Removable ' Сменный носитель. If curDrive.IsReady Then Text = Text & curDrive.VolumeName ' Локальный диск. End If Case CDROM ' CD-ROM If curDrive.IsReady Then Text = Text & curDrive.VolumeName ' Локальный диск. End If Саве Remote Text = Text & curDrive.ShareName ' Сетевой диск. Case Else ’ Другой носитель. Text = Text & curDrive.VolumeName ' Локальный диск. End Select Text = Text & vbCrLf Next MsgBox Text, vbOKOnly + vblnformation, Title '*** Конец Листинг 12-1. ListDrives.vbs. СОВЕТ В VBScript именованная константа vbTab вставляет в строку символ табуляции. Это позволяет отформатировать выходную инфор- мацию в диалоговом окне в виде столбцов. Реализация на JScript На JScript также можно вывести список всех дисков с помощью объекта FileSystemObject. Следующие операторы создают объект FileSystemObject и набор Drives-.
298 ЧАСТЬ III Особые возможности сценариев var fso = new ActiveXObject(”Scripting.FileSystemObject"); var oDrivee = new Enumerator(feo.Drives); // Получить набор Drives. Встроенный оператор new ActiveXObject создает экземпляр объекта. Клю- чевое слово языка JScript Enumerator во второй строке создает новую пере- менную-объект, содержащую набор Drives. Получив этот набор, с помощью методов atEnd и moveNext объекта Enumerator можно обратиться ко всем элементам набора в цикле for. Этот оператор позволяет получить объект из свойства item-. oDrive.item(); Показанный здесь цикл обращается к каждому элементу' набора: for (; loDrives.atEnd(); oDrivee. moveNextO) { var drive oDrive.item(); // Получить объект. } После этого можно задействовать свойства объекта Drive, например, DriveLetter, DriveType, ShareName и VolumeName. Чтобы не определять кон- станты типов дисков в сценарии в явном виде, можно вставить в .wsf-файл ссылку на библиотеку типов через определение <reference>. Creference guid=’{420B283O-E718-11CF-893D-00AOC9O54228}'/> В этой ссылке задано значение GUID объекта FileSystemObject. Вот реализа- ция программы на JScript с использованием .wsf-файла (листинг 12-2): <?xml version="1.0” encoding=”IS0-8859-1”?> cl- Файл: ListDrives.wsf (WSH 2) Автор: (c) G. Born Вывод списка дисков компьютера -> cjob id="ListDrives"> Creference guid='{420B2830-E718-11CF-893D-00A0C9054228}’/> cscript language="JScript”> cl [CDATAt // Вывести список всех дисков компьютера. Значения типов дисков // будут получены из библиотеки типов FileSystemObject. var drtype = new Array(5); drtypefO] = " Unknown "; drtype[1] = " Removable ”; drtype[2] = ” Fixed "; drtype[3] = ” Remote ”; drtype[4] = " CDROM ";
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 299 drtype[5] = " RAMDisk Text = "Drives \п\п"; Title "WSH sample - by G. Born"; // Создать объект FileSystemObject, чтобы получить доступ к файловой системе. // Здесь мы используем встроенный метод языка JScript. var feo = new ActiveXObject("Soriptine.FileSystemObject"); И Получить перечислитель дисков. var oDrive new Enumeratorfso.Drives); for (; IoDrive.atEnd(); oDrive.moveNextO) { var drive « oDrive.item(); // Получить объект. Text Text + drive.Driveletter + " \t "; // Буква диска. Text » Text + drtype[drlve.DriveType]; if (drive.DriveType Remote) Text = Text + drive.ShareName; // Сетевой диск. if ((drive.DriveType == Removable) || (drive.DriveType == CDROM)) // Сменный носитель. if (drive.IsReady) Text = Text + drive.VolumeName; // Локальный диск. if (drive.DriveType == Fixed) Text = Text + drive.VolumeName; // Локальный диск. Text Text + "\n”; } // Показать результат. var objAdr = WScrlpt.CreateObjectC'WScript.Shell"); objAdr.Popup(Text, 0, Title); ]]> </script> </job> Листинг 12-2. ListDrives.wsf. СОВЕТ В JScript escape-символ \Г вставляет в строку символ табуляции. Это позволяет форматировать выходную информацию в диалоговом окне в виде столбцов. На прилагаемом компакт-диске также есть файл (ListDrives.js') с исходным текстом этой программы, реализованной на языке JScript.
300 ЧАСТЬ III Особые возможности сценариев Вывод свойств диска А теперь напишем сценарий, который будет запрашивать у пользователя букву диска в диалоговом окне ввода (рис. 12-2). После того, как пользова- тель введет действительную букву диска (без двоеточия), сценарий будет возвращать свойства диска (имя файловой системы, размер свободного ме- ста и т. д.) в другом диалоговом окне (рис. 12-3). Рис. 12-2. Запрос буквы диска у пользователя. х] WSH sample - by ВдеИА Рис. 12-3. Свойства диска. На примере этой программы демонстрируется вся проверка, которую надо выполнить в сценарии, прежде чем обращаться к диску. Если опустить ее, велика вероятность ошибки периода выполнения. Следующий оператор запрашивает букву диска с помощью функции VB- Script InputBox: drive = InputBox("Drive letter (e.g. A)", "Drive”, "C") ПРИМЕЧАНИЕ Первый символ (букву диска) из строки, которую ввел пользователь, вырезает оператор drive = Left(drive, 1). Получив информацию от пользователя, стоит проверить, допустима ли введенная буква диска. Например, диск «0» смысла не имеет. Проверить ин- формацию, которую ввел пользователь, позволяет оператор If, например, так: If Asc(UCase(drive)) < Asc(”A") Or _ Asc(UCase(drive)) > AscC'Z") Then ... Если в результате обнаружена допустимая буква из интервала A-Z, сцена- рий должен создать ссылку на объект FileSystemObject: Set fso = WScrlpt.CreateObject("Scripting.FileSystemObject") Прежде чем обращаться к свойствам диска, надо убедиться, что диск су- ществует, например методом DriveExists:
ГЛАВА 12 Использование файловой системы и команд ввода-выводв 301 If (Not fso.DriveExists(drive)) Then WScript.Echo "The drive " & drive & " doesn't exist" WScrlpt.Quit End If Только если метод вернет значение True, можно обращаться к диску. В этом случае следующим оператором нужно создать объект Drive-. Set oDrive = fso.GetDrive(drive) Метод GetDrive возвращает объект, поэтому в операторе присваивания нужно использовать ключевое слово Set (иначе при исполнении сценария возникает ошибка периода выполнения). Прежде чем обращаться к свой- ствам объекта, надо проверить готовность диска. Если этого не делать, то при каждой попытке обратиться к приводу с отсутствующим носителем будет возникать ошибка периода выполнения. Проверку выполняет оператор: If (drive.IsReady) Then End If Свойство IsReady возвращает значение True, если привод готов и в нем есть носитель. СОВЕТ В этом примере свойство IsReady проверяется независимо от типа диска, поэтому иногда эта операция бывает излишней. Так, в слу- чае (форматированного) жесткого диска IsReady всегда возвращает True. Конечно, никакого вреда от проверки свойства IsReady при этом не будет, и после нее можно обращаться к носителю/диску совершен- но свободно независимо от типа диска. Другое интересное свойство, TotalSize, возвращает емкость носителя: WSoript.Eoho "Capacity: " & _ FormatNumber(oDrlve.TotalSize/(1024«1024), 0) & _ " MB" & vbCrLf Для представления результатов с разделителем между тысячами в этом операторе служит функция VBScript FormatNumber. Разделив результат на 1024’1024, вы получите емкость носителя в мегабайтах. Получить размер свободного места на диске позволяет оператор: WScript.Echo "Free: “ & FormatNumber(oDrive.FreeSpaoe/1024, 0) & _ " KB" & VbCrLf Полностью программа на VBScript приведена ниже (листинг 12-3). Что- бы задействовать ссылки на библиотеку типов, в ней используется структу- ра .wsf-файла. В файле GetDriveX.vbs находится решение, созданное исклю- чительно на языке VBScript. ПРИМЕЧАНИЕ Получить размер свободного места на носителе позво- ляют свойства FreeSpace и AvailableSpace. Оба возвращают одно и то же значение, если только ОС (например, Windows 2000) не поддержи-
302 ЧАСТЬ III Особые возможности сценариев вает квоты. При этом для каждого пользователя администратор может задать квоту дискового пространства. При этом FreeSpace показывает свободное место на томе (целом диске), iAvailabl'eSpace — свободное место, доступное текущему пользователю. Из-за ошибок в Windows 95 OSR 2 при использовании свойств FreeSpace и AvailableSpace на этой платформе возникают сбои: если емкость диска больше 2 ГБ, возвра- щается неверное значение. c?xml vereion="1.0" encodina="ISO-B859-1’’?> <1- Файл: GetDriveX.wsf (WSH 2) Автор: (с) G. Born Вывод свойств диска с помощью объекта FileSystemObject и ссылки на библиотеку типов <job id="GetDriveX"> creference guid=,{420B2830-E718-11CF-B93D-00A0C9054228}7> cscript language="VBSoript"> cl[CDATA[ Option Explicit Dim Text, Title, drive Dim fso, oDrive ' Переменная-объект. Dim drtype(6) drtype(O) = " Unknown “ drtype(1) = ” Removable " drtype(2) = " Fixed " drtype(3) = ” Remote " drtype(4) = " CDROM " drtype(5) = " RAMDisk " Text = "Drive" & vbCrLf & vbCrLf Title = "WSH sample - by G. Born" drive = Do ' Запросить букву диска, drive = InputBox("Drive letter (e.g. A)", "Drive", "C”) If drive = "" Then ' Проверка нажатия кнопки Cancel. WScript.Quit End If drive = Left(drive, 1) ' Извлечь букву диска. ' Действительно ли имя диска (это буква между А и 1)1
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 303 If Aso(UCase(drive)) < Asc("A") Or Asc(UCase(drive)) > Asc("Z“) Then MsgBox "Drive " & drive & " is illegal" drive = End If Loop Until drive <> "" ' Создать объект FileSystemObject, чтобы получить ' доступ к файловой системе. Set fso = WSoript.CreateObject("Soripting.FileSystemObject") ' Проверить, существует ли диск. If (Not fso.DriveExists(drive)) Then WSoript.Eoho "The drive " & drive & " doesn't exist" WSoript.Quit End If Set oDrive = fso.GetDrive(drive) ' Получить объект "Диск". If (oDrive.IsReady) Then Text = Text & UCase(drive) oDrive.VolumeName & vbCrLf Text = Text & "Drive type: " & _ drtype(oDrive.DriveType) & vbCrLf Text = Text & "File system: ” & _ oDrive.FileSystem & vbCrLf Text = Text & "Capacity: " & _ FormatNumber(oDrive.TotalSize/(1024*1024), 0) & _ •' MB" & VbCrLf Text = Text & "Free: " & _ FormatNumber(oDrive.FreeSpaoe/1024, 0) & _ ' KB" & vbCrLf Else Text = Text & "Drive not ready" & vbCrLf End If MsgBox Text, vbOKOnly + vblnformation, Title ]]> </script> </job> Листинг 12-3. GetDriveX.wsf. Реализация на JScript В версии этой JScript-программы используются те же методы и свойства. И все же некоторые функции надо заменить их эквивалентами из JScript. Например, в версии на JScript диалоговое окно для получения вводимой пользователем информации реализовано функцией WSHInputBox (о ней см. главу 8). Кро-
304 ЧАСТЬ III Особые возможности сценариев ме того, для преобразования символов в нижнем регистре в верхний регистр вместо функции Ucase языка VBScript надо применять к объекту String метод JScript toUpperCase. Функция форматирования, используемая в программе на VBScript, на JScript недоступна. Поэтому я добавил VBScript-функцию JsFor- matNumber. Она обеспечивает поддержку недостающей функциональности. Вот реализация на JScript (в форме .wsf-файла) полностью (листинг 12-4). <?xml version»"1.0" encoding="IS0-8859-1"?> <!- Файл: GetDriveXJS.wsf (WSH 2) Автор: (c) G. Born Вывод свойств диска с помощью объекта FileSystemObject, ссылки на библиотеку типов и функции на VBScript для получения информации от пользователя -> <job id="ListDrives"> reference guid='{420B2830-E718-11CF-893D-00A0C9054228 ) 7> <eoript language="VBScript"> <l[CDATA[ Function WSHInputBox(Message, Title, Value) ' Организует в JScript поддержку функции InputBox. ' Из программы на JScript эту функцию можно вызвать так: ‘ var result = WSHInputBox(”Enter a name","Input''.test); WSHInputBox = InputBox(Message, Title, Value) End Function ]]> </soript> <soript language="VBScript"> <l[CDATA[ Function JsFormatNumber (value, decimale) ' Форматирование числа. JsFormatNumber = FormatNumber(value, decimals) End Function ]]> </script> <eoript language»"JSoript"> <l[CDATA[ II Часть программы на JScript, получающая и показывающая свойства диска. И Определить массив с константами типов дисков. var drivetype = new Array(" Unknown ", " Removable ", " Fixed ", " Remote ", " CDROM ", " RAMDisk "); var Text = "Drive\n\n";
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 305 var Title = "WSH sample - by G. Born"; // Запросить букву диска. var drive = WSHInputBox("Drive letter (e.g. A)”, "Drive", "C"); if (drive == ””) // Проверить, не нажата ли кнопка Cancel. WScript.Quit(); drive = drive.substr(0, 1); // Извлечь букву диска. И Создать объект FileSystemObject, чтобы получить Ц доступ к файловой системе. var fso = new ActiveXObject("Scripting.FileSystemObject”); I/ Проверить, существует ли диск. if (!fso.DriveExists(drive)) { WScript.Echo("The drive " + drive + " doesn’t exist”); WScript.Quit(); } var oDrive = fso.GetDrive(drive); Ц Получить объект "Диск”. if (oDrive.IsReady) { Text = Text + drive.toUpperCase() + " + oDrive.VolumeName + "\n"; Text = Text + "Drive type: " + drivetype[oDrive.DriveType] + "\n"; Text = Text + "File system: " + oDrive.FileSystem + "\n"; Text = Text + "Capacity: " + JsFormatNumber(oDrive.TotalSize/1024/1024, 0) + ” MB\n”; Text = Text + "Free: " + JsFormatNumber(oDrive.FreeSpace/1024, 0) + " KB\n”; } else Text = Text + "Drive not ready\n"; var objAdr = WScript.CreateObject("WScript.Shell"); objAdr.Popup(Text, 0, Title); ]]> </script> </job> Листинг 12-4. GetDriveXJS.wsf.
306 ЧАСТЬ III Особые возможности сценариев Обращение к папкам и файлам В этом разделе вы познакомитесь с объектами, методами и свойствами File- SystemObject, которые позволяют обращаться к файлам и папкам. Выводим список вложенных папок данной папки Список всех папок, вложенных в данную папку (ее подкаталогов), можно создать с помощью набора Folders объекта FileSystemObject. Мы напишем простой сценарий, который получает папки, вложенные в Windows\System и выводит их список в диалоговом окне (рис. 12-4). Рис. 12-4. Список подкаталогов папки \System в Windows 9В. ПРИМЕЧАНИЕ Для этого эксперимента можно взять любую папку, но для нашего примера выбрана именно папка \System. Это сделано, что- бы ограничить число подкаталогов, выводимых в диалоговом окне. Если выбрать такую обширную папку, как Windows, размеры диалого- вого окна со списком подкаталогов превысят размеры рабочего сто- ла, и пользователь не сможет закрыть его кнопкой ОК. В книге Ad- vanced Development with Microsoft Windows Script Host 2.0 я познакомлю вас с лучшим решением, использующим окно браузера для вывода со- держимого каталога. Путь к целевой папке устанавливается в заголовке программы именован- ной константой: Const path = "XWINDIRX\System" Чтобы получить доступ к папке, надо создать объект FileSystemObject опе- ратором: Set fso = WSoript.CreateObJeot("Soriptin0.FileSystemObject") После этого можно обращаться к папке посредством метода GetFolder. Так как именованная константа path содержит заполнитель %WINDIR%, нужно раскрыть соответствующую переменную окружения с помощью Expand- EnvironmentStrings-. Set oFolders = fso.GetFolder(wsh.ExpandEnvironmentStrings(path))
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 307 Метод GetFolder объекта FileSystemObject, который содержит переменная- объект fso, возвращает ссылку на текущую папку как объект. После этого свойство SubFolders переменной-объекта oFolders позволяет получить набор вложенных папок: Set oSubFolders = oFolders.SubFolders Имя подкаталога поможет получить свойство Name элемента набора Sub- Folders. Следующий цикл обрабатывает все папки набора и собирает имена папок в переменной Text-. For Each oFolder In oSubFolders ' Все папки Text = Text & oFolder.Name & vbCrLf Next После завершения цикла переменная Text содержит имена всех вложен- ных папок, обнаруженных в текущей папке. Конечно, функцию обработки имен папок в цикле можно реализовать иначе. В этом примере имена для простоты суммируются в одной строке. Полностью программа выглядит так (листинг 12-5): '•А********************************************** ' Файл: Folders.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ‘ Вывод описка всех папок, вложенных в данную папку, о помощью ’ FileSystemObject *••••*******••**•*•••******••**••••••*****•*•**•• Option Explicit Const path = "XWINDIRX\System" ' Для Windows 95 и Windows 98. ' Const path = "XWINDIRX\System32" ' Для Windows NT и Windows 2000. Dim Text, Title Dim fso, oFolders, oFolder, oSubFolders, wsh ’ Переменные-объекты. Text = "Folders" & vbCrLf & vbCrLf Title = "WSH sample - by G. Born" Set wsh = WScrlpt.CreateObjectC'WScript.Shell") ' Создать объект FileSystemObject, чтобы получить доступ к файловой сиотеме. Set fso = WScrlpt.CreateObjectC'SoriptinB. FileSystemObjeot”) ' Получить набор Folders. Set oFolders = fso.GetFolder(wsh.ExpandEnvironmentStrings(path)) Set oSubFolders = oFolders.SubFolders For Esch oFolder In oSubFolders ' Все папки. Text = Text & oFolder.Name & vbCrLf см. след. стр.
308 ЧАСТЬ III Особые возможности сценариев Next MsgBox Text, vbOKOnly + vblnformation, Title '*** Конец Листинг 12-5. Folders.vbs. Реализация на JScript Самое главное отличие этой программы на языке JScript заключается в спо- собе обработки набора. Следующие операторы с помощью свойства Sub- Folders создают объект «Папка», а затем и набор: var oFolders = fso.GetFolder(wsh.ExpandEnvironmentStrings(path)); var oSubFolders = new Enumerator(oFolders.SubFolders); После этого необходимо обработать все элементы набора в цикле: for (; IoSubFolders.atEnd(); oSubFolders.moveNextO) // Все папки. { var oFolder = oSubFolders.item(); Text = Text + oFolder.name + "\n"; ) Заметьте: для перехода к следующему элементу набора в программе слу- жит метод moveNext. Используется именно он, поскольку конструкции вида for (oFolder in oSubFolders) на JScript не работают. Элемент набора следует по- лучать через свойство item-. var oFolder = oSubFolders.item(); Свойство name этого объекта возвращает имя папки. Кроме имени пап- ки, доступны и другие свойства, например, файловые атрибуты и дата созда- ния. Есть альтернативный путь получения пути к системной папке, когда сце- нарий делает это независимо от ОС. В показанном выше примере програм- мы на VBScript путь к системной папке ОС определяет константа path. Эта папка вложена в папку Windows и называется в Windows 95/98 и Windows Millennium Edition \System, а в Windows NT/2000 — \System32. Вместо этого можно получить путь к специальной папке методом GetSpecialFolder объек- та FileSystemObject-. var path = fso.GetSpeoialFolder(l); Если методу передается значение 1, GetSpecialFolder возвращает путь к системной папке; значение 0 возвращает путь к папке Windows, а значение 2 — путь к папке Тетр. Вот программа на JScript полностью (листинг 12-6): //.......*.....*.........*...................... И Файл; Folders.Js (Пример для WSH на JSoript)
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 309 // Автор: (с) G. Born // // Вывод содержимого папки о // помощью FileSyetemObjeot //.................................*............ var Text = ”Folders\n\n"; var wsh = WScript.CreateObjeot ("WScript.Shell"); // Создать объект FileSystemObject, чтобы получить доступ к файловой системе, var fso = WScript.CreateObject("Scripting.FileSystemObject"); // Получить системную папку ОС. var path = fso.GetSpecialFolder(l); // 1 = системная папка. // Получить набор Folders. var oFolders = fso.GetFolder(wsh.ExpandEnvironmentStrings(path)); Ц Набор Subfolders var oSubFolder = new Enumerator(oFolders.SubFolders); for (; !oSubFolder.atEnd(); oSubFolder.moveNextO) // Все папки. { var oFolder = oSubFolder.item(); Text = Text + oFolder.name + "\n”; ) WScript.Echo(Text); I/*** Конец Листинг 12-6. Folders.js. Создание, перемещение, переименование и удаление папок Следующая программа-пример создает папку, выводит список подкаталогов в родительской папке и удаляет по крайней мере новую папку. Создаем новую папку На VBScript новую папку создает функция InputBox. В следующих строках также запрограммирован запрос имени (пути) новой папки: path = InputBox("Enter folder name (e.g. C:\Born).", _ Title, "C:\Born”) If path = "" Then WScript.Quit ' Пользователь отменил действие. End If
310 ЧАСТЬ III Особые возможности сценариев Далее эта последовательность команд анализирует информацию, кото- рую ввел пользователь. Если он щелкнул кнопку Cancel, сценарий заверша- ется. На JScript аналогичное диалоговое окно ввода реализует метод W- HlnputBox (см. предыдущие главы). Теперь можно создать новую папку. В нашем примере применяется метод FolderExists объекта FileSystemObject, который проверяет наличие папки с та- ким же именем: Set fso = WScrlpt.CreateObjeotC'Scripting.FileSystemObjeot") If (Not fso.FolderExlets(path)) Then End If Параметром метода FolderExists является путь к папке. Если заданная пап- ка существует, метод возвращает True, нет — False. ПРИМЕЧАНИЕ Если пользователь вводит недопустимое имя пути (т. е. содержащее недопустимые символы, например C:\Bom/\test~), WSH ге- нерирует ошибку периода выполнения. Здесь я опустил обработку ошибок периода выполнения, чтобы не усложнять пример. Если вы уверены, что папки с таким именем нет, методом CreateFolder можно создать пустую папку: Set oNewFolder = fso.CreateFolder(path) Этот метод применяется к переменной-объекту fso, которая содержит объект FileSystemObject. Параметром метода является путь (в который вклю- чено имя папки, например C:\Borri). Метод создает папку и возвращает ссыл- ку (с описателем) на объект, представляющий эту папку. Обращаться к пап- ке нужно по этой ссылке. ПРИМЕЧАНИЕ Вы должны быть уверены, что путь (включая имя пап- ки) является действительным. Целевой носитель также должен быть доступен для записи. Получаем родительскую папку Папка обычно находится в родительской папке. Можно извлечь имя роди- тельской папки из пути, но объект FileSystemObject поддерживает специаль- ный метод для решения этой задачи: parent = fso.GetParentFolderName(path) Параметром метода GetParentFolderName является путь к текущей папке. По умолчанию этот метод возвращает путь к родительской папке. Если пос- ледняя не существует (например, когда путь указывает на корневую папку), метод возвращает пустую строку. Следующий код позволяет определить, су- ществует ли родительская папка: If (parent = '") Then MsgBox "No parent folder"
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 311 End If В программе-примере этот метод получает родительскую папку и выво- дит путь в диалоговом окне. ПРИМЕЧАНИЕ Если выбрать родительскую папку, в которой вложено слишком много папок, диалоговое окно с их списком станет больше рабочего стола. Поэтому пользователь не сможет закрыть его щелчком кнопки ОК. Ниже я познакомлю вас с решением, которое вместо диа- логового окна использует для вывода больших объемов информации окно браузера. Переименование, копирование и перемещение папки Скопировать всю папку с ее содержимым позволяет метод CopyFolder объек- та FileSystemObject-. Object.CopyFolder источник, приемник[, перезапись] Идентификатор Object играет роль переменной-объекта, содержащей объект FileSystemObject. Три параметра метода задают исходную папку, пап- ку назначения и режим перезаписи: источник — обязательный параметр, в котором передается строка с именем (путь) исходной папки; для копирования нескольких папок в строку можно включать знаки подстановки; приемник — обязательный параметр, который задает папку назначения в виде строки; метод копирует исходную папку в папку назначения; в па- раметре не должно быть знаков подстановки; перезапись — необязательный параметр; если он равен True (по умол- чанию), метод записывает имеющиеся файлы поверх целевой папки. Знаки подстановки можно использовать только в конце пути. Например, следующие операторы допустимы: FileSystemObject.CopyFolder "C:\Document\*", "C:\temp\" Но такая команда вызывает ошибку периода выполнения: FileSystemObject.CopyFolder "C:\Document\A*”, "C:\temp\" Если путь к исходной папке содержит знаки подстановки или путь к целе- вой папке оканчивается символом \, метод предполагает, что целевая папка существует и папка со всеми вложенными папками и файлами должна быть скопирована. В противном случае создается новая папка. Успешное завершение вызова CopyFolder зависит от конкретного сочета- ния исходной и целевой папок. Если целевой папки нет, она создается, и в нее копируется содержимое исходной папки (это происходит по умолча- нию). Если путь назначения указывает на существующий файл, возникает ошибка периода выполнения. Если он указывает на папку, метод пытается
312 ЧАСТЬ III Особые возможности сценариев скопировать содержимое исходной папки в папку назначения. Если какой- либо файл из исходной папки уже существует в целевой папке и значение параметра overwrite равно False, возникает ошибка периода выполнения, а если параметр overwrite установлен как True, файл из исходной папки будет записан поверх существующего файла целевой папки. Если для целевой пап- ки установлен файловый атрибут Read-only, возникает ошибка периода выпол- нения, если только параметр overwrite не установлен в True. Если путь к исход- ной папке нельзя определить по указанным знакам подстановки (* или ?), так- же возникает ошибка периода выполнения. ВАЖНО Если метод CopyFolder обнаруживает ошибку, исполнение сце- нария завершается. Этот метод не поддерживает отката: уже скопиро- ванные файлы и папки не удаляются из целевой папки. Он действует в основном так же, как Windows или MS-DOS при копировании файлов. Переименование и перемещение папок выполняет метод MoveFolder, у которого те же параметры, что и у CopyFolder. Файлы при этом перемеща- ются, а содержимое исходной папки удаляется. ПРИМЕЧАНИЕ Можно также переименовать папку, задав новое значе- ние ее атрибута пате. Допустим, с помощью оператора Set oFolder = fso.GetFolder(«C:\Test») получена ссылка на данную папку. Командой oFolder.пате = «Testi» ее можно переименовать в Testi. Если папка с новым именем уже существует, при исполнении этой команды возни- кает ошибка. В нашем примере папку переименовывает метод MoveFolder. Старое имя папки передается параметром, задающим путь к исходной папке, а новое — параметром, который задает путь к целевой папке: If (MsgBox("Rename folder “ & path & " ?", vbYesNo + vbQuestion, Title) = vbYes) Then ' Да. newpath = path & "New" fso.MoveFolder path, newpath MsgBox "Folder renamed to " & newpath End If Прежде чем папка будет переименована, сценарий запросит у пользова- теля подтверждение — для того, чтобы предотвратить случайное переиме- нование важных папок (например, папки Windows). Переменная path содер- жит исходный путь, а переменная newpath — путь к целевой папке (имя це- левой папки создается добавлением строки «New» к старому имени). СОВЕТ При возникновении ошибки метод MoveFolder завершается. При этом исходная и целевая папки остаются в промежуточном состо- янии, так как после копирования каждого элемента (файла или под- каталога) MoveFolder удаляет его из исходной папки. Чтобы восстано-
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 313 вить исходную папку, придется выполнить откат вручную. Поэтому вместо MoveFolder я рекомендую CopyFolder. Если содержимое исход- ной папки успешно скопировано, его можно удалить оттуда. При ис- пользовании CopyFolder можно быть уверенным, что в случае ошибки содержимое исходной папки останется в целости и сохранности. Удаление папки Удаляет папку метод DeleteFolder, который поддерживает объект FileSystemObject. Параметром этого метода является строка, в которой должно быть имя папки и путь к ней: If (MsgBoxC’Delete folder " & newpath & "?", vbYesNo + vbQuestion, Title) = vbYes) Then _ fso.DeleteFolderfnewpath) Кроме того, метод поддерживает второй (необязательный) параметр force, который в показанном выше операторе не используется. Если этот параметр равен True, файлы с атрибутом Read-only также будут удалены. Метод удаля- ет папку целиком, вместе с вложенными файлами и папками. В представленной ниже программе (листинг 12-7) используются все вы- шеописанные методы манипулирования папками, кроме CopyFolder. Сцена- рий просит пользователя ввести имя папки и создает папку с этим именем. После этого в диалоговом окне выводятся подкаталоги родительской папки. Далее папка может быть переименована и удалена. Сценарий также выводит диалоговые окна, чтобы держать пользователя в курсе действий. '*********♦♦*******************♦**********<1****** ' Файл: Folderl.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born Создание папки , Option Explicit Dim isnew Dim path, newpath, parent Dim Text, Textl, Title, oFolder Dim fso, oFolders, oSubFolder, wsh Text = "Folders" & vbCrLf & vbCrLf Title = "WSH sample - by G. Born" ’ Переменные-объекты. ' Запрос имени папки. path = InputBox("Enter folder name (e.g. C:\Born).", _ Title, "C:\Born") If path = "" Then WScript.Quit ’ Пользователь отменил действие. End If см. след. стр.
314 ЧАСТЬ III Особые возможности сценариев newpath = path ' Сохранить путь (для удаления). Создать объект FileSystemObject, чтобы получить доступ к файловой системе. Set fso = WScrlpt.CreateObject("Scripting.FileSystemObject”) ' Проверить, существует ли папка. If (Not fso.FolderExists(path)) Then ’ Папка не существует, создать ее. Set oFolders = fso.CreateFolder(path) MsgBox "Folder " & path & " created" isnew = True ’ Имейте в виду, что это новая папка. Else isnew = False ’ Имейте в виду, что такая папка уже есть. End If If (MsgВох("List parent folders?", vbYesNo + vbQuestion, Title) = vbYes) Then ‘ Получить родительскую папку. parent = fso.GetParentFolderName(path) If (parent = "") Then MsgBox "No parent folder" Else ’ Получить набор Folders. Set oFolders = fso.GetFolder(parent) Set oSubFolder = oFolders.SubFolders For Each oFolder In oSubFolder ' Вое папки. Text = Text & oFolder.Name & vbCrLf Next MsgBox Text, vbOKOnly + vblnformation, Title End If End If If isnew = False Then MsgBox "AttentionI The next steps might delete your folder " & newpath & vbCrLf & _ "Do not delete system foldersI", vbYes + vbExclamation, Title End If ' Переименовать папку методом MoveFolder. If (MsgBox("Rename folder " & path & " ?", vbYesNo + vbQuestion, Title) = vbYes) Then ’ Да, пользователь согласен. newpath = path & "New”
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 315 fso.MoveFolder path, newpath MsgBox "Folder renamed " & newpath End If ' Удалить папку. If (MsgBox("Delete folder ” & newpath & " ?", vbYesNo + vbQuestion, Title) = vbYes) Then ' Пользователь согласился. fso.DeleteFolde r(newpath) End If ' *** Конец Листинг 12-7. Folderl.vbs. Реализация на JScript У метода Popup языка JScript есть дополнительный параметр, задающий тай- маут (который отсутствует у функции MsgBox языка VBScript). Вот так про- грамма реализуется на JScript (листинг 12-8): //«*•••••*••••••**••••••••••*••*••*••••••••••••••• Ц Файл: Folderl.js (Пример для WSH на JScript) И Автор: (с) G. Born И И Создание папки var vbOKCanoel =1; // Объявить переменные. var vbOK = 1; var vbYes = 6; var vbCancel - 2; var vbYesNo = 4; var vbQuestion = 32; var vblnformation = 64; var Text = "Folders\n\n"; var Title = "WSH sample - by G. Born"; 11 Создать несколько нужных объектов. var wsh = WScript.CreateObjectC'WScript.Shell”); var objAdr = WScrlpt.CreateObject("WSHExtend.WinExt"); var fso = new ActiveXObject("Scripting.FileSystemObject"); // Запрос имени папки. var path = objAdr.WSHInputBox("Enter folder name (e.g. C:\\Born).", см. след. стр.
316 ЧАСТЬ III Особые возможности сценариев Title, "С:\\Вогп"): if (path == "") WScript.Quit(); И Пользователь отменил действие. var newpath = path; // Сохранить путь (для удаления). И Проверить, существует ли папка. if (Ifso.FolderExists(path)) { // Папка не существует, создать ее. var fo = fso.CreateFolder(path); WScript.Echo(”Folder ” + path + " created”): var isnew = true; // Имейте в виду, что зто новая папка. } else var isnew = false; // Имейте в виду, что это такая папка уже существует. if (wsh.Popup(”List parent folders?”, 0, Title, vbYesNo + vbQuestion) == vbYes) { var parent = fso.GetParentFolderName(path) // Родительская папка. if (parent == ”") WScript.Echo("No parent folder") else ( // Получить набор Folders. var oFolders = fso.GetFolder(parent); var oSubFolder = new Enumerator(oFolders.SubFolders); // Все папки. for (; loSubFolder.atEnd(); oSubFolder.moveNextO) { var i = oSubFolder.item(); Text = Text + i.name + "\n”; } WScript.Echo(Text); } ) if (Iisnew) WScript.Echo( "Attention! The next steps might delete your folder " + newpath + ”\n" + "Do not delete system foldersl"); // Переименовать папку методом MoveFolder. if (wsh.Popup("Rename folder " + path + " ?", 0, Title, vbYesNo + vbQuestion) == vbYes) { // Да, пользователь согласен.
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 317 newpath = path + "New”; fso.MoveFolder(path, newpath); WScrlpt.Echo(”The folder wae renamed ” + newpath); ) I/ Удалить папку. if (wsh.Popup!"Delete folder " + newpath, 0, Title, vbYesNo + vbQuestion) == vbYes) // Пользователь согласился. fso.DeleteFolder(newpath); //*** Конец Листинг 12-8. Folderljs. Выводим список всех файлов папки Предыдущая программа выводила список всех папок, находящихся в данной папке. Аналогично набор Files объекта FileSystemObject позволяет вывести список всех файлов из данной папки. Следующая программа выводит в диа- логовом окне список всех файлов из папки Windows\ShellNew (рис. 12-5). Путь к целевой папке можно задать именованной константой в заголов- ке программы: Const path = "XWINDIRX\ShellNew” Рис. 12-5. Список файлов заданной папки. Чтобы получить доступ к содержимому папки, прежде всего надо создать объект FileSystemObject-. Set fso = WScript.CreateObject!"Scripting.FileSystemObject") Далее можно получить ссылку на объект, представляющий папку, методом GetFolder. На этом этапе методу нужен путь к папке. Поскольку путь, опреде- ленный константой path, содержит переменную окружения %WINDIR%, не-
318 ЧАСТЬ III Особые возможности сценариев обходимо раскрыть это выражение методом ExpandEnvironmentStrings. Это делают вложенные операторы: Set oFolder = fso.GetFolder(wsh.ExpandEnvironmentStrings(path)) После этого переменная oFolder содержит ссылку на объект, представля- ющий текущую папку. С его помощью можно получить свойство Files, кото- рое возвращает набор всех файлов в данной папке: Set oFiles = oFolder.Files Свойство Name позволяет извлечь из набора имя файла. Следующий цикл получает имена и размеры всех файлов из текущей папки: For Each 1 In oFiles ' Все файлы Text = Text & i.Name i vbTab Text = Text & FormatNumber(i.Size, 0) & vbCrLf Next По завершении цикла переменная Text содержит имена всех файлов. Имя файла отделено от его размера табуляцией с помощью именованной констан- ты VBScript vbTab. Если полученный текст отображается в диалоговом окне, имена файлов и их размер выводятся в отдельных столбцах. К сожалению, я не нашел способа настройки позиций табуляции, чтобы изменить значение по умолчанию (рис. 12-6). Вот текст примера полностью (листинг 12-9): *************************************************** ' Файл: Files.vbs (Пример для WSH на VBScript) ‘ Автор: (с) G. Born ' Вывод списка воех файлов из папки Windows\ShellNew *************************************************** Option Explicit Const path = ”XWINDIRX\ShellNew" Dim Text, Title, oFile Dim fso, oFolder, oFiles, wsh ' Переменные-объекты. Text = "Folder " Title = "WSH sample - by G. Born" Set wsh = WScrlpt.CreateObjectC’WScript.Shell”) ’ Создать объект FileSystemObject, чтобы получить доступ к файловой системе. Set fso = CreateObjeotC’Scripting.FileSystemObject") ’ Получить объект Folder. Set oFolder = fso.GetFolder(wsh.ExpandEnvironmentStrings(path)) Text = Text i oFolder & vbCrLf & vbCrLf
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 319 Text = Text & "Name" & vbTab & vbTab & "Size" & vbCrLf Set oFiles = oFolder.Files ' Получить набор Files. For Each oFile In oFiles ' Все файлы. Text = Text & oFile.Name & vbTab Text = Text & FormatNumber(oFile.Size, 0) & vbTab ’ Получение коротких имен файлов ' (аакомментировано для VBScript 3.1) ’ Text = Text & oFile.ShortName 4 vbCrLf Text = Text & vbCrLf Next MsgBox Text, vbOKOnly + vblnformation, Title ’••• Конец Листинг 12-9. Files.vbs. Реализация на JScript А вот JScript-версия этой программы (листинг 12-10). // Файл: Files.js (WSH sample in JScript) // Автор: (c) G. Born // // Вывод списка всех файлов из папки Windows\ShellNew var path = "XwindirX\\ShellNew"; var Text = "Folder "; var wsh = WScript.CreateObject ("WScript.Shell"); // Создать объект FileSystemObject, чтобы получить доступ к файловой системе, var fso = WScript.CreateObjeot("Scripting.FileSystemObject"); // Получить набор Folders. var oFolder = feo.GetFolder(wsh.ExpandEnvironmentStrings(path)); var oFilee = new Enumerator(oFolder.Files); // Набор Files. Text = Text + oFolder + "\n\n"; Text = Text + ”Name\t\tSize\n"; for (; loFiles.atEnd(); oFiles.moveNextO) // Все файлы. { var oFile = oFiles.item(); Text = Text + oFile.name + "\t"; Text = Text + oFile.size + "\t”; // Text = Text + oFile.ShortName + "\n“; см. след. стр.
320 ЧАСТЬ III Особые возможности сценариев Text = Text + "\n”; } WScrlpt.Echo(Text); //♦♦* Конец Листинг 12-10. Files.js. Получение атрибутов и дат файлов Получив набор Files, можно извлечь из него объект «файл» и проанализиро- вать его свойства, как показано в предыдущем примере. Свойство Name объек- та File возвращает имя файла, а свойство Attributes — двоичное значение, опи- сывающее атрибуты файла. Возможные значения таковы (табл. 12-3): Табл. 12-3. Константы, обозначающие файловые атрибуты. Константа* Значение Описание Normal 0 Обычный файл без установленных атрибутов. Readonly 1 Файл с атрибутом «только для чтения». Hidden 2 Скрытый файл. System 4 Системный файл. Directory 16 Папка или каталог (возможно, с атрибутом «только для чтения»). Archive 32 Файл с атрибутом «архивный», модифицированный со времени последнего резервного копирования. Alias 1024 Ярлык (.Ink-файл). Compressed 2048 Сжатый файл (только для Windows NT/2000). ’ Константы действительны для библиотеки Scrrun.dll, поставляемой с WSH 2. Можно комбинировать значения констант свойства Attributes. Свойства DateCreated, DateLastAccessed и DateLastModified объектов File или Folder по- зволяют получить дату создания, изменения и последнего обращения к фай- лу соответственно. Следующая программа-пример получает сведения о файле. По умолча- нию она использует файл Autoexec.bat (который всегда есть в Windows 95/98). Пользователи Windows NT/2000 могут взять любой другой тексто- вый файл. Программа-пример поддерживает технологию drag-and-drop, поэтому если пользователь перетащит значок файла на значок сценария, сценарий вернет сведения об этом файле. Сценарий создает диалоговое окно, которое содержит значения (сведения об атрибутах и датах), полу- ченные для файла Autoexec.bat (рис. 12-6).
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 321 Рис. 12-6. Сведения о файле Autoexec.bat. Трудности при использовании свойства DateCreated При разработке этого сценария я столкнулся с проблемой: исполне- ние CStrQDateCreated) на моей тестовой машине вызывало ошибку ♦Invalid procedure call or argument» («Неверный аргумент или вызов процедуры»). Сначала я подумал, что это просто ошибка в обработчике, так как пример без проблем работал с обработчиками языка версии 3.1 (на другой машине). Повозившись с отладкой, я понял, что ошибку вы- зывает свойство DateCreated. На вкладке General среди свойств файла Autoexec.bat (рис. 12-7) я отыскал причину: на той машине дата создания файла Autoexec.bat была не определена. Чтобы организовать в сценарии «защиту от дурака», необходимо реализовать обработку ошибок для всех случаев, когда поля данных для файла не определены. То же вер- но для папок (тяжела ты, доля программиста). Рис. 12-7. Свойства Autoexec.bat. Следующий сценарий читает атрибуты файла Autoexecbat, а также даты его создания, изменения и последнего обращения к нему (листинг 12-11). После этого сценарий выводит полученную информацию в диалоговом окне.
322 ЧАСТЬ III Особые возможности сценариев Файл: Fi.le1.vbs (Пример WSH sample in VBScript) Автор: (о) G. Born Чтение атрибутов, дат ооэдания, изменения и последнего обращения к файлу Autoexec.bat (Пользователи Windows NT должны изменить константу "file") Option Explicit Dim fso, oFile, objArgs, Text, attrib, file file = "C:\Autoexeo.bat" ' Задать файл no умолчанию. ' Try to get a file as an argument. Set objArgs = WScrlpt.Arguments ' Создать объект. If objArgs. Count > 0 Then _ file = objArga(O) ' Первый аргумент. ' Создать объект FileSystemObject, чтобы получить доступ к файловой системе. Set feo = WScrlpt.CreateObjeotCSoripting.FileSyetemObject") If fso.FileExlets(file) Then ’ Проверить, существует ли файл. Set oFile = fso.GetFile(file) ' Получить описатель объекта "файл". ' Теперь попробуем получить оведения о файле. Text = "File: " & vbTab & oFlle.Name & vbCrLf ' Получить имя файла. ' Даты файла (создания, изменения, последнего обращения к файлу). Text = Text & "Created: “ & vbTab & oFile.DateCreated & vbCrLf Text = Text & "Modified: " & vbTab & oFile.DateLastModifled & vbCrLf Text = Text i "Accessed: " & vbTab & _ oFile.DateLastAcceesed & vbCrLf ’ Декодировать атрибуты. Text = Text & "Attributes " & vbTab attrib = oFile.Attributes ' Это атрибут "только для чтения". If (attrib And &H01) > 0 Then Text Text & "r ” ’ Это атрибут "скрытый". If (attrib And 4H02) > 0 Then Text = Text & "h " ' Это атрибут "системный". If (attrib And &H04) > 0 Then Text = Text & "s " ' Это атрибут "архивный". If (attrib And &H20) > 0 Then Text = Text & "a " ' Это атрибут Windows NT "сжатый". If (attrib And &H800) > 0 Then Text = Text & "c "
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 323 WScript.Echo Text ' Показать результат. Else WScript.Echo "Error: File " & file & " not found" End If '*** Конец Листинг 12-11. Filel.vbs. Реализация на JScrlpt JScript-версия программы показана ниже (листинг 12-12). Сценарий читает атрибуты и даты файла, и выводит сведения в диалоговом окне (рис. 12-8): Рис. 12-8. Свойства файла, которые выводит сценарий на JScript. По умолчанию сценарий выводит свойства файла Autoexec.bat. В WSH 2 пользователь может вывести свойства файла, перетащив его значок на зна- чок сценария. Вы увидите, что этот сценарий создает диалоговое окно не- сколько иного вида, чем у показанного выше (рис. 12-6). В частности, зна- чения дат возвращаются соответствующими свойствами в длинном форма- те (включая день недели). Кроме этого, на JScript функция CStr недоступна, автоматическое преобразование типов происходит при конкатенации строк оператором +. //...............................*............... Ц Файл; Filel.js (Пример для WSH на JScrlpt) Ц Автор: (с) G. Born П Ц Чтение атрибутов, дат создания, изменения и И последнего обращения к файлу Autoexec.bat. // (Пользователи Windows NT должны изменить //переменную "file".) /у************************************************ var file = ”C:\\Autoexec.bat”; // Задать файл. И Попытаться получить переданные параметры; // поддерживается только одно имя файла. var objArgs = WScript.Arguments; // Создать объект. if (objArgs.length > 0) // Есть ли аргументы? file = objArgs(O); // Получить первый аргумент. см. след. стр.
324 ЧАСТЬ III Особые возможности сценариев // Создать объект FileSystemObjeot, чтобы получить доотуп к файловой оиотеме. var fso » WSoript.CreateObjectCScriptino.FileSystemObjeot"); if (Ifeo.FileExists(file)) { WScrlpt.Echo("Error", file, "doesn't exist"); WScrlpt.Quit(1); var ] = fso.GetFile(file); // Получить описатель объекта "файл". // Теперь попробуем получить сведения о файле. var Text = "File: \t\t" + j.name + "\n"; // Имя файла. Ц Даты файла (создания, изменения, последнего обращения к файлу) Text = Text + "Created: \t\t" + j.DateCreated + "\n"; Text = Text + "Modified: \t\t" + j.DateLastModifled + "\n"; Text = Text + "Accessed: \t" + j.DateLastAccessed + "\n"; I/ Декодировать атрибуты. Text = Text + "Attributes\t\t"; var attrib = j. Attributed if ((attrib & 0x01) l= 0) // Это атрибут "только для чтения". Text = Text + ”r "; if ((attrib & 0x02) l= 0) // Это атрибут "скрытый”. Text = Text + "h "; if ((attrib & 0x04) l= 0) // Это атрибут "системный". Text = Text + "s "; if ((attrib & 0x20) l= 0) // Это атрибут "архивный". Text = Text + "a "; if ((attrib & 0x800) l= 0) // Это атрибут "сжатый" (Windows NT). Text = Text + "c "; WScrlpt.Echo(Text); // Показать результат. //*** Конец Листинг 12-12. Filel.js. СОВЕТ В файле File 1 .wsf на прилагаемом компакт-диске используется ссылка на библиотеку типов. Это позволяет задействовать в програм- ме именованные константы для атрибутов Readonly, Hidden и System. Решение проблемы с неопределенными значениями CreatlonDate Ранее я говорил, что на некоторых из моих машин дата создания несколь- ких файлов была не определена, что стало причиной сбоя сценария из-за ошибки периода выполнения. Тем не менее есть способ получить набор Files
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 325 и обработать все составляющие его файлы в цикле (это нужно, например, чтобы вывести свойства всех файлов в папке). У каждого элемента набора до- ступны свойства, к которым можно обращаться и манипулировать ими (рис. 12-9). Даже если значение даты не определено, сценарий сможет восстано- виться после ошибки периода выполнения. Рис. 12-9. Список файлов, свойства которых не определены. Давайте расширим возможности предыдущей программы-примера, кото- рая выводила список файлов в папке Windows\ShellNew, так, чтобы она вы- водила атрибуты файлов и дату их создания. Получив набор файлов в этой папке, можно обработать все составляющие его файлы в простом цикле For Each file In oFiles-. For Each file In oFiles Text = Text & file.Name ' Добавить имя файла. Text = Text & " " & file.DateCreated ’ Дата создания. Next Оператор Text = Text ?file Name добавляет имя файла к строке через свой- ство Name. Оператор Text = Text “ & fileJDateCreated должен добавлять к строке дату создания файла. К сожалению, если значение свойства файла DateCreated не определено, этот код все равно приведет к ошибке периода выполнения («Invalid procedure call or argument»). Нужно сделать что-то еще, чтобы fileJDateCreated был толерантным к неопределенным значениям даты. Следующая функция позволяет справиться с такой ситуацией. Она полу- чает значение свойства DateCreated-. Function DateCreatedEx(obj) On Error Resume Next Dim datex ' Получает дату создания файла. datex = i.DateCreated ' Дата создания. If Err.Number <> 0 Then datex » "unknown" DateCreatedEx = datex
326 ЧАСТЬ III Особые возможности сценариев On Error Goto О End Function Оператор On Error Resume Next перехватывает все ошибки периода вы- полнения и заставляет интерпретатор продолжить исполнение со следую- щего оператора. Если при попытке обращения к свойству DateCreated про- исходит сбой, в ErrNumber будет ненулевое значение. Когда обращение к DateCreated заканчивается неудачей, программа-пример возвращает строку «unknown*, поэтому возможность возникновения ошибки периода выполне- ния из-за неопределенной даты создания файла исключена. Оператор On Error GoTo О отключает встроенную обработку ошибок. Код сценария хра- нится в .wsf-файле, который содержит ссылку на библиотеку типов, поэто- му для расшифровки значений атрибутов в программе можно использовать именованные константы (такие как Readonly, Hidden и System). Полный ис- ходный текст выглядит так (листинг 12-13): <?xml version»"1.0" enooding»"IS0-8859-1"?> <l- Файл: File2.wsf (Пример для WSH 2) Автор: (о) G. Born Чтение атрибутов, даты ооздания, изменения и последнего обращения файлов из папки 8hellNew -> cjob id="File2"> creference guid-’{420B2830-E718-11CF-893D-00A0C9064228}7> caorlpt language»"VBSoript"> <l[CDATA[ Option Explicit Const path « ”XWINDIRX\8hellNew” Dim Text, attrib Dim wsh, fao, oFolder, oFiles, oFile Set wsh WSoript.CreateObject("WScript.Shell") ' Создать объект FileSystemObject, чтобы ' получить доступ к файловой системе. Set fso » WSoript.CreateObjeot("Soripting.FileSystemObject") Set oFolder » _ fso.GetFolde r(wsh.ExpandEnvi ronmentSt rings(path)) Set oFiles = oFolder.Files ’ Получить набор Files.
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 327 ' Задать текст заголовка. Text » "File” & vbTab & vbTab & "Creation Date" & vbTab _ & vbTab & "Attributes" & vbCrLf ' Теперь попробуем получить сведения о файле. For Each oFile In oFiles Text » Text & oFile.name & vbTab & " [” ’ Имя файла. Text = Text & DateCreatedEx(oFile) & “] " ' Дата создания. Text » Text & vbTab ’ Табулятор. ' Декодировать атрибуты. If (oFile.Attributes And Readonly) > 0 Then Text = Text & “r " If (oFile.Attributes And Hidden) > 0 Then Text = Text & ”h " If (oFile.Attributes And System) > 0 Then Text = Text & "s “ If (oFile.Attributes And Archive) > 0 Then _ Text » Text & "a " If (oFile.Attributes And Compressed) > 0 Then Text » Text & "c “ Text = Text & vbCrLf ' С новой строки Next WScript.Echo Text ’ Вывести реэультвты. ‘ Вспомогвтельнвя функция для предотвращения ошибок периода выполнения. Function DateCreatedEx(obj) On Error Resume Next ' Включить обработку ошибок. Dim datex ’ Получает дату создания файла datex = obj.DateCreated 'Дата создания. If Err.Number <> 0 Then datex » " unknown DateCreatedEx = datex On Error Goto 0 ' Отключить обработку ошибок. End Function ]]> </script> </job> Листинг 12-13. File2.wsf. Копирование и удаление файлов Для копирования, перемещения и удаления файлов служат методы объекта File. Чтобы этот объект стал доступен, нужно создать объект FileSystemObject-. Set fso ” CreateObjectCScripting.FileSystemObject")
328 ЧАСТЬ III Особые возможности сценариев Чтобы избежать ошибок периода выполнения, надо проверить, существу- ет ли файл, который должен быть скопирован. Это можно сделать методом FileExists (мы уже использовали его в предыдущем примере): If (fso.FileExists(filel)) Then Если файл, имя которого передано в параметре filel, существует, метод возвращает True. В filel должен быть указан полный путь, включая имя фай- ла. Если наличие исходного файла уже проверено, можно получить ссылку на объект File методом GetFile объекта FileSystemObject-. Set oFile = fso.GetFile(filel) Параметрfilel также должен содержать путь к исходному файлу и его имя. Далее, используя ссылку на объект File в переменной-объекте oFile, можно применить метод Сору: oFile.Copy file2 Метод Сору требует, чтобы был задан хотя бы один параметр, содержащий имя целевого файла. Если второй (необязательный) параметр установлен как True, существующий файл в целевой папке будет перезаписан при операции копирования, если False — в случае наличия целевого файла возникает ошиб- ка периода выполнения. Переместить или переименовать файл позволяет метод Move объекта File. У него тот же синтаксис, что и у Сору (но в отличие от Сору после заверше- ния операции копирования этот метод удаляет исходный файл). Д ля удаления файла служит метод Delete: Set oFile = fso.GetFile(file2) oFile.Delete Оператор в первой строке получает ссылку на объект, представляющий файл, заданный параметром file2. Эта ссылка возвращается как объект File. Поэтому вы можете удалить файл, применив метод Delete к переменной- объекту oFile. У метода Delete есть необязательный параметр force. Если он равен True, WSH удалит также файлы с установленным атрибутом Read-only, если False и при этом файл помечен атрибутом «только для чтения* — Delete вызывает ошибку периода выполнения. Две показанные выше команды мож- но объединить в одной строке: fso.DeleteFile file2 ПРИМЕЧАНИЕ После исполнения метода, перемещающего или удаля- ющего файл, ссылка на объект, который представляет исходный файл, становится недействительной. Методы Copy, Move и Delete не поддерживают знаков подстановки. Поэто- му можно удалять файлы только по одному. Однако группу файлов позволя- ет обработать набор, содержащий все файлы папки. С помощью метода Run
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 329 можно также выполнять команды MS-DOS, чтобы копировать, удалять, пере- мещать или переименовывать несколько файлов сразу. Следующий оператор запускает команду MS-DOS Сору, которая поддерживает знаки подстановки: wah.Run "XCOMSPECX /с Copy C:\Born\Text*.txt C:\Born\Backup" При установке параметра bWaitOnReturn в True (см. главу 7) сценарий бу- дет ожидать завершения исполнения команды и самого процесса. У этого подхода есть один минус: сценарий не может обрабатывать ошибки, возни- кающие при исполнении команд. Кроме методов, которые использованы в следующей программе (лис- тинг 12-14), объектFileSystemObject поддерживает другие объекты и методы для манипуляций с файлами. Метод CopyFile также поддерживает копирова- ние файлов. Первый параметр (в котором могут быть знаки подстановки) за- дает исходный файл, а второй — целевой. Для работы этого сценария нужна папка C:\Born, в которой находится файл Test.txt. Файл Test.txt копируется в файл Testl.txt в той же папке. После запроса этот файл удаляется. Файл: FileS.vbs (Пример для WSH на VBSoript) Автор: (о) 6. Born ' Копирование и удаление файлов '******************************: Option Explicit Const path = "C:\Born" ' Тестовая папка (ее нужно создать заранее). Conet filel = ''C:\Born\Test.txt'' ' Исходный файл (его нужно создать заранее). Const file2 “ "C:\Born\Test1.txt'’ ' Целевой файл Dim Text, Title, i Dim feo, oFile, oFolder ' Переменные-объекты. Text "File oopied" & vbCrLf Title "WSH sample - by G. Born" ' Создать объект FileSyetemObjeot, чтобы получить доступ к файловой системе. Set fso »> CreateObject("Soripting.FileSyatemObject”) ' Проверить, существует ли файл. If (fso.FileExists(filel)) Then ' Copy filel to file2 (or use fso.CopyFile filel, file2). Set oFile = fso.GetFile(filel) ' Получить объект File. oFile.Copy file2, True ' Перезаписать целевой файл. Set oFolder = fso.GetFolder(path) Set oFile = oFolder.Files ' Получить набор Files. For Each i In oFile ' Все файлы. ом. след. стр.
330 ЧАСТЬ III Особые возможности сценариев Text = Text & i.Name & vbCrLf Next MsgBox Text, vbOKOnly + vblnformation, Title Else WScript.Echo "File ” & filel & " doesn't exist” WScrlpt.Quit End If ' Удалить файл пооле запроса. If (MsgBox("Delete file?", vbYesNo, Title) » vbYes) Then Set oFile » feo.GetFile(file2) ' Получить объект File. oFile.Delete ' (or use fso.CopyFile file2) WScript.Echo "File " & file2 & ” deleted” End If '*** Конец Листинг 12-14. Flle3.vbs. Реализация на JScript В реализации этого примера на JScript (листинг 12-15) использованы те же методы, что и в VBScript-программе. Файл Jest.txt в папке C:\Born копируется в файл Jestl.txt, а затем удаляется, если пользователь щелкнет кнопку Yes. И......*.............*......... И Файл: FileS.js (Пример для WSH на JScript) И Автор: (с) G. Born И И Копирование и удаление файлов //**.....................**.......... var vbYesNo = 4: var vbYes = 6; var vblnformation = 64; var vbCancel = 2; var path = "C:\\Born"; var filel = "C: \\BornWTest.txt”; var file2 = "C:\\Born\\Test1.txt"; var Text = "File copied\n"; var Title = "WSH sample - by G. Born”; var obj = WScrlpt.CreateObjectC'WScript.Shell"); // Создать объект FileSystemObject, чтобы получить доступ к файловой системе, var fso = WScrlpt.CreateObjectC'Scripting.FileSystemObject"); И Проверить, существует ли файл, if (fso.FileExists(filel))
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 331 И Копировать filel в file2. var oFile » fso.GetFile(filel); // Получить объект File. oFile.Copy (file2, true): // Перезаписать целевой файл. var oFolder = fso.GetFolder(path); var oFile = new Enumerator(oFolder.Filee); // Набор Files. for (; loFile.atEndO; oFile.moveNextO) // Все файлы. { var i = oFile.item(): Text = Text + i.Name + "\n"; } WScrlpt.Echo(Text); > else { WSoript.Echo("File " + filel + ” doesn't exist"); WScrlpt.Quit(1); // Удалить файл пооле запроса. if (obj,Popup("Delete file?”, 0, Title, vbYesNo) =« vbYes) { var oFile » fso.GetFile(file2); // Получить объект File. oFile. DeleteO; WScrlpt. EchoC'File ” + file2 + " deleted"); //*** Конец Листинг 12-15. File3.js. Создание резервных копий папок Сценарий, состоящий из нескольких операторов, создает папки для ежеднев- ного резервного копирования своих файлов. В имена папок можно включить текущую дату. Следующим примером будет простая программа на VBScript, ко- торая спрашивает у пользователя, создавать ли резервную копию папки. Сце- нарий предполагает, что исходная папка G\Born уже существует. Если этой пап- ки нет, сценарий завершается и выводит диалоговое окно (рис. 12-10, слева): samplo - hy fl fl «ни - Рис. 12-10. Диалоговые окна программы резервного копирования.
332 ЧАСТЬ III Особые возможности сценариев Если исходная папка имеется, сценарий определяет наличие в ней фай- лов. Если эта папка пуста, резервное копирование не требуется, и выводит- ся соответствующее диалоговое окно. Если в папке есть файлы, сценарий создает целевую папку GXBackupXCopyxx-j/y-zzzz, копирует в нее файлы и выводит диалоговое окно, подтверждающее копирование (рис. 12-10, спра- ва). Символы xx-yy-zzzz — это заполнитель для текущей даты в формате чис- ло-месяц-год. Каждый день в папке C:\Backup создается новая целевая пап- ка. Если вы выполняете резервное копирование несколько раз в день, фай- лы в целевой папке перезаписываются. Сценарий предполагает, что файлы не заняты, так как он не поддерживает обработку ошибок периода выполне- ния, возникающих, если файлы заняты. Пути к исходной папке и папке назначения установлены в заголовке про- граммы в константахpathl и path2, что позволяет легко настроить этот сце- нарий для собственных нужд. Резервное копирование фалов осуществляет- ся в целевую папку, чье имя должно включать в себя текущую дату. Путь к папке задает оператор: Т11е2 = path2 & Day(Date) & & Month(Date) & 4 Year(Date) Значение константы path2 установлено в заголовке программы и равно C:\Backup\Copy. Функции Day (Date), Month(Date) и Year(Date) прибавляют к этому пути текущую дату. Вы можете спросить, почему я не создал путь таким оператором: file2 ° path2 4 Date Эта команда короче, но она вызывает проблемы: пользователь определяет разделители для формата даты на уровне ОС, но некоторые символы-разде- лители (например, обратный слеш \) недопустимы в имени файла. В пока- занном выше операторе функция Date вернет недопустимое имя файла. Ска- жем, путь C:\Backup\Copy2\22\1998. будет интерпретирован как иерархия папок. Она будет создана автоматически, но результат будет вовсе не тот, который мы ожидали. Предыдущий оператор извлекает из значения даты число, месяц и год и вставляет разделители вручную. Вы можете комбини- ровать части даты как угодно, чтобы получить действительное имя каталога (я записал дату в европейском формате, где число стоит перед месяцем, и объединил ее с именем папки). Далее следует проверить, существует ли исходная папка. Если нет, сцена- рий завершится с сообщением об ошибке. Проверку выполняет последова- тельность команд, в которой используется метод FolderExists-. If (Not fso.FolderExiste(pathl)) Then Text » "Folder ” 4 pathl 4 ” doesn’t exist." MsgBox Text, vbOKOnly + vblnformation, Title WScrlpt.Quit End If Также надо проверить, не пуста ли исходная папка (если это так, никаких файлов копировать не нужно). При применении метода CopyFile к пустой
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 333 папке возникает ошибка периода выполнения. Я пытался выяснить число элементов набора с помощью oFiles.Count, но получал ошибку периода вы- полнения. Проверять наличие файлов в папке следует так: If FolderEmpty(pathl) Then Function FolderEmpty(name) Dim fso, oFolder, oFiles ' Переменные-объекты. Dim i, flag Set fso = CreateObject("Scripting.FileSystemObject") Set oFolder = fso.GetFolder(pathl) ' Получить папку. Set oFiles = oFolder.Files ' Все папки. flag = True ' Установить флаг как "пусто". For Each i In oFiles flag = False ' Файл найден; поменять флаг. Exit For Next FolderEmpty = flag End Function Функция FolderEmpty требует имя папки — строку, которая содержит дей- ствительный путь, включая имя папки. Этот путь позволяет получить набор Files. Цикл For Each Un oFiles выполняется, только если набор содержит фай- лы. В этом случае переменная flag устанавливается как False (т. е. в папке об- наружен файл). Если файлов в папке нет, функция возвращает True. ПРИМЕЧАНИЕ Функция не проверяет наличия папки. Вы можете сами расширить этот сценарий, поместив в него проверку наличия папки. Я также опустил проверку наличия вложенных папок, так как метод FileCopy применим лишь к файлам текущей папки. Перед резервным копированием нужно проверить, существует ли целевая папка. Если нет, ее нужно создать. Сначала следует создать корневую папку C:\Backup. После этого метод CreateFolder создает новую папку назначения: If (Not fso.FolderExists(file2)) Then ' Существует ли родительская папка? If (Not fso.FolderExists(path3)) Then fso.CreateFolder(path3) ' Первый шаг fso.CreateFolder(file2) ' Создать папку для резервных копий. End If Параметром метода FolderExists объекта FileSystemObject является имя пап- ки. Метод проверяет, доступна ли папка в данном (допустимом), пути и воз- вращает True, если папка существует. После этих проверок можно копиро- вать файлы:
334 ЧАСТЬ III Особые возможности сценариев fso.CopyFile pathl & file2 Метод CopyFile применяется к объекту FileSystemObject. В первом парамет- ре, переданном ему, находится источник копирования (в примере это путь к исходной папке, оканчивающийся знаками подстановки). Этот параметр гарантирует, что будут скопированы все файлы из исходной папки. Имейте в виду, что этот метод не обрабатывает вложенные папки. Кроме того, в ис- ходной папке должен быть хотя бы один файл. Второй обязательный пара- метр задает целевую папку. Если он содержит путь, оканчивающийся именем файла, метод переименовывает копируемые файлы. Чтобы этот сценарий работал, нужно создать папку C:\Born, в которой должен быть минимум один файл. После запуска сценария на жестком дис- ке появится новая папка Backup с вложенной папкой, в имя которой будет вставлена текущая дата (рис. 12-11). WIN98 (С:) ВО Backup i 'i-Gj Сору22-12-1993 | Copy23-12-1993 Born Рис. 12-11. Исходная и целевая папки. Вот исходный текст этой программы на VBScript (листинг 12-16): '**************************************************** ' Файл: Backup.vbs (Пример для WSH на VBScript) ’ Автор: (с) G. Born ' Поиск файлов в папке C:\Born и, если папка не пуста, ' резервное копирование найденных файлов в целевую папку ' C:\Backup\Copyxx-yy-zzzz (где xx-yy-zzzz - ' текущая дата) ’**************************************************** Option Explicit Const pathl = "C:\Born” Const path2 = "C:\Backup\Copy" Const path3 = ”C:\Backup\" Dim Text, Title, destination Dim fso ’ Переменные-объекты. Dim flag Text = "Backup folder " & pathl & ”?" Title = "WSH sample - by G. Born” If (MsgBox(Text, vbYesNo + vbQuestion, Title) = vbNo) Then WScript.Quit ' Нажата кнопка Cancel. End If ' Создать имя папки назначения. Поскольку локализованные
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 335 ’ версии Windows могут использовать в качестве разделителей в формате даты ' символы, недопустимые в именах файлов (например, \ или :), ' имя создается вручную из даты. destination » path2 & Day(Date) & & Month(Date) & _ & Year(Date) Создать объект FileSystemObject, чтобы получит доступ к файловой системе. Set fso = CreateObject("Scripting.FileSystemObject") ’ Проверить, существует ли папка. If (Not fso.FolderExists(pathl)) Then Text = "Folder " & pathl & “ not foundl" MsgBox Text, vbOKOnly + vblnformation, Title WScript.Quit End If ' Проверить, есть ли файлы в исходной папке. Если нет, ' при операции копирования возникнет ошибка периода выполнения. ' Если исходная папка пуста, папку назначения ' создавать не нужно. If FolderEmpty(pathl) Then Text = "Nothing to save in “ & pathl MsgBox Text, vbOKOnly + vblnformation, Title WScript.Quit End If ' Проверить, существует ли целевая папка. If (Not fso.FolderExists(destination)) Then ' Существует ли родительская папка? If (Not fso.FolderExists(path3)) Then fso.CreateFolder(path3) ' Первый шаг. fso.CreateFolder(destination) ' Создать папку для резервного копирования. End If Скопировать файлы из исходной папки в целевую. fso.CopyFile pathl & destination Text = "Folder ” & pathl & " is backed up to ” & destination MsgBox Text, vbOKOnly + vblnformation, Title ’ Проверить, не пуста ли папка. Function FolderEmpty (name) Dim fso, oFolder, oFiles ' Переменные-объекты. Dim i, flag Set fso = CreateObject("Scripting.FileSystemObject") Set oFolder = fso.GetFolder(pathl) ' Получить папку. Set oFiles = oFolder.Files ' Получить набор Files. см. след. стр.
336 ЧАСТЬ III Особые возможности сценариев flag = True For Each i In oFiles flag = False Next FolderEmpty = flag End Function ' Нет файлов. ’ Если цикл обрабатывается, ' файл найден. ' Вернуть результат. '*** Конец Листинг 12-16. Backup.vbs. В качестве упражнения самостоятельно перенесите эту программу на JScript. ПРИМЕЧАНИЕ Как сказано выше, у объекта FileSystemObject есть не- сколько методов и субобъектов, позволяющих копировать файлы и папки. Если метод Сору, предоставляется субобъектом, его единствен- ный параметром является целевая папка — исходная папка определе- на самим субобъектом. Если при копировании или переносе метод вызывает ошибку периода выполнения, кроме наличия самой папки и файлов, следует проверить, оканчивается ли путь символом «\». Доступ к текстовым файлам Для чтения и записи данных из текстовых файлов служат методы объекта FileSystemObject. Чтение данных из текстового файла Метод OpenTextFile, поддерживаемый объектом FileSystemObject, служит для получения доступа к текстовому файлу. Рассмотрим простой сценарий, ко- торый обращается к текстовому файлу. Вызванный без параметра, он будет пытаться прочитать файл C:\Autoexec.bat. В диалоговом окне пользователь может выбрать способ вывода содержимого файла: в диалоговом окне или в окне браузера (рис. 12-12). Чтобы прочитать данные из текстового файла, нужно сначала создать объект FileSystemObject-. Set fso = CreateObject("Scripting.FileSystemObject”) Также следует проверить наличие файла, так как если его нет, при испол- нении сценария возникает ошибка периода выполнения: If fso.FileExists(file) Then Если файл существует, можно попробовать открыть его методом Open- TextFile объекта FileSystemObject: Set txtStream = fso.OpenTextFile(file)
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 337 WSH sample by Б Bom - Microsoft IrJemet fxpfc Content of C:\W3HDevGuicie\Chapter01) Args, vbs <*«••*•••••••••«•»••«••»••«•«««••*••««*»•••••*••• • Filet Args.vbs (ОЗМ ветерle in VBScript) • Author» (с) G. Born • Shoving all arguments submitted to the script »’ in a dialog box > • XWSS**e*se»rWS-J»WAr»»»*.*eW»»X*»Si*AirXSSW*W#-«»»itW* text * "Arguments” vbCrLf « -vtoCrLf Set objArgs “. WScript. Arguments . j*- Great* .object.. Fox i • О to objArgs.Count - 1 • Loop through a text • text C objArgs(1) * vbCrLf ‘ Get argument. Next .. -- ' •; WScript.Echo text * Show arguments using Echo. End Рис. 12-12. Вывод содержимого текстового файла в окне браузера и в диалоговом окне. Необходимо передать методу параметр file, содержащий путь (включая имя текстового файла). Если файла нет, возникает ошибка периода выпол- нения. Показанный выше оператор использует только один параметр, кото- рый содержит имя файла. Метод поддерживает несколько необязательных параметров, определяющих, как буде т открыт файл: 0Ь)есг_пате.0репТех1Р11е(файл[, режим[, создать[, формат]]]) В этом операторе заданы следующие параметры. М Файл — имя существующего текстового файла. М Режим — необязательный параметр, задает режим ввода-вывода для опе- раций с файлом. Параметр может содержать константы ForReading (со значением 1, определяющим доступ только для чтения), ForWriting (со значением 2, которое определяет доступ только для записи) и ForAppen- ding (значение 8 определяет доступ для записи и позволяет дописывать данные к концу файла). ПРИМЕЧАНИЕ Константы метода OpenTextFile в сценариях WSH надо объявлять явно, так как WSH не поддерживает предопределенных имен для этих констант. В WSH 2 можно использовать .wsf-файл, в котором элемент <reference> позволяет определить ссылку на библиотеку ти- пов, откуда могут быть получены эти константы (эта методика много- кратно демонстрировалась по ходу главы). М Создать — необязательный параметр, содержит булево значение: True — отсутствующий файл будет создан, False — файл не создается.
338 ЧАСТЬ III Особые возможности сценариев Формат — необязательный параметр; задает формат текстового файла, который должен быть открыт. Если этот параметр не задан, для файла определяется формат ASCII. Можно установить его значение как Tristate- UseDefault (или -2, при этом файл открывается с параметрами, заданны- ми по умолчанию), TristateTrue (со значением -1, чтобы открыть файл в формате Unicode) или TristateFalse (со значением О файл будет открыт в формате ASCII). Чтобы прочитать строки из текстового файла, необходимо применить к объекту «файл» метод ReadLine. При чтении метод atEndOJStream должен проверять, не достигнут ли конец файла. Следующий цикл построчно чита- ет содержимое файла и собирает его в одну строку: Do While Not (txtStream.atEndOfStream) Text = Text & txtStream.ReadLine & vbCrLf Loop Когда содержимое файла прочитано, переменную Text можно обрабаты- вать дальше. В сценарии-примере C:\Autoexecbat установлен как файл по умолчанию. Если не указан иной файл, сценарий читает этот файл и выводит его содер- жимое. Однако пользователю может понадобиться вывод содержимого фай- ла путем перетаскивания значка этого файла на значок файла сценария. Это можно реализовать на VBScript следующими операторами: file = "C:\Autoexec.bat" ' Тестовый файл по умолчанию. ' Попытаться получить имя файла из набора Arguments. Set objArgs - WScrlpt.Arguments ' Создать объект. If objArgs.Count > 0 Then ' Аргумент найден. file = objArge(O) ' Установить имя файла равным значению ' первого аргумента. End If После обработки этих операторов в переменной file будет имя C:\Auto- exec.bat или путь и имя файла, значок которого перетащили на значок сце- нария. Прежде чем обращаться к файлу, проверим, существует ли он: Set feo = CreateObjeotC'Scripting.FlleSyBtemObject”) If fso.FlleExlsts(file) Then ’ Проверить, существует ли файл. End If В первой строке создается ссылка на объект FileSystemObject. Затем к это- му объекту применяется метод FileExists, чтобы проверить наличие файла. Если файла нет, метод Quit завершает сценарий. В противном случае чита- ется содержимое текстового файла: Set txtStream = fso.OpenTextFile(file) ' Открыть текстовый файл. Do While Not (txtStream.atEndOfStream) Text = Text & txtStream.ReadLine & vbCrLf Loop
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 339 Метод OpenTextFile открывает файл. Необязательные параметры в этом примере опущены, так как нужен лишь доступ для чтения. Далее для чтения файла используется цикл, в теле которого находится метод ReadLine. Про- верку достижения конца файла осуществляет метод atEndOfStream. Если ко- нец файла не достигнут, он возвращает False. После выхода из цикла в стро- ковой переменной Text находится все содержимое файла. Далее сценарий выводит его в простом диалоговом окне или окне браузера. Подводные камни при просмотре текстовых файлов с помощью диалоговых окон и браузера Простое диалоговое окно на VBScript выводит оператор: WScrlpt.Echo Text или команда: MsgBox Text, vbOKOnly + vblnformation, Title Если переменная Text содержит лишь несколько символов, проблем не возникает. Но если выводить методом Echo содержимое длинного текстово- го файла, окно будет больше рабочего стола. При этом конец текста и кнопка ОК будут скрыты за панелью задач. При использовании функции VBScript MsgBox возникает другая пробле- ма: текст выводится не полностью. В справочном файле по VBScript говорит- ся, что максимальная длина параметра prompt функции MsgBox равна 1 024 символам. Таким образом, при попытке вывести длинный текстовый файл в диалоговом окне вы увидите лишь первую часть файла. В следующей программе-примере эта проблема решается путем вывода простого диалогового окна, которое позволяет пользователю задать в каче- стве средства для просмотра содержимого текстового файла окно браузера или диалоговое окно (рис. 12-13). WSH sample by G Bom Рис. 12-13. Диалоговое окно выбора средства просмотра файла (браузера или диалогового окна). Для вывода содержимого в Microsoft Internet Explorer служит процедура: ShowWindow Text, Title Процедура ShowWindow из приведенных ниже примеров состоит из та- ких операторов: Sub ShowWlndow(txt, title) Dim oIE, doc1
340 ЧАСТЬ III Особые возможности сценариев ' Создать объект Internet Explorer Application. Set oIE = WScrlpt.CreateObject("InternetExplorer.Application") oIE.Navigate "about:blank" ’ Пустой документ HTML oIE.Visible = 1 ' Окно Internet Explorer видимо. oIE.ToolBar = 0 oIE.StatusBar = 0 ’ oIE.Width=600 oIE.Height = 500 Do While (oIE.Busy): Loop ' Важно: ждать, пока Internet ' Explorer не освободится. Set doc1 = oIE.Document ' Получить объект Document. docl.open ' Открыть документ. ' Записать сценарий в объект Document. docl.wrlteln "<html><head><tltle>" & Title & ”</titlex/head>" docl.wrlteln "cbody bgcolor=’#FAFOFO'xpre>" docl.wrlteln txt ’ Вывод текстовой информации. doc1. writein "</prex/bodyx/html>" dod.close ' Закрыть документ для записи. End Sub Эта процедура вызывает окно Internet Explorer, записывает корректный HTML-заголовок и вставляет содержимое переданных строк в окно браузе- ра. Сам текст отформатирован с помощью тэгов <рге>...</рге>. После текста в конце документа расположены допустимые символы конца HTML-файла (тэги </body></html>). Затем содержимое текстового файла выводится в окне браузера. Заметили ли вы, что свойство Width для окна браузера в этой процедуре не задано? Поскольку оператор, который устанавливает это свойство, начи- нается со знака комментария (‘), браузер настраивает ширину окна по дли- не строк текстового файла. Реализовав эту процедуру, я заметил, что при выводе некоторых файлов в окне браузера получаются «неверные» результаты. Как видите, некоторые строки показаны полужирным шрифтом (рис. 12-14). Другие файлы (напри- мер, HTML-файлы с формами) выводятся в окне браузера в виде форм. Про- анализировав исходный текст HTML, я нашел причину: процедура Show- Window просто записывает содержимое файла в окно документа браузера. Если переменная Text содержит внедренные в исходный текст команды HTML, браузер применяет их к тексту при выводе, и получаются непредсказуемые результаты. Например, при попытке вывода файла сценария с операторами для запи- си в окно браузера HTML-кода эти операторы изменят вид окна браузера. Поэтому для преобразования HTML-кода нужен «фильтр». Прежде всего нуж- но преобразовать знаки тэга < и > в символы 8dt; и &gt;. Я решил написать собственную функцию, MakeHTMLCode, преобразую- щую строки в формат, в котором их можно вывести в виде документа HTML. Кроме знаков тэга (< и >), я также решил отфильтровать из строк все коды возврата каретки/перевода строки и преобразовать их в тэги <br>, чтобы
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 341 выводить текст в окне браузера, не заключая его между тэгами <рге>...</рге>. К сожалению, в HTML символ пробела интерпретируется как «свободное место». Это значит, что несколько стоящих подряд пробелов вырезаются из HTML-кода и браузер показывает лишь один пробел. Я попытался преобра- зовать пробелы в строках в &nbsp;, но результат присутствия в HTML-файле нескольких &nbsp; подряд зависит от браузера. В Internet Explorer 5 несколь- ко стоящих один за другим пробелов рассматриваются как один. С учетом этого я решил ввести в функцию фильтра MakeHTMLCode второй параметр, управляющий параметрами фильтра. Его значение, равное 0, вынуждает фильтр преобразовывать все символьК и >, 1 задает обработку строки (как и значение О) и преобразование всех символов разрыва строки в тэги <br>, а 2 работает так же, как 1, но при этом вынуждает фильтр конвертировать пробелы в &nbsp;. Рис. 12-14. Текст выводится в окне браузера полужирным шрифтом. На этом этапе хотелось бы сделать несколько замечаний о замене фрагмен- тов строк по шаблону. Версия 5 VBScript и JScript поддерживает объект «регу- лярное выражение». На VBScript этот объект можно создать так: Set oReg = New RegExp Затем с помощью методов, таких как Replace, можно установить свойства этого объекта так, чтобы он выполнял преобразование фрагментов строки по заданному шаблону. Если нужно обработать все фрагменты строки, совпа- дающие с шаблоном, свойство Global надо установить в True-. oReg.Global = True Следующая команда делает поиск фрагментов, соответствующих шабло- ну, нечувствительным к регистру: oReg.IgnoreCase = True Эти операторы позволяют заменить в строке все символы <: oReg.Pattern = "<" txt = oReg.Replace(txt, "&lt;”)
342 ЧАСТЬ III Особые возможности сценариев В первой строке задается шаблон, а во второй метод Replace применяет- ся к строке txt. Подставляться будет строка 8dt;. Вот полный исходный текст: Sub MakeHTMLCode(txt, flag) ' Преобразовать текстовый файл в структуру HTML. ' Элементы, которые необходимо преобразовать, заданы флагом. Использовать следующие значения: ' 0: Преобразовать все символы < и > в &lt; и &gt;. ’ 1: Аналогично flag = 0, но также заменить vbCrLf на тзг <Ьг> ' (принудительный перенос строк). ' 2: Аналогично = 1, кроме того, заменить пробелы символами &nbsp;. ’ ### Соблюдайте осторожность, определяя порядок замены. ### Dim oReg Set oReg = New RegExp ' Создать регулярное выражение. oReg.Global = True ' Обрабатывать все совпадения. oReg.IgnoreCaee = True ’ Отключить чувствительность к ' регистру. ' Заменяем все < на &lt;. oReg.Pattern = "<" ' Задать шаблон, txt = oReg.Replace(txt, ”&lt;") ' Заменяем все ">" на "&gt;” oReg.Pattern = ”>" ' Задать шаблон. txt = oReg.Replace(txt, "&gt;") If flag > 0 Then ' Заменить vbCrLf? ' Теперь мы готовы к замене всех констант vbCrLf на <Ьг>. oReg.Pattern = vbCrLf ' Задать шаблон. oReg.Global = True ' Обработать все совпадения. txt = oReg.Replaoe(txt, ”<br>") End If If flag > 1 Then ’ Заменить пробелы? ' Теперь мы готовы к замене всех пробелов на &пЬвр;. oReg.Pattern = " “ ' Задать шаблон. oReg.Global - True ' Обработать все совпадения txt = oReg.Replace(txt, "&nbsp;") End If End Sub Функция MakeHTMLCode позволяет контролировать фильтрацию строки. В этом примере второй параметр установлен в О, что вынуждает фильтр пре- образовывать только символы < и >. Коды возврата каретки/перевода стро- ки останутся в строке. Поскольку текст в области документа внедрен между тэгами <рге>...</рге>, все пробелы останутся неизмененными. Вот полный исходный текст программы на языке VBScript (листинг 12-17): 'А*********************************************** Файл: ReadTxt.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 343 ’ Чтение содержимого текстового файла и вывод ’ его содержимого в диалоговом окне. В сценарии используется ' значение параметра "режим" по умолчанию. ’ ************************************************ Option Explicit Dim Text, Title Dim fso, objArgs ' Переменные-объекты, Dim txtstream ' Текстовый поток. Dim file ' Имя файла. file = "C:\Autoexec.bat" ' Тестовый файл no умолчанию. Попытаться получить имя файла из набора Arguments. Set objArgs = WScript.Arguments ' Создать объект. If objArgs.Count > 0 Then ’ Аргумент найден. file = objArgs(O) ' Установить имя файла равным ' значению первого аргумента. End If Text = "Content of " & file & vbCrLf & vbCrLf Title = "WSH sample - by G. Born" ' Создать объект FileSystemObject, чтобы получить доступ к файловой системе. Set fso = CreateObject("Soripting.FileSystemObject") ’ Проверить, существует ли файл. If feo.FileExists(file) Then Set txtStream = fso.OpenTextFile(file) ' Открыть текстовый файл. Do While Not (txtStream.atEndOfStream) Text = Text & txtStream.ReadLine & vbCrLf Loop Else ' Завершить. МвдВох "File & file & not found”, _ vbOKOnly + vbCritical, Title WScript.Quit 1 ' Завершить с кодом ошибки. End If If MsgBox("Show results in dialog box?", vbYesNo, Title) _ = vbYes Then ’ Вывести результат в диалоговом окне. MsgBox Text, vbOKOnly + vblnformation, Title Else ' Вывести результат в окне браузера. MakeHTMLCode Text, 0 ' Преобразовать текст в HTML (только символы < и >). ShowWindow Text, Title ' Вывести результат в окне HTML. End If Sub ShowWindow(txt, title) Dim oIE, doc1 ' Create Internet Explorer Application object. см. след. стр.
344 ЧАСТЬ III Особые возможности сценариев Set oIE = WScrlpt.CreateObject("InternetExplorer.Application") oIE.Navigate "about:blank" ’ Пустой документ HTML oIE.Visible = 1 ' Окно Internet Explorer видимо. oIE.ToolBar = 0 oIE.StatusBar = 0 ‘oIE.Width = 600 oIE.Height = 500 Do While (oIE.Busy): Loop ' Важно: ждать,пока Internet ’ Explorer не освободится. Set doc1 = oIE.Document ’ Получить объект Document. docl.open ' Открыть документ. ' Записать сценарий в объект Document. dod.wrlteln "<html><head><tltle>" & Title & "</tltlex/head>" dod.wrlteln "<body bgcolor=’#FAF0F0'xpre>" docl.wrlteln txt ’ Вывод текстовой информации dod.wrlteln "</pre></bodyx/html>" dod.close ' Закрыть документ для записи. End Sub Sub MakeHTMLCode(txt, flag) ' Преобразовать текстовый файл в структуру HTML. ' Элементы, которые необходимо заменить, заданы флагом. ' Использовать следующие значения: ' 0: Заменить все символы < и > символами &lt; и &gt;. ' 1: Аналогично flag = 0, но также заменить vbCrLf на тэг <br> (принудительный перенос строк). ‘ 2: Аналогично = 1, кроме того, заменить пробелы на &nbsp;. ' ### Соблюдайте осторожность, определяя порядок замены. ### Dim oReg Set oReg = New RegExp ' Создать регулярное выражение. oReg.Global = True ' Обработать все совпадения. oReg.IgnoreCase = True ' Отключить чувствительность ' к регистру. ' Заменить все < на &lt;. oReg.Pattern = ”<” ’ Задать шаблон. txt = oReg.Replace(txt, "&lt;") ' Заменить все ">" на "&gt;" oReg.Pattern = ">" ' Задать шаблон, txt = oReg.Replace(txt, ”&gt;") If flag > 0 Then ' Заменить vbCrLf?. ’ Теперь все готово для замены всех констант vbCrLf тэгами <br>. oReg.Pattern = vbCrLf ' Задать шаблон. oReg.Global = True ' Обработать все совпадения, txt = oReg.Replace(txt, "<br>”) End If
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 345 If flag > 1 Then ' Заменить пробелы? ' Теперь все готово для замены всех пробелов на &nbsp;. oReg.Pattern = ” " ' Задать шаблон. oReg.Global = True ' Обработать все совпадения txt = oReg.Replace(txt, ”&nbsp;") End If End Sub ’*** Конец Листинг 12-17. ReadTxt.vbs. Реализация на JScript Версия программы на JScript заменяет символы < и > на 8dt; и &gt; с помощью объекта «регулярное выражение» (листинг 12-18). Для метода языка JScript exchange, применяемого к объекту «текст», нужно задать два параметра. Пер- вый должен быть регулярным выражением (например, />/(§). Искомая стро- ка заключена между символами /; буква i в ig означает команду «игнорировать регистр», a g задает глобальную замену в объекте «строка» фрагментов, совпа- дающих с заданным шаблоном. Второй содержит заменяющую строку. // Файл: ReadTxt.js (Пример для WSH на JScript) // Автор: (с) G. Born // // Чтение содержимого текстового файла и вывод // его содержимого в диалоговом окне var vbYesNo = 4; var vbYes = 6; var vblnformation = 64; var vbOueetion = 32; var vbCancel = 2; var file = "C:\\Autoexec.bat”; var Title = "WSH sample - by G. Born"; // Попытаться получить имя файла из набора Arguments. var objArgs = WScript.Arguments; // Создать объект. if (objArgs.length > 0) // Аргумент найден. file = objArgs(O); // Установить имя файла равным значению первого // аргумента. var Text = "Content of " + file + "\n\n"; // Создать объект FileSystemObject, чтобы получить доступ к файловой системе, var fso = WScrlpt.CreateObject("Scripting.FileSystemObject"); см. след. стр.
346 ЧАСТЬ III Особые возможности сценариев // Проверить, существует ли файл. if (fso.FileExists(file)) { var txtStream = fso.OpenTextFile(file); // Открыть текстовый файл, while (ItxtStream.atEndOfStream) Text = Text + txtStream.ReadLine() + "\n“; } else { WScript.Echo(" File \”’ + file + ”\’ not found"); WScript.Quit(1); } var wsh = WScript.CreateObjectC’WScript.Shell"); if (wsh.Popup(’’Show results in dialog box?",0,Title, vbYesNo + vbQuestion) == vbYes) { WScript.Echo(Text); } else { Text = MakeHTMLCode(Text, 0); // Преобразовать текст в HTML ShowWindow(Text, Title); // (только < и >) в окне браузера. } // Вспомогательные функции function ShowWindow(txt, title) { И Создать объект Internet Explorer Application. var oIE = WScript. CreateObject(”InternetExplorer. Application’’); oIE.navigate("about:blank’’); // Пустой документ HTML. oIE.visible =1; // Окно Internet Explorer видимо. oIE.toolbar = 0; oIE.statusbar = 0; oIE.width=400; oIE.height=500; while (oIE.Busy) {} // Важно: ждать,пока Internet Ц Explorer не освободится. var doc1 = oIE.Document; // Получить объект Document. dod.open; // Открыть документ. // Записать сценарий в объект Document. doc1. writeln( ’’<html><head><title>’’); doc1.writeln(Title); doc1. writeln( ’’</title></head>"); doc1. w riteln( ’’ <body bgcolo r=\’ #FAFOFO\' ><pre>"); dod.writeln(txt); // Вывод текстовой информации, dod. writeln( ’’</pre></body></html>’’); dod.close; // Закрыть документ для записи.
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 347 function MakeHTMLCode(txt, flag) { И Преобразовать текстовый файл в структуру HTML. Ц Элементы, которые необходимо заменить, заданы флагом. Ц Использовать следующие значения: Ц 0: Заменить все символы < и > на символы &lt; и &gt;. И 1: Аналогично flag = 0, но, кроме этого, заменить vbCrLf на тэг <Ьг> Ц (принудительный перенос строк). И 2: Аналогично = 1, кроме того, заменить пробелы на &nbsp;. И tttttt Соблюдайте осторожность, определяя порядок замены. ### Ц Заменить все символы < на &lt; (с помощью регулярного выражения). txt = txt.replace(/</ig, "&lt;”); Ц Заменить все символы > на &gt;. txt = txt.replace(/>/ig, "&gt;"); if (flag > 0) // Заменить \n? txt = txt.replace(/\n/ig, "<br>"): if (flag >1) // Заменить пробелы? txt = txt.replace(/ /ig, "&nbsp;"); return txt; } //*** Конец Листинг 12-18. ReadTxtjs. Запись данных в текстовый файл Небольшая программа-пример, приведенная ниже, открывает файл Auto- exec.bat, копирует его содержимое в новый файл и добавляет к нему строку Set Bom=Hello. Эта строка заставляет Windows 95/98 во время следующего запуска системы создать переменную окружения Вот. ПРИМЕЧАНИЕ Чтобы сценарий работал в Windows NT/2000, нужно создать тестовый файл C:\Autoexec.bat, записав в него несколько строк текста. Чтобы получить доступ к текстовому файлу, нужен объект FileSystemObject. Файл должен быть открыт методом OpenTextFile. Как отмечено выше, режим доступа к файлу контролируют параметры этого метода. Следующий опера- тор открывает текстовый файл для записи (значение именованной констан- ты ForWriting надо установить в 2). Set txtStreamOut = fso.0penTextFile(file2, ForWriting, True)
348 ЧАСТЬ 111 Особые возможности сценариев Если третьему параметру присвоено значение True, то при отсутствии текстового файла будет создан новый файл. ПРИМЕЧАНИЕ VBScript не распознает константу ForWriting, поэтому необходимо или объявить ее в сценарии (если используются .vbs- или .js-файлы) или, используя .wsf-файл, определить ссылку на библиоте- ку типов (как это делается, я уже многократно показывал). В процессе записи (в режиме ForWriting) выходной файл построчно за- полняется с начала. Следующие операторы копируют содержимое текстово- го файла txtStream в файл txtStreamOut. После этого к выходному файлу до- бавляется новая строка. Do While Not (txtStream.atEndOfStream) Text = txtStream.ReadLine txtStreamOut.WriteLine Text Loop ' Добавить новую строку. txtStreamOut.WriteLine "Set Born=Hello” Копировать содержимое файла. Прочитать строку. Записать строку. Во время каждого обращения для записи метод WriteLine автоматически вставляет новую строку кода. Следующий сценарий читает файл Autoexec.bat, создает выходной файл Autoexecxxl, копирует в него содержимое Autoexecbat и добавляет к выход- ному файлу новый оператор (листинг 12-19). По окончании обработки со- общается, что файл создан (рис. 12-15). При многократном исполнении это- го сценария каждый раз будет создаваться один и тот же выходной файл, поскольку запись все время осуществляется поверх старого файла. Рис. 12-15. Диалоговое окно, которое выводится после копирования файла Autoexec.bat. ’ Файл: WriteTxt.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ’ Копирование содержимого текстового файла и ’ добавление к нему новой строки '******************************************* Option Explicit Const filel = "C:\Autoexec.bat” ' Текстовый файл. Const file2 = "C:\Autoexec.xx1" ' Выходной файл.
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 349 ’ Необходимо определить конотанту ForWriting, поскольку ' константы параметра "режим" неизвестны обработчику VBScript. Const ForWriting « 2 ' режим: доступ для записи Dim Text Dim fso ' Переменная-объект. Dim txtStream, txtStreamOut ' Объекты Textstream. ' Создать объект FileSystemObject, чтобы получить доступ к файловой системе. Set fso - CreateObjeot("Scripting.FileSystemObject") ' Проверить, существует ли файл. If feo.FileExists(filel) Then Set txtStream - fso.OpenTextFile(filel) ' Открыть входной файл. Set txtStreamOut feo.0penTextFile(file2, _ ForWriting, True) ' Открыть выходной файл. Do While Not (txtStream.atEndOfStream) ' Скопировать содержимое файла. Text = txtStream.ReadLine ’ Прочитать отроку. txtStreamOut.WriteLine Text ' Записать строку. Loop txtStreamOut.WriteLine "Set Born»Hello" ' Добавить отроку. Set txtStream - Nothing ' Освободить объекты. Set txtStreamOut » Nothing WScript.Echo "Text file " & filel & _ " copied and extended in “ & file2 Elee WScript.Echo "File " & file & " not found." End If Конец Листинг 12-19. WriteTxt.vbs. Реализация на JScript Структура программы на языке JScript (листинг 12-20) не отличается от VB- Script. Сценарий создает выходной текстовый файл Autoexec.xxl, копирует в него содержимое Autoexec.bat и добавляет к нему новую строку (рис. 12-16).
350 ЧАСТЬ III Особые возможности сценариев Autaenpc KII.L. _____________________________________________________________ ' >91'( HO OFF ““*“ _''-1 -mode con codepage prepar e-«85O) c:\w1ndows\COMMAND\ega.cp1) ’ *** mode con codepage select-850 ikeyb qr,, c:\w1ndows\coMMANO\keyboard.sys REM [Header] ;REM (CD-ROM Drive] REM [Miscellaneous] ; REM (Display) :rem (Mouse] : LH C:\WINDOWS\A5P4DO5.COM ! SET BLASTER-A240 12 01 T4 rem set path-%path%; c:\wiNDOw5\Twa1n_32\scanw12;c:\wiND0wS\Twa1n\scanw1z 5 set PATH-c:\wiMDOws;c:\wiNDOws\Co<wtiand; I set Born-Hello ; ....... . ... ...................... ....... ................... ,. a Рис. 12-16. Вид содержимого файла Autoexec.хх1 в Блокноте. //************************************************** // Файл: Wri.teTxt.jB (Пример для WSH на JScrlpt) Ц Автор: (с) G. Born И Ц Копирование содержимого текстового файла // и добавление к нему новой отроки //••••••..................****..........*........... var filel = "С:\\Autoexec.bat"; var flle2 = "C:\\Autoexec.xxT'; var ForWriting = 2; var Text; // Входной файл. // Выходной файл. И режим: доступ для записи И Создать объект FileSystemObject, чтобы получить доступ к файловой системе, var fso = WScrlpt.CreateObject("Scripting.FileSystemObject"); if (fso.FileExiBtB(filel)) // Проверить, существует ли файл. { var txtStream = fBo.OpenTextFile(filel); // Открыть входной файл. var txtStreamOut = fso.0penTextFlle(file2, ForWriting, true); // Открыть выходной файл. while (ItxtStream.atEndOfStream) // Скопировать содержимое файла. { Text = txtStream.ReadLine(); // Прочитать строку. txtStreamOut.WrlteLine(Text); // Записать строку. > txtStreamOut.WriteLineC'Set Born=Hello“); // Добавить строку. WScrlpt.Echo("Text file ” + filel + " copied and extended in ” + file2); > else WScrlpt.Echo("File " + file + " not found.");
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 351 //*** Конец Листинг 12-20. WriteTxtjs. Добавление нового текста в существующий файл Возможно, у вас появится желание добавить данные в текстовый файл при обработке файлов журнала и в некоторых других ситуациях. Метод WriteLine, поддерживаемый объектом FileSystemObject, позволяет добавлять новый текст к существующему текстовому файлу. В отличие от предыдущего примера надо установить второй параметр в режим добавления данных. Следующий оператор заставляет дописывать все новые данные к концу текстового фай- ла. (При использовании .vbs- или .js-файла именованной константе For- Append надо присвоить значение 8. В противном случае необходимо через .wsf-файла определить ссылку на библиотеку типов, как показано ниже.) Set txtStream = fso.0penTextFile(file2, ForAppend, True) При отсутствии выходного текстового файла третий параметр, равный True, заставляет метод создать новый файл. Показанная ниже программа (листинг 12-21) открывает файл C:\Auto- exec.xxl и добавляет в него текстовую строку Set Bom=Hello [файл C:\Auto- exec.xxl создается сценарием WriteTxt.vbs (листинг 12-19)]. При многократ- ном исполнении этого сценария в существующий файл каждый раз добав- ляется новая строка. <?xml vereion="1.0" encodin0="ISO-8859-1"?> <l- File: WriteTxtl.wsf (WSH 2) Author: (c) G. Born Добавление строки в текстовый файл с помощью ссылки на библиотеку типов FileSystemObjeot -> <job id="WriteTxt1"> Creference guid='{420B2830-E718-11CF-893D-00A0C9054228}'/> <Bcript language="VBSoript"> <I[CDATA[ Option Explicit Const filel = "C:\Autoexec.xx1" '••• Const ForAppending = 8 ' Получена из библиотеки типов. Dim Text см. след. стр.
352 ЧАСТЬ 111 Особые возможности сценариев Dim fso ' Переменная-объект. Dim txtStream ' Текстовый поток. ' Создать объект FileSystemObject, чтобы получить доступ к файловой ‘ сиотеме. Set fso = CreateObject("Scripting.FileSystemObject") If fso.FileExiste(filel) Then ' Проверить, существует ли файл. Set txtStream = _ fso.0penTextFile(file1, ForAppending) ' Выходной файл. txtStream.WriteLine "Set Born=Hello" ’ Добавить строку. Set txtStream = Nothing ‘ Освободить объект. WScript.Echo "Text file " & filel & ” extended." El ве WScript.Echo "File " & filel & " not found." End If '*** Конец ]]> </soript> </job> Листинг 12-21. WriteTxfl.wsf. Реализация на JScript В сценарии, реализованном на JScript, используется простой .js-файл, поэто- му константе ForAppending в сценарии должно быть присвоено значение 8 (листинг 12-22). Однако с помощью кода из предыдущей прораммы можно без труда заменить часть, написанную на VBScript, соответствующим кодом на JScript из этого листинга и импортировать именованную константу ForAp- pending из библиотеки типов FileSystemObject. И................................................. // Файл: WriteTxtl.js (Пример для WSH на JScrlpt) Ц Автор: (с) G. Born И И Добавление строки к текстовому файлу И................................................. var filel = "C:\\Autoexec.xx1"; var ForAppending =8; // Режим записи. var Text = "Set Born=Hello"; // Создать объект FileSyetemObjeot, чтобы получить доступ к файловой системе, var fso = WScript.CreateObject("Scripting.FileSystemObject"); if (fBO.FileExists(filei)) // Проверить, существует ли файл.
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 353 { var txtStream = fso.0penTextFile(file1, ForAppending, true); // Выходной файл. txtStream.WriteLine(Text); // Добавить строку. WScrlpt.Echo("Text file " + filel + " extended."); ) elee WScrlpt.Echo("File " + file + " not found."); //**• Конец Листинг 12-22. WriteTxtl.js. Замена текста в файле Следующая программа-пример, представляющая собой сочетание методик, известных вам из предыдущих разделов, читает данные из входного файла, ищет фрагменты, совпадающие с шаблоном, заменяет их заданной строкой и записывает результат в другой файл. Программа-пример читает файл Test- Fiie.txt (который должен быть в той же папке, что и файл сценария) и заме- няет все символы «’» на ♦//*». Результат записывается во второй файл. Все, что для этого нужно, — объединить фрагменты примеров, приведен- ных выше. Оператор в следующей строке позволяет получить путь к файлу сценария: path = GetPath Функция GetPath состоит из таких операторов: Function GetPath ' Получить путь к сценарию. Dim path path = WScrlpt.ScriptFullName ' Имя сценария. GetPath = Left(path, InStrRev(path, "\")) End Function Получив путь, можно открыть входной файл и создать выходной такой последовательностью команд: Set fBO = CreateObject("Scripting.FileSyetemObject") If Not fso.FileExists(fileln) Then WScrlpt.Quit 1 Set oFileln = fso.OpenTextFile(path & "TeetFile.txt") Set oFileOut = feo.OpenTextFile(path & "TeetFile1.txt", _ ForWriting, True) В первой строке создается экземпляр объекта FileSystemObject. Во второй выполняется проверка существования файла. Если файл существует, его от- кроет метод OpenTextFile в третьей строке. Поскольку нужен лишь доступ к файлу для чтения, в качестве параметра передается только имя файла. Пос-
354 ЧАСТЬ III Особые возможности сценариев ледний оператор открывает выходной файл. Значение второго параметра метода OpenTextFile равно ForWriting, что позволяет записывать в файл. Обработку входного файла и замену фрагментов, совпадающих с шабло- ном, заданным текстом, осуществляет последовательность команд: Do While Not (oFileln.atEndOfStream) Text = oFileln.Headline ’ Прочитать строку. Text = Filter(Text, pattern, replacement) oFileOut.WriteLine Text ' Записать строку. Loop Если метод входного файла atEndOfStream возвращает True, цикл Do While завершается. Если файл пуст, этот метод сразу возвращает True, и цикл бу- дет пропущен. В противном случае atEndOfStream возвращает True только после того, как метод ReadLine прочитает последнюю строку файла. Второй оператор в цикле вызывает пользовательскую функцию Filter, у которой три параметра: первый содержит подлежащую обработке строку, второй задает шаблон для поиска, а третий — заменяющий текст. В примере параметры pattern и replacement заданы как константы. Последняя строка в теле цикла просто записывает текст, который вернула функция Filter, в выходной файл. Код, выполняющий замену, помещен в Filter. Аналогичный подход исполь- зован выше в примере ReadTxt.vbs, поэтому большая часть кода этого при- мера взята оттуда. t Function Filter(txt, exprl, expr2) ' Заменяет в тексте exprl на ехрг2. Dim oReg Set oReg = New RegExp oReg.Global = True oReg.IgnoreCaee = True ' Создать регулярное выражение. ' Обработать все совпадения. ’ Отключить чувствительность к регистру. ' Заменить все фрагменты exprl на ехрг2 oReg.Pattern exprl ' Задать шаблон. Filter = oReg.Replace(txt, expr2) End Function Эта функция создает объект «регулярное выражение» oReg. Далее свойства этого объекта устанавливаются так, чтобы заставить его выполнять глобаль- ную замену. Метод Replace гарантирует, что все фрагменты, заданные пара- метром exprl, будут заменены строкой, заданной ехрг2. Вот программа полностью (листинг 12-23). Файл: ReplaceTxt.vbe (Пример для WSH на VBScript) Автор: (с) G. Born Чтение файла, замена фрагмента по шаблону и запись результата в другой файл
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 355 Option Explicit ' Необходимо определить константу ForWriting, поскольку ' константы параметра "режим" неизвестны обработчику VBScript. Const ForWriting = 2 ' Режим: доступ для записи. Const inF = "TestFile.txt” Const outF = "TestFile1.txt" ’ Определение строк для замены. Const pattern = ... Const replacement = "//#" Dim Text Dim fso ' Переменная-объект. Dim oFileln, oFileOut ' Текстовый поток. Dim path, filein, fileOut path = GetPathO ' Получить текущий путь к сценарию, filein = path & inF ' Создать имена файлов. fileOut = path & outF ' Создать объект FileSystemObject, чтобы получить доступ к файловой системе. Set fso = CreateObject("Scripting.FileSystemObject") If Not feo.FileExistB(fileln) Then ’ Существует ли входной файл? WScript.Echo "File & filein & "’ not found” WScrlpt.Quit 1 End If ' Входной файл существует; открыть его и ооздать выходной файл. Set oFileln = fso.OpenTextFile(fileln) ' Открыть входной файл. Set oFileOut = fso.OpenTextFile(fileOut, _ ForWriting, True) ' Открыть выходной файл. Do While Not (oFileln.atEndOfSt ream) Text = oFileln.ReadLine ' Прочитать строку. Text = FilterCText, pattern, replacement) oFileOut.WriteLine Text ' Записать текот. Loop WScript.Echo "Text file: " & filein & vbCrLf & _ "Written into: " & fileOut Function GetPath ' Получить путь к сценарию. Dim path path = WScrlpt.ScriptFullName ' Имя сценария. см. след. стр.
356 ЧАСТЬ III Особые возможности сценариев GetPath = Left(path, InStrRev(path, "\”)) End Function Function Filter(txt, exprl, expr2) ' Заменить в тексте exprl на expr2. Dim oReg Set oReg = New RegExp oReg.Global = True oReg.IgnoreCase = True ' Создать регулярное выражение. ’ Обработать все совпадения. ' Отключить чувствительность к регистру. ’ Заменить все фрагменты exprl на ехрг2. oReg.Pattern = exprl ' Задать шаблон. Filter = oReg.Replace(txt, expr2) End Function ’*** Конец Листинг 12-23. WriteTxtl js. ПРИМЕЧАНИЕ Можно по-разному расширять функциональность про- граммы ReplaceTxtvbs. Например, можно изменить ее так, чтобы она позволяла задать шаблон поиска, заменяющий текст, а также одно или несколько имен файлов. В результате эта программа сможет заменить одну заданную строку на другую в группе из нескольких файлов. Использование диалогового окна выбора папки Для интерактивной работы с файлами и папками нужно, чтобы пользователь мог задавать имена пути и папки в период выполнения. В приведенных выше примерах с помощью функции InputBox или метода WSHInputBox было реа- лизовано диалоговое окно ввода. Но как реализовать в сценарии WSH диа- логовое окно выбора файла? Рассмотрим два похода. Выбор папок методом BrowseForFolder Путь к папке можно задать в диалоговом окне, предоставленном Windows (рис. 12-17). В нем пользователь выбирает диск и папку. Это диалоговое окно можно вызывать в сценариях WSH. ПРИМЕЧАНИЕ Поддержку диалогового окна осуществляет функция из библиотеки Shdocvw.dll, которая входит в состав Internet Explorer версий 4 и 5. Также понадобится библиотека Shell32.dll версии 4-71 и выше, доступная в Windows 98 (версия 4.72) и Windows 2000 (версия 5). В Windows 95/NT 4 библиотека Shell32.dll версии 4.71 доступна, если установлен Internet Explorer 4 с обновлением Active Desktop. При ус- тановке Internet Explorer 5 в Windows 95/NT обновления Shell32.dll не
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 357 происходит. Следует сначала установить Internet Explorer 4 с обновле- нием Active Desktop, а затем уже Internet Explorer 5. Рис. 12-17. Диалоговое окно выбора папки. Чтобы сделать доступными методы объекта Application Explorer 4 или 5, нужно создать на него ссылку: Set objOlg = WScrlpt.CreateObject!"Shell.Application”) Затем можно использовать методы и субобъекты объекта Application. Метод BrowseForFolder вызывает окно выбора папки (рис. 12-17): Set objF = objOlg.BrowBeForFolder(hWnd, Title, Options!, Root]) Этот метод возвращает ссылку на объект из пространства имен оболоч- ки Windows (которое отличается от объекта FileSystemObject). Параметры этого метода документированы плохо, но мне удалось кое-что узнать. Первый параметр передает диалоговому окну описатель окна, он всегда должен быть равен 0, поскольку у сценария нет описателя. Второй параметр задает строку, которая выводится в диалоговом окне ниже заголовка (рис. 12-17). Третий параметр представляет собой 32-разрядный флаг, который зада- ет внутренние свойства диалогового окна. Список констант этого мето- да см. ниже (табл. 12-4). Некоторые константы можно комбинировать (например, &Н0010 и &Н0001). Четвертый (необязательный) параметр позволяет заранее выбрать пап- ку в диалоговом окне. Путь к папке может быть задан в виде строки (на- пример, C:\Borri) или с помощью одного из значений, приведенных ниже (табл. 12-5), которые позволяют выбрать специальную папку в простран- стве имен оболочки.
358 ЧАСТЬ III Особые возможности сценариев Табл. 12-4. Константы для третьего параметра метода BrowseForFolder* Константа Описание &Н0001 Можно выбирать лишь папки файловой системы. Если этот разряд установлен, то при выборе папки, не принадлежащей к файловой сис- теме (например, Control Panel), кнопка ОК будет недоступна. &Н0002 Во время поиска компьютера пользователю запрещено просматривать папки ниже этого домена в пределах сети. &Н0004 Под диалоговым окном появляется область для вывода сведений о со- стоянии (однако я не смог найти способ вывода состояния). &Н0008 Возвращает только каталоги, расположенные в иерархии файловой системы выше данного. &Н0010 Выводит в диалоговом окне поле ввода, в котором пользователь может задать имя элемента. &Н0020 &Н1000 Проверяет имя, набранное в поле ввода. Позволяет пользователю просматривать сетевую ветвь пространства имен оболочки в поисках компьютеров. &Н2000 Позволяет пользователю просматривать сетевую ветвь пространства имен оболочки в поисках принтеров. &Н4000 Позволяет искать любые элементы. • Значения документированы в файле Shlobj.h из Platform SDK. Табл. 12-5. Константы для четвертого параметра метода BrowseForFolder. Константа Описание 0 Корневым каталогом является (виртуальная) папка Desktop. При ис- пользовании этой константы с &.Н0001 для третьего параметра возни- кают проблемы с кнопкой ОК. • 1 2 3 Корневым каталогом является Internet Explorer. Корневым каталогом является папка Programs из меню Start. Корневым каталогом является папка Control Panel. У третьего парамет- ра должно быть значение &.Н4000 (поиск любых элементов). 4 Корневым каталогом является папка Printers. У третьего параметра должно быть значение &.Н4000 (поиск любых элементов). 5 6 7 Корневым каталогом является папка Documents из меню Start. Корневым каталогом является папка Favorites из меню Start. Корневым каталогом является папка Startup из меню Start. У третьего параметра должно быть значение &Н4000 (поиск любых элементов). 8 . Корневым каталогом является папка Recent. У третьего параметра должно быть значение &Н4000 (поиск любых элементов). 9 Корневым каталогом является папка SendTo. У третьего параметра должно быть значение &.Н4000 (поиск любых элементов). 10 Корневым каталогом является папка Recycle Bin. У третьего параметра должно быть значение &Н4000 (поиск любых элементов). И 16 17 Корневым каталогом является папка меню Start Корневым каталогом является (физическая) папка Desktop. Корневым каталогом является папка Му Computer.
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 359 Табл. 12-5. (продолжение) Константа Описание 18 19 20 21 Корневым каталогом является папка Network Neighborhood. Корневым каталогом является папка Nethood. Корневым каталогом является папка Fonts. Корневым каталогом является папка Templates. ПРИМЕЧАНИЕ Несмотря на свою мощь, метод BrowseForFolder потен- циально опасен, так как позволяет получать объекты из пространства имен оболочки. Изменение этих объектов в сценарии может стать причиной множества сбоев. Но использование метода лишь для про- смотра системных папок ничем не грозит. В следующем примере всего три параметра. Значение третьего равно &Н0010 (показывать поле ввода) + &F10001 (выбирать только объекты фай- ловой системы). Если пользователь, выбрав папку, закрывает диалоговое окно кнопкой ОК, метод возвращает имя выбранной папки. Щелкнул ли пользователь кнопку Cancel Как узнать, что пользователь щелкнул кнопку Cancel? Поскольку метод BroivseForFolder возвращает ссылку на объект из пространства имен оболочки, это нельзя сделать командой: If objF <> - Then Если пользователь щелкнул кнопку Cancel, метод не возвращает ничего. При обращении к переменной-объекту с результатом возни- кает ошибка периода выполнения — ведь ее значение не определено. Этот тест не будет работать, так как он всегда будет говорить о на- жатии кнопки Cancel. If objF Is Nothing Then А этот тест всегда будет возвращать True-. If IsObject(objF) Then Поэтому я реализовал пользовательскую функцию IsValue, которая проверяет, вернул ли метод какое-либо значение: Function IsValue(obj) ' Проверить, вернул ли метод какое-либо значение. Dim tmp On Error Resume Next tmp = ” " & obj If Err <> 0 Then IsValue = False Else см. след. стр.
360 ЧАСТЬ III Особые возможности сценариев IsValue = True End If On Error GoTo 0 End Function Если окно было закрыто кнопкой Cancel, значение переменной obj будет равно Nothing. В этом случае команда tmp = “ “ & obj вызовет ошибку периода выполнения, которую можно обнаружить с помощью значения объекта Err. В телеконференции по WSH я нашел еще один вариант решения: с помощью TypeName(objF). Если в результате проверки получается строка «Folder», переменная-объект содержит действительное имя пап- ки. К сожалению, строка, которую возвращает метод, зависит от ОС. Windows 95/98/NT возвращают строку «Folder», но Windows 2000 — строку «Folder2». Поэтому, чтобы определить, была ли нажата кнопка Cancel, нужно сравнить строки. Следующая программа вызывает диалоговое окно Browse For Folder (ли- стинг 12-24). Когда пользователь закроет его, сценарий с помощью методов, описанных в этом разделе, определяет, какую кнопку щелкнул пользователь (ОК или Cancel). Поэтому выводятся два диалоговых окна с результатами. Заметьте: этот пример не возвращает полный путь к выбранному объекту (в следующем примере будет использована функция BrowseForFolder, кото- рая возвращает полный путь к объекту). Файл: Dialog.vbs (Пример для WSH на VBScript) Автор: (с) G. Born ' Выбор папки с помощью диалогового окна оболочки '************************************************ Option Explicit ' Флаги для параметров. Const BIF_returnonlyfedirs = 4H0001 Const BIF_dontgobelowdomain = 4H0002 Const BIF_etatUBtext = 4H0004 Const BIF_returnfsanceetors = 4H0008 Const BIF_editbox = 4H0010 Const BIF_validate = 4H0020 Const BIF_browseforcomputer • 4НЮ00 Const BIF_browseforprinter 4H2000 Const BIF_browseinoludefiles = 4H4000 Dim wsh, objDig, objF ' Получить объект Application оболочки Windows. Set objOlg = WScrlpt.CreateObject("Shell.Application")
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 361 ’ Использовать метод BrowseForFolder. ' Например: Set objF = objDlg.BrowBeForFolder _ (&Н0, "Select the folder to copy", iH10, "C:\Born") Set objF = objDlg.BrowseForFolder (&H0, "Select the folder to copy", _ BIF_editbox + BIF_returnonlyfsdirs) ' Здесь определяется результат с помощью первой методики. If iBValue(objF) Then МвдВох "Selected folder: " & objF.Title Else MsgBox "Canceled” End If ' Здесь результат определяется с помощью TypeName. If InStr(1, TypeName(objF), "Folder") > 0 Then MsgBox "Selected folder: ” & objF.Title Else MsgBox "Canceled" End If Function IsValue(obj) ' Проверить, вернул ли метод какое-либо значение. Dim tmp On Error Resume Next tmp = •'•'& obj If Err <> 0 Then IsValue = False Else IsValue = True End If On Error GoTo 0 End Function ’*** Конец Листинг 12-24. Dialog.vbs. СОВЕТ Файл Shdocvw.dll содержит и другие объекты, свойства и мето- ды для доступа к оболочке Windows (о доступе к оболочке Windows см. главу 14). Их описания см. по адресу http://msdn.microsoft.com/library/ default.asp. Изучить методы позволяет и программа Object Browser из Microsoft Script Editor, или Microsoft Visual Basic Editor (который дос- тупен из любого приложения пакета Microsoft Office), или Microsoft Visual Basic 5 Control Creation Edition (ССЕ), если вы определите ссыл- ку на эту библиотеку (подробнее об этом см. Advanced Development with Microsoft Windows Script Host 2.0).
362 ЧАСТЬ III Особые возможности сценариев Выбор файлов методом BrowseForFolder Приведенная выше программа не поддерживает полный путь к данному объекту. Если пользователь выбирает диск, то одновременно с буквой диска возвращается имя тома. Она также не позволяет выбирать в диалоговом окне Browse For Folder файлы. Давайте расширим ее возможности. Значение &.Н4000 (константа BIF_browseincludefiles~) разрешает выбирать файлы методом BrowseForFolder. Следующая команда вызывает диалоговое окно Browse For Folder, в котором файлы будут доступны для выбора: Set oltem = WshShell.ВrowseForFolder( &Н0, "Select a file or folder to copy”, BIF.returnonlyfsdirs + BIF.browseincludefiles, "C:\") Необходимо определить константу BIF browseincludefiles, а переменная WshShell должна быть допустимой переменной-объектом, указывающей на объект WshShell. Метод возвращает объект, который присваивается перемен- ной oltem. Эта переменная-объект не содержит пути к папке, поэтому нужно сделать что-то еще, чтобы получить полный путь и имя выбранного объекта. Это можно сделать командой: name = oltem.ParentFolder.ParseName(oItem.Title).Path Здесь метод ParentFolder применяется к объекту. Этот метод возвращает объект, представляющий родительскую папку. После этого метод ParseName выбирает элемент из набора. Этот метод получает имя выбранного объекта, которое возвращает свойство oltem.Title. Свойство Path объекта содержит полный путь, включая имя. Теперь все готово (не считая обработки ошибок, которая опущена). К со- жалению, если пользователь закроет окно кнопкой Cancel, показанный выше оператор не вернет ни пути, ни имени объекта, и возникнет ошибка перио- да выполнения (с кодом 402). Кроме того, при выборе файла из корневого каталога диска в Windows 2000 метод BrowseForFolder вызывает ошибку пе- риода выполнения (с кодом 5). К тому же, если пользователь выбирает диск, нужно извлечь букву диска из имени тома. Для простоты я переместил весь код в пользовательскую функцию Brow- seForFolder. Ее вызывает оператор: tmp = BrowseForFolder(Title, flags, dir) Параметр Title передает функции текст, который выводится в диалоговом окне. Параметрflags задает код поиска файлов и папок (табл. 12-4). Параметр dir представляет собой строку, в которой находится путь, выбранный в диа- логовом окне. Если передается пустая строка (“”), предварительно выбран- ной становится папка Му Computer. Эта функция возвращает строку, в которой находится путь к объекту'. Если строка содержит значение «-/», пользователь нажал кнопку Cancel. Значение «-5» свидетельствует о том, что пользователь выбрал файл в корневой пап-
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 363 ке, что не допускается в Windows 2000. Следующий код позволяет опреде- лить, допустимо ли имя, возвращенное функцией: file = BrowseForFolder(Title, flags, dir) If file = “-5" Then WScrlpt.Echo "Not possible to select files in root folder" Else If file = "-1” Then WScrlpt.Echo "No object selected; Cancel clicked” Else WScrlpt.Echo "Object: ", file End If End If Вот небольшая программа на VBScript, которая вызывает диалоговое окно Browse For Folder и дает пользователю возможность выбрать файл или пап- ку (листинг 12-25). Результат выводится в диалоговом окне (рис. 12-18). Рис. 12-18. Выбор файла в диалоговом окне Browse For Folder. ' Файл: FileSelectDialog.vbs (Пример для WSH на VBScript) Автор: (с) G. Born ’ Выбор файла или папки ’ в диалоговом окне оболочки ’ Предупреждение: Если пользователь выбирает файл в корневом ’ каталоге диска при исполнении сценария ’ в Windows 2000, возникает ошибка периода выполнения. Option Explicit ’ Флаги для параметров. Const BIF_returnonlyfsdirs = &Н0001 см. след. стр.
364 ЧАСТЬ III Особые возможности сценариев Const BIF_dontgobelowdomain Const BIF_statustext Const BIF_returnfsancestors = &H0002 = &H0004 = &H0008 Const BIF_editbox = &H0010 Const BIF_validate = &H0020 Const BIF_browseforcomputer = &H1000 Const BIF_browseforprinter = &H2000 Const BIF_browseincludefiles = &H4000 Dim file file = BrowseForFolder( "Select a file or folder to copy", BIF_returnonlyfedirs + BIF_browseincludefiles, If file = "-5" Then WScript.Echo "Not possible to select files in root folder" Else If file « "-1" Then WScript.Echo "No object selected; Cancel clicked" Else WScript.Echo "Object: ", file End If End If ' Получение полного пути К выбранному объекту ’ методом оболочки BrowseForFolder. ' title = текст, который выводится в диалоговом окне. ' flag - одно из значений, упрзвляющих поведением метода BrowseForFolder. ' dir = Предварительно выбранный каталог (can be ""). Function BrowseForFolder(title, flag, dir) On Error Resume Next Dim oShell, oltem, tmp ' Создать объект WshShell. Set oShell = WScrlpt.CreateObject("Shell.Application") ' Взывать диалоговое окно Browse For Folder. Set oltem = oShell.ВrowseForFolder(4H0, title, flag, dir) If Err.Number <> 0 Then If Err.Number = 5 Then BrowseForFolder» "-5" Err. Clear Set oShell = Nothing Set oltem = Nothing Exit Function End If
ГЛАВА 12 Использование файловой системы и команд ввода-вывода 365 End If ' Теперь попытвемся получить полный путь. BrowseForFolder = oltem.ParentFolder.ParseName(oItem.Title).Path ' Обработка нажатия кнопки Cancel и выбора диска. If Erro 0 Then If Err.Number = 424 Then ' Обработать кнопку Cancel. BrowseForFolder = "-1" Else Err.Clear ' Обработать ситуацию, в которой пользователь выбирает диск. ' Извлечь из названия элемента букву диске - сначала ' найти двоеточие (:). tmp = InStr(1, oltem.Title, If tmp > 0 Then ' Символ “ найден; взять два ' символа и добавить \. BrowseForFolder = _ Mid(oltem.Title, (tmp - 1), 2) & "\" End If End If End If Set oShell = Nothing Set oltem = Nothing On Error GoTo 0 End Function '*** Конец Листинг 12-25. FileSelectDialog.vbs. ПРИМЕЧАНИЕ На тех машинах, где установлена Windows 2000 или Windows 98, метод BrowseForFolder не смог вернуть допустимые име- на файлов при первой попытке обращения к папке. При этом был по- казан код ошибки, свидетельствующий об отсутствии выбранного файла. После установки на эти машины Microsoft Office ошибка исчез- ла и больше не появлялась.
ГЛАВА 1 3 Управление окнами и приложениями из сценариев WSH 2 предлагает несколько интересных новшеств для управления сцена- риями-. приостановка сценария, имитация последовательности нажатия кла- виш и переключение между приложениями. Вы узнаете, как эти методы по- зволяют автоматизировать часто встречающиеся задачи и настроить среду Windows при входе в систему. Кроме того, вы научитесь добавлять сценарий входа для Windows 2000 и познакомитесь с новыми средствами Windows 2000, позволяющими выполнять сценарий при запуске и завершении систе- мы, а также при входе и выходе пользователя из системы. Задержка выполнения сценария Приостановить или задержать выполнение сценария позволяет метод Sleep, известный нам по предыдущим главам. Снижение нагрузки на процессор методом Sleep Иногда требуется синхронизировать сценарий с другим процессом. Так, в главе 11 мы рассмотрели ситуацию, когда при входе в доменную сеть сце- нарий регистрации в Windows 98 пытается прочитать свойство UserName. Если свойство возвращает пустое значение, сценарий ждет, когда оно ста- нет непустым: Set WshNetwork = WScrlpt.CreateObjectC'WScript.Network") User = WshNetwork.UserName ' Инициализируем значение. Do While User = "" ’ Цикл, пока не получено имя пользователя. WScrlpt.Sleep 200 ' Пауза для снижения нагрузки на процессор. User = WshNetwork.UserName ’ Считываем свойство. Loop Сценарий опрашивает в цикле свойство WsbNetworkUserName, пока его зна- чение остается пустым. Такая методика применена в главе 9, когда сценарий ждал, чтобы пользователь подтвердил ввод в форму Microsoft Internet Explorer, щелкнув кнопку ОК. Там для опроса состояния формы мы сделали так: Do ' Ожидаем нажатия кнопки ОК. WScrlpt.Sleep 200 ' Приостанавливаем сценарий на 200 миллисекунд. Loop While (oIE. Document. Script. CheckValQ = 0)
ГЛАВА 13 Управление окнами и приложениями из сценариев 367 Третий оператор VBScript вызывает метод CheckVal, опрашивающий внут- реннее состояние формы Internet Explorer. Если пользователь щелкнет на форме кнопку OK, CheckVal возвращает 1, и цикл завершается. У подобного опроса один минус: он может загрузить процессор на все 100%. Поэтому в цикл добавлен оператор-. WScrlpt.Sleep 200 ' Приостанавливаем сценарий на 200 миллисекунд. Этот оператор вызывает метод Sleep объекта WScrlpt. В параметре, пере- даваемом методу, задается приостановка выполнения сценария в миллисе- кундах, в течение которой сценарий не занимает процессор. Взгляните на последствия применения метода Sleep внутри цикла опро- са. На вкладке Performance в Task Manager Windows 2000 представлена хро- нология загрузки процессора двумя сценариями (из примера Form); выпол- нение цикла Do While без оператора WScriptSleep доводит загрузку процес- сора до 100% (рис. 13-1, слева). Там же показана загрузка процессора сцена- рием, применяющим оператор WScriptSleep (рис. 13-1, справа). Усовершен- ствованный сценарий уже не так сильно обременяет процессор. Небольшой всплеск нагрузки в начале этого периода вызван щелчками мышью при за- пуске сценария и загрузке формы в Internet Explorer, а также циклом в сце- нарии, опрашивающем oIEBusy при загрузке браузером формы. Без Sleep Вызов Sleep Рис. 13-1. Загрузка процессора во время опроса. ПРИМЕЧАНИЕ Хронологию загрузки процессора в Microsoft Windows NT/2000 позволяет наблюдать Task Manager (Диспетчер задач). В Win-
368 ЧАСТЬ III Особые возможности сценвриев dows 95/98 для этого служит System Monitor (Системный монитор) (он доступен и в Windows NT/2000). Приостановка как способ решения проблемы асинхронных процессов Теперь посмотрим, как метод Sleep помогает решить проблему асинхронных процессов. Я столкнулся с ней, используя метод SendKeys (представленный ниже). Допустим, сценарий запускает два внешних приложения, Calculator и Notepad, и выводит диалоговое окно для взаимодействия с пользователем: oShell.Run "Calc.exe”,1 ' Запускаем Calculator. oShell.Run "Notepad.exe”, 1 ’ Запускаем Notepad. WScript.Echo "Have applications been launched?” Как вы думаете, какое окно будет выведено сначала, а какое окажется на переднем плане? Казалось бы, первым должен появиться Calculator, окно которого затем перекроется окном Notepad, а на переднем плане будет окно Echo. Однако на моей машине окна Calculator и Echo оказались закрыты ок- ном Notepad. И окно Echo обнаруживается только на панели задач. Это результат особенности обработки этих приложений в Windows. Сце- нарий направляет оболочке два вызова Run и переходит к выполнению сле- дующей инструкции. В итоге окно Echo появится прежде, чем Windows за- пустит внешние приложения. Кроме того, порядок появления окон зависит от времени, необходимого для запуска конкретного приложения. ПРИМЕЧАНИЕ В MsgBox или в Popup можно использовать константу vbSystemModal, обеспечивающую отображение диалогового окна на переднем плане. Но эта константа не работает с методом Echo. Чтобы установить порядок выведения окон на передний план, нужно пос- ледовательно открывать окна приложений, предусмотрев в сценарии ожи- дание появлений этих окон. Обычно этого можно добиться, добавив неболь- шую паузу после обращения к методу Run-. oShell.Run "Calc.exe", 1 ' Запускаем Calculator. WScript.Sleep 500 ' Ожидаем 0.5 секунды. oShell.Run "NotePad.exe”, 1 ' Запускаем Notepad. WScript.Sleep 500 ' Ожидаем 0.5 секунды. WScript.Echo "Please close all application windows" Вызов метода Sleep с параметром 500 переводит сценарий в состояние па- узы на 0,5 секунды перед обработкой очередной инструкции. В результате окна приложений и окно Echo будут появляться на экране в заданном поряд- ке. Такой механизм реализован в VBScript-программе (листинг 13-1), кото- рая последовательно запускает Calculator и Notepad, а затем отображает ди- алоговое окно. На втором шаге запускаются оба приложения и диалоговое окно с небольшой задержкой между операторами вызова.
ГЛАВА 13 Управление окнами и приложениями из сценариев 369 ' Файл: RunApps.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Запуск Calculator и Notepad с помощью метода Run '************************************************ Option Explicit Dim oShell ' Создаем объект WshShell. Set oShell = WScrlpt.CreateObjectC'WScript.Shell") oShell.Run "Calc.exe", 1 ' Запускаем Calculator, oShell.Run "NotePad.exe", 1 ' Запускаем Notepad. ' Приостанавливаем сценарий после запуска приложения. WScript.Echo "Second Attempt: Launch Notepad and Calculator" oShell.Run "Calc.exe", 1 ’ Запускаем Calculator. WScrlpt.Sleep 500 ' Ожидаем 0.5 секунды. oShell.Run "NotePad.exe", 1 ' Запускаем Notepad. WScrlpt.Sleep 500 ' Ожидаем 0.5 секунды. WScript.Echo "Please close all application windows" ’*** Конец Листинг 13-1. RunApps.vbs. Активизация приложения методом AppActivate Итак, метод Run объекта WshShell позволяет запустить внешние приложения. Кроме того, перенести приложение на передний план (т. е. активизировать его) может метод AppActivate. Рассмотрим сценарий, в котором запускаются два приложения. Окно одного получает фокус. Если щелкнуть другое приложение, фокус перейдет на него. Для управления окном из сценария WSH (скажем, путем пересылки в него данных через SendKeys} нужно, чтобы фокус находился именно на этом окне. Для метода AppActivate применяется такой синтаксис: obj.AppActivate title Переменная-объект obj содержит ссылку на объект WshShell, а в title — текст для заголовка окна уже запущенного приложения, которое нужно активизи- ровать. Следующая программа применяет метод AppActivate (листинг 13-2). Сценарий запускает Calculator и Notepad, а затем переносит фокус с одного окна на другое. Сценарий запрашивает у пользователя заголовок окна и пе- реводит фокус на окно, заголовок которого совпадает с введенным текстом.
370 ЧАСТЬ III Особые возможности сценариев Файл: AppActivateWSH2.vbs (Пример для WSH на VBScript) Автор: (с) G. Born ' Запуск Calculator и Notepad и переключение между ' приложениями методом AppActivate '****♦***********♦********************************' Option Explicit ' Описываем строки заголовков для окон приложений. ' Важно: Строки зависят от локализованных версий Windows. Const Edit_Title = "Untitled - Notepad" ' Заголовок окна. Const Calc_Title = "Calculator" ' Заголовок окна. Dim Wsh, win.title ' Создаем объект WshShell для вызова Run и AppActivate. Set Wsh = WScrlpt.CreateObjectC'WScript.Shell") ' Пробуем запустить оба приложения. Чтобы пооледнее приложение ' получило фокус, приостанавливаем сценарий. Wsh.Run “Calc.exe", 1 ' Запускаем Calculator. WScrlpt.Sleep 800 ' Приостановка позволяет передать фокус в Calculator. Wsh.Run "Notepad.exe", 1 ' Запускаем Notepad. WScrlpt.Sleep 800 ' Приостановка позволяет передать фокус в Notepad. WScrlpt.Echo "Click OK to set focue to the Calculator window" ' Переводим фокус обратно в окно Calculator. Wsh.AppActivate Calc_Title ' Устанавливаем фокус в окно Notepad. WScrlpt.Echo "Click OK to set the foous to Notepad" Wsh.AppActivate Edit_Title ' Запрашиваем у пользователя заголовок окна и ' устанавливаем фокус в это окно. win.title = InputBox ("Please enter the window title", _ "Авк for window title", Calc.Title) Wsh.AppActivate win.title Конец Листинг 13-2. AppActivateWSH2.vbs. Разберем подробнее этот код. Сначала идет описание двух констант, где содержатся строки заголовков окон: Const Edit_Title = "Untitled - Notepad" ' Заголовок окна. Const Calc.Title = "Calculator" ' Заголовок окна.
ГЛАВА 13 Управление окнами и приложениями из сценариев 371 Эти строки удобно описать как константы, поскольку и Calculator, и Note- pad используют локализованные заголовки. Так, в заголовках этих программ для версии Windows, отличной от американской (например, в русской), вы увидите другой текст. Чтобы приспособить этот пример к локализованной версии Windows, нужно изменить только текст в этих константах. Затем со- здается ссылка на WScriptShell, необходимая для выполнения метода Run-. Set Wsh = WScript.CreateObject! "WScript.Shell”) После этого можно запускать приложения методом Run-. Wsh.Run "Calc.exe”, 1 ' Запускаем Calculator. Wsh.Run "Notepad.exe", 1 ' Запускаем Notepad. Чтобы избежать передачи фокуса в Calculator из-за задержки, вызванной загрузкой приложения, вызовем метод Sleep-. Wsh.Run "Calc.exe", 1 ' Запускаем Calculator. WScript.Sleep 800 ' Приостановка позволяет передать фокус в Calculator. Wsh.Run "Notepad.exe", 1 ' Запускаем Notepad. WScript.Sleep 800 ' Приостановка позволяет передать фокус в Notepad. На моей машине приостановки на 800 миллисекунд системе было доста- точно для того, чтобы окно Notepad получило фокус. Вторая остановка после запуска обоих приложений позволяет вывести на передний план диалого- вое окно сценария (рис. 13-2). Без этой остановки одно из приложений мо- жет появиться позже диалогового окна. В нашем примере (листинг 13-2) диалоговое окно сценария переводится на задний план, а фокус переходит в окно приложения. Рис. 13-2. Рабочий стол с окнами приложений и диалоговым окном сценария, получившим фокус.
372 ЧАСТЬ III Особые возможности сценариев Следующая команда переносит фокус в окно Calculator, после того как пользователь щелкает кнопку ОК: Wsh.AppActivate Calc_Title Другие диалоговые окна сценария позволяют пользователю контролиро- вать результаты на каждом шаге. На последнем шаге пользователь может вве- сти текст заголовка любого окна на рабочем столе или на панели задач. Сце- нарий передает фокус в это окно. ВАЖНО Метод AppActivate не изменяет стиль окна при переносе фо- куса в заданное приложение или окно, т. е. он не может развернуть его или свернуть. Поэтому фокус может получить даже кнопка на панели задач. Методов, позволяющих изменять стиль окна, в WSH 2 нет. «Подводные камни» при применении метода AppActivate Чтобы определить, какое приложение надо активизировать, AppActivate срав- нивает параметр title, передаваемый методу, со строкой заголовка каждого за- пущенного приложения. Если точного совпадения нет, активизируется при- ложение, у которого начало строки заголовка совпадает с переменной title. Если приложение не найдено, активизируется приложение, у которого ко- нец строки заголовка совпадает с переменной title. Полезный в целом метод AppActivate имеет ряд недостатков. При создании сценария необходимо знать точный заголовок. Если сце- нарий запускается на локализованной версии Windows, вы должны сна- чала задать константы для заголовков окон. Если программа изменила текст в заголовке, использование AppActivate затрудняется или становится невозможным. Свернутое окно нельзя восстановить или развернуть, изменив соответ- ствующим образом его стиль. Вы не сможете найти нужное окно по тексту в заголовке, если у несколь- ких окон одинаковые заголовкшЛррЛсГгшГе активизирует первый экзем- пляр (по внутреннему списку открытых окон). Программа на JScript запускает два экземпляра приложения Calculator и пытается с помощью AppActivate перевести фокус из одного его окна в дру- гое (листинг 13-3). Поскольку у обоих окон одинаковый заголовок, измене- ний не происходит. //......***............................*.......... И Файл: AppActivateWSH2.js (Пример для WSH 2 на JScript) И Автор: (с) G. Born И И Два запуска Calculator и попытка перенести фокус // из одного окна в другое //.........*............*..........*...*..........
ГЛАВА 13 Управление окнами и приложениями из сценариев 373 // Описываем строку заголовка для окон приложения. // Важно: Строки зависят от локализованных версий Windows. var Calc_Title = "Calculator": // Заголовок окна. // Создаем объект WshShell для вызова Run и AppActivate. var Wsh = WScrlpt.CreateObjectC'WScript.Shell”); // Пробуем два раза запустить приложение. Чтобы последнее // приложение получило фокус, приостанавливаем сценарий. Wsh.RunCCalc.exe", 1); // Запускаем Calculator. Wsh.RunCCalc.exe", 1); // Запускаем второй экземпляр Calculator. WScrlpt.Sleep(800); // Приостановка, пока Calculator получает фокус. // Переводим фокус из одного окна в другое. WScrlpt.Echo("Click OK to set focus to Calculator window"); Wsh.AppActivate(Calc_Title); WScrlpt.Echo("Click OK to set focus to second Calculator window"); Wsh.AppActivate(Calc_Title); //*** Конец Листинг 13-3. AppActivateWSH2.js. Итак, метод WSH 2 AppActivate не позволяет изменять стиль окна, а заго- ловок окна не обеспечивает надежную идентификацию окна. В руководстве по программированию для WSH 2 сказано, что активизировать окно можно методом AppActivate, указав идентификатор процесса, полученный из функ- ции Shell, но WSH 2 не поддерживает функцию Shell. Имитация нажатия клавиш методом SendKeys Сценарий может запустить приложение и перевести его окно на передний план. Все нажатия клавиш пользователем передаются в это окно приложе- ния. Иногда нужно, чтобы сценарий имитировал пользовательский ввод Применение SendKeys в WSH 2 В WSH 2 можно использовать метод SendKeys объекта WshShell. Рассмотрим простой пример. Следующий JScript-код запускает Calculator методом Run. var WshShell = WScrlpt.CreateObjectC'WScript.Shell"); WshShell.Run("Calc.exe"); WSc ript.Slee p(200); Последний оператор переводит фокус в окно Calculator. Если не сделать эту паузу, сценарий может перейти к следующей группе операторов, посы- лающих нажатия клавиш, до того, как Calculator получит фокус; если это слу- чится, все нажатия просто пропадут.
374 ЧАСТЬ III Особые возможности сценариев Когда окно активизируется, сценарий посылает выражение 10 + 2 = в окно Calculator. Синтаксис метода: WshShell.SendKeys keys Метод SendKeys является частью объекта WshShell, параметр keys содержит один или несколько посылаемых символов. Для представления «клавиши», передаваемой в этом параметре, нужен минимум один символ. Клавиша на клавиатуре может быть представлена одним символом. Так, чтобы имитиро- вать нажатие клавиши А, в аргумент key нужно передать символ А. Если в строке несколько символов (скажем, АВС), приложению посылаются все эти символы. Знак «плюс» (+) имеет особый смысл в команде SendKeys (табл. 13-2), а передать его можно, заключив в фигурные скобки: {+}. Таким образом, команды в окно Calculator пересылаются операторами: WshShell.SendKeys("10"); WshShell.SendKeys("{+}"); WshShell.SendKeys("2"); WshShell.SendKeys(; Каждый вызов передает параметр, содержащий строку. Калькулятор вы- числяет выражение и отображает число 12. Следующие команды приоста- навливают сценарий и очищают результат на табло калькулятора: WScript.SleepC2000); WshShell. SendKeysC’c"); Сценарий вынуждает Calculator сложить в цикле числа от 1 до 3: for (var 1=1; 1 <= 3; 1++) { WshShell.SendKeys(i); // Складываем числа от 1 до 3. WshShell.SendKeysC"{+}"); } Вот полный текст сценария (листинг 13-4): И......*.....***.................*................... // Файл: SendKeysWSH2.js (Пример для WSH 2 на JScrlpt) // Автор: (с) G. Born // И Запуск Calculator и выполнение вычислений // с помощью метода SendKeys //•••••••••••••••••••••••••«••••••••••••••••••••••••••• И Создаем объект WshShell для вызова Run. var WshShell = WScript.CreateObject("WScript.Shell”); // Запускаем Calculator. WshShell. Run("Calc.exe");
ГЛАВА 13 Управление окнами и приложениями из сценариев 375 // Ждем, пока Calculator готовится принять ввод, И иначе ввод с "клавиатуры" посредством SendKeys попадет И в буфер сообщений Windows и будет передан активному окну И прежде, чем Calculator получит фокус. WScrlpt.Sleep(200); // Подождем немного. WshShell.SendKeys("10"); WshShell.SendKeys("{+}"); WshShell.SendKeys("2"); WshShell. SendKeys( "='); WScrlpt.Sleep(2000); // Ждем две секунды. WshShell.SendKeys("с"); // Очищаем результат. for (var 1 = 1; 1 <= 3; 1++) { WshShell.SendKeys(l); // Складываем числа от 1 до 3. WshShell.SendKeys("{+}"); } WSc rlpt.Echo("Те rmlnate?"); WSc rlpt.Sleep(200); WshShell.SendKeys("X{F4}"); // Закрываем Calculator с помощью Alt+F4. 11*** Конец Листинг 13-4. SendKeysWSH2.js. Еще о методе SendKeys Знаки «плюс» (+), «процент» (%), «вставка» (л), «тильда» (~) и круглые скобки О имеют для команды SendKeys особое значение (табл. 13-1 и 13-2). Для пе- редачи методу их нужно заключать в фигурные скобки. Чтобы переслать знак «плюс», например, нужно в параметр key передать строку {+}. Квадрат- ные скобки — [ и ] — нужно также помещать в фигурные скобки, так как эти символы имеют определенный смысл в приложениях, применяющих дина- мический обмен данными (Dynamic Data Exchange, DDE). To же относится и к фигурным скобкам: {{} и {}}. Некоторые клавиши на клавиатуре, включая Enter и Tab, не имеют види- мых символов. Чтобы передать их методу SendKeys, их нужно закодировать. Ниже представлена кодировка всех специальных клавиш (табл. 13-1). Табл. 13-1. Кодировка специальных клавиш в методе SendKeys. Клавиша_______________________________Кодировка_________________________________ Backspace {BACKSPACE}, {BS} или {BKSP} Break {BREAK} Caps Lock {CAPSLOCK} Delete {DELETE} или {DEL} см. след. стр.
376 ЧАСТЬ III Особые возможности сценариев Табл. 13-1. (продолжение) Клавиша Кодировка Cursor down (стрелка вниз) {DOWN} End {END} Enter {ENTER} или ~ Esc {ESC} Help {HELP} Home {HOME} Insert {INSERT} или {INS} Cursor left (стрелка влево) {LEFT} Num Lock {NUMLOCK} Page Down {PGDN} Page Up {PGUP} Print {PRTSC} Cursor right (стрелка вправо) {RIGHT} Scroll lock {SCROLLLOCK} Tab {TAB} Cursor up (стрелка вверх) {UP} Fl {Fl} F2 {F2} F3 {F3} F4 {F4} F5 {F5f F6 {F6} F7 {F7} F8 {F8} F9 {F9} F10 {F10} Fll {FH} F12 {F12} F13 {F13} F14 {F14} F15 {F15} F16 {FIG} Чтобы переслать комбинации, включающие Shift, Ctrl и Alt, вы должны добавить специальный код перед кодом второй клавиши (табл. 13-2). Табл. 13-2. Коды для комбинаций клавиш в методе SendKeys. Клавиша Код, вставляемый перед кодом второй клавиши Shift + Ctrl Alt %
ГЛАВА 13 Управление окнами и приложениями из сценариев 377 Следовательно, строка означает нажатие Ctrl+X. Если комбинация со- стоит из двух клавиш и более, символы нужно заключить в круглые скобки. Так, для комбинации Shift+E+C это выглядит как +(ЕС). «Плюс» означает кла- вишу Shift, а (ЕС) — клавиши Е и С, которые нужно нажать одновременно, удерживая клавишу Shift. Чтобы переслать комбинацию Shift+E, а вслед за ней — С, строка параметра должна выглядеть таю +ЕС. «Плюс* представляет клавишу Shift, которая нажимается одновременно с Е. После обработки этой комбинации принимается одиночный символ С. Круглые скобки в первом случае указывают на необходимость рассматривать клавиши в скобках как комбинацию клавиш с ведущим управляющим кодом для клавиши Shift. Для повторяющихся клавиш применяется формат {код_клавиши число}. (Пробел между кодом клавиши и числом обязателен.) Например, строка {LEFT42} представляет 42 нажатия клавиши Стрелка влево, а строка {Н10} — 10 нажатий клавиши Н. СОВЕТ Чтобы обеспечить автоматический перевод клавиши Num Lock во включенное состояние, напишите сценарий, в котором код {NUM- LOCK} пересылается с помощью SendKeys. Наличие этого сценария в меню Startup обеспечивает включение режима Num Lock при каждом запуске системы. Файл NumLockvbs, выполняющий эту задачу, находит- ся в папке \WSHDevGuide\Chapterl3 на прилагаемом компакт-диске. Работа с двумя приложениями посредством SendKeys Теперь вы познакомитесь с примером использования метода SendKeys, в том числе и в сочетании с другими методами. Этот сценарий, написанный на JScript, запускает Calculator и Notepad командами: oWSH.RunCNotepad.exe", 1); WSc ript.Sleep(500); oWSH.Run("Calc.exe", 1); WSc ript.Sleep!500); // Запускаем Notepad с пустым окном. // Ждем, пока Notepad получит фокус. И Запускаем Calculator с пустым окном. И Ждем, пока Calculator получит фокус. Метод Sleep гарантирует передачу фокуса на Calculator. После чего вы мо- жете вычислить 10 + 2 с помощью SendKeys, выполнив команды: oWSH.SendKeys!"10"): И Делаем некоторые вычисления. oWSH.SendKeye! '{+}"); oWSH.SendKeys!”2"); oWSH.SendKeys!; Эта последовательность операторов использует коды клавиш для переда- чи и вычисления в Calculator. Результат вычислений можно скопировать в буфер обмена: oWSH.SendKeys!""{c}'); // Копируем результат в буфер обмена. Код ''{с} представляет нажатие клавиш Ctrl+C. Затем сценарий выводит диалоговое окно, сообщающее пользователю, что результат будет записан в
378 ЧАСТЬ III Особые возможности сценариев окно Notepad. Если пользователь закроет диалоговое окно, сценарий пере- даст фокус в окно Notepad и вставит содержимое буфера обмена: oWSH.AppActivate(Edit_Title); // Записываем текст в окно Notepad. // Сначала вставляем результат из буфера обмена. oWSH.SendKeys("Calculation Result: "); oWSH. SendKeys( ”“{v)”); oWSH.SendKeys(”\n\n“); Первый оператор использует заголовок окна для передачи фокуса в при- ложение. (Эта методика не годится, если открыто несколько окон с тем же заголовком.) Три обращения к методу SendKeys записывают некий текст в окно Notepad, а затем вставляют результат вычисления из буфера обмена. Код \п\п создает две пустых строки в конце документа. Затем сценарий в цикле дописывает в окно Notepad еще некоторый текст: И Вписываем дополнительный текст 30 раз. for (var i = 1; i <= 30; i++) { oWSH.SendKeys(i + " Hello, world\n"); } Затем сценарий пытается закрыть окна Calculator и Notepad. Первым за- крывается окно Calculator: oWSH.AppActivate(Calc_Title); // Переводим фокус в Calculator. oWSH.SendKeys("X{F4}"); // Закрываем Calculator с помощью Alt+F4. Закрытие окна Notepad с помощью Alt+F4 приводит к появлению диало- гового окна с запросом «Do you want to save the changes?» (Сохранить изме- нения?), поэтому сценарий должен выполнить еще один шаг, имитируя «щел- чок» кнопки No. oWSH.AppActivate(Edit_Title); oWSH.SendKeys("X{F4}"); // Закрываем Notepad с помощью Alt+F4. oWSH.SendKeys("X{N}”); // "Щелкаем" кнопку No. Вот полная реализация (листинг 13-5). //**“*.............***............................. Ц Файл: SendKeysl.js (Пример для WSH 2 на JScript) // Автор: (с) G. Born // // Применение метода SendKeys и метода AppActivate // для запуска Calculator и Notepad и // записи в окно приложения // Описываем строки заголовков для окон приложений. // Важно: Строки зависят от локализованной версии Windows, var Edit_Title = "Untitled - Notepad"; // Заголовок окна.
ГЛАВА 13 Управление окнами и приложениями из сценариев 379 var Calo_Title = "Calculator"; // Заголовок окна. И Создаем объект WshShell для вызова Run и AppActivate. var oWSH = WSoript.CreateObjectC’WScript.Shell”); // Пробуем запустить два приложения. Чтобы обеспечить передачу // фокуса в последнее приложение, приостанавливаем сценарий. oWSH.RunCNotepad.exe", 1); // Запускаем Notepad о пустым окном. WSoript.Sleep(500); Ц Делаем паузу, чтобы Notepad получил фокус. oWSH.Run("Calc.exe",1); // Запускаем Calculator. WScrlpt.Sleep(500); // Делаем паузу, чтобы Calculator получил фокус. oWSH.SendKeys("10”); // Делаем некоторые вычисления. oWSH.SendKeys(”{+}"); oWSH.SendKeys(”2"); oWSH.SendKeys("="); oWSH.SendKeys(””{c}"); // Копируем результат в буфер обмена. WScrlpt.Echo(”Write text to Notepad window."); // Устанавливаем фокус в окно Notepad. oWSH.AppActivate(Edit_Title); // Пишем текст в окно Notepad. И Сначала вставляем результат из буфера обмена. oWSH.SendKeyeCCelculation Result: "); oWSH.SendKeys(”"{v}”); oWSH.SendKeys("\n\n"); // Пишем текст 30 раз. for (var 1=1; i <= 30; 1++) { oWSH.SendKeys(i + ” Hello, world\n”); ) WScrlpt.Echo("Close Calculator window."); oWSH.AppActivate(Calc_Title); // Переводим фокус в окно Calculator. oWSH.SendKeys(”X{F4}"); // Закрываем Calculator с помощью Alt+F4. WScrlpt.Echo("Close Notepad window."); I/ Переводим фокус в Notepad и посылаем команду на завершение. oWSH.AppActlvate(Edit_Title); oWSH.SendKeys("X{F4}"); // Закрываем Notepad с помощью Alt+F4. oWSH.SendKeye("X{N}"); // "Щелкаем” кнопку No. //*** Конец Листинг 13-5. Send Keys 1 js.
380 ЧАСТЬ III Особые возможности сценариев Вы познакомились с приемами программирования на WSH 2 для управ- ления внешними приложениями. Подробнее о методах работы с внешними приложениями см. Advanced Development with Microsoft Windows Script Host 2.0. Настройка Windows с помощью сценариев регистрации В предыдущих главах вы узнали о составлении сценариев, выполняющих подключение к сетевым устройствам и принтерам. Вам уже известно, как применять объект FileSystemObject (например, для создания резервных копий файлов), вы также изучили приемы разработки сценариев, предназначенных для создания ярлыков на рабочем столе и в главном меню. Иначе говоря, ис- пользуя сценарии, вы уже можете настраивать пользовательские системы и автоматизировать некоторые задачи. Я уже рассказал о сценариях, выполня- ющихся при запуске и завершении системы, а также при входе и выходе из нее. Введя в Windows NT 4 поддержку сценариев регистрации (в виде пакет- ных файлов, например), Microsoft попыталась в Windows 2000 расширить поддержку отработки сценариев при запуске и отключении системы, а так- же при входе и выходе из системы. Установка сценария регистрации В Windows 2000 (и даже в Windows NT) администратор может так настро- ить учетную запись, чтобы сценарий регистрации запускался автоматичес- ки при регистрации пользователя в системе. (Для этого вы можете приспо- собить сценарии из предыдущих глав.) Для установки сценария регистрации требуется сделать следующее. 1. Скопировать сценарий (или сценарии) регистрации в папку для сцена- риев. (О конкретном местонахождении папки см. далее.) 2. В качестве администратора запустить программу управления учетными записями пользователей. В Windows 2000 требуемые функции предостав- ляет Microsoft Management Console (ММС). Щелкните дважды Administ- rative Tools в Control Panel, а затем — Computer Management. (В Windows NT 4 управление учетными записями пользователей осуществляется че- рез User Manager.) 3- Выделите учетную запись пользователя и выведите ее свойства. В ММС выберите ветвь System Tools/Local Users And Groups/Users и в списке учет- ных записей щелкните дважды элемент с именем пользователя. (Чтобы открыть окно свойств учетной записи пользователя в Windows NT 4, щел- кните дважды имя пользователя в списке учетных записей.) 4- На вкладке Profile окна свойств пользователя введите имя файла-сцена- рия регистрации в поле Logon Script (рис. 13-3)- (В Windows NT 4 для от- крытия диалогового окна Logon Script щелкните кнопку Profile.)
ГЛАВА 13 Управление окнами и приложениями из сценариев 381 Рис. 13-3. Microsoft Management Console и страница свойств Profile. После закрытия диалоговых окон и окон свойств кнопкой ОК парамет- ры данной учетной записи пользователя будут сохранены. Скопируйте сце- нарий регистрации в папку для сценариев, если вы этого еще не сделали. Ее местонахождение зависит от того, выполняется этот сценарий при регист- рации в домене или с локальной учетной записью. Сценарий регистрации в домене должен находиться на основном контроллере домена. На контрол- лере домена Windows NT 4 сценарий регистрации должен быть в папке: ^ysZemroof\system32\repl\import\scripts где systemroot означает путь для папки Windows; на контроллере домена Windows 2000 — в папке: sysvol\rfom<a/nnawze\scripts. Локальные учетные записи как в Windows 2000, так и в Windows NT 4 хранятся в папке: ^ysZemrooZ\system32\iepl\import\scripts. Если сценарий скопирован, нужно ввести его имя (например, Logon.vbs) в поле Logon Script. Кроме того, хранить сценарии регистрации можно во вложенной папке основной папки сценариев регистрации (чтобы сгруппи- ровать, например, различные сценарии регистрации для групп пользовате- лей). При этом нужно к имени файла добавить ее относительный путь (на- пример, admins\Logon.vbs'). Теперь сценарий регистрации будет автоматически запускаться при каж- дой регистрации пользователя в системе. Преимущество такого подхода в том, что каждому пользователю можно назначить индивидуальный сценарий регистрации.
382 ЧАСТЬ III Особые возможности сценариев ВАЖНО В Windows 2000 можно напрямую использовать WSH-сцена- рии как сценарии регистрации. (В поле Logon Script можно задать vbs-, js- и wsf-файлы.) В Windows NT 4 поддерживаются файлы-сценарии регистрации только с расширениями .exe, .cmd и .bat, поэтому вам придется создать .bat-файл, запускающий WSH-сценарий, сохранить его в папке сценариев и ввести его имя в поле Logon Script. Глобальные сценарии регистрации и выхода из системы В Windows 2000 есть и другой способ автоматического запуска сценариев при входе пользователя в систему и выходе из нее. 1. Составьте сценарий с командами, которые нужно отработать при регис- трации или выходе. Сохраните его в WSH-файле в локальной папке. 2. Войдите в систему как администратор и запустите экземпляр ММС, кото- рый поддерживает политику на уровне пользователя и группы (см. при- ложение Б). 3. Выберите ветвь Local Computer Policy/User Configuration/Windows Set- tings/Scripts (Logon/Logoff) на вкладке Tree. 4- На правой панели ММС появятся два значка для сценариев регистрации и выхода. Щелкните дважды один из них, чтобы открыть окно свойств Scripts (рис. 13-4). 5. Щелкните кнопку Add, чтобы открыть диалоговое окно Add A Script (рис. 13-5). Введите в это окно имя файла сценария и дополнительные парамет- ры. Кнопка Browse позволяет выбрать файл сценария из любой папки. Рис. 13-4. ММС и страница свойств Scripts. После закрытия всех диалоговых окон посредством кнопки ОК выделен- ный сценарий выполняется автоматически (независимо от учетной записи пользователя), будь то сценарий регистрации или выхода из системы (в за- висимости от значка, который вы щелкнули).
ГЛАВА 13 Управление окнами и приложениями из сценариев 383 Рис. 13-5. Диалоговое окно Add a Script. Использование сценариев при запуске и отключении системы В Windows допускается отработка сценариев при запуске и отключении си- стемы, которые не зависят от регистрации и выхода пользователя. Это удоб- но для машин, запускаемых без регистрации пользователя (например, на серверах). Чтобы сценарий автоматически выполнялся при запуске или от- ключении системы, выполните действия, подобные тем, о которых речь шла в предыдущем разделе. 1. Составьте сценарий с командами, которые нужно отработать при запуске или отключении системы. Сохраните его в WSH-файле в локальной папке. 2. Войдите в систему с правами администратора и запустите экземпляр ММС, поддерживающий политику на уровне пользователя и группы. 3. Если нужно, установите связь с удаленной машиной (локальная политика будет загружена автоматически) и щелкните на вкладке Tree (рис. 13-4) узел Local Computer Policy/ Computer Configuration/Windows Settings/Scripts (Startup /Shutdown). 4. На правой панели двойным щелчком значка Startup или Shutdown, а за- тем кнопки Add откройте диалоговое окно Add a Script (рис. 13-5). 5. В окне Add A Script введите вместе с путем имя файла сценария и допол- нительные параметры. Используйте кнопку Browse для выбора файла сце- нария из любой папки. После закрытия всех диалоговых окон посредством кнопки ОК выделен- ный сценарий будет автоматически выполняться при каждом запуске и от- ключении системы (в зависимости от того, какой значок вы щелкнули). Сценарии запуска и отключения системы в Windows 95/98 Если машины с Windows 95/98 запускаются в сетевой среде, управляемой контроллером домена Windows NT, администратор сети может установить отработку сценариев регистрации в политике для пользователя или группы. Если компьютер запускается в среде рабочей группы или вне сети, можете применить предлагаемые ниже способы выполнения сценариев в автомати- ческом режиме при входе пользователя в систему.
384 ЧАСТЬ III Особые возможности сценариев Простейший способ — добавить ярлык в папку Startup меню Start, содер- жащий команду запуска сценария. (В Windows 98 это можно сделать, пе- ретащив его туда мышью.) Можно добавить команду WScript.exe patb\scriptftle в раздел Run системного реестра в ветвь HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows. Раз- дел Run можно обработать с помощью редактора системной политики (Sys- tem Policy Editor) или утилиты System Configuration Utility (в Windows 98). Кроме того, для вставки команды в раздел Run системного реестра или уда- ления ее оттуда можно применить методику доступа к реестру (см. главу 11). Любой из предложенных способов обеспечивает выполнение всех сце- нариев при каждой регистрации пользователя в системе.
ГЛАВА 1 4 Приемы программирования и советы В этой главе я познакомлю вас с приемами работы с WSH и дам несколько полезных советов. Материал главы сгруппирован по следующим темам: ошиб- ки периода выполнения; пути и даты; длинные имена, команда At и систем- ные вызовы; пользовательские диалоговые окна и вывод; работа с файлами; воспроизведение звука; оболочка Windows; вызов DUN-соединения. Ошибки периода выполнения В VBScript и JScript встроена обработка ошибок, которая позволяет вашему сценарию перехватывать ошибки, приводящие к завершению сценария. В этом разделе изложено то, что вам следует знать о явной обработке ошибок периода выполнения внутри сценария. Обработка ошибок периода выполнения в VBScript В VBScript явную обработку ошибок периода выполнения реализует опера- тор On Error Resume Next, который вызывает выполнение следующего опе- ратора сразу после появления ошибки. Эта инструкция включает режим встроенной обработки ошибки периода выполнения. (Обработчик сценари- ев сообщает только о синтаксических ошибках.) Код ошибки позволяет получить объект Err. Допустим, переменная oWSH содержит указатель на объект WshShell, тогда проверка ошибки при обраще- нии к методу RegRead выглядит так: valx = oWSH.RegRead"хххх") If Err О 0 Then Если при выполнении оператора в первой строке возникла ошибка пе- риода выполнения, значение объекта Err не равно О. Код ошибки содержит свойство ErrNumber, а ее описание — EmDescription. Подобную обработку ошибок периода выполнения я применял в предыдущих главах. Оператор On Error GoTo О отменяет обработку ошибок периода выполне- ния. После него эти ошибки обрабатывает обработчик сценариев.
386 ЧАСТЬ III Особые возможности сценариев ВНИМАНИЕ Включение встроенной обработки ошибок периода вы- полнения подавляет все неявные сообщения об ошибках, поэтому от- ветственность за обнаружение ошибок и оповещение о них ложится на ваш сценарий. Опасность этого подхода в том, что некоторые труд- но находимые ошибки могут оказаться невыявленными. Даже если сценарий содержит оператор Option Explicit, будут пропущены случаи ошибочного задания имен переменных, функций или процедур. Такой оператор не будет выполнен, а обработчик сценариев перейдет к сле- дующему оператору. Чтобы не допускать подобных ситуаций, отклю- чайте обработку ошибок периода выполнения (с помощью On Error GoTo О) сразу, как только в этом отпадет необходимость. Обработка ошибок периода выполнения в JScript JScript поддерживает обработку ошибок периода выполнения в обработчи- ке сценариев, начиная с версии 5. Последовательность операторов try {...} catch (е) {...} может выглядеть так: try { var valx WSH.RegRead("....", "xxxx”); } catch (a) { if (a 1= 0) WScrlpt.Echo("Error during Registry access"); ) Ключевое слово try должно стоять перед оператором. Оператор или блок операторов надо заключить в фигурные скобки. Оператор catch (е) вызыва- ется при появлении ошибки периода выполнения. Переменная е получает объект-ошибку, которую можно анализировать в блоке catch. (Операторы внутри блока тоже заключите в фигурные скобки.) Генерация ошибок периода выполнения в VBScript Вы можете сами генерировать ошибки периода выполнения методами, пре- доставляемыми языками сценариев. В VBScript это метод Raise объекта Err. Вот как генерировать ошибку периода выполнения и вывести на экран ее описание: On Error Resume Next Err. Clear Err.Raise 6 ' Генерируем ошибку. MsgBox "Error code: " & Err.Number & vbCrLf & Err.Description, _ vbOKOnly, "VBScript-Error-Description" On Error GoTo 0
ГЛАВА 14 Приемы программирования и советы 387 Этот код имитирует ошибку переполнения (код 6). На его основе вы мо- жете составить небольшой сценарий, который запрашивает код ошибки и возвращает ее описание. ПРИМЕЧАНИЕ Файл VBScriptError.vbs с прилагаемого к книге ком- пакт-диска (папка \WSHDevGuide\Chapterl4) запрашивает код ошиб- ки и выводит ее описание. Описание всех ошибок см. также в VBScript Language Reference. Правда, этого нельзя сказать об ошибках, генери- руемых ОС (или OLE- и COM-компонентами). Описания этих ошибок можно получить из внутренних таблиц с помощью функций Windows API, но эта тема выходит за рамки данной книги. Пути и даты В этом разделе вы узнаете, как определить папку текущего файла сценария, папку или диск по умолчанию. Я также расскажу об ошибке, которая может возникнуть при определении разницы дат. Получение пути сценария Иногда нужно узнать путь для файла сценария, например, если вам нужно обработать файлы в папке, хранящей сценарий. Если принять в качестве рабочей папки путь самого сценария, то вероятность появления ошибки будет меньше, чем при использовании абсолютных путей, так как путь сце- нария всегда действителен (даже после переименования папки сценария или перемещения его на другой диск). В WSH нет функций и методов, позволя- ющих узнать путь сценария, но получить путь в VBScript поможет свойство ScriptFullName объекта WScript: Function GetPath ' Получение пути для файла сценария. Dim path path в WScript.ScriptFullName ' Имя файла сценария. GetPath = Left(path, InStrRev(path, "\")) End Function Получить путь в JScript вам поможет функция: function GetPathO { И Получение пути для файла сценария. var path = WScript.ScriptFullName; // Имя файла сценария. path = path.aubstr(O, path.laetIndexOf("\\") + 1): return path; } В обеих функциях предполагается, что путь заканчивается символом «\». Если когда-нибудь WSH перенесут в другие ОС (например, Macintosh или UNIX), там этот способ может привести к ошибке. Поэтому лучше исполь- зовать иную конструкцию:
388 ЧАСТЬ III Особые возможности сценариев path = Left(Wscript.ScriptFullName, Len(Wscript.ScriptFullName) - Len(Wscript.ScriptName)) Здесь имя файла сценария вычитается из полного имени, чем достигается независимость от соглашения об именовании файлов. Если вам такой прием не нравится, вызовите метод GetParentFolderName объекта FileSystemObject-. Dim fso Set fso = CreateObject("Scripting.FileSystemObject") Path = fso.GetParentFolderName(WScript.ScriptFullName) Этот метод должен возвратить путь независимо от ОС. Однако вам при- дется выделить память для объекта «файловая система» и подождать, пока этот метод выполнится. Получение текущего каталога В Microsoft Visual Basic и Microsoft Visual Basic for Applications (VBA) есть фун- кция, возвращающая текущий каталог. В сценарии текущим является каталог, из которого запускается сценарий, поэтому определить текущий каталог можно либо с помощью кода из предыдущего раздела, либо операторами: Dim fso Set fso = WScript.CreateObjectC’Scripting.FileSystemObject") ‘ CurrentDir = fso.GetAbsolutePathName("") ‘ Либо следующий синтаксис: CurrentDir = fso.GetAbsolutePathNameC’.") Этот код получает путь, вызывая метод GetAbsolutePathName объекта File- SystemObject с параметром «.». ПРИМЕЧАНИЕ Сценарий CurrentDir.vbs (папка \WSHDevGuide\Chap- terl4) отображает текущий каталог и путь сценария в информацион- ном окне. Альтернативный способ определения текущего каталога предлагает метод GetDir. Установка папки по умолчанию В WSH нельзя «в лоб» задать для программы каталог по умолчанию, но есть несколько искусственных приемов. Самый простой — поместить требуемые файлы в папку, в которой находится сценарий, а затем обратиться к функ- ции GetPath (вы уже с ней знакомы). Другой способ — создать файл ярлыка, задать для него полное имя испол- няемого файла и рабочий каталог, а затем запустить ярлык методом Run. При- ложение, запущенное из ярлыка, получит все, что установлено параметрами. Третий — создать ВАТ-файл, включив в него команды смены каталога (cd) и запуска приложения. Затем можно запустить этот файл методом Run. (О создании файлов ярлыков и методе Run см. главы 7 и 10.)
ГЛАВА 14 Приемы программирования и советы 389 Получение имени текущего диска Имя текущего диска можно получить через свойство ScriptFullName объекта WScript, однако это малопригодно для путей в формате UNC. Вот более про- стой способ, подходящий и для UNC-путей: Set oFS = WScrlpt.CreateObject("Scripting.FileSystemObject") oldDrive = oFS.GetDriveName(WScript.ScriptFullName) Значение свойства ScriptFullName вы передаете методу GetDriveName объек- та FileSystemObject, который возвращает имя текущего диска (рис. 14-1): Рис. 14-1. Отображение имени текущего диска (в формате UNC). ПРИМЕЧАНИЕ Представленный выше код всегда возвращает имя дис- ка, на котором запускается файл сценария. С помощью методов, предо- ставляемых его объектной моделью WSH, имя диска изменить нельзя. Вычисление разницы дат В VBScript разницу дат вычисляет функция DateDiff. Согласно справочной системе по VBScript в первом параметре вы должны задать интервал, в двух других — даты, по которым производится вычисление: WScript.Echo DateDiffC'd", Now, "1/1/2020”) &_ " days left to 2020..." Для определения количества дней, оставшихся до января 2020 г., в этом операторе задан интервал «г/» (дни). Now представляет текущую дату, а тре- тий параметр — фиксированное значение даты. ПРИМЕЧАНИЕ Разделитель компонентов даты зависит от параметров вашей ОС. Результат вычисления разницы дат представлен ниже, слева — дни, остав- шиеся до указанной даты (рис. 14-2). Как видите, в последней строке появи- лась отрицательная разница. Рис. 14-2. Разница дат.
390 ЧАСТЬ III Особые возможности сценариев Рассмотрим подробнее код для расчета разницы дат. В обеих строках вы- числяется временной интервал между сегодняшним днем и 1 января 2020 г.: MsgBox DateDiffC’d", Now, "1/1/2020") & " days left to 2020..." MsgBox OateOlffC'd", Now, "1/1/20") & ” days left to 2020..." Хотя во втором параметре год представлен двумя цифрами, 20, оба опера- тора дают правильный результат. Однако при работе с датами, представленными двумя цифрами, таится опасность. Так, следующие два оператора приводят к разным результатам. MsgBox DateOiff("d", Now, ”1/1/2030") & " days left to 2030..." MsgBox DateDiffC’d", Now, "1/1/30") & " days left to 2030..." Второй оператор показывает отрицательное значение (рис. 14-3). В вариан- те с датой «1/1/20* вычисляет количество дней до 1 января 2020 г., а в вари- анте с «1/1/30* — до 1 января 1930 г. Эта ситуация иллюстрирует пресловутую «ошибку 2000 года». Многие программы, написанные в XX веке, работают с годами, представленными двумя цифрами. Чтобы они могли рассчитывать временной интервал меж- ду 19хх и 20хх годами, Windows применяет смещение для значений годов, представленных двумя цифрами. Все значения между 0 и 29 рассматривают- ся как годы от 2000 до 2029, а значения между 30 и 99 — с 1930 по 1999- Поэтому при программировании сценариев хорошим тоном считается ука- зывать даты, в которых год представлен четырьмя цифрами. Вышесказанное позволяет проверить файл DateTestvbs (папка \WSHDevGuide\Chapterl4). Длинные имена, команда At и системные вызовы В этом разделе мы рассмотрим работу с длинными именами, применение команды АТ и выполнение системных вызовов методом Run. Запуск сценария с помощью планировщика Windows NT Планировщик Microsoft Windows NT (Microsoft Windows NT scheduler) позво- ляет запустить сценарий в заданное время: АТ 18:00:00 /interactive "C:\WSH0evGuide\Chapter14\RunExit.vbs" В строке, содержащей команду АТ, нужно указать полный путь для файла сценария. Вы должны также задать флаг /interactive, если сценарий требует взаимодействия с пользователем. ПРИМЕЧАНИЕ В Windows 98/2000 можно создать расписание для выполнения сценариев с помощью Task Scheduler. (Хотя Task Scheduler предоставляет API другим программам, он не поддерживает интерфейс в сценариях; Microsoft Site Server включает вспомогательную DLL, пре- доставляющую нужный СОМ-интерфейс.)
ГЛАВА 14 Приемы программирования и советы 391 Работа с длинными именами в сценариях Если в ваших сценариях предусмотрена работа с длинными именами фай- лов, вы должны заключить имена файлов и пути в двойные кавычки: WshShell.Run _ ..C:\Programs\Microsoft Office\Office\Excel.exe., 1, True В VBScript нужно добавить двойные кавычки: Первые и последние двойные кавычки ограничивают строку, вторые показывают, что в это мес- то строки должны быть вставлены двойные кавычки. В JScript двойные кавычки в строке записываются как \”: WshShell.Run ("\"C:\\Programs\\Microsoft Office\\Office\\Excel.exe\”", 1. true); ПРИМЕЧАНИЕ Формируя командную строку из имени пути и имени файла, заключите результирующую строку в пару двойных кавычек (так как выбранное имя пути может иметь внутренние пробелы). На- пример, oWSHRun в-path & 3, True. Здесь нужны четыре пары двойных кавычек, поскольку две внутренних кавычки указывают обра- ботчику сценариев, что это должен быть один символ “. Внешние пары двойных кавычек отмечают внутренние двойные кавычки как строко- вый символ. Выполнение системных вызовов методом Run Для вызова функций Windows API из WSH-сценария вам необходим элемент управления ActiveX, предоставляющих требуемый интерфейс. (Описание про- граммирования таких элементов я даю в Advanced Development with Microsoft Windows Script Host 2.0.) Однако Windows 95/98/NT/2000 позволяют получить доступ к системным подпрограммам из сценария методом Run. Завершение Windows 95/98 с помощью RunDII32.exe Если у вас нет элемента управления ActiveX с методами завершения Windows 95/98, вы можете воспользоваться командой внутри метода Run-. WshShell.Run "XWINDIRX\RunD1132.exe user,Exitwindows", 1, -1 Программа RunDlI32.exe активизирует несколько функций Windows API, содержащихся в библиотечных файлах (DLL). Представленная выше коман- да запускает RunD1132.exe, которая осуществляет доступ к библиотеке User.exe и вызывает оттуда библиотечную API-функцию ExitWindows. СОВЕТ В команде запуска RunD1132.exe вы вправе обратиться к любой DLL Windows, но не стоит забывать и о существующих ограничениях. Имена функций, экспортируемые из библиотеки, чувствительны к ре- гистру букв. (Например, exitwindows отличается от ExitWindows.) Кро-
392 ЧАСТЬ III Особые возможности сценариев ме того, нельзя с помощью RunD1132.exe передать аргументы в функ- ции Windows API. Однако есть несколько исключений, позволяющих с помощью RunD1132.exe вызывать другие функции и передавать стро- ку через командную строку. Эти функции (такие как SHExitWindowsEx, о которой речь пойдет ниже) анализируют командную строку и выби- рают из нее аргументы. Программа на VBScript содержит команду завершения Windows 95/98 из WSH-сценария (листинг 14-1). (Этот и другие примеры этой главы находятся в папке \WSHDevGuide\Chapterl4 на прилагаемом к книге компакт-диске.) • Файл: RunExit.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Применение метода Run для вызова функции Exitwindows ' из Windows 95 или Windows 98 API ’ ************************************************ Option Explicit Dim WshShell Set WshShell = WScript.CreateObjectC’WScript.Shell") If (MsgBoxC'Shut down Windows 95 or Windows 98”, vbYesNo + vbQuestion, _ "WSH sample - by G. Born”) = vbYes) Then WshShell.Run "XWINDIRX\RunD1132.exe user,Exitwindows", 1, -1 ’*** Конец Листинг 14-1. RunExit.vbs. ПРИМЕЧАНИЕ Такой вызов не будет работать в Windows NT/2000, так как эти ОС не поддерживают функцию ExitWindows в User.exe. (Заверше- ние системы в Windows NT/2000 требует, чтобы у вызывающей задачи были определенные права.) Элемент управления ActiveX WSHExtend.ocx (см. Advanced Development with Microsoft Windows Script Host 2.0) предос- тавляет метод для завершения системы Windows 95/98/NT/2OOO. Завершение и перезапуск систем Windows 95/98 Представленная выше методика завершения не годится для перезапуска Windows 95/98. Однако в этих версиях Windows реализован режим эмуля- ции MS-DOS (режим консольного окна), который выгружает ядро Windows и заменяет его ядром MS-DOS. Поэтому если вы выполняете DOS-програм- му в режиме эмуляции MS-DOS, Windows прекращает работу. После выхода из приложения MS-DOS ядро Windows автоматически загружается вновь. Иными словами, происходит перезапуск системы.
ГЛАВА 14 Приемы программирования и советы 393 Благодаря этой особенности вы можете перезапускать Windows 95/98. Сначала нужно создать ВАТ-файл, содержащий единственную команду: •Exit Затем надо, щелкнув правой кнопкой значок этого файла, выбрать в кон- текстном меню команду Properties. На странице свойств Program установите флажок MS-DOS Mode и снимите флажок Warn Before Entering MS-DOS Mode. После чего двойным щелчком вы запускаете этот пакетный файл в режиме MS- DOS. Поскольку файл содержит команду Exit, этот режим тут же завершается и происходит новая загрузка Windows. Для перезапуска Windows из сценария создайте сценарий, запускающий ваш ВАТ-файл методом Run. Эта уловка помогает в Windows 95/98 (но не в Windows Me). Возможность управления процессом завершения и перезапуска системы предоставляет другая функция Windows API — ExitWindowsEx. Она есть в Windows Windows 95/98/NT. Увы, ее нельзя вызвать с помощью RunDU32.exe, так как у нее два параметра: режим выхода и зарезервированный параметр. Чтобы задейство- вать эту API-функцию, нужен элемент управления ActiveX. Кроме того, в Windows 98 (и в Windows Me) я обнаружил еще один не- документированный способ вызова из оболочки функции ExitWindowsEx с требуемыми параметрами — с помощью функции SHExitWindowsEx из фай- ла She!132.dll. Эту надстройку над функцией ExitWindowsEx вызывает из обо- лочки Windows команда: RunD1132.exe Shell32.dll,SHExitWindoweEx 0x0 RunDH32.exe вызывает функцию SHExitWindowsEx из Shell32.dll. У этой фун- кции один аргумент, который нужно представить в виде строки. (Эту особен- ность я отмечал выше: SHExitWindowsEx поддерживает параметр, передавае- мый из командной строки.) В аргументе задается шестнадцатеричное число, означающее режим выхода. Строка 0x0 переводится в число 0, строка 0x01 — в 1 и т. д. SHExitWindowsEx считывает этот аргумент, преобразует его в шес- тнадцатеричное число и вызывает API-функцию ExitWindowsEx с нужным па- раметром (табл. 14-1). Табл. 14-1. Значения аргумента SHExitWindowsEx. Аргумент Результат ОхО Выход из системы 0x1 Завершение системы 0x2 Перезагрузка Таким образом, RunD1132.exe позволяет вам завершить и перезапустить Windows 98, либо инициировать выход пользователя из системы. Этот сце- нарий выполняет все перечисленные действия (листинг 14-2): ' Файл: RunExitEx.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born см. след. стр.
394 ЧАСТЬ III Особые возможности сценариев ' Применение метод Run для вызова в Windows 98 ' недокументированной API-функции SHExltWlndowsEx с целью ' завершения, перезапуска системы или выхода пользователя из системы ' Shell32.dll,SHExltWlndoweEx,0x0 Выход из системы ' Shell32.dll,SHExltWlndowsEx,0x1 Завершение ' Shell32.dll,SHExltWlndowsEx,0x2 Перезапуск '************************************************ Option Explicit Dim Shell, Title, obj Title = "WSH sample - by G. Born" ' Создание объекта оболочки. Set Shell = WScrlpt.CreateObject("Shell.Application") Set obj = WSoript.CreateObjectC'WScript.Shell”) ' Вызов режима Выход (Logoff). If (MsgBoxC'Log off?", _ vbYesNo + vbQuestion, Title) = vbYes) Then obj.Run "RunD1132.exe Shell32.dll,SHExltWlndowsEx 0x0" Else ' Вызов режима Завершение (Shutdown). If (MsgBox("Shut down Wlndowe?", _ vbYesNo + vbQuestion, Title) = vbYes) Then obj.Run "RunD1132.exe Shell32.dll,SHExltWlndoweEx 0x01" Else ' Вызов режима Перезапуск (Restart). If (MegBox("Restart Windows?", _ vbYesNo + vbQueetion, Title) = vbYes) Then obj.Run "RunD1132.exe Shell32.dll,SHExltWlndowsEx 0x02" End If End If End If '*** Конец Листинг 14-2. RunExitEx.vbs. Эти вызовы не годятся для Windows 95/NT/2OOO, поскольку они не под- держивают эту вспомогательную функцию. Я вернусь к этой теме немного позже, когда буду рассказывать о получении доступа к оболочке Windows 98 для приостановки вашего компьютера или для вызова диалогового окна Shutdown Windows. Блокировка рабочей станции в Windows 2000 Итак, выйти из Windows NT/2000 с помощью RunD1132.exe нельзя, но мож- но заблокировать рабочую станцию под Microsoft Windows 2000 Professional. В Windows 2000 модуль User32 предоставляет API-вызов LockWorkStation. Сле-
ГЛАВА 14 Приемы программирования и советы 395 дующий код вызывает эту API-функции с помощью RunD1132.exe и блокиру- ет систему (листинг 14-3). ********************************************************* ' Файл: NTLockWorkStati.on.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Блокировка рабочей станции Windows 2000 ********************************************************* Option Explicit Dim WshShell ' Создаем объект WshShell (для Run). Set WehShell = WScrlpt.CreateObjectC'WScript.Shell") ' Запрашиваем у пользователя разрешение на блокировку. If MsoBox("Lock workstation?", vbYesNo, "WSH Sample") = vbYes Then ' Use Lockworkstation API call. WshShell.Run "Run01132.exe ueer32.dll,LockWorkStation" End If '*** Конец Листинг 14-3. NTLockWorkStation.vbs. Для установки блокировки рабочей станции пользователю нужно дваж- ды щелкнуть этот файл. Когда пользователь введет пароль, будет восстанов- лен рабочий стол со всеми открытыми окнами. Этот пример сам по себе несет немного пользы (вы же можете заблокировать свою рабочую станцию, нажав Ctrl+Alt+Del, а затем щелкнув кнопку Lock Computer), но продемонст- рированная техника может пригодиться при выполнении сценариев. Вызов диалогового окна Copy Disk Копирование с дискеты на дискету в Windows реализуется посредством DiskCopy.dll. Эта библиотека выводит на экран диалоговое окно Copy Disk (Копирование диска) (рис. 14-3). Рис. 14-3. Диалоговое окно Copy Disk.
396 ЧАСТЬ III Особые возможности сценариев Эта DLL экспортирует функцию, которую можно вызвать из других про- грамм. С помощью RunD1132.exe вы можете из WSH-сценария вызвать ком- понент DiskCopyRunDll библиотеки DiskCopy.dll: RunD1132.exe DiskCopy.dll,DiskCopyRunDll Эта команда активизирует диалоговое окно Copy Disk. Вот WSH-сценарий, вызывающий это окно (листинг 14-4). ************************************************* ' Файл: CopyDisk.vbs (Пример для WSH на VBScript) • Автор: (с) G. Born ' Активизация диалогового окна Copy Disk ************************************************* Option Explicit Dim WshObj ' Объект для метода Run. Set WshObj = WScript.CreateObject("WScript.Shell") WshObj.Run _ "RunD1132.exe DiskCopy.dll,DiskCopyRunDll", _ 1, True ' Запускаем диалоговое окно. '*** Конец Листинг 14-4. CopyDisk.vbs. Вызов диалогового окна Format Подобную технику можно применить и для активизации диалогового окна Format, предназначенного для форматирования дискет в Windows. Реализа- ция функции форматирования находится в файле Shell32.dll; чтобы ее акти- визировать, вызовите SHFormatDrive, которая выводит на экран диалоговое окно Format. Следующая команда реализует доступ к этой функции из WSH- сценария. RunD1132.exe Shell32.dll,SHFormatDrive Этот сценарий активизирует окно Format (листинг 14-5): 'А************************************************* ’ Файл: Format.vbs (Пример для WSH на VBScript) ‘ Автор: (с) G. Born ’ Активизация диалогового окна Format для дискеты *************************************************: Option Explicit Dim WshObj ' Объект для метода Run.
ГЛАВА 14 Приемы программирования и советы 397 Set WshObj = WScrlpt.CreateObjectC'WScript.Shell") WahObj.Run "RunD1132.exe Shell32.dll,SHFormatDrive", 1, True ‘ Запускаем диалоговое окно. '*•* Конец Листинг 14-5. Format.vbs. Вызов страницы свойств Screen Saver Страница свойств Screen Saver позволяет устанавливать заставки экрана. Вы можете активизировать это окно из сценария или из оболочки Windows командой: RunD1132.exe desk.cpl,InstallScreenSaver Этот сценарий VBScript активизирует страницу свойств (листинг 14-6). ************************************************* ' Файл: Screensaver.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Установка заставки Option Explicit Dim WshObj ' Объект для метода Run. Set WshObj = WScrlpt.CreateObjectC'WScript.Shell”) WshObj.Run _ "RunD1132.exe deak.cpl,InstallScreenSaver", 1, True ' Страница свойств Screen Saver. '•** Конец Листинг 14-6. Screensaver.vbs. Вызов модулей из Control Panel В предыдущем примере представлен метод, предназначенный для активиза- ции страницы свойств Screen Saver посредством RunD1132.exe. Для отображе- ния страницы свойств панели управления можно вместо RunD1132.exe выз- вать Control.exe из.ср!-файла. Следующая команда активизирует страницу свойств Buttons диалогового окна Mouse Properties: WshObj.Run "Control.exe maln.cpl,©0,0“
398 ЧАСТЬ III Особые возможности сценариев Параметры после имени модуля (.cpl-файл) определяют, какую страницу свойств этого модуля вывести на передний план. Ниже перечислены моду- ли и их параметры (табл. 14-2). Табл. 14-2. Модули Control Panel и их параметры. Модуль Имя Индекс Описание Пример Appwiz.cpl Н/п" От 0 до 3 Открывает указанную в index (индексе) страницу свойств диалогового окна Add/Re- move Programs (или страницу свойств, зависящую от версии ОС). Controlexe Appiviz.cpl„l Desk.cpl Н/п От 0 до 3 Открывает страницу окна Display Property. Control.exe Desk.cpl„l Intlcpl Н/п От Одо 4 Открывает окно свойств Regional Options и выбирает одну из его страниц. Во вто- ром параметре указывается страница свойств. Control.exe Intlcpl,, 1 Main.cpl От@0 до @5 От 0 дох Предназначен для окон свойств мыши, клавиатуры, энергосбережения и PCMCIA. В первом параметре задается модуль. Можно указать его имя (Mouse или Keyboard) или числовой индекс в формате @х (где х — число от 0 до 5). Имя зависит от локализован- ной версии. Второй параметр определяет страницу свойств модуля. Control.exe Main.cpl,@O,l Controlexe Main.cplplouse, 1 Mmsys.cpl @0 и @1 От 0 до х Открывает окно свойств для звука или мультимедиа. Пер- вый параметр задает окно свойств (0 = Мультимедиа; 1 = Звуки). Во втором — ука- зывается страница свойств. ControLexe Mmsys.cpl,@O, 1 Sysdm.cpl Н/п ОтОдоЗ Открывает окно свойств Sys- tem и выбирает одну из его страниц. Control.exe Sysdm.cpl„0 Timedatecpl Н/п 0 и 1 Открывает окно свойств Date/Time. Controlexe Timedate.cpl„0 «Н/п» означает «не применяется». Имена страниц свойств в разных версиях ОС могут различаться. Число страниц также непостоянно. Здесь представлены сведения для Windows 98 (большинство которых применимо в Windows 95/NT/2000).
ГЛАВА 14 Приемы программирования и советы 399 Обработка сетевых подключений методом Run Объект WshNetwork позволяет подключать/отключать сетевые устройства, такие как диски и принтеры, однако иногда изменение сетевых параметров через данный объект сопряжено с трудностями. Проще всего — вызвать ме- тод Run с командой MS-DOS Net в качестве параметра. Чтобы, например, уда- лить все сетевые подключения на компьютере, в сценарий записывается: Set objSh = WScript.CreateObject("WScript.Shell") objSh.Run "NET USE * /DELETE AES". 0, True NET USE предоставляет доступ к сетевым подключениям. Символ-замес- титель (’) указывает на все подключения, а ключ /DELETE означает удаление этих подключений. Ключ /YES освобождает вас от необходимости подтвер- ждать эти действия. ПРИМЕЧАНИЕ Чтобы получить дополнительные сведения о команде NET, введите в окне Command Prompt команду NET/? или NET USE/?. Пользовательские диалоговые окна и вывод В рассмотренных выше примерах вывод из сценариев осуществлялся в пользо- вательские диалоговые окна. Теперь мне хотелось бы дать некоторые советы по его совершенствованию. Ниже мы рассмотрим также вопросы поточного вво- да/вывода в окне Command Prompt и печать документов из WSH-сценария. Применение табуляции и концов строк Когда вы передаете некую строку в методы отображения диалоговых окон (такие как Echo и Popup) или в функции (например, MsgBox), упоминавшие- ся в предыдущих главах, строка форматируется автоматически под вывод в диалоговое окно. Добавив в эту строку символы табуляции и конца строки, можно изменить внешнее представление текста. Перевод текста в другую строку в VBScript осуществляет встроенная константа vbCrLf WScript.Echo "First line ” & vbCrLf & “Second line " В JScript нужно в строку добавить Esc-последовательность \п (новая строка): WScript.Echo("First line \nsecond line '); Чтобы текст в диалоговом окне выравнивался по столбцам, в него вводят- ся символы табуляции. В VBScript для этого предназначена именованная константа vbTab, в JScript — Esc-последовательность \t. Позиции табуляции внутри диалоговых окон фиксированы. Отображение консольного ввода и вывода Отображение консольного ввода/вывода в окне Command Prompt реализо- вано в WSH 2 свойствами потоков Stdin и StdOut. Чтобы ими воспользовать-
400 ЧАСТЬ III Особые возможности сценариев ся, нужно запустить сценарий с помощью сервера CScript.exe. (Запуск в WS- cript.exe приведет к ошибке, так как оконные приложения не поддерживают потоковый ввод/вывод.) В следующем примере с помощью методов WSH 2 осуществляется пользо- вательский ввод с командной строки и отображение введенного текста. Этот сценарий нужно запускать в CScript.exe. Для обеспечения корректности за- пуска сценарий сам запускает CScript.exe. If (Not IsCScriptO) Then Set WshShell = WScrlpt.CreateObjectC'WScript.Shell") WshShell.Run "CScript.exe " & WScrlpt.ScriptFullName WScrlpt.Quit ' Завершаем сценарий. End If Если функция пользователя IsCScript возвращает False, сценарий вызыва- ет метод Run для запуска второй копии сценария. Эта копия выполняется в CScript.exe. Вот код функции IsCScript-. Function IsCScriptO ' Проверяем, является ли CScript.exe хостом. If (InStr(UCase(WScript.FullName), "CSCRIPT”) О 0) Then IsCScript = True Else IsCScript = False End If End function Функция сравнивает строку, возвращаемую сервером, с «CSCRIPT». Эту строку возвращает свойство FullName объекта WScript. Запись в выходной поток позволяет выполнить команда: WScrlpt.StdOut.WriteLine "Please enter something" В ней используется свойство StdOut объекта WScript и вызывается метод WriteLine, отображающий переданный ему параметр в окне командной стро- ки (рис. 14-4). Рис. 14-4. Ввод в командной строке. Для считывания введенных пользователем значений из консольного вво- да служит метод ReadLine свойства Stdin объекта WScript-.
ГЛАВА 14 Приемы программирования и советы 401 tmp = WScrlpt.Stdin.Headline Введенное пользователем значение, возвращенное методом ReadLine, присваивается переменной tmp. ReadLine переводит сценарий в режим ожи- дания ввода символа «новая строка» (т. е. сценарий ждет нажатия клавиши Enter). Вот эта программа (листинг 14-7): ' Файл: StdIO.vbs (WSH 2 sample in VBScript) ' Автор: (c) G. Born ' Применение свойств WSH 2 Stdin и StdOut '******************************♦**♦********♦***** Option Explicit Dim tmp, WshShell ' Проверяем, является ли хостом CScript.exe. If (Not IsCScriptO) Then Set WshShell = WScrlpt.CreateObjectC'WScript.Shell") WshShell.Run "CScript.exe ” & WScrlpt.ScriptFullName WScrlpt.Quit ' Завершаем сценарий. End If WScrlpt.StdOut.WriteLine "Please enter something" tmp = WScrlpt.Stdin.ReadLine WScript.StdOut.WriteLine "Your input was: " & tmp WScrlpt.StdOut.WriteLine "Please press Enter" tmp = WScrlpt.Stdin.ReadLine ' Ожидаем нажатия клавиши. Function IsCScriptO ' Проверяем, является ли CScript.exe хостом. If (InStr(UCase(WScript.FullName), "CSCRIPT") <> 0) Then IsCScript = True Else IsCScript = False End If End Function ’*** Конец Листинг 14-7. StdIO.vbs. Запись в строку и чтение из строки Приведенный выше пример пишет текст в командную строку, создает новую строку и считывает вводимые пользователем данные. Обычно требуется вы- вести текст и считать вводимые данные в одной строке. Это можно сделать, заменив метод WriteLine на Write.
402 ЧАСТЬ lil Особые возможности сценариев WScrlpt.StdOut.WriteC'Enter a number> ") Этот оператор выводит текст в командную строку, оставляя курсор на ме- сте. Пользователь может ввести что-то в ту же строку окна Command Prompt. Ввод пользователя можно считать и методом Read и с помощью ReadLine. Метод Read может считать заданное число символов. Следующая коман- да запрашивает первый введенный пользователем символ, после того как он нажимает Enter: tmp = WScrlpt.Stdin.Read(1) Если пользователь ввел строку 1234{Enter}, где {Enter} — клавиша Enter, Read(1) возвращает значение 1. (Метод Read особенно удобен для чтения из файла данных полей постоянной длины.) Ниже показано применение Write и Read для обработки введенных пользователем данных и сообщений в од- ной строке (листинг 14-8). '**••••••***»»»»»»•••*******************•******** ' Файл: StdlOl.vbe (WSH 2 sample In VBScript) ’ Автор: (c) G. Born ' Применение свойств WSH 2 Stdin и Stdout '********»*************************************** Option Explicit Dim tmp, WshShell ' Проверяем, является ли сервером CScript.exe. If (Not IsCScriptO) Then Set WshShell = WScrlpt.CreateObjectC'WScript.Shell") WshShell.Run "CScript.exe ” & WScrlpt.ScriptFullName WScrlpt.Quit ' Завершаем сценарий. End If ' Записываем строку, не создавая новую строку. WScrlpt.StdOut.WriteC’Type in a three-digit number and press Enter> ") ' Применяем метод Read для получения первого введенного символа. tmp = WScrlpt.Stdin.Read(1) ' Отображаем данные. WScrlpt.StdOut.WriteLineC’The first character was ” & tmp) ' Создаем новую строку. WScrlpt.StdOut.WriteC’Type in a three-digit number and press Enter> ”) ' Получаем данные с помощью ReadLine. tmp = WScrlpt.Stdin.ReadLineO
ГЛАВА 14 Приемы программирования и советы 403 ' Показываем пользовательский ввод методом Echo. WScript.Echo "You entered", tmp WScript.Echo "Please press the Enter key to quit the script” WScript.Echo WScript.Stdin.Read(1) ' Ожидаем. Function IsCScript() ' Проверяем, является ли сервером CScript.exe. If (InStr(UCase(WScript.FullName), "CSCRIPT") <> 0) Then leCScript = True Е1ве IsCScript = False End If End Function '*** Конец Листинг 14-8. StdIOl.vbs. Конвейеризация программного вывода В окне Command Prompt механизм конвейеризации позволяет применять вывод из одной программы в качестве ввода в другой программе. Команда dir использует вывод команды как ввод для фильтра тоге-. dir *.* | more Подобная команда позволяет конвейеризовать ввод в сценарий. Допус- тим, программа StdIOFilter.vbs воспринимает поток по умолчанию в качестве ввода. Можно ввести команду, в результате которой выполняется команда dir. dir *.* | CScript.exe StdIOFilter.vbs Вывод dir станет вводом для программы-сценария. Здесь важно то, что в качестве сервера выступает CScript.exe. StdIOFilter.vbs может прочитать стан- дартный поток ввода, обработать введенную информацию и записать ре- зультат в стандартный поток вывода. Следующий код читает входной поток, вставляет первую и последнюю строки, делает все буквы прописными и за- писывает результат в стандартный поток вывода (листинг 14-9). ' Файл: StdIOFilter.vbs (WSH 2 sample in VBScript) ' Автор: (c) G. Born ' Чтение данных из входного потока и направление ' их в выходной поток **************************************************** Option Explicit Dim tmp см. след. стр.
404 ЧАСТЬ III Особые возможности сценариев ' Читаем входящий поток. tmp = WScrlpt.Stdin.ReadAll() ' Пробуем записать результат в стандартный выходной поток. WScrlpt.StdOut.WriteLineC'*** Output Filter demo ***") WScrlpt.StdOut.Write(UCase(tmp)) WScrlpt.StdOut.WriteLineC*** End of input data ***") *** Конец Листинг 14-9. StdIOFilter.vbs. ПРИМЕЧАНИЕ Для запуска StdIOFilter.vbs служит команда, показанная выше. Запустить вторую копию CScript.exe с помощью функции IsCScript нельзя: WSH не может должным образом обработать потоки ввода/вы- вода. Поточный обмен с файлами Посмотрим, как с помощью объекта Textstream сценарий считывает из тек- стового файла, обрабатывает и отображает данные. Этот пример можно за- пускать как в CScript.exe, так и в WScript.exe. В нем вызывается команда dir, которая создает список файлов каталога на диске С:\ и перенаправляет вы- вод во временный файл. Затем сценарий читает этот файл и удаляет заголо- вок, содержащий имя тома. Потом из списка убираются столбцы, содержа- щие дату и время. Результат (включая две итоговые строки) отображается в диалоговом окне. В этом простом примере показано несколько новых приемов. Во-первых, объект FileSystemObject создает временный файл во временной папке системы: Set fso = CreateObjectC'Scripting. FileSystemObject") tmp = fso.GetTempName Переменная tmp содержит имя временного файла, создаваемого ОС. За- тем вы ищете путь для папки, в которой ОС хранит временные файлы. Раз- мещение этой папки определяет метод GetSpecialFolder. path = fso.GetSpecialFolder(tmpFolder) Параметру tmpFolder нужно присвоить значение 2. ПРИМЕЧАНИЕ Значение 0 параметра tmpFolder возвращает путь для папки Windows, а 1 — размещение системной папки. Раньше я отме- чал, что системная папка зависит от ОС. В Windows 95/98 это \System, а в Windows NT/2000 — \System32. Поэтому для получения размеще- ния и имени системной папки в любой ОС достаточно подставить в GetSpecialFolder значение 1.
ГЛАВА 14 Приемы программирования и советы 405 Получив путь для временной папки, можно сформировать абсолютный путь временного файла: tmp = path & "\" & tmp В следующих операторах запускается команда dir, которая создает вре- менный файл с результатами своей работы: Set WshShell = CreateObject("WScript.Shell") WSHShell.Run "XcomspecX /с " & cmd & " >" & tmp, 0, True Переменная %comspec% содержит имя командного процессора. Во втором параметре задан О (нормальный размер окна), а в третьем — значениеГгие, означающее перевод сценария в режим ожидания завершения команды. Открывает временный файл и возвращает объект, связанный с этим фай- лом, команда: Set oFile = fso.OpenTextFile(tmp) Следующий за ней цикл пропускает первые четыре строки файла: For 1 = 1 to 4 oFile.SkipLine Next Затем остальная часть файла считывается в строковую переменную txt-. txt = oFile.ReadAll Прочитав файл, вы можете его закрыть и удалить: oFile.Close fso.DeleteFile tmp Переменная txt содержит весь файл в одной строке. Если вы хотите об- работать это содержимое построчно, вызовите функцию Split-. lines = Split(txt, vbCrLf) Она превращает строку в массив с помощью разделителя, указанного во втором параметре, — и можно обращаться к строкам, как к элементам мас- сива: lines(O), lines(l) и т. д. Позже можно объединить массив в одну строку командой: txt = Join(lines, vbCrLf) Функция Join вставляет шаблон, указанный во втором параметре, в конец каждого элемента и записывает результат в строку. Сценарий на VBScript (лис- тинг 14-10) выводит два диалоговых окна: в первом отображается исходный вывод команды dir, во втором — отфильтрованные данные (без дат и времени). ’************************************************ ' Файл: Pipe.vbs (WSH 2 sample in VBScript) ' Автор: (c) G. Born см. след. стр.
406 ЧАСТЬ III Особые возможности сценариев ' Обмен данными между командой MS-DOS и сценарием ' посредством временных файлов Option Explicit Const cmd = "dir c:\*.* /ON" ' Команда, которую нужно выполнить. Const tmpFolder = 2 ’ Временная папка системы. Dim WshShell, fso, oFile, tmp, path, txt, lines, i ’ Создаем FileSystemObject. Set fso = CreateObject("Scripting.FileSystemObject") ' Запрашиваем имя временного файла. tmp = fso.GetTempName ' Получаем путь для временной папки системы. path = fBo.GetSpecialFolder(tmpFolder) tmp = path & "\" & tmp ' Формируем имя временного файла. Теперь у нас есть временный файл. Создаем объект WshShell... Set WshShell = CreateObjectC'WScript.Shell”) ' ...и запускаем команду MS-DOS, которая ' направляет вывод во временный файл. WSHShell.Run "ХсотвресХ /с " & cmd & ” >" & tmp, 0, True ' Команда MS-DOS завершилась. Во временном файле ’ теперь содержится вывод команды dir. ' Считываем содержимое файла. Set oFile = fso.OpenTextFile(tmp) ' Пропускаем первые строки. For i = 1 to 4 oFile.SkipLine Next txt = oFile.ReadAll ' Остальная часть файла oFile.Close fso.DeleteFile tmp ' Удаляем временный файл. WScript.Echo txt ' Показываем содержимое. ' Здесь мы пробуем обработать полученные данные. ' Сначала превращаем все строки в массив. lines = Split(txt, vbCrLf) ’ Не обрабатываем две последних строки. For i = 1 to UBound(lines) - 3 llnes(i) = Mid(lineB(i), 40) ' Отбрасываем даты и время. Next
Г Л А В A 14 Приемы программирования и советы 407 ' Объединяем массив данных в одну строку и отображаем ее на экране. MsgBox Join(lines, vbCrLf) *** Конец Листинг 14-10. Pipe.vbs. Регистрация вывода из сценария Для регистрации вывода из сценариев в файл служит метод LogEvent объек- та WshShell (предоставляемый WSH 2). Он добавляет данные в журнальный файл. В Windows NT/2000 запись осуществляется в журнал системы; его мож- но просмотреть в Event Viewer (рис. 14-5). Рис. 14-5. Просмотр записи в журнале с помощью Event Viewer. В Windows 95/98 событие добавляется в файл WSH.log, который находит- ся в папке Windows пользователя. Его элементы представляют собой записи даты, времени и типа события, а также текст, передаваемый методу LogEvent. Вызвать метод можно так: Set WshShell = WScrlpt.CreateObjectC'WScript.Shell") flag = WshShell.LogEvent(INFORMATlON, Text) Методу LogEvent объекта WScriptShell нужно передать два параметра: пер- вый определяет тип события и принимает значения от 0 до 16, второй со- держит текст, записываемый в журнал. В случае успеха метод возвращает True, в противном случае — False. Рассмотрим небольшую программу на VBScript, которая при каждом вхо- де пользователя в систему записывает в журнал дату, время, имя компьюте- ра, имя домена и имя пользователя. Сначала нужно собрать нужную инфор-
408 ЧАСТЬ III Особые возможности сценариев мацию, взяв ее из свойств объекта WshNetwork и записав полученные данные в текстовую переменную: Text = Date & " ” & Time & Computer: " & WshNetwork.ComputerName & vbTab Text = Text & "Domain: " & _ WshNetwork.UserDomain & vbTab User = WshNetwork.UserName ' Инициализируем значение. Do While User = "" ' Запускаем цикл для получения имени пользователя. WScript.Sleep 200 ' Пауза позволяет снизить нагрузку на ЦП. User = WshNetwork.UserName ' Считываем свойство. Loop Text = Text & "User: " & User & vbTab Поскольку этот пример имеет смысл лишь в Windows 95/98 (Windows NT/ 2000 по умолчанию регистрируют вход пользователя), я применил методи- ку, описанную в главе 11, позволяющую получить имя пользователя из свой- ства UserName. Записать полученную строку позволяет следующий код: WshShell.LogEvent INFORMATION, Text Этот вызов не возвращает никакого значения, поскольку мы имеем дело с вызовом процедуры. Как же сделать так, чтобы Windows 95/98 выполняли этот сценарий при каждом входе пользователя в систему? Добавим коман- ду, состоящую из полного имени сценария, в параметр UserLog следующего раздела системного реестра: HKLM\Software\MicroBoft\Windows\CurrentVerBion\Run Содержимое этого раздела обрабатывается при каждом входе пользова- теля в систему. Следующий сценарий добавляет команду в раздел Run (лис- тинг 14-11). Для включения режима автоматической регистрации пользова- телю нужно запустить этот сценарий только раз. Удалить из реестра эту за- пись позволяют System Policy Editor, Registry Editor или System Configuration Utility (в Windows 98). Файл: UserLog.vbs (WSH 2 sample in VBScript) Автор: (c) G. Born Запись имени пользователя методом WSH 2 LogEvent. В раздел Run добавляется сценарий, фиксирующий вход пользователя в Windows 95/98. Option Explicit Const SUCCESS = 0 Const ERROR = 1 Const WARNING = 2
ГЛАВА 14 Приемы программирования и советы 409 Const INFORMATION = 4 Const AUDIT-SUCCESS = 8 Const AUDIT_FAILURE = 16 Dim Text, User Dim WshNetwork, WshShell ' Переменная-объект. ' Создаем ссылку на объект WshShell. ' (необходимую для доступа к реестру и методу EventLog). Set WshShell = WScrlpt.CreateObjectC'WScript.Shell") ' Добавляем сценарий в раздел Run, чтобы он выполнялся ' при каждом входе в систему. AddRun ' Создаем объект WshNetwork для доступа к свойотвам сети. Set WshNetwork = WScript.CreateObjectC'WScript.Network") Text = Date & ” " & Time & Computer: ” & _ WshNetwork.ComputerName & vbTab Text = Text & "Domain: " & _ WshNetwork.UserDomain & vbTab User = WshNetwork.UserName ' Инициализируем значение. Do While User = "" ' Цикл получения имени пользователя. WScrlpt.Sleep 200 ' Пауза для снижения нагрузки на ЦП. User = WshNetwork.UserName ' Считываем свойство. Loop Text = Text & "User: " & User & vbTab ' Делаем запись в журнал. Возвращаем True (успешно) или False (неуспешно). If WshShell.LogEvent(INFORMATION, Text) Then ' Удалите, если не желаете показывать результат. WScript.Echo "Log Event written" & vbCrLf & Text ' Показываем результат. Е1ве WScript.Echo "LogEvent method failed in UserLog.vbs” End If Sub AddRun() ' Добавление пакетного файла для запуска сценария ' в раздел Run системного реестра. Dim Command Const Root = "HKEY-LOCAL-MACHINE" Const key = "\Software\Microsoft\Windows\CurrentVersion\Run\” Const valname = "UserLog" см. след. стр.
410 ЧАСТЬ III Особые возможное™ сценариев Command = WScript.ScriptFullName WshShell.RegWrite Root & Key & valname, Command, ”REG_SZ" End Sub '*** Конец Листинг 14-11. UserLog.vbs. Печать из WSH-сценария WSH не имеет поддержки печати, так как печать в Windows задача не три- виальная. Единственный способ запустить печать из сценария — переложить эту задачу на приложение. Для печати обычного текстового файла мож- но воспользоваться редактором Notepad.exe. Он «понимает» ключ /р, по- зволяющий распечатать текстовый файл и закрыть редактор по заверше- нии печати: Notepad /р C:\Test\Text.txt Эта команда запускает Notepad, передавая ему параметры в командной строке. Найдя в командной строке имя файла, редактор пытается его загру- зить. Обнаружив ключ/0, редактор направляет файл на принтер по умолча- нию. По завершении печати Notepad заканчивает работу. Следующий фрагмент, взятый из PrintTxtvbs, применяет эту методику для печати исходного текста сценария: Set oWshShell = WScript.CreateObjectC’WScript.Shell”) ' Запускаем команду для печати с помощью Notepad. oWshShell.Run "Notepad /р " & WScript.ScriptFullName, 7, True В первой строке создается экземпляр объекта WshShell, необходимый для метода Run. Второй оператор содержит команду запуска Notepad и последу- ющей печати заданного текстового файла. Для вставки имени текущего фай- ла сценария применяется свойство ScriptFullName. Второй параметр метода Run равен 7, чтобы окно Notepad при запуске не отображалось на рабочем столе. Значение True последнего параметра указывает на то, что сценарий ожидает завершения метода Run. Это решение годится для обычных текстовых файлов, но неприменимо для изменения параметров принтера. Чтобы запустить диалоговое окно Print (в Windows 2000) и разрешить пользователю выбрать другой принтер и на- строить его, используйте такой код: Set oWshShell = WScript.CreateObject("WScrlpt.Shell") ’ Команда для печати исходного текста с помощью MSHTML. oWshShell.Run ’RunD1132.exe MSHTML.dll,PrintHTML ” & _ WScrlpt.ScriptFullName, 7, True
ГЛАВА 14 Приемы программирования и советы 411 ' Команда для печати HTML-документов с помощью MSHTML. oWehShell.Run "RunD1132.exe MSHTML.dll,PrintHTML " & _ GetPathO & "TestForm.htm", 7, True В первой строке создается экземпляр объекта, необходимый для метода Run. В двух следующих операторах вызывается метод Run. Первый распечатывает исходный текст сценария, а второй — HTML-документ. В обоих операторах вызывается вспомогательная DLL с помощью RunD1132.exe MSHTMLdll экспор- тирует функции, которые можно вызывать из внешних программ. Одна из них — PrintHTML. (Помните о регистре букв.) Эта API-функция берет пара- метр из командной строки, содержащий имя файла документа. Функция вы- водит на экран диалоговое окно Print. Пользователь может выбрать принтер, задать нужные параметры печати и отправить документ на печать. ПРИМЕЧАНИЕ Пример PrintDocs.vbs позволяет напечатать текстовые файлы, HTML-документы и документы в формате RTF. Файлы других форматов, таких как .gif или .pdf, MSHTML напечатать не может. Для печати документов Microsoft Office используйте приложения Office. Они, правда, не «понимают» ключ /р, но поддерживают СОМ-интер- фейсы, благодаря чему можно получить доступ к объектам и методам. Все приложения Office имеют методы для печати документов. Я тоже написал элемент управления ActiveX, предоставляющий методы для печати документов с помощью оболочки Windows. (Подробности см. в Advanced Development with Microsoft Windows Script Host 2.0.) Работа с файлами В этом разделе описаны некоторые приемы программирования, предназна- ченные для работы с файлами и папками. Проверка наличия файла или папки Наличие файла можно определить методом FUeExists объекта FileSystemObject-. Set feo = CreateObject("Scriptlng.FileSystemObject") If (fso.FileExiBtB("C:\Autoexec.bat") Then Если файл существует, FUeExists возвращает значение True. Наличие папки определяет метод FolderExists-. Set feo = WScrlpt.CreateObject("Scrlpting.FileSystemObjeot") If (fso.FolderExlsts(path)) Then Дополнительную информацию по этой теме см. в главе 12. Проверка наличия файлов в папке Определить, пустая папка или нет, можно так:
412 ЧАСТЬ III Особые возможности сценариев Function FolderEmpty(path) ' Определение наличия файлов в папке. Dim fso, oFolder, oFiles ' Переменная-объект. Dim i, flag Set fso = CreateObjectC'Scripting. FileSystemObject") Set oFolder = fBo.GetFolder(path) ' Получаем папку. Set oFiles = oFolder.Files ' Получаем набор Files. flag = True For Each i in oFiles flag = false Exit For Next FolderEmpty = flag End Function ' Нет файлов. ' При обнаружении файла ' попадаем в тело цикла. ’ Возвращаем результат. Если папка пуста, FolderEmpty возвращает значение True. Дополнительную информацию по этой теме см. в главе 12. Проверка, используется ли база данных Access Чтобы получить доступ к базе данных Microsoft Access и убедиться, 4To.mdb- файл не открыт другим экземпляром Microsoft Access, нужно проверить су- ществующий файл. Открывая БД, Microsoft Access 97 автоматически создает .ldb-файл. Этот файл удаляется, как только Microsoft Access освобождает БД. Вы можете проверить наличие .ldb-файла, чтобы узнать, занята БД или нет. Следующая программа проверяет, имеется ли в папке .mdb-файл и существу- ет ли .ldb-файл (листинг 14-12). Результат проверки отображается в диало- говом окне. *************************************************** ' Файл: MDBOpen.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Проверка, занята ли база данных Microsoft Access 97 'А************************************************* Option Explicit Dim fso, path, txt ' Получаем путь для файла базы данных. ’ Он должен находиться в той же папке, что и сценарий. path = WScript.ScriptFullName path = Left(path, InStrRev(path, "\")) txt = "Database file doesn't exist" Set fso = WScript.CreateObjBctC'Scripting.FileSystemObject")
ГЛАВА 14 Приемы программирования и советы 413 If (fso.FileExists(path & "TeBt1.mdb")) Then ' Существует? If (fso.FileExists(path & "Testi.Idb")) Then txt = "Database locked by Access” Else txt = "Database not locked" End If End If WScript.Echo txt '*** Конец Листинг 14-12. MDBOpen.vbs. ПРИМЕЧАНИЕ Для проведения проверки вам нужно скопировать и MDBOpen.vbs и БД Microsoft Access 97 Testl.mdb из папки \WSHDev- Guide\Chapter 14 в локальную папку. Этот тест проходит и для Microsoft Access 2000. Копирование файла Для копирования файла можно применить объект File. Создав объект File- SystemObject, вы получите доступ к файлу с помощью методов GetFile и Сору. Set fso CreateObject("Scripting.FileSystemObJeot") Set fi « fso.GetFile(filel) ' Создаем объект файл. fi.Copy file2 ' Копируем filel в files. ПРИМЕЧАНИЕ О файлах и папках см. также главу 12. Изменение имени файла или папки Объект File позволяет переименовать файл: Set fso = CreateObject("Soripting.FileSystemObject") Set oFile = fso.GetFile("C:\TeBt.txt") ' Создаем объект файл. oFile.Name = "Test1.txt" ' Присваиваем новое имя. После получения объекта File атрибуту Name присваивается новое имя. Изменение имени папки происходит аналогичным образом: Set fso = CreateObject("Scripting.FileSystemObject") Set oFolder = fso.GetFolder("C:\Test") ' Создаем объект папка. oFolder.Name = "Testi" ' Присваиваем новое имя. Когда объект Folder получен, атрибуту Name присваивается новое имя. Другой способ переименования состоит в обращении к методу Move объек- та FileSystemObject, как показано в примере на VBScript (листинг 14-13). Эта программа изменяет регистр всех букв в имени заданного файла. Пользова- тель может перетащить файлы или папки на файл LCase.vbs. В именах всех обработанных объектов будут только строчные буквы.
414 ЧАСТЬ III Особые возможности сценариев *************************************************** ' Файл: LCase.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Преобразование регистра букв в именах папок и файлов ' (в строчные буквы). Сценарий поддерживает drag-and-drop. Option Explicit ' Устанавливаем направление преобразования регистра для модуля. ' Если xCase равно false, сценарий делает буквы строчными. 'Const xCase = True ' Хотим сделать буквы прописными. Const xCase = False ’ Хотим сделать буквы строчными. Const Title = "Lowercase converter - by G. Born" Dim objArgs, param, i ' Пробуем получить аргументы. Set objArgs = WScript.Arguments ' Создаем объект. If objArgs.Count < 1 Then ' Аргументов нет. ' Выводим диалоговое окно и завершаем работу. МвдВох "Sorry, по arguments found!" & vbCRLF & _ "Please drag file(e) or folder(B) to the script's icon.”, vblnformation + vbOKOnly, Title WScrlpt.Quit ' Завершаем сценарий! End If 1 = 0 ' Преобразуем регистр букв; подсчитываем каждое действие. For Each param In objArgs If MakeCase(param, xCase) Then 1 = 1+1 Next MsgBox i & " object(s) converted", vblnformation + vbOKOnly, Title Function MakeCase(file, caseFlag) Dim fso, oFile, path, name Set feo = CreateObject("Scrlpting.FileSystemObject") If fso.FileExists(flle) Then Set oFile = fso.GetFile(flle) Else If fso. FolderExists(file) Then Set oFile = fso.GetFolder(file) Else MakeCase = False ' Нет объекта "файл". Exit Function End If End If
ГЛАВА 14 Приемы программирования и советы 415 name = fso.GetFileNamB(file) path = feo.GetParentFolderName(file) If caseFlag Then oFile.Move path & "\" & UCase(name) Else oFile.Move path & "\" & LCase(name) End If Set feo = Nothing MakeCase = True End Function '*** Конец Листинг 14-13. LCase.vbs. ПРИМЕЧАНИЕ LCase.vbs позволяет создать имя файла или папки, со- стоящее из прописных букв. Для этого достаточно присвоить True пе- ременной xCase. О файлах и папках см. также главу 12. Поиск файла Поиск файла осуществляет объект FileSystemObject и его подобъекты для по- лучения папки и вложенных в нее папок. Вы должны составить код для об- работки содержимого папки и поиска в ней требуемых файлов. Чтобы по- лучить список вхождений нужного файла, запустите команду MS-DOS DIP методом Run-. DIR filename /s > LiBt.txt Затем доступ к файлу List.txt можно получить через объект TextStream и его методы. Составление списка всех файлов-ярлыков Я написал на VBScript небольшую программу поиска ярлыков (.Ink-файлов), находящихся в специальных папках (Desktop, Start menu и т. п.). Она извле- кает имена этих папок через свойство SpecialFolders, возвращающее объект^ набор. Элементы в этом наборе позволяют получить набор Files, находящий- ся в папке. Является ли файл ярлыком, проверяет оператор: InStrRev(UCase(name), ".LNK") Функция возвращает значение, отличное от О, если файл имеет расширение .Ink. Следующая программа (листинг 14-14) ищет в специальных папках .Ink- файлы и отображает результаты поиска в окне браузера (рис. 14-6).
416 ЧАСТЬ III Особые возможности сценариев Ц Shortcut Же» - Miciosoh Internet Explorer (Worthing Otfhnel Й Shortcuts in: F:\Documents and SettingsVAll UsersVDesktop ; F:VDocuments and SettingsVAll UsersVDesktopVPrimalSCRXPT.lnk F.VDocuments and SettingsVAll UsersVDesktopVAcrobat Reader 4.0.Ink Shortcuts in: F:\Documents and SettingsVAll UsersVStart Menu •i F:\Documents and SettingsVAll UsersVStart MenuVWindows Update.lnk ; j | F.VDocuments and SettingsVAll UsersVStart MenuVNew Office Document.lnk \ F.VDocuments and SettingsVAll UsersVStart MenuVOpen Office Document.lnk £ I * i Shortcuts in: F:\Documents and SettingsVAll UsersVStart MenuVFrograms > I F.VDocuments and SettingsVAll UsersVStart MenuVProgramsVMicrosoft Word.Ink ® t FADocuments and SettingsVAll UsersVStart MenuVProgramsVPrimalSCRIPT.Ink 'i F:\Documents and SettingsVAll UsersVStart MenuVProgramsVMicrosoft Access.lnk j j F VDocuments and SettingsVAll UsersVStart MenuVProgramsVMicrosoft Excel Ink : j|| I F:\Documents and SettingsVAll UsersVStart MenuVProgramsVMicrosoft Outlook.lnk ДI 1 F:\Documents and SettingsVAll UsersVStart MenuVProgramsVMicrosoft PowerPoint.lnk j ..............................................................................,и Рис. 14-6. Список файлов-ярлыков. Файл: ListShortcutB.vbs (Пример для WSH на VBScript) Автор: (с) G. Born Создание списка всех файлов-ярлыков в специальных папках Option Explicit Const Title = "Shortcut files" Dim WshShell Dim fso, fi, fc, f Dim text, syef, fldr set WshShell = WScript. CreateObjectC’WScript. Shell") set fso = WScript.CreateObject("Scripting.FileSystemObject") text = ”” For Each sysf in WshShell.SpecialFoldere text = text & "<b>ShortcutB in: " & eysf & "</bxbr>" Set fldr = fso.getfolder(sysf) Set fc = fldr.files For Each f In fc If IsLnk(f) Then text = text & f & ”<br>" Next text = text & ”<br>” Next ShowHSIE text, Title ’ Выводим элементы списка в окне браузера. ’ Вспомогательная функция.
ГЛАВА 14 Приемы программирования и советы 417 Function IsLnk(name) ' Проверяем, является ли файл ярлыком (.Ink-файлом). IsLnk = (InStrRev(UCase(name), ”.LNK") о 0) End Function Sub ShowMSIE(txt, title) Dim oIE, oDoc ' Создаем объект приложения Internet Explorer. Set oIE - WScrlpt.CreateObject("InternetExplorer.Application") ' Устанавливаем параметры окна браузера. oIE.left = 20 ' Расположение окна oIE.top =50 'и другие свойства. oIE.height = 380 oIE.width = 580 oIE.menubar = 0 ' Без меню. oIE.toolbar = 0 oIE.statusbar = 0 oIE.navigate("about: blank") ' Создаем, пустой HTML-документ. oIE.visible = 1 ' Делаем Internet Explorer видимым. Do While(oIE.Busy): Loop ' Важно: Выжидаем, если Internet ' Explorer не готов. Set oDoc = oIE.Document ’ Получаем объект документ. oDoc.open ' Открываем документ. ' Записываем сценарий в объект документ. oDoc.writeln("<htmlxheadxtitle>" & title & "</titlex/head>") oDoc.writeln("<body>" & txt & "</bodyx/html>") oDoc.close ‘ Закрываем документ для доступа на запись. End Sub '*** Конец Листинг 14-14. ListShortcuts.vbs. Воспроизведение звука WSH не поддерживает воспроизведение звуковых файлов. В Advanced Deve- lopment with Microsoft Windows Script Host 2.0 я привожу методы, реализован- ные в элементе управления ActiveX для воспроизведения звука. Однако есть и другие способы воспроизвести звук в WSH-сценарии. Так, можно воспользо- ваться Windows ActiveMovie Player. Этот проигрыватель устанавливает элемент управления ActiveX с именем Amovie.ocx, который можно задействовать так: Set oWSH = WScrlpt.CreateObjectC’WScript.Shell") oWSH.Run "RunD1132.exe XWINDIRX\System\Amovie.ocx, RunDll " & ’’/play /close C:\Test\Sound.wav" Вторая команда содержит вызов программы RunDU32, которая запускает ActiveMovie Player. Параметры, переданные в командной строке, сообщают
418 ЧАСТЬ III Особые возможности сценариев проигрывателю, что надо воспроизвести звуковой файл и автоматически закрыть окно. Amovie.ocx не поставляется с Windows 2000. Вместо него в Windows 2000 есть объект Msdxm.ocx, который делает то же самое. Поэтому вполне допус- тима и такая команда: Set oWSH = WScript.CreateObject("WScript.Shell") oWSH.Run "RunD1132.exe XWINDIRX\System32\Msdxm.ocx,RunDll " & "/play /close C:\Test\Sound.wav" Она запускает Windows Media Player и воспроизводит мультимедийные файлы (звуковые и видео). Заметьте: в Windows 2000 файл находится в пап- ке \System32, а в Windows 98 — в \System. В примере на VBScript метод GetSpecialFolder объекта FileSystemObject за- прашивает путь для системной папки, а затем воспроизводится .wav-файл (листинг 14-15). ' Файл: PlaySound.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Воспроизведение звука посредством Msdxm.ocx Option Explicit Dim fso, oWSH Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set oWSH = WScript.CreateObject("WScript.Shell") oWSH.Run "RunD1132.exe " & fso.GetSpecialFolder(l) & _ "\Msdxm.ocx,RunDll ” & _ "/play /close " & _ "C:\WSHDevGuide\Chapter14\The Microsoft Sound.wav" '*** Конец Листинг 14-15. PlaySound.vbs. Воспроизведение звука с помощью Internet Explorer С помощью Internet Explorer можно воспроизводить звуковые файлы неза- висимо от платформы. Звуковой файл находится внутри HTML-файла и вос- производится в фоновом режиме, пока идет загрузка HTML-файла. Вот код для обработки такого звукового файла: <html> <head> •cbgsound src="The Microsoft Sound.wav" loop="1"> </head> <body>
ГЛАВА 14 Приемы программирования и советы 419 </body> </html> Тэг <bgsound> воспроизводит фоновые звуки. Звуковой файл задается в атрибуте src. Чтобы с помощью сценария запустить браузер, загрузить HTML- файл и воспроизвести звуковой файл, служит такой код: Set oIE = WScrlpt.CreateObject("InternetExplorer.Application") oIE.Navigate GetPathO & "Sound.htm” ' Страница HTML co звуком. Окно браузера невидимо, потому что оно нам не нужно (pIEVisible = 0 — параметр по умолчанию). Значит, не надо задавать его размеры и стиль. Двух строк, представленных здесь, вполне достаточно. Есть только одна проблема: сценарий должен закрыть браузер, но брау- зер запускается в независимом процессе, и сценарий не знает, когда закон- чится воспроизведение звукового файла. В главе 13 вы узнали, что метод Sleep позволяет приостановить сценарий на заданный промежуток времени. Так же можно остановить сценарий, пока Internet Explorer воспроизводит звуковой файл. Когда сценарий продолжит работу, он может вызвать метод Quit для завершения браузера. Однако если вы вызвали метод Sleep, пользо- ватель не сможет остановить воспроизведение звука. Лучшее решение — применить метод Popup-. oWSH.Popup "Hello, world", 10 Второй параметр сообщает методу Popup, что через 10 секунд диалого- вое окно надо закрыть. Открытое диалоговое окно тоже задерживает выпол- нение сценария, поэтому на это время программа не загружает ЦП. Чтобы прекратить воспроизведение звука, пользователь может щелкнуть кнопку ОК и закрыть диалоговое окно. После этого сценарий должен выз- вать метод Quit для браузера (как это сделать, показано ниже), который пре- рывает воспроизведение звука и завершает работу браузера. oIE.Quit Небольшая программа на VBScript (листинг 14-16) запускает Internet Explorer, загружает файл Sound.htm и задерживает выполнение сценария на заданный интервал времени. Окно браузера невидимо; пользователю откры- ваются только два диалоговых окна, одно из которых задерживает сценарий, а другое сообщает о завершении программы. ************************************************** ' Файл: PlaySoundl.vbs (Пример для WSH на VBScript) ’ Автор: (с) G. Born ' Применение Internet Explorer 4 или 5 для ’ воспроизведения звукового файла и приостановка ' сценария методом Popup ************************************************** Option Explicit см. след. стр.
420 ЧАСТЬ III Особые возможности сценариев Const delay = 10 ' Время остановки в секундах. Dim oIE, oWSH ' Объявляем переменные. Dim path ' Создаем ссылку на объект WshShell (для Popup). Set oWSH = WScript.CreateObjectC'WScript.Shell") ’ Запускаем Internet Explorer. Set oIE = WScript.CreateObject("InternetExplorer.Application") oIE.Navigate GetPath() & "Sound.htm" ' Страница HTML co звуком. oIE.Visible = 0 ' Оставляем невидимым. ' Важно: Ждем готовность IE. Do While (oIE.Busy): Цикл. ' Задерживаем на время воспроизведения звука. oWSH.Popup "Script suspended for ” & delay & " seconds" _ & vbCrLf & "because we're playing sound." & vbCrLf & _ "Click OK to cancel sound", delay, _ "Sound demo", vblnformation + vbSystemModal oIE.Quit ' Закрываем Internet Explorer. MsgBox "Finished playing sound”, vblnformation + vbSystemModal ' Вспомогательная функция. Function GetPathO ' Запрашиваем путь сценария. Dim path path = WScript.ScriptFullName GetPath = Left(path, InStrRev(path, "\”)) End Function '*** Конец Листинг 14-16. PlaySoundl .vbs. Оболочка Windows Если на компьютере установлен Internet Explorer 4 или более поздняя вер- сия, вы можете получить доступ к некоторым функциям оболочки Windows. В этом разделе я познакомлю вас с приемами использования из сценария объекта Windows Shell. ПРИМЕЧАНИЕ Приведенные здесь примеры требуют наличия обо- лочки Windows версии 4.71 или более поздней. Версия устанавливает- ся с Internet Explorer 4, если выбран параметр Active Desktop. Windows 98 поставляется с оболочкой Windows версии 4.72, a Windows 2000 использует версию 5- Только пользователям Windows 95/NT 4 нужно
ГЛАВА 14 Приемы программирования и советы 421 проверить версию Shell32.dll. Учтите-, установка Internet Explorer 5 на компьютере не обновляет оболочку. Вы должны установить Internet Explorer 4 со средством Active Desktop, а затем сделать обновление до Internet Explorer 5. Проверка версии оболочки Для проверки версии оболочки Windows вы можете воспользоваться неболь- шой программой на VBScript (листинг 14-17), которой требуется WSH 2. Пути файла Shell32.dll заданы в расчете на Windows NT/2000. Чтобы запус- тить сценарий в Windows 95/98, потребуется снять комментарий во втором операторе, в котором заданы пути для Windows 95/98. ******************************************************** Файл: GetShellVersion.vbs (WSH 2 sample in VBScript) Автор: (c) G. Born ' Получение версии' библиотечного файла ' Shell32.dll *************************************' Option Explicit Dim fso, oShell Dim file, tmp ' Переменные-объекты. ' Имя файла. ' Получение пути для Shell32.dll. ’ В Windows NT и Windows 2000 файлы находятся в file = "XWINDIRX\System32\Shell32.dll" ’ В Windows 95/98 файлы находятся в •file = "XWINDIRX\System\Shell32.dll" Set oShell = WScript.CreateObjectC’WScript.Shell") file = oShell.ExpandEnvironmentStrings(file) ' Создаем объект FileSystemObject для доступа к файловой системе. Set fso = CreateObject("Scripting.FileSystemObject") ' Проверяем наличие файла. If fso.FileExists(file) Then tmp = fso.GetFileVersion(file) ' Запрашиваем версию. If Len(tmp) > 0 Then WScript.Echo "File ” & file & vbCrLf & "Version: ” & tmp Else WScript.Echo "File " & file & vbCrLf & _ "Version: undefined" End if Else ow. след. стр.
422 ЧАСТЬ III Особые возможности сценариев WScript.Echo "File & file & not found" End If '*** Конец Листинг 14-17. GetShell Version.vbs. Упорядочение окон рабочего стола Если вы уже настроили свой рабочий стол, поместив на панель задач такие ярлыки, как Minimize АП или Tile Windows Horizontally, можно сделать так, чтобы все открытые окна папок сворачивались после запуска системы. Ав- томатизировать эту задачу позволяет WSH-сценарий и некоторые объекты, методы и свойства оболочки Windows. Сначала создадим объект Application оператором: Set Shell = WScript.CreateObjeotC'Shell.Application") Этот объект имеет следующие методы для работы с окнами на рабочем столе: MinimizeAll сворачивает все открытые окна и показывает их как кнопки на панели задач; М UndoMinimizeAll отменяет последнее действие; свернутые окна возвра- щают свой прежний вид; TileHorizontally упорядочивает все открытые на рабочем столе окна по горизонтали; TileVertically упорядочивает все открытые на рабочем столе окна по вер- тикали; П Cascadewindows располагает все открытые на рабочем столе окна кас- кадом. Следующая программа на VBScript (листинг 14-18) выводит на экран не- сколько диалоговых окон, которые спрашивают у пользователя, как распо- ложить окна на рабочем столе: по горизонтали, по вертикали или каскадом (рис. 14.7). В сценарии предусмотрена отмена функции на каждом шаге, что- бы вы могли проверить правильность работа методов. Чтобы отменить последнее действие, вы можете пойти на хитрость. После того как окна расположились согласно, например, методу TileVertically, вы можете отменить это действие методом UndoMinimizeAll (хотя из имени ме- тода следует, что отмене подлежит другое действие).
ГЛАВА 14 Приемы программирования и советы 423 Рис. 14-7. Манипуляция окнами на рабочем столе с помощью WSH-сценария. Файл: Shell.vbs (Пример для WSH на VBScript) Автор: (с) G. Born к оболочке Windows из WSH-сценария; Доступ свертывание и упорядочение окна на рабочем столе по вертикали и по горизонтали Option Explicit Dim Shell, Title Title = "WSH sample - by G. Born" ' Создаем объект Shell. Set Shell = WScript.CreateObject("Shell.Application") If (MsgBox("Minimize all windows?", vbYesNo + vbQuestion, Title) = vbYes) Then Shell.MinimizeAll ‘ Метод MinimizeAll. WScript.Echo "Undo minimize all. " Shell.UndoMinimizeAll ' Восстанавливаем прежний вид окон. End If If (MsgBox("Tile windows vertically?", см. след. cmp.
424 ЧАСТЬ III Особые возможности сценариев vbYesNo + vbOuestion, Title) = vbYes) Then Shell.TileVertically ' По вертикали. WScript.Echo "Undo tile vertically." Shell.UndoMinimizeAll ' Восстанавливаем прежний вид окон. End If If (MsgBox("Tile windows horizontally?", vbYesNo + vbQuestion, Title) = vbYes) Then Shell.TileHorizontally WScript.Echo "Undo tile horizontally." Shell.UndoMinimizeAll ’ Восстанавливаем прежний вид окон. End If If (MsgBox("Cascade all windows?", vbYesNo + vbQuestion, Title) = vbYes) Then Shell.Cascadewindows WScript.Echo "Undo cascade windows." Shell.UndoMinimizeAll ' Восстанавливаем прежний вид окон. End If WScript.Echo "Ready?" '*** Конец Листинг 14-18. Shell.vbs. Открытие окон папок Методом Run можно запустить Windows Explorer и отобразить в нем окно папки. Другой способ открытия папки в режиме Shell (одна панель) или ре- жиме Explorer (две панели) — вызвать методы Open и Explore объекта Shell. Оба требуют в качестве аргумента путь для нужной папки. Ниже (листинг 14- 19) с помощью этих методов мы откроем в Windows Explorer папку Windows, а затем подкаталог \System в качестве окна папки (в режиме Shell). ************************************************ ' Файл: ShelH.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ’ Получение доступа к оболочке Windows и ’ открытие окна папки Option Explicit Dim Shell, wsh, Title, path Title = "WSH sample - by G. Born" ’ Создание объекта WshShell.
ГЛАВА 14 Приемы программирования и советы 425 Set wsh = WScript.CreateObject ("WScript.Shell") ' Каталог Windows. path = wsh.ExpandEnvironmentStringsC'XWINDIRX") ' Создание объекта Application оболочки Windows. Set Shell WScript.CreateObject ("Shell.Application") ' Открытие папки в окне Explorer (Проводника). WScript.Echo "Windows Explorer folder" ’ Этот оператор запускает Explorer с деревом папок, ’ начинающегося с указанного пути. ' (то же, что и wsh.Run "explorer.exe /e,/root," & path). Shell.Explore path ’ Показываем папку в окне оболочки. WScript.Echo "Open Windows folder \System" Shell,Open path & "\Systsm" WScript.Echo "Ready?" '*** Конец Листинг 14-19. ShelH.vbs. Доступ к диалоговым окнам оболочки Windows Оболочка Windows снабжена интегрированными диалоговыми окнами, та- кими как Run, Find и Date/Time, которые можно вывести из панели задач или из меню Start. Кроме того, оболочка предоставляет интерфейс Automation, доступный из сценария. Следующая команда получает экземпляр объекта оболочки Windows: Set oShell = WScript.CreateObject("Shell.Application") Методы объекта Shell выводят на экран эти диалоговые окна или открыва- ют папку Control Panel и окна свойств в Control Panel. Доступ к Control Panel осуществляет метод ControlPanelltem: oShell.ControlPanelltem В качестве параметра ему можно передать имя запрашиваемого модуля (например, Desk.cpl). Если параметра нет, открывается панель управления. Чтобы открыть, например, диалоговое окно Run, достаточно вызвать ме- тод FileRun объекта Windows Shell. Следующий оператор открывает диалого- вое окно Run и отображает последнюю введенную команду: oShell.FileRun
426 ЧАСТЬ III Особые возможности сценариев Для открытия диалогового окна Find, предназначенного для поиска фай- лов и папок, служит оператор: oShell.FindFiles Открыть диалоговое окно для поиска компьютера, позволяет метод: oShell.FindCompute г Если вам требуется изменить текущую дату или время, откройте соответ- ствующую страницу свойств методом: oShell.SetTlme Я уже говорил о приемах завершения работы Windows 95/98. У объекта Shell тоже есть два метода, приостанавливающих ПК (активизируя режим энергосбережения) или завершающих систему. Следующая команда включа- ет режим Suspend. (Результат работы метода Suspend зависит от конкретно- го компьютера и его среды.) oShell.Suspend А эта команда активизирует диалоговое окно Shut Down Windows (рис. 14-8): Shell.Shutdownwindows Рис. 14-8. Диалоговое окно Shut Down Windows. Следующая программа на VBScript выводит несколько упомянутых выше диалоговых окон (листинг 14-20). Файл: Shell2.vbs (Пример для WSH на VBScript) Автор: (с) G. Born ' Получение доступа к оболочке Windowe и вывод на экран ' некоторых диалоговых окон '«******«*«««************************************ Option Explicit
ГЛАВА 14 Приемы программирования и советы 427 Dim Shell, wsh, Title, path Title = "WSH sample - by G. Born" ' Создаем объект WshShell. Set wsh = WSoript.CreateObject ("WScrlpt.Shell”) ’ Создаем объект оболочки Windows Application. Set Shell = WScrlpt.CreateObject ("Shell.Application") ’ Выводим папку Control Panel. If (MsgBox(“Open Control Panel?", vbYesNo + vbQuestion, Title) = vbYee) Then Shell.ControlPanelltem ..... Без аргументов. End If ' Пробуем открыть модуль Desk.cpl. If (MsgBox(“Show display properties?", _ vbYesNo + vbQuestion, Title) = vbYes) Then Shell.ControlPanelltem "Desk.cpl” End If ' Выводим диалоговое окно Run. If (MsgBox("Open Run dialog box?", vbYesNo + vbQuestion, Title) = vbYes) Then Shell.FileRun End If ' Выводим диалоговое окно Search Files. If (MagBox("Open Find: All Filea dialog box?", vbYesNo + vbQuestion, Title) = vbYes) Then Shell.FindFiles End If * Выводим диалоговое окно Search Computers. If (MsgBoxCOpen Find: Computer dialog box?", vbYesNo + vbQuestion, Title) = vbYes) Then Shell.FindComputer End If ’ Выводим страницу свойств Date/Time. If (MsgBox("Change date/time?", vbYesNo + vbQuestion, Title) = vbYes) Then Shell.SetTime End If ’ Включаем режим Suspend. If (MsgBox("Suspend Windows?", см. след. стр.
428 ЧАСТЬ III Особые возможности сценариев vbYesNo + vbQuestion, Title) = vbYes) Then Shell.Suspend End If ' Выводим диалоговое окно Shut Down Windows. If (MsgBox("Open Shut Down Windows dialog box?", vbYesNo + vbQuestion, Title) =» vbYes) Then Shell.Shutdownwindows End If '*** Конец Листинг 14-20. Shell2.vbs. Подключение телефонных соединений WSH-сценарий позволяет подключить телефонные соединения (dial-up net- working — DUN). WSH не имеет объекта для прямого доступа к этой функ- ции, поэтому вы должны, прибегнув к некоторой уловке, запросить подклю- чение DUN методом Run объекта Shell. И опять вам придется выполнить RunDll32.exe следующей командой (в Windows 95/98): XWINDIRX\RunD1132.exe rnaui.dll.RnaDial name %WINDIR% — шаблон для папки Windows. В пате указывается нужный элемент из вашей папки DUN (например, CS3 Connection). Команду можно проверить, запустив диалоговое окно Run. (Выберите Run в меню Start.) Сле- дующая программа на VBScript подключается к DUN посредством соедине- ния с CompuServe (листинг 14-21). ************************************************* ' Файл: DUN.vbs (Пример для WSH на VBScript) ' Автор: (с) G. Born ' Выполнение телефонного подключения (DUN) Option Explicit Dim wsh Set wsh = WScript.CreateObject("WScript.Shell") wsh.Run "XWINDIRX\RunD1132.exe rnaui.dll.RnaDial CS3 Connection”, 1, True WScript.Echo "Ready" *** Конец Листинг 14-21. DUN.vbs.
ГЛАВА 14 Приемы программирования и советы 429 ВАЖНО При запуске телефонного соединения в Windows NT эта ко- манда выглядит иначе. Создайте ярлык для записи DUN, а затем выпол- ните команду objRun <-Rasphone.exe -txxx», 1, True, где xxx — имя фай- ла-ярлыка для упомянутой записи. Дополнительное управление телефонными соединениями или Dial-Up Networking Monitor в Windows NT (чтобы, например, дать отбой) обеспечи- вает элемент управления ActiveX, предоставляющий объекты и методы для доступа к Remote Access Service (RAS) или Winsock/TCP/IP. Ниже приведен список Web-узлов, с которых можно загрузить такие элементы управления ActiveX, и примеры их использования (табл. 14-3)- Табл. 14-3. Web-узлы с элементами управления ActiveX для получения доступа к RAS и DUN. Web-узел Описание http://www.catalyst.com Узел Catalyst Development Corporation. Предлагает SocketTools, элемент управления ActiveX для про- граммирования Windows Sockets, и информацию о программировании TCP/IP. http://www.voidpointer.com Узел Voidpointer, LLC. Предлагает Script Driven Internet (SDI32), средство автоматизации задач для Интернета (таких как FTP и e-mail) из сценариев. http://cwashingtonjtetreach.net Раздел копирования узла С. Washington. Содержит элементы управления ActiveX и примеры получения доступа к RAS и DUN. http://factoryglazier.co.nz Узел Factory Software Components. Содержит полез- ные элементы управления ActiveX. http://www.mvps.org/ccrp/ Узел Common Controls Replacement Project.
ЧАСТЬ I V ПРИЛОЖЕНИЯ
ПРИЛОЖЕНИЕ А Ресурсы WSH в Интернете На приведенных ниже Web-узлах вы найдете информацию и инструменты, относящиеся к WSH и программированию сценариев. Адрес Описание news://microsoft.publicscripting.wsh Международные группы новостей по WSH, news://microsoft.publicscripting.vbscript news://microsoft.publicscripting.jscript VBScript и JScript. msdn.microsoft.com/scripting Web-узел сценариев Microsoft: последние вер- сии и средства WSH, документация по WSH, JScript, VBScript и т. д. www.windows-script.com Один из самых посещаемых программистами сценариев Web-узел, созданный Яном Морри- шем (Ian Morrish): раздел FAQ по WSH, раздел загрузки, примеры кода, группа обсуждений и т. д. Ян — один из первых участников групп новостей по WSH. cwashington.netreach.net Эту (одну из самых посещаемых) страницу, посвященную сценариям для Win32, поддер- живает активный участник групп новостей по WSH Си Вашингтон (С. Washington). Здесь есть множество сценариев на разных языках про- граммирования. www.bomcity.de Мой личный сайт WSH Bazaar: примеры, во- просы, учебники по созданию элементов управления ActiveX, письма и список адресов других Web-узлов, связанных с WSH. wwwsapien.com Web-узел SAPIEN Technologies, Inc.: здесь мож- но приобрести редактор сценариев Primal- SCRIPT или скопировать пробную версию PrimalSCRIPT.
ПРИЛОЖЕНИЕ Б Безопасность сценариев Первоначально в WSH не было механизмов защиты от выполнения WSH- сценариев из ненадежных источников. Это ввело многих пользователей в заблуждение, что защитить систему от вирусов, распространяемых WSH-сце- нариями, нельзя. Механизмы защиты (хотя и не всегда защищающие «от ду- рака» или от слишком легкого доступа) от случайного заражения вирусами, находящимися во вложениях электронной почты, есть во всех 32-разрядных ОС Microsoft Windows. В этом приложении описаны методики, позволяющие повысить безопасность работы WSH-сценариев. Частичная блокировка WSH В Windows 95/98 можно частично заблокировать WSH (а это все-таки луч- ше, чем совсем отказаться от WSH), чтобы вирус не смог благодаря стандар- тным настройкам Windows запустить WScript.exe или CScript.exe. Частичная блокировка WSH достигается путем изменения имен файлов WScript.exe и CScriptexe, находящихся в системной папке (\System или \System32), скажем, на CScriptexe и WScript.exe. При попытке выполнить файл с расширени- ем .vbs или .js программа прерывается и сообщает, что выполняемый файл не найден и поэтому не может быть выполнен. Достоинство этого решения в том, что опытный пользователь может ра- ботать с WSH, указывая явно выполняемый модуль, например: _WSc ript.ехе <путь>\вс rlpt_flie Если файл WScript.exe существует и путь для файла сценария указан пра- вильно, Windows запустит сервер, и сценарий будет выполнен. ВНИМАНИЕ Этот прием годится для Windows 95/98. Однако когда вы переименуете первый файл в Windows 2000, диалоговое окно сооб- щит, что важный системный файл отсутствует и вы можете восстано- вить систему с компакт-диска Windows. (Копия исходных файлов на- ходится также в DLL-кэше.) В следующем разделе описан более удач- ный способ защиты WSH.
434 ЧАСТЬ IV Приложения Предотвращение автоматического выполнения сценариев WSH Параметры Windows по умолчанию разрешают выполнение файла-сценария WSH из оболочки — т. е. когда пользователь дважды щелкает файл сценария, активизируется команда Open. Иной способ предотвращения случайного заражения системы вирусами из WSH-сценария состоит в том, чтобы забло- кировать вызов команды Open. Измените действие Open так, чтобы вместо запуска сценария эта команда загружала исходный код в редактор Notepad. Если для просмотра вложений в электронной почте или в Internet Explorer пользователь случайно выберет команду Open, щелкнув команду загрузки, вирус в сценарии выполняться не станет. Вместо этого исходный код загру- зится в Notepad. ПРИМЕЧАНИЕ Если пользователь сохранит зараженное вложение и запустит его вручную, эта методика окажется бесполезной. И все же она существенно снижает риск случайного заражения. Чтобы реализовать идею с «перенаправлением», в системном реестре надо изменить параметры для .vbs-, .vbe-, .js-, .jse- и .wsf-файлов. Сделать это можно двумя способами: К изменить параметры для одного компьютера можно на странице свойств File Types (см. ниже); чтобы автоматизировать процедуру перенастройки на нескольких ком- пьютерах, создайте REG-файл (см. ниже) и импортируйте его. Параметры типов файлов хранятся в головном разделе HKEY_CLASSES_ROOT системного реестра. У каждого типа файла свой раздел (например, .vbs) с описанием расширения файла и еще один раздел (например, VBSFile), кото- рый связывает действия с данным типом. Вам нужно изменить параметры в разделах VBSFileJSFileJSEFile, VBEFile и WSFFile. ПРИМЕЧАНИЕ WSH 1 поддерживает только .vbs- и .js-файлы, которым в системном реестре принадлежат разделы VBSFile и JSFile соответ- ственно. Взгляните, как REG-файл выполняет изменения для .vbs-файлов (в подраз- деле VBSFile) в реестре Windows 95/98: REGEDIT4 [HKEY_CLASSES_ROOT\VBSFile\Shell\Open\Command] e="Notepad.exe \"Х1\"" [HKEY_CLASSES_R00T\VBSFile\Shell\0pen2\Command] е="Notepad.exe \"X1\"" [HKEY_CLASSES_ROOT\VBSFile\Shell\Execute] e="4Execute"
ПРИЛОЖЕНИЕ Б Безопасность сценариев 435 [HKEY_CLASSES_ROOT\VBSFile\Shell\Execiite\Command] @="С:\\WindowsWWScript.exe \''Х1\“ %*” [HKEY_CLASSES_ROOT\VBSFile\Shell\ExecuteDOS\Command] @="C:\\Windows\\COMMAND\\CScript.exe \"Х1\" X*" После импортирования этого REG-файла (путем двойного щелчка REG- файла и после подтверждения импортирования файла) команда Open изме- нится, и, если пользователь щелкнет VBScript-файл, тот откроется в окне Notepad. Чтобы выполнить файл, щелкните его правой кнопкой и выберите в контекстном меню команду Execute. Команда ExecuteDOS в этом меню выполняет сценарий с CScript.exe. Подобный REG-файл можно создать и для js-файлов. Параметры для это- го расширения находятся в подразделе JSFile. В представленном выше коде надо поменять VBSFile на JSFile и сохранить REG-файл с другим именем. То же можно проделать с .wsf-файлами. В этом случае раздел реестра называ- ется WSFFile, а в исходном REG-файле нужно поменять VBSFile на WSFFile. ПРИМЕЧАНИЕ REG-файлы могут пригодиться и для блокировки за- шифрованных (encoded) версий файлов-сценариев с расширениями .vbe и .jse. Этим файлам соответствуют разделы реестра VBEFile иJSEFile. REG-файл позволяет и восстановить прежние параметры. Следующий REG-файл восстанавливает параметры по умолчанию для .vbs и удаляет из подраздела VBSFile действия Execute и ExecuteDOS: REGEDIT4 [HKEY_CLASSES_ROOT\VBSFile\Shell\Open\Command] @="С:\\WINDOWSWWScript.exe \"Х1\" X*" [HKEY_CLASSES_R00T\VBSFile\Shell\0pen2\Command] @=”C:\\WINDOWS\\COMMAND\\CScript.exe \"Х1\" X*" [-HKEY_CLASSES_ROOT\VBSFile\Shell\Execute] [-HKEY_CLASSES_ROOT\VBSFile\Shell\ExecuteDOS] Аналогичные REG-файлы можно создать и для .vbe-, .js-, .jse- и .wsf-фай- лов, чтобы изменить для них параметры по умолчанию для Windows 95/98. ПРИМЕЧАНИЕ Такой REG-файл годится не для всех платформ. Так, в Windows NT/2000 исполняемые файлы WSH хранятся в системной папке \System32, тогда как в Windows 95/98 — в папке Windows. Кро- ме того, Windows NT/2000 сохраняют строки в Unicode, a Windows 95/ 98 — в формате ASCII. Поэтому эти REG-файлы нужно изменить в со- ответствии с платформой. Ниже изложена методика создания REG- файлов в Windows NT/2000. Можно также написать сценарий, в кото- ром определяются версии Windows и WSH, а затем делаются нужные изменения параметров реестра. О зарегистрированных типах файлов
436 ЧАСТЬ IV Приложения см. также мою книгу Inside the Microsoft Windows 98 Registry (Microsoft Press, 1998). Изложенные там сведения, относящиеся к регистрации типов файлов, применимы ко всем 32-разрядным версиям Windows. Если вы не хотите использовать описанные выше REG-файлы (или хоти- те поэкспериментировать, прежде чем изменять параметры системы, либо изменить параметры путем экспорта REG-файлов), выберите команду Folder Options в меню View или меню Tools в окне папок. На странице свойств File Types выберите тип файла, например VBScript Encoded Script File или VBScript Script File, и откройте окно с параметрами, щелкнув кнопку Edit (или кноп- ку Advanced в Windows 2000). В диалоговом окне Edit File Туре будут пред- ставлены все действия, связанные с данным типом. Вы можете вручную из- менить параметры для Open и Ореп2 и включить прежние для Open и Ореп2 в виде Execute и ExecuteDOS соответственно. (В главе 2 изложен способ до- бавления команды Edit для файла сценария. Повторите описанные там шаги для других типов сценариев.) Изменив параметры для файлов-сценариев, можно запустить редактор системного реестра Regedit.exe, найти раздел (например, HKEY_CLASSES_ ROOT/JSFile') и экспортировать его в REG-файл командой Export Registry File меню Registry. Повторите это действие для других типов файлов (вроде VBSFile, VBEFile, JSEFile и WSFFile'). Затем в Notepad удалите ненужные запи- си (в соответствии с приведенным выше примером) и соберите все эти REG- файлы в один. Этот сборный файл можно импортировать в системные рее- стры на других машинах. ВНИМАНИЕ Некоторые компьютерные журналы и Web-узлы утверж- дают, что удаление WSH — лучшая защита компьютеров от заражения со стороны WSH-сценариев. К этому решению можно прибегнуть в Windows 95/98/NT, хотя столь радикальное средство вряд ли оправ- данно. Кроме того, поскольку WSH является составной частью ОС Win- dows 2000 и Windows Me, удалить WSH на компьютерах с этими сис- темами просто невозможно. Я ни в коем случае не советую удалять такие файлы, как WScript.exe и CScript.exe, ведь они являются важней- шими системными файлами. Windows 2000 попытается исправить ОС, если системные файлы окажутся повреждены или исчезнут (так дела- ет и Windows Me). Поэтому я рекомендую использовать одну из мето- дик, описанных в этом приложении. Параметры безопасности сценариев WSH Заражение системы всегда является результатом лени и невежества пользо- вателя. Если бы пользователи не открывали вложения электронной почты (и если бы почтовые программы были так установлены, чтобы не открывать вложения по умолчанию, даже в режиме просмотра), то вирус не мог бы рас- пространиться. Увы, многие открывают все приходящие к ним почтовые вложения. В большинстве систем Windows по умолчанию все параметры
ПРИЛОЖЕНИЕ Б Безопасность сценариев 437 безопасности отключены (это напоминает тех пользователей Linux, которые всегда запускают свои системы с правами root). Администратор системы может заблокировать сценарии, не удаляя WSH. Кроме того, это можно распространить только на определенных пользова- телей или на всю систему. Эта возможность существует во всех 32-разрядных версиях Windows, но ее нужно активизировать. Способы блокировки WSH- сценариев в разных ОС могут различаться. В Windows 2000/NT 4 можно ограничить право на выполнение файла для определенных групп пользователей. Чтобы рядовые пользователи не запус- кали исполняемые WSH-файлы, нужно-. 1. войти в систему с правами администратора и найти файлы CScript.exe и WScript.exe (в папке \System32); 2. щелкнуть правой кнопкой каждый файл и выбрать в контекстном меню команду Properties; 3. выбрать страницу свойств Security (рис. Б-1), щелкнуть Everyone и снять флажок Read & Execute в столбце Allow. Рис. Б-1. Параметры безопасности для WScript.exe. Повторите эти шаги для всех остальных групп пользователей, для кото- рых вы собираетесь заблокировать WSH. (Только учетные записи System и Administrator имеют право выполнять сценарии. Кроме того, сама Windows должна быть обязательно установлена на томе с NTFS.)
438 ЧАСТЬ IV Приложения После того как вы закроете страницу свойств Security, выполнение WSH- сценариев будет заблокировано для заданных групп пользователей. Если вам понадобится выполнить сценарий, вы сможете войти в систему как админи- стратор и запустить файл. Старайтесь избегать вхождения в систему в режи- ме online с правами администратора. СОВЕТ Администратор может разрешить отдельным пользователям выполнять сценарии, даже когда WScript.exe и CScript.exe закрыты для большинства пользователей. Чтобы сформировать подмножество осо- бых пользователей, нужно создать учетную запись пользователя (на- пример, с именем Scripter) и добавить ее в группу, которой разреше- но выполнять сценарии. В Windows 2000 затем можно создать ярлык для файлов, таких как WScript.exe или CScript.exe. В свойствах файла- ярлыка укажите путь для файла-сценария, который может быть выпол- нен путем активизации ярлыка. Обратите внимание на флажок Run As Different User. Если рядовой пользователь щелкнет дважды ярлык, Win- dows запросит у него имя пользователя и пароль. Введя учетную запись (в данном случае Scripter) и пароль, пользователь может выполнить этот сценарий под этой учетной записью. Точно так же можно дать особые права и сценарию. Хитрость в том, что пользователь получает требуемые права, но при этом не снижается безопасность системы. Windows 95/98 не предоставляют индивидуальных прав для файлов, но вы можете в System Policy Editor установить системную политику (см. Mic- rosoft Windows Resource Kit). Вот как установить системную политику в Win- dows NT/2000. 1. В Windows 95/98/NT 4 запустите System Policy Editor (Poledit.exe), загру- зите локальный реестр (выбрав команду Open Registry из меню File) и дважды щелкните Local User. 2. Выберите раздел Local User/Windows 98 System/Restrictions и выделите элемент Only Run Allowed Windows Applications. 3- Щелкните кнопку Show. В диалоговом окне Show Contents щелкните кноп- ку Add, чтобы добавить все приложения Windows, которые вы хотите от- крыть для выполнения пользователями. Когда вы закроете все окна и перезапустите Windows, ОС позволит пользо- вателю запустить только те приложения, что перечислены в диалоговом окне Show Contents. Если в списке нет CScript.exe и WScript.exe, пользователь не сможет выполнить сценарий. ПРИМЕЧАНИЕ Этот метод имеет недостаток. Как администратор сис- темы, вы обязаны описать все разрешенные приложения, а это нелег- ко. Кроме того, важно сгоряча не забыть указать для учетной записи ад- министратора в качестве разрешенных такие приложения, как RegEdit и System Policy Editor, иначе вам не удастся затем вносить изменения в реестр. О системной политике см. Microsoft Windows Resource Kit и мою книгу Inside the Microsoft Windows $)8 Registry.
ПРИЛОЖЕНИЕ Б Безопасность сценариев 439 В Windows 2000 установить системную политику намного проще. В Mic- rosoft Management Console (ММС) вы можете перечислить приложения, ко- торые пользователю выполнять запрещено. Если вы указали WScript.exe и CScript.exe, то при следующем входе в систему пользователь не сможет вы- полнять сценарии. Однако есть одна проблема: по умолчанию ММС не под- держивает системную политику. Вы должны создать свою собственную вер- сию ММС, поддерживающую локальную или удаленную политику. Собствен- ное ММС-приложение создать несложно. 1. Выберите Run в меню Start. 2. Введите ММС в качестве команды и щелкните ОК. Запустится новый эк- земпляр ММС с пустым окном. 3. Выберите Add/Remove Snap-in в меню Console. В окне свойств Add/Re- move Snap-in щелкните вкладку Standalone. 4. Щелкните кнопку Add и выберите Group Policy snap-in в диалоговом окне Add Standalone Snap-in. 5. Когда диалоговые окна будут закрыты, в ММС появится snap-in (элемент управления ActiveX). Сохраните страницу командой Save As меню Console. Сохранив конфйгурацию в .msc-файле, вы сможете открыть этот файл (как ММС-приложение), когда понадобится внести изменение в системную политику. Чтобы изменить список приложений, не разрешенных для выпол- нения, сделайте следующее. 1. Запустите свою копию ММС. В зависимости от конфигурации вам, воз- можно, потребуется загрузить параметры с сетевого компьютера. (Ло- кальные параметры загружаются автоматически.) 2. Выберите вкладку Tree на левой панели и щелкните Local Computer Policy/ User Configuration/Administrative Templates/System. На правой панели по- явится политика, установленная на вашей системе. 3. Дважды щелкните Don’t Run Specified Windows Applications. 4. В новом окне свойств щелкните вкладку Policy, выберите переключатель Enabled и щелкните кнопку Show. 5. Щелкните кнопку Add в диалоговом окне Show Contents, чтобы добавить приложения, которые пользователи не смогут запускать, такие как WS- cript.exe и CScript.exe (рис. Б-2.) После того как вы закроете все диалоговые окна и щелкнете кнопку Apply на странице свойств Policy, Windows 2000 заблокирует WSH-сценарии на ва- шем компьютере (для заданной группы пользователей). Заметьте: пользова- тель пока еще может запускать WSH-сценарии из диалогового окна Com- mand Prompt или Run, но двойной щелчок на уровне оболочки уже не сра- батывает. О системной политике в Windows 2000 см. Microsoft Windows 2000 Professional Resource Kit. Эти же сведения справедливы и для Windows 2000 Server.
440 ЧАСТЬ IV Приложения Component Services Device Manager on local computer Local Computer Policy Computer Configuration l¥i -&3 Software Settings Windows Settings Administrative Templates User Configuration Software Settings Windows Settings & Administrative Templates Ж' @1 Windows Components ; • Cal Start Menu Ь Taskbar Desktop >?5сф1.ехе WScfipt.exe I Disable Autoplay । Download missing COM components 4i Don't display welcome screen at logon : Century Interpretation for Year 2000 I'M Code signing for device drivers M Custom user interface № Disable the command prompt )M Disable registry edging tools *)i Rud only elowed Windows appfcations -i&l Control Panel Network _ J Logon/Logof f •-&3 Group PoUcy IP Security Policies on Local Mtdv WMI Control (Local) ! * a hi * iwfoMf : адьс'йвг*, ifcfc V»- »и «gtcMirt .. 3 < Д t «0. Г . «*; specified Windows eppfecahofts r-r,4M-.^,t.v [show Contents Not configured Not configured Not configured Not configured Not configured Not configured Not configured Not configured Not configured Рис. Б-2. Установка системной политики с помощью ММС в Windows 2000. Заключительные замечания Методики, упомянутые в этом приложении, помогут вам предотвратить за- ражение системы вирусами, распространяемыми через наиболее популяр- ные сценарии, пока Microsoft не выпустила версию WSH, которая выполня- ет только те сценарии, что имеют электронную подпись. Я должен сказать также несколько слов о параметрах безопасности в Microsoft Internet Explorer. Если выполнение сценария разрешено внутри HTML-страниц, загруженных из Интернета, вашу систему может заразить вирус, имеющий форму кода сценария внутри HTML-документа. Используя метод CreateObject, этот вирус может получить доступ к методам, не прибе- гая к помощи WScript.exe или CScript.exe. Предотвратить это можно, запре- тив выполнение сценариев в HTML-документах, просматриваемых через Ин- тернет. Такой же подход вы можете применить в Microsoft Outlook, чтобы запретить выполнение сценариев внутри HTML-страниц (присылаемых в ка- честве электронной почты). Кроме того, желательно загрузить и установить
ПРИЛОЖЕНИЕ Б Безопасность сценариев 441 самые последние исправления, связанные с обеспечением безопасности для Outlook с Web-узла Microsoft (http://officeupdate.microsoft.com). Помните: безопасность системы — это не только задача ОС и разработ- чиков ПО. Основная ответственность лежит на администраторах и пользо- вателях. Если пользователь входит в систему с правами администратора, а параметры безопасности не установлены, то все двери открыты (как в ОС Linux, когда пользователи входят в систему как root). Здорово поможет и хороший сканер вирусов.
Предметный указатель А Active Directory Service Interfaces см. ADSI Active Server Pages cm. ASP ADSI (Active Directory Service Interfaces) 3 API 3 API-функция 281 ASP (Active Server Pages) 35, 134 AT (команда) 390 В BAT 2 c collection см. объект: набор COM (Component Object Model) 46, 156, 157 Component Object Model cm. COM Control Panel 397, 398 Control.exe 397 CScript.exe 112, 133 D DDE (Dynamic Data Exchange) 375 dial-up networking cm. DUN DiskCopy.dll 396 drag-and-drop 236 DUN (dial-up networking) 428 Dynamic Data Exchange cm. DDE E ECMA (European Computer Manufacturers Association) 86 ECMA-262 86 ECMAScript 4,86 escape sequence cm. JScript: escape- последовательность European Computer Manufacturers Association cm. ECMA Event Viewer 407 Extensible Markup Language cm. XML H hot key см. ярлык: клавиша быстрого вызова НТА 186 HTML 35 HTML-файл 183 — путь 184 — сценарий 183 I Internet Explorer 177, 180 — воспроизведение звука 418 J JavaScript 2, 4, 86 JScript 4, 86 — escape-последовательность 93 — VBScript 175 -WSH 195 — встроенная функция 105 — диалоговое окно ---About 188 ---ввода 174 — доступ к реестру 270 — запуск Calculator 163 — комментарий 87 — константа 89 — массив 106, 130 — метод ---Echo 113 ---Popup 125,127,130 — — prompt 180 — непрерывная строка 88 — обработчик языка 137 — объект 105 ---WScript 136 — оператор 88, 94 ---if 98-99 ---switch 103-104 ---арифметический 95 ---декремента 96 ---инкремента 96 ---логический 97 ---присваивания 94 ---сравнения 94 ---старшинство 97 ---условный 99 ---цикл do...while 102 ---цикл for 99 ---циклfor...in 101 ---цикл while 102 — ошибка периода выполнения 386 — перевод строки 114 — переменная 89 ---Null 93 ---булевская 93 ---имя 90 ---область действия 89 ---объявление 89 ---строковая 93
Предметный указатель 443 — — тип данных 92 ---числовая 92 ---окружения 148 — подключение принтера 254 — пользовательская функция 104 — программа 86 — путь сценария 387 — раздел реестра 275 — свойство ---файла 323 ---length 217 — сетевой диск 262 — создание — — сценария 7 ---ярлыка 228 — сокрытие имени пользователя 287 — специальная папка 218,220 — список дисков 297 — управляющие структуры 98 — файл ---копирование 330 ---текстовый 349, 352 ---ярлыка 224 — ярлык ---аргумент 233 ---для Web-узла 245 L language engine см. обработчик языков link см. ссылка м Microsoft Access 412 Microsoft Frontpage 199 Microsoft Frontpage Express 189-190,199 Microsoft Management Console см. MMC Microsoft OLE/COM Object Viewer 46 Microsoft Windows NT scheduler см. планировщик Microsoft Windows NT MMC (Microsoft Management Console) 380 MS-DOS 2, 169 MSHTML.dll 411 N Notepad 163 ---.exe 410 0 object model см. объектная модель OCX-файл 31 OLE/COM Object Viewer 156 P Perl 4 ProgID см. объект: идентификатор R RAS (Remote Access Service) 429 Registry Editor 408 см. также редактор реестра RegSvr32.exe 31 Remote Access Service cm. RAS Rexx 4 RunD1132.exe 391,393,411,428 s special folder см. специальная папка System Configuration Utility 408 System Policy Editor 287, 408 T Tool Control Language (Tel) 4 Tweak UI 287 u UNC (Universal Naming Convention) 12, 250 V VBA (Visual Basic for Applications) 2, 27, 47, 388 VBScript (Visual Basic, Scripting Edition) 2, 4, 47 -CStr 52 -JScript 175 — Option Explicit 53 -WSH 190 — диалоговое окно 111 ---ввода 172 — доступ к реестру 268 — запуск Notepad 163 — класс 80, 82 — комментарий 48 — константа 49, 51 — массив 56,123 — метод ---Echo 111 ---Popup 125, 129 ---showModalDialog 186 — непрерывная строка 48 — обработка ошибок 75 — обработчик языка 7, 137 — объект Wscript 135 — оператор 47 ---арифметический 58 ---логический 59 ---сравнения 61 ---старшинство 62 —- цикл 64 ---With 84 — ошибка периода выполнения 385 — переменная 51
444 Предметный указатель --окружения 146 — программа 48 — процедура 69 — разница дат 389 — регулярные выражения 78 — свойство Count 217 — сетевой диск 261 — создание --объекта 156 --сценария 6 --ярлыка 226 — специальная папка 219 — тип данных 50-51 — управляющие структуры 63 — файл ярлыка 222 — функция 67 встроенная 69 MsgBox 115 — ярлык 236 Visual Basic for Applications см. VBA w Windows 95/98 — завершение 391 — перезапуск 392 Windows ActiveMovie Player 417 Windows Media Player 418 Windows Script 4 Windows Script Components cm. WSC Windows Script Host cm. WSH Winsock/TCP/IP 429 WSC (Windows Script Components) 46 WScript 156 WSH (Windows Script Host) 2 — CScript.exe 8 -JScript 3, 195 — ProgID 46 — REG_MULTI_SZ 278 — VBScript 3,190 — Visual Basic 4 — WScript 156 — WScript.exe 8 — доступ к реестру 277 — исполнение сценария 8 — метод SendKeys 373 — обработка событий 5 — обработчик языков 5 — объект 45, 133, 155 — объектная модель 125 — отладчик сценария 19 — печать из сценария 410 — подключение файла 17 — свойство 133 — сценарий 3, 204 — формат файла 16 — ярлык 211 WSH 2 4 X XML (Extensible Markup Language) 16, 26 А аргумент — key 374 — SHExitWindowsEx 393 асинхронный процесс 368 атрибут — Кате 413 — Read-only 313, 3 28 — sre 419 Б библиотека типов 18,156,157 буксировка см. drag-and-drop д диалоговое окно ПО — About 184 — Add/Remove Programs 398 — Choose File 197 — Copy Disk 396 — Format 396 -HTML-код 185 — Mouse Properties 397 — Shut Down Windows 426 — добавление кнопки 185 — внешнее представление текста 399 — выбора файла 196 — выравнивание текста 399 — закрытие 119 — значок 117 — кнопка 117, 118, 119 — создание 117, 183 — сценария WSH 199 — функция MsgBox 117 динамический обмен данными см. DDE диск 389 И интерфейс прикладного программиро- вания см. API К ключевое слово — break 104 — ByRef 70 — ByVai 70 — continue 104 — Dim 55 — Enumerator 298 —function 105 — in 101
Предметный указатель 445 —Loop 64 — new Array 130 —Private 50, 55, 82 — Property 82 — Public 50, 55, 82 — Select Case 64 -Set 139, 142, 144, 156, 191 — var 100,156 конвейеризация 403 копирование 396 м массив 56, 123, 124 метод 45 —Add 83 —AddPrinterConnection 249, 250 —AddWindowsPrinterConnection 249 —AppActivate 369, 372 — atEnd 101,298 — atEndOfStream 338,339,354 —BrowseForFolder 356, 357, 362 — CascadeWindows 422 — CheckVal Ъ&7 — ControlPanelltem 425 -Copy 294,328,413 — CopyFile 294,329 — CopyFolder 311 — CreateFolder 293 -CreateObject 32, 126, 155, 156, 157, 191,293 — CreateShortcut 154, 211, 215, 225, 244 — CreateTextFile 293 — Date 130 —Delete 328 —DeleteFile 293 — DeleteFolder 293,313 —DisconnectObject 158 — Echo 8,34,45,106,110 — EnumNetworkDrives 261 — ErrRaise ~П — exchange 345 — Execute 79 — ExpandEnvironmentStrings 153, 154, 221, 318 — Explore 424 — FileExists 411 — FileRun 425 — FolderExists 228,411 — GetAbsolutePathName 388 — GetDrive 294 — GetDriveName 389 — GetExtensionName 239 — GetFile 294,413 — GetFolder 294, 306 — GetObject 157,158 — GetParentFolderName 310,388 — GetSpecialFolder 404, 418 — lastlndexOf 195 — LogEvent 407 —MapNetworkDrive 260 —MinimizeAll 422 — Move 45,328,413 —MoveFolder 312 — moveNext 101,298,308 — navigate 178 — new 159 — Open 424 — OpenTextFile 336,339,347 — ParentFolder 362 -Popup 125, 154, 315,419 —prompt 177, 178, 179 — Quit 163, 165, 181, 187, 204, 419 —Raise 77, 386 — Read 402 — ReadLine 338,339,400 — RegDelete 154, 266 — RegKeyFromString 282, 283 — RegRead 154, 266, 274, 278, 385 — RegWrite 154,266 — RemoteRegistry 283 — Remove 151 —RemoveNetworkDrive 263 — RemovePrinterConnection 255 -Replace 79, 341, 354 — Run 154, 160, 169, 266, 369, 391, 399 — Save 211,212 — SendKeys 368,373 — SetDefaultPrinter 258 — showModalDialog 183, 186 — Sleep 248, 366, 367, 419 — substr 195 — Suspend 426 — Test 78 — TileHorizontally 422 — TileVertically 422 — UndoMinimizeAll 422 — window.close 186 — Write 401 — WriteLine 348,351,400 — WScript.CreateObject 159 — WScriptEcho 122 — WScriptSleep 192 — WSHInputBox 310 — встроенный 159 — доступа к реестру 279 О оболочка Windows 420, 425 обработка события 192 обработчик языков 5, 137 объект 42 — WScript 135 — ActiveXObject 159 — address 82
446 Предметный указатель —Application 178 —Array 106 —Automation 158 — Button 1 201 — Document 178 — Drive 292 — Environment 151 -Err 77, 252, 271, 385 — File 292,294,413 — FileSystemObject 18, 226, 239, 292, 411 --вложенные папки 306 --доступ к папке 306 --метод 293 --обращение к диску 294 --обращение к файлу/папке 306 --объектная модель 292 --создание 293 --список дисков 294 --ссылка 293 — Folder 292,413 —form 45 — objArgs 237 — objArgs(O) 139 — RegExp 84 — RegObj 282 — Script 178, 179, 186 — Shell 420 — String 105, 195, 304 — Textstream 292 — TheForm 201 — window 183 — ivindow.document 5 — Wscript 106 - WScript 8, 45, 58, 110-111,114, 126, 133, 157, 367 — —JScript 136 --обработчик языка 138 — — свойство 133 — WshArguments 138 — WshNetwork 249, 288, 399 — WshShell 125, 126, 153, 210, 211, 385 — WshShortcut 211, 215 — WshSpecialFolders 215, 217 — идентификатор 156 — иерархия 178 — имя 44 — интерфе йс 157 — метод 45 — набор 44 — свойство 45 — создание 155,159 — экземпляр 281 объектная модель 43 оператор - And 59 — Case 64 — catch 254 — debugger 19,36 — Declare 4 -Dim 53, 55, 56, 57 — Do Until 65 — Do While 64 — Do..Loop Until 65 — Do.Poop While 65 — End Function 68 — Exit Do 66 — Exit For 66 — Exit Function 68 — For...Next 66 — If Err <> 0 Then 258 — new 130 — new ActiveXObject 298 — Not 59 — oIEResizable = 0 191 — On Error Resume Next 54, 75, 226, 252, 326, 385 — Option Explicit 53,54,57 — Or 59 — Path 12 — Path=.\^rgs.vbs 12 —Private 53 — Property Get 82,83 — Public 53 — ReDim 53, 57 — return 105 -Set 57 — stdout 112 — stop 19 — Stop 36 — value = MathPI 106 — var 89 — While 66 — With 84 — WScriptFcho 6, 18, 40 — WScriptFcho Err.Code 258 — WScriptSleep 186,367 —Xor 59 ошибка периода выполнения 385 п папка — выбор 357 — вызов 225 — доступ 306 --к содержимому 317 — исходная 334 — копирование 293, 311 — наличие файла 411 — обращение 306 — окно 424 — переименование 312,413 — перемещение 293, 312 — проверка наличия 411 — путь 356
Предметный указатель 447 — резервная копия 331 — родительская 310 — создание 226,309 — список файлов 317 — удаление 293,313 — установка 388 — целевая 334 параметр — bUpdateProfile 255 — bWaitOnReturn 329 — dir 362 -filel 328 —file2 328 —flags 362 —force 313,328 —JITDebug 19 — overwrite 312 — strName 255 — title 372 — Title 362 — tmpFolder 404 — UserLog 408 переменная окружения 143 — COMSPEC 144 — DOCUMENT 153 -HOMEDRIVE 144 -HOMEPATH 144 —JScrlpt 148 - NUMBER_ OF_PROCESSORS 14 5 — OS 145 — PATH 145 — PATHEXT 145 — PROCESSOR-ARCHITECTURE 145 — PROCESSORIDENTIFIER 145 - PROCESSOR-LEVEL 145 - PROCESSOR-REVISION 14 5 — PROMPT 145 -SYSTEMDRIVE 145 — SYSTEMROOT 145 - TEMP 145 -TMP 146 — VBScript 146 — WINDIR 146,153 — значение 144, 147 — индекс 144 — категория 144 — метод ExpandEnvironmentStrings 153 — обращение 143, 146, 148 — пакетный файл 153 — раскрытие 153,154 — создание 149 — срок жизни 150 — считывание значения 153 — удаление 151 планировщик Microsoft Windows NT 390 пользователь — сокрытие имени 287 — учетная запись 3 приложение 369, 377 принтер — драйвер 250 — локальный порт 250 — ошибка периода выполнения 252 — подключение 249 ---временное 251 ---для любого пользователя 252 ---постоянное 251 ---удаление 255 — список 256,258 — установка по умолчанию 258, 259 процедура — ErrCheck 261 — GetPath 191 — lEJOnQuit 192 —MakePath 226 —Message 40 P рабочая ---группа 288 ---станция 394 рабочий стол 422 редактор реестра 265 - Binary (REG_BINARY) 265 - DWORD (REG_DWORD) 266 — REG_EXPAND_SZ 266 - REG_FULL_RESOURCE_DESCRIPTOR 266 - REG_MULTI_SZ 266 — String (REGSZ) 265 — создание раздела 277 реестр 264 — двоичный параметр 277 - доступ 264, 265, 266, 277 ---из VBScript 268 ---к параметрам /разделам 279 ---к разделу 274 — корневой раздел 265, 266 — наличие раздела/параметра 273 — обработка ошибок 271 — перечисление разделов/параметров 281 — считывание раздела 271 — тип данных ---REGB1NARY 277 ---REG_D WORD 277 ---REG_EXPAND SZ 277 ---REG MULTI SZ 277 ---REG—SZ 277 — удаление параметра/раздела 267 — удаленный доступ 283 — установочный путь 285 резервное копирование 331
448 Предметный указатель С свойство 45 —Application 133 —Arguments 58, 133, 139, 231 —AvailableSpace 301 — Busy 179,191 -Count 138,139,217,237 — DateCreated 320,321 — DateLastAccessed 320 — DateLastModified 320 — DriveLetter 298 — Driv eType 295, 298 — EmailName 82 — EnumPrinterConnections 256 — Em ironment 143 — ErrDescription 385 — ErrNumber 385 — Files 318 — FreeSpace 301 — FullName 82, 133, 400 -Global 78,341 — Height 191 — Hotkey 226 — IconLocation 222,236 — IgnoreCase 78 — IsReady 296 — item 298 — Item 139, 142 — Left 191 — length 217 -Length 139, 142 — MenuBar 191 — Name 134,282,318 — Navigate 186 — Number 252,271 — o!tem.Title 362 -Path 134,362 — Pattern 78 — ScriptFullName 134, 167, 187. 212, 387, 389,410 — ScriptName 134, 135 — ShareName 296, 298 — SpecialFolders 215,219, 415 — StatusBar 191 — Stdin 400 — StdOut 400 — SubFolders 307 —NlargetPath 212, 244 — ToolBar 191 - Top 191 — TotalSize. 301 — UserDomain 247 — UserName 566, 408 — value 204 — Values 282 — Version 134 — Visible 179,186 — VolumeName 296, 298 — Width 191 — Windowstyle 222 — WScriptArguments 142 — WScriptScriptFullName. GetPath 167 — WshNetwork.UserName 366 — WshShelLSpecialFolders 230 — сети 247 сетевое подключение 399 сетевой — диск 260 — принтер 249, 250 событие — onclick 201 — onclose 192 — Window OnLoad 201 специальная папка 215,216 — имя 216 — поиск 215 — путь 217 — свойство SpecialFolders 215 — список 216 ссылка 244 страница свойств — Buttons 397 — Screen Saver 397 строка — расширяемая (expandable) 266 — составная (multiple) 266 сценарий 3 -HTML-файл 183 — Microsoft Script Editor 27 -MS-DOS 169 — PrimalSCRIPT 26 — Registry.js 271 — Registry.vbs 271 — Step Out 40 — Step Over 40 — аргумент 14,138 — библиотека типов 18 — вызов формы 204 — выхода из системы 382 — длинное имя 391 — доступ --к API-функции 281 --к ярлыку 238 — задержка 366 — запись результатов исполнения 112 — запуск 390 --Calculator 163 --Notepad 163 -—программы 160 --системы 383 — значение переменной 40 — имя 134 — исполнение 8, 15
Предметный указатель 449 — каталог 388 — метод Popup 127 — неявное объявление переменных 53 — объединение 175 — отключение системы 383 — отладчик 19 --Microsoft Script Debugger 35, 38 — ошибка 33 — передача аргумента 12,15 — переменная окружения 143 — печать 410 — подключение --принтера 250 --файла 17 — пошаговое исполнение 39 — приостановка 366 — путь 387 --к файлу 134 — расширение файла 6 — регистрации 248, 264, 380, 383 --вывода в файл 407 --глобальный 382 --установка 380 — редактирование 23 — редактор 24 --CodeMagic 30 --EditPad 30 --EditPlus 30 --NoteTab 30 --TextPad 30 --UltraEdit-32 30 — свойство 133 — создание 6,21,23 — сохранение файла 21 — стек вызовов 40 — страница свойств 11 — точка прерывания 40 — трассировка программ 33 — установка свойств 11 — файл 15 — шаблон 22 т телефонное соединение см. DUN Ф файл — атрибут 320 — восстановление 3 — выбор 196, 362 — добавление текста 351 — замена текста 353 — звуковой 417 — копирование 293, 327, 329, 413 — наличие в папке 411 — обращение 306 — переименование 328,413 — перемещение 293, 328 — поиск 415 — поточный обмен 404 — проверка наличия 411 — резервирование 3 — текстовый 336 --доступ 336 — — запись данных 347 --чтение 338 — удаление 293,328 — ярлык 211,415 форма -HTML 189 --вывод 204 --создание 199 — вывод 190, 195 — для ввода 189 — заголовок окна 190 — создание 190 — состояние 192 — сценарий WSH 199 — текстовое поле 200 — цвет фона 190 — элемент управления 190 функция -API 211 — Array 123 — Asc 69 — CheckVal 201 — CStr 52 —DateDiff 389 -ERRORLEVEL 166 — eval 105 — ExitWindows 391 — ExitWindowsEx 393 — Filter 354 — FolderEmpty Щ — FormatNumber 301 — GetPatb 167,353 — init 184 — InputBox 172,300,309 — InStrRev 187 — IsCScript 400, 404 — IsLnk 237,239 — IsValue 359 — IsWinNT 241 — Join 405 — JsFormatNumber 304 — KeyExists 289 — Left 187,211 —MakeHTMLCode 340 —MakePath 228 —Month 124 —MonthName 124 — MsgBox 114, 115, 192, 204 --возвращаемое значение 120
450 Предметный указатель --константа 118,120 --параметр 115 —MyPrompt 180, 181 — Now 124 — PrintHTML 411 — RegExpTest 79 — ScriptEngine 137 — ScriptEngineBuildVersion — ScriptEngineMajorVersion — ScriptEngineMinoiVersion — Shell 373 — SHExitWindowsEx 393 — Split 405 — Weekday 124 — WeekDayName 124 — WSHInputBox 175,303 Э 137 137 137 элемент управления 31 — лицензирование 32 — регистрация 31 — удаление 32 Я ярлык 210 — API-функция 211 — аргумент 231 — доступ 235 — значок 222 — имя ---домена 247 ---компьютера 247 ---пользователя 247 ---файла 211 — клавиша быстрого вызова 226 — метод CreateShortcut 211 — обновление 241 — объект WshShell 211 — окно свойств 247 — рабочий каталог 212, 222 — свойство Arguments 231 — создание 210,211 ---в меню Start 225 ---для Web-узла 244 ---на рабочем столе 221 — считывание свойств 235
Гюнтер Борн Гюнтер Борн имеет ученую степень по физике, также изучал информатику и электротехнику. Он начал карьеру в каче- стве разработчика ПО и инженера проек- та в 1979 г. в аэрокосмической и химичес- кой промышленности Германии. Участво- вал в управлении группами, занятыми в разработке ПО, консультировал несколь- ко международных проектов с участием Японии, Таиланда и европейских стран. С 1993 г. работает как независимый писа- тель и переводчик. Общаться с компьютерами Борн начал еще студентом, когда один из профессо- ров предложил ему проработать серию уравнений для механических систем. Из- за нехватки средств на карманный кальку- лятор он использовал компьютер IBM 370, работавший на перфокартах. Неверный оператор FORTRAN’a обошелся ему в неимоверные траты сил, бумаги и времени, но полученная в конце концов рабочая программа с лихвой возместила время, а бумага из-под листингов пригодилась для записи лекций. Начало писательской карьеры Борна не предвещало ничего хорошего. В 1987 г. он не смог опубликовать статью о дизассемблере 8085/Z80, реали- зованном на БЕЙСИКе, потому что об этом языке никто не хотел читать. Так он решил изучать Паскаль. Позаимствовав старенький IBM PC/XT с компи- лятором Borland Pascal, он провел выходные, перенося свой дизассемблер на Паскаль, заменяя листинг БЕЙСИКа в исходный код на Паскале. После это- го его статью приняли к печати в компьютерном журнале. Свою первую кни- гу Борн написал, чтобы заработать деньги на покупку ПК (однако гонорара едва хватило, чтобы покрыть стоимость машины). С тех пор Борн написал массу статей и более 90 книг и компакт-дисков — от детских книг про компьютеры до описаний приложений и изданий о программировании высокого уровня. Его книга The File Formats Handbook стала стандартом в сообществе программистов. Его перу также принадлежат книги Inside the Registry for Microsoft Windows 95 и Inside the Microsoft Windows 98 Registry. Борн участвовал в работе над Microsoft Windows 98 Resource Kit, он автор, переводчик и технический редактор нескольких книг, изданных не- мецким отделением Microsoft Press.
ЛИЦЕНЗИОННОЕ СОГЛАШЕНИЕ MICROSOFT (прилагаемый к книге компакт-диск) ЭТО ВАЖНО - ПРОЧИТАЙТЕ ВНИМАТЕЛЬНО. Настоящее лицензионное со- глашение (далее «Соглашение») является юридическим документом, оно зак- лючается между Вами (физическим или юридическим лицом) и Microsoft Corporation (далее «корпорация Microsoft») на указанный выше продукт Micro- soft, который включает программное обеспечение и может включать сопут- ствующие мультимедийные и печатные материалы, а также электронную документацию (далее «Программный Продукт»). Любой компонент, входящий в Программный Продукт, который сопровождается отдельным Соглашени- ем, подпадает под действие именно того Соглашения, а не условий, изложен- ных ниже. Установка, копирование или иное использование данного Про- граммного Продукта означает принятие Вами данного Соглашения. Если Вы не принимаете его условия, то не имеете права устанавливать, копировать или как-то иначе использовать этот Программный Продукт. ЛИЦЕНЗИЯ НА ПРОГРАММНЫЙ ПРОДУКТ Программный Продукт защищен законами Соединенных Штатов по авторскому праву и меж- дународными договорами по авторскому праву, а также другими законами и договорами по пра- вам на интеллектуальную собственность. 1. ОБЪЕМ ЛИЦЕНЗИИ. Настоящее Соглашение дает Вам право: а) Программный продукт. Вы можете установить и использовать одну копию Программно- го Продукта на одном компьютере. Основной пользователь компьютера, на котором установ- лен данный Программный Продукт, может сделать только для себя вторую копию и использо- вать ее на портативном компьютере. Ь) Хранение или использование в сети. Вы можете также скопировать или установить экземпляр Программного Продукта на устройстве хранения, например на сетевом сервере, исключительно для установки или запуска данного Программного Продукта на других ком- пьютерах в своей внутренней сети, ио тогда Вы должны приобрести лицензии на каждый та- кой компьютер. Лицензию на данный Программный продукт нельзя использовать совместно или одновременно на других компьютерах. с) License Рак. Если Вы купили эту лицензию в составе Microsoft License Рак, можете сделать ряд дополнительных копий программного обеспечения, входящего в данный Программный Продукт, и использовать каждую копию так, как было описано выше. Кроме того, Вы получа- ете право сделать соответствующее число вторичных копий для портативного компьютера в целях, также оговоренных выше. d) Примеры кода. Это относится исключительно к отдельным частям Программного Про- дукта, заявленным как примеры кода (далее «Примеры»), если таковые входят в состав Про- граммного Продукта. i) Использование н модификация. Microsoft дает Вам право использовать и модифи- цировать исходный код Примеров при условии соблюдения пункта (d)(iii) ниже. Вы не имеете права распространять в виде исходного кода ни Примеры, ни их модифицирован- ную версию. ii) Распространяемые файлы. При соблюдении пункта (d)(iii) Microsoft дает Вам право на свободное от отчислений копирование и распространение в виде объектного кода При- меров или их модифицированной версии, кроме тех частей (или их модифицированных версий), которые оговорены в файле Readme, относящемся к данному Программному Про- дукту, как не подлежащие распространению. iii) Требования к распространению файлов. Вы можете распространять файлы, раз- решенные к распространению, при условии, что: а) распространяете их в виде объектно- го кода только в сочетании со своим приложением и как его часть; б) не используете на- звание, эмблему или товарные знаки Microsoft для продвижения своего приложения; в) включаете имеющуюся в Программном Продукте ссылку на авторские права в состав эти- кетки и заставки своего приложения; г) согласны освободить от ответственности и взять на себя защиту корпорации Microsoft от любых претензий или преследований по закону, включая судебные издержки, если таковые возникнут в результате использования или рас- пространения Вашего приложения; и д) не допускаете дальнейшего распространения ко- нечным пользователем своего приложения. По поводу отчислений и других условий ли- цензии применительно к иным видам использования или распространения распростра- няемых файлов обращайтесь в Microsoft.
2. ПРОЧИЕ ПРАВА И ОГРАНИЧЕНИЯ • Ограничения на реконструкцию, декомпиляцию и дизассемблирование. Вы не имеете права реконструировать, декомпилировать или дизассемблировать данный Программ- ный Продукт, кроме того случая, когда такая деятельность (только в той мере, которая необ- ходима) явно разрешается соответствующим законом, несмотря на это ограничение. • Разделение компонентов. Данный Программный Продукт лицензируется как единый продукт. Его компоненты нельзя отделять друг от друга для использования более чем на од- ном компьютере. • Аренда. Данный Программный Продукт нельзя сдавать в прокат, передавать во времен- ное пользование или уступать для использования в иных целях. • Услуги по технической поддержке. Microsoft может (ио не обязана) предоставить Вам услуги по технической поддержке данного Программного Продукта (далее «Услуги»), Предос- тавление Услуг регулируется соответствующими правилами и программами Microsoft, описан- ными в руководстве пользователя, электронной документации и/или других материалах, пуб- ликуемых Microsoft. Любой дополнительный программный код, предоставленный в рамках Услуг, следует считать частью данного Программного Продукта и подпадающим под действие насто- ящего Соглашения. Что касается технической информации, предоставляемой Вами корпора- ции Microsoft при использовании ее Услуг, то Microsoft может задействовать эту информацию в деловых целях, в том числе для технической поддержки продукта и разработки. Используя такую техническую информацию, Microsoft не будет ссылаться на Вас. • Передача прав на программное обеспечение. Вы можете безвозвратно уступить все права, регулируемые настоящим Соглашением, при условии, что не оставите себе никаких копий, передадите все составные части данного Программного Продукта (включая компоненты, муль- тимедийные и печатные материалы, любые обновления, Соглашение и сертификат подлин- ности, если таковой имеется) и принимающая сторона согласится с условиями настоящего Соглашения. • Прекращение действия Соглашения. Без ущерба для любых других прав Microsoft может прекратить действие настоящего Соглашения, если Вы нарушите его условия. В этом случае Вы должны будете уничтожить все копии данного Программного Продукта вместе со всеми его компонентами. 3. АВТОРСКОЕ ПРАВО. Все авторские права и право собственности на Программный Продукт (в том числе любые изображения, фотографии, анимации, видео, аудио, музыку, текст, приме- ры кода, распространяемые файлы и апплеты, включенные в состав Программного Продукта) и любые его копии принадлежат корпорации Microsoft или ее поставщикам. Программный Продукт охраняется законодательством об авторских правах и положениями международных договоров. Таким образом. Вы должны обращаться с данным Программным Продуктом, как с любым другим материалом, охраняемым авторскими правами, с тем исключением, что Вы можете установить Программный Продукт на один компьютер при условии, что храните ори- гинал исключительно как резервную или архивную копию. Копирование печатных материа- лов, поставляемых вместе с Программным Продуктом, запрещается. ОГРАНИЧЕНИЕ ГАРАНТИИ ДАННЫЙ ПРОГРАММНЫЙ ПРОДУКТ (ВКЛЮЧАЯ ИНСТРУКЦИИ ПО ЕГО ИСПОЛЬЗОВАНИЮ) ПРЕ- ДОСТАВЛЯЕТСЯ БЕЗ КАКОЙ-ЛИБО ГАРАНТИИ. КОРПОРАЦИЯ MICROSOFT СНИМАЕТ С СЕБЯ ЛЮ- БУЮ ВОЗМОЖНУЮ ОТВЕТСТВЕННОСТЬ, В ТОМ ЧИСЛЕ ОТВЕТСТВЕННОСТЬ ЗА КОММЕРЧЕСКУЮ ЦЕННОСТЬ ИЛИ СООТВЕТСТВИЕ ОПРЕДЕЛЕННЫМ ЦЕЛЯМ. ВЕСЬ РИСК ПО ИСПОЛЬЗОВАНИЮ ИЛИ РАБОТЕ С ПРОГРАММНЫМ ПРОДУКТОМ ЛОЖИТСЯ НА ВАС. НИ ПРИ КАЙИХ ОБСТОЯТЕЛЬСТВАХ КОРПОРАЦИЯ MICROSOFT, ЕЕ РАЗРАБОТЧИКИ, А ТАКЖЕ ВСЕ, ЗАНЯТЫЕ В СОЗДАНИИ, ПРОИЗВОДСТВЕ И РАСПРОСТРАНЕНИИ ДАННОГО ПРОГРАММНОГО ПРО- ДУКТА, НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА КАКОЙ-ЛИБО УЩЕРБ (ВКЛЮЧАЯ ВСЕ, БЕЗ ИСКЛЮЧЕ- НИЯ, СЛУЧАИ УПУЩЕННОЙ ВЫГОДЫ, НАРУШЕНИЯ ХОЗЯЙСТВЕННОЙ ДЕЯТЕЛЬНОСТИ, ПОТЕ- РИ ИНФОРМАЦИИ ИЛИ ДРУГИХ УБЫТКОВ) ВСЛЕДСТВИЕ ИСПОЛЬЗОВАНИЯ ИЛИ НЕВОЗМОЖ- НОСТИ ИСПОЛЬЗОВАНИЯ ДАННОГО ПРОГРАММНОГО ПРОДУКТА ИЛИ ДОКУМЕНТАЦИИ, ДАЖЕ ЕСЛИ КОРПОРАЦИЯ MICROSOFT БЫЛА ИЗВЕЩЕНА О ВОЗМОЖНОСТИ ТАКИХ ПОТЕРЬ, ТАК КАК В НЕКОТОРЫХ СТРАНАХ НЕ РАЗРЕШЕНО ИСКЛЮЧЕНИЕ ИЛИ ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОС- ТИ ЗА НЕПРЕДНАМЕРЕННЫЙ УЩЕРБ, УКАЗАННОЕ ОГРАНИЧЕНИЕ МОЖЕТ ВАС НЕ КОСНУТЬСЯ. РАЗНОЕ Настоящее Соглашение регулируется законодательством штата Вашингтон (США), кроме случаев (и лишь в той мере, насколько это необходимо) исключительной юрисдикции того государства, на территории которого используется Программный Продукт. Если у Вас возникли какие-либо вопросы, касающиеся настоящего Соглашения, или если Вы же- лаете связаться с Microsoft по любой другой причине, пожалуйста, обращайтесь в местное пред- ставительство Microsoft или пишите по адресу: Microsoft Sales Information Center, One Microsoft Way, Redmond, WA 98052-6399-
Распределенные системы Microsoft для профессии Сопровождение сервера ж? Межсетевое взаимодействие Pecv Windows Ресурсы Windows 2000 Server ЯП н HHOKX9Ott' Pf®5& Издательство «Русская Редакция» представляет новую серию книг Microsoft Press Ресурсы Microsoft Windows 2000 Server официальный источник основных технических сведений по операционной системе Windows 2000 Server. Сети TCP/ В книгах серии содержится подробная информация для администраторов сети, Web-мастеров и опытных пользователей, занимающихся настройкой, администрированием, Ресурсы Windows 2000 Server оптимизацией и устранением неполадок в Windows 2000 Server, а также сетей и Web-узлов на основе Windows 2000 Server. издательство компьютерной литературы И РУССКАЯ РЕДАКЦИЯ ПРОДАЖА КНИГ оптом тел.: (095) 142-0571, e-maii: slexg@rusedit.ru; интернет-магазин http://www.ITbook.ru; тел.: (095) 145-4519: В розницу магазин «КОМПЬЮТЕРНАЯ и ДЕЛОВАЯ КНИГА» Москва, Ленинский пр-т, стр. 38, тел.: (095) 778-7269
Официальные пособия Microsoft Учебный курс Вашей квалификации! Windows 2000 Server экзамен Тб-215 1ебныЙ курс ASOCSOft' Windows 2000 Professional Книги серии «Учебный курс» для подготовки к экзаменам MCSE-2000 Учебный курс сетей на основе " Windows 2000 Книги этой серии помогут Вам приобрести Фундаментальные знания и подготовиться к сдаче экзаменов по программам сертификации Microsoft. :/X- Учебный курс Windows 2000 Active Directory jbgufr Services Каждая книга — это серьезное изложение темы, полная справочная информация от первоисточника; занятия, упражнения для самостоятельной работы, видеоролики и вопросы для самопроверки и закрепления знаний. VJhoows [издательство компьютерной литературы КОМПАКТ-ДИСК ПРОДАЖА КНИГ оптом тел.: (095) 142-0571, e-mail: aiexg@rusedit.ru; интернет-магазин http://www.lTbook.ru; тел.: (095) 145-4519; в розницу магазин «КОМПЬЮТЕРНАЯ и ДЕЛОВАЯ КНИГА- Москва, Ленинский пр-т. сто. 38, тел.: (095) 778-7269
КНИГА-ПОЧТОЙ ЗАКАЗАТЬ КНИГИ ИЗДАТЕЛЬСКОГО ДОМА «ПИТЕР» МОЖНО ЛЮБЫМ УДОБНЫМ ДЛЯ ВАС СПОСОБОМ: • по телефону: (812) 294-01 -04; • по электронному адресу: postbook@piter.com; • на нашем сервере: www.piter.com; • по почте: 197198, Санкт-Петербург, а/я 619 ЗАО «Питер Пост». ВЫ МОЖЕТЕ ВЫБРАТЬ ОДИН ИЗ ДВУХ СПОСОБОВ ДОСТАВКИ И ОПЛАТЫ ИЗДАНИЙ: Наложенным платежом с оплатой заказа при получении посылки на бли- жайшем почтовом отделении. Цены на издания приведены ориентиро- вочно и включают в себя стоимость пересылки по почте (но без учета авиатарифа). Книги будут высланы нашей службой «Книга - почтой» в течение двух недель после получения заказа или выхода книги из пе- чати. Оплата наличными при курьерской доставке (только для Санкт-Пе- тербурга). Курьер бесплатно доставит заказ по указанному адресу в удобное для вас время в течение трех дней. Такой заказ лучше оформ- лять по телефону. ПРИ ОФОРМЛЕНИИ ЗАКАЗА УКАЖИТЕ: • фамилию, имя, отчество, телефон, факс, e-mail; • почтовый индекс, регион, район, населенный пункт, улицу, дом, корпус, квартиру; • название книги, автора, код, количество заказываемых экземпляров. Бы можете заказать бесплатный урнал «Клуб Профессионал». пздАтепьский дом
ИЗДАТЕЛЬСКИЙ ДОМ ВНИМАНИЕ СПЕЦИАЛИСТАМ КНИЖНОГО БИЗНЕСА! УВАЖАЕМЫЕ ГОСПОДА! ИЗДАТЕЛЬСКИЙ ДОМ «ПИТЕР» ПРИГЛАШАЕТ ВАС К ВЗАИМОВЫГОДНОМУ СОТРУДНИЧЕСТВУ. МЫ ПРЕДЛАГАЕМ ЭКСКЛЮЗИВНЫЙ АССОРТИМЕНТ КОМПЬЮТЕРНОЙ, МЕДИЦИНСКОЙ, ПСИХОЛОГИЧЕСКОЙ, ЭКОНОМИЧЕСКОЙ И ПОПУЛЯРНОЙ ЛИТЕРАТУРЫ. МЫ ГОТОВЫ РАБОТАТЬ ДЛЯ ВАС НЕ ТОЛЬКО В САНКТ-ПЕТЕРБУРГЕ. НАШИ ПРЕДСТАВИТЕЛЬСТВА НАХОДЯТСЯ В МОСКВЕ, МИНСКЕ, КИЕВЕ, ХАРЬКОВЕ. ЗА ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИЕЙ ОБРАЩАЙТЕСЬ ПО СЛЕДУЮЩИМ АДРЕСАМ: Россия, г. Москва Представительство издательства «Питер», м. «Калужская», ул. Бутлерова, д. 176, оф. 207 и 240, тел./факс (095) 234-38-15, 333-15-73. E-mail: sales@piter.msk.ru Украина, г. Харьков Представительство издательства «Питер», тел. (0572) 23-75-63, факс (0572) 14-96-09. Почтовый адрес: 310093, г. Харьков, а/я 9130. E-mail: piter@tender.kharkov.ua Россия, г. Санкт-Петербург Представительство издательства «Питер», м. «Электросила», ул. Благодатная, д. 67, тел. (812) 327-93-37, 294-54-65. E-mail: sales@piter.com Украина, г. Киев Филиал Харьковского представительства издательства «Питер», тел./факс (044) 490-35-68, тел. 490-35-69. Почтовый адрес: 04073, г. Киев, пр. Красных Казаков, д. 6, корп.1. E-mail: office@piter-press.kiev.ua Беларусь, г. Минск Представительство издательства «Питер», тел./факс (0172) 16-00-06. Почтовый адрес: 220012, г. Минск, ул. Кедышко, д. 19, а/я 104. E-mail: piterbel@carry.nsys.by КАЖДОЕ ИЗ ЭТИХ ПРЕДСТАВИТЕЛЬСТВ РАБОТАЕТ С КЛИЕНТАМИ ПО ЕДИНОМУ СТАНДАРТУ ИЗДАТЕЛЬСКОГО ДОМА «ПИТЕР». Предлагаем принять участие в совместных проектах по электронным продажам. Дополнительную информацию можно получить по телефону в Санкт-Петербурге: (812) 327-93-37. E-mail; siti@piter.com Ищем зарубежных партнеров или посредников, имеющих выход на зарубежный рынок. Телефон для связи: (812) 327-93-37. E-mail; sea@piter.com Редакции компьютерной, психологической, экономической, юридической, медицинской, учебной и популярной (оздоровительной и психологической) литературы Издательского дома «Питер» приглашают к сотрудничеству авторов. Обращайтесь по телефону: (812) 327-13-11.
ИЗДАТЕЛЬСКИЙ ДОМ УВАЖАЕМЫЕ ГОСПОДА! КНИГИ ИЗДАТЕЛЬСКОГО ДОМА «ПИТЕР» ВЫ МОЖЕТЕ ПРИОБРЕСТИ ОПТОМ И В РОЗНИЦУ У НАШИХ РЕГИОНАЛЬНЫХ ПАРТНЕРОВ. Башкортостан Уфа, «Азия», ул. Зенцова, д. 70 (оптовая продажа), маг. «Оазис», ул. Чернышевского, д. 88, телефакс (3472) 50-39-00. E-mail: asiaufa@ufanet.ru Дальний Восток Владивосток, «Приморский Торговый Дом Книги», тел./факс (4232) 23-82-12. Почтовый адрес: 690091, Владивосток, ул. Светланская, д. 43. E-mail: bookbase@mail.primorye.ru Хабаровск, «Мирс», тел. (4212) 22-74-58, факс 22-73-30. Почтовый адрес: 680000, Хабаровск, ул. Ким-Ю-Чена, д. 21. E-mail: postmaster@bookmirs.khv.ru Хабаровск, «Книжный мир», тел. (4212) 32-85-51, факс 32-82-50. Почтовый адрес: 680000, Хабаровск, ул. Карла Маркса, д. 37. Европейские регионы России Архангельск, «Дом Книги», тел. (8182) 64-00-56, факс 65-41-34. Почтовый адрес; 163061, Архангельск, пл. Ленина, д. 3. E-mail: book@atnet.ru Калининград, «Пресса», тел. (0112) 53-66-97, факс 53-63-87. Почтовый адрес: 236040, Калининград, ул. Подполковника Иванникова, д. За. E-mail: book@pressa.gazinter.net Краснодар, «Когорта», тел./факс (8612) 62-54-97. Почтовый адрес: 350033, Краснодар, ул. Ленина, д. 101. Северный Кавказ Ессентуки, «Россы», ул. Октябрьская, 424, тел./факс (86534) 6-93-09. Почтовый адрес: 357600, Ессентуки, а/я 80. E-mail: rossy@kmv.ru , Сибирь Братск, «Прометей», тел./факс (3953) 43-18-76. Почтовый адрес: 665708, Братск, ул. Кирова, д. 35. Иркутск, «Продалигь», тел. (3952) 59-13-70, факс 51 -23-31. Почтовый адрес: 664031, Иркутск, ул. Байкальская, д. 172, а/я 1397. E-mail: prodalit@irk.ru; http:/www.prodalit.irk.ru Иркутск, «Антей-книга», тел./факс (3952) 34-69-38. Почтовый адрес: 664003, Иркутск, ул. Карла Маркса, д. 20. E-mail: antey@irk.ru Красноярск, «Книжный Мир», тел./факс (3912) 27-39-71. Почтовый адрес: 660049, Красноярск, пр. Мира, д. 86. E-mail: book-world@public.krasnet.ru Нижневартовск, «Дом книги», тел. (3466) 23-59-50, факс 23-27-14. Почтовый адрес: 626440, Нижневартовск, пр. Победы, д. 12. Новосибирск, «Ton-книга», тел. (3832) 36-10-26, факс 36-10-27. Почтовый адрес: 630117, Новосибирск, а/я 560. E-mail: office@top-kniga.ru; http://www.top-kniga. nr Тюмень, «Друг», ул. Республики, д. 211, тел./факс (3452) 21-02-20. E-mail: drug@tyumen.ru Тюмень, «Фолиант», тел. (3452) 27-36-06, факс 27-36-11. Почтовый адрес: 625039, Тюмень, ул. Харьковская, д. 83а. E-mail: foliant@tyumen.nj Татарстан Казань, «Таис», ул. Гвардейская, д. 9а, тел. (8432) 76-34-55, факс 38-24-32. E-mail: tais@bancorp.ru Урал Екатеринбург, магазин № 14, ул. Челюскинцев, д. 23, тел. (3432) 53-24-90. E-mail: gvardia@mail.ur.ru Екатеринбург, «Валео Плюс», тел. (3432)42-07-75,42-56-00. E-mail: valeo@emts.ru Пермь, «Азбука», тел. (3422) 41-01-41, факс 64-12-26. Почтовый адрес: 614010, Пермь, ул. Героев Хасана, д. 10. E-mail: azb plus@perm.raid.ru
Ч книги по современным информационным технологиям новый интернет-магазин http://ITbook.ru IT . , КНИГИ П<- СО&р»М«|<МЫМ И ЧфОрМвЦМС'ЯН^Я Г&.*,«елоГЧЙМ book «Го ?асй»жеин=-1Й псисх |Учебный курс БЙкhome 1 [WE рубрика] |В] holplliiia'i Базы данных в Интернете. приложений « в«еа*м дойных Анексащр Фролов, Григорий Фролов Эта книга представляет собой практичес кое руководство по созданию приложений Web с Вазами данных для Интернета, а также для корпоративной интрасети В ней рассмотрены современные технологии, созданные Microsoft для работы с базами данных подробнее Компьютерные сети* Учебный курс M&wottCorp Настоящий учебный куре — перевод третьего издания бвстсе.-тле;-з Microsoft Press «Networking бзедогап». дополненного материалами о неводах в сетевых теянслегия»: и OCXlCSHMOCW: Windows NT $ подробна* магазин «Компьютерная и деловая книга» г. Москва, Ленинский пр-т, 38 тел.: (095) 778 7269 . Разработка распределенных приложений на Служб» 1| Active Di| Microsoft БОГАТ!? ВЫБОР низкий ЦЕНЫ I -
Борн Гюнтер Руководство разработчика на Microsoft Windows Script Host 2.0 Мастер-класс Перевод с английского под общей редакцией В. Г. Вшивцева Технический редактор С. В. Дергачев Компьютерная верстка Д. В. Петухов Дизайнер обложки Е. В. Козлова Оригинал-макет выполнен с использованием издательской системы Adobe PageMaker 6.0 TypeMarketFonflibrary легальный пользователь Л ОЛЬЗОВАТЕЛЬ Рага (-)Ту ре IN LEG A L USE Совместное издание издательства «Русская Редакция» и издательства «Питер» ишсшщиш &пппр’ Лицензия ЛР № 066422 от 19.03.99. Лицензия ИД № 01940 от 05.06.00. Подписано в печать 10.09.01. Формат 70 х 100/16. Физ. п. л. 30. Тираж 5000 экз. Заказ № 1532. ЗАО «Питер Бук». 196105, Санкт-Петербург, Благодатная ул, д. 67. Налоговая льгота - общероссийский классификатор продукции ОК 005-93, том 2; 953000 - книги и брошюры. Отпечатано с диапозитивов в ФГУП «Печатный двор» им. А М. ТЪрького Министерства РФ по делам печати, телерадиовещания и средств массовых коммуникаций. 197110, Санкт-Петербург, Чкаловский пр., 15.
Руководство разработчика Microsoft на Windows Script Host 2.0 Автоматизируя повседневные задачи по управлению компьютером, вы сэкономите время и ресурсы! Эта книга является подробным руководством по применению Windows Script Host (WSH). Здесь подробно рассмотрены возможности WSH, а также их расширение с помощью компонентов ActiveX и доступ к объектам автоматизации. Эта книга идеальна для всех, кто работает со сценариями: от новичков, желающих изучить основы предмета, до опытных разработчиков на Perl VBScript, JScript, Python, TCL или других языках сценариев. Одним щелчком мыши вы сможете: • выполнять резервное копирование и восстановление файлов, отключение и перезапуск Windows и другие задачи при старте и выходе из системы; • вызывать приложения Microsoft Office, открывать, обрабатывать и печатать документы, а также закрывать приложение; • обращаться к оболочке Windows и интерфейсу прикладного программирования для создания ярлыков, назначения дисков и принтеров и управления приложениями; • считывать переменные среды или получать информацию о Windows и отображать диалоговые окна со сведениями о приложениях или для получения вводимой пользователем информации. К чему пакетные файлы MS-DOS, средства записи макросов или дорогие и сложные инструментальные средства для автоматизации от сторонних производителей, если можно применить мощный, простой и бесплатный инструмент — Windows Script Host! На компакт-диске содержатся: • Windows Script Host 2.0; • утилиты, упрощающие разработку сценариев; • примеры программ на VBScript, и JScript; • справочник по объектам WSH; • электронная версия книги. Об авторе Гюнтер Борн имеет ученую степень по физике и 20-летний опыт работы в качестве инженера, разработчика ПО и менеджера проектов в химической промышленности. Опубликовал более 70 книг. Его последняя книга, выпущенная Microsoft Press на английском языке, — Inside the Microsoft Windows 98 Registry. ISBN 5-318-00605-1 ISBN 5-7502-0167-8 www.rusedit.ru www.piter.com 9 785750 201679