Главная страницаОбратная связьКарта сайта

Работа с сетевым окружением


Для работы с объектами сети и сетевого окружения в WSH есть объект wshNetwork, позволяющий получать информацию об имени пользователя, компьютера, подключать и отключать сетевые диски и принтеры.
Рассмотрим небольшой пример (листинг 6.14), в котором выведем в информационное окно сведения об имени пользователя, имени компьютера и домене (wsh_net_infojs).

; Листинг 6.14. Информация о пользователе, компьютере и домене. J Script

// Информация о пользователе,   компьютере и домене.   JScript

// Чеботарев И.

// http://www.whatis.ru

//Создаем объект WshNetwork

var WshNetwork = new ActiveXObjecttWScript .Network) ;

//Создаем переменную info и заносим туда имя пользователя

info = Имя пользователя:   + WshNetwork.UserName;

info = info +  Чп;

//Добавляем имя компьютера

info = info + Имя компьютера: + WshNetwork.ComputerName;

info = info + \n;

//Добавляем домен, к которому подключился пользователь

info я info + Домен: + WshNetwork.UserDomain;

//Выводим на экран полученную информацию

WScript.Echo (info);

Тот же пример на VBScript (листинг 6.15).

i Листинг 6.15. Информация о пользователе, компьютере и домене. VBScript

  Информация о пользователе,   компьютере и домене.   VBScript

1   Чеботарев И.

http://www.whatis.ru

Set WshNetwork = CreateObject(WScript.Network)

info = Имя пользователя: & WshNetwork.UserName

info ■ info Ь Chr(lO)

info щ  info & Имя компьютера: & WshNetwork.СотриterName

info = info fc ChrdCH

info = info & Домен: & WshNetwork.UserDomain

WScript.Echo info

В   ЭТИХ   Примерах   МЫ   ИСПОЛЬЗОВалИ   СВОЙСТВа  Объекта  WshNetwork:  UserName,

computerName и UserDomain для получения информации о текущем пользователе. Зачем это может понадобиться? Например, если на компьютере работает несколько пользователей и им нужен доступ к разным сетевым дискам, можно обеспечить автоматическое подключение этих дисков в зависимости от того, какой пользователь сейчас работает (результат работы скрипта вы можете видеть на рис 6.9).

Рис. 6.9. Информация о пользователе, компьютере и домене

Таким образом, мы подошли к вопросу работы с сетевыми дисками. Для начала неплохо бы выяснить, какие сетевые диски подключены в данный момент (на диске файл wsh_network_drives.js) — листинг 6Л6.

Листингб^б^о^юченныесетевь.в^скиУаЗспр!

// Подключенные сетевые диски. JScript

// Чеботарев И.

// http://www.whatis.ru

// Подготовим переменные для вывода сообщения

var vbOKQnly = 0,-

var vblnformation = 64;

var WSHShell = WScript.CreateObject(WScript.Shell);

var WSHNetwork ■ WScript.CreateObject(WScript.Network)

// Получаем коллекцию сетевых дисков

var colDrives = WSHNetwork.EnumNetworkDrives();

if (colDrives.length = 0)   { // Если дисков кет

WSHShell.Popup(Подключенных сетевых дисков кет, О,

Работа с WSHNetwork, vblnformation + vbOKQnly ); } else {

stxMsg •■ Текущие сетевые подключения:  \п; for {i =0; i < colDrives.length; i += 2) (

strMsg = strMsg + \n + colDrives(i) + St + colDrives(i + 1); }

WSHShel1.Popup(s trMsg,

0,

Работа с WSHNetwork,

vblnformation + vbOKOnly );
Думаем, вы уже достаточно освоили WSH, чтобы без подробных комментариев понять, что и как тут работает: создаем нужные переменные, проверяем, есть ли вообще подключенные диски, если нет — выводим соответствующее сообщение, если есть — выводим их список. Приведем аналогичный сценарий на VBScript (листинг 6.17).

\ Листинг 6.17. Подключенные сетевые диски. VBScript

  Подключенные сетевые диски.  VBScript

  Чеботарев И.

1  http://www.whatis.ru

Set WSHNetwork = WScript.CreateObject(WScript.Network) Set colDrivea = WSHNetwork.EmimNetworkDrives If colDrives.Count = 0 Then

MsgBox Подключенных сетевых дисков нет,

vblnformation + vbOkOnly,                                         _

Работа с WSHNetwork Else

strMsg ■ Текущие сетевые подключения:   5 Chr[10) For i = 0 To colDrives.Count - 1 Step 2

strMsg = strMsg & Chr[10)  & colDrives(i)  & Chr(9)  U colDrives(i+1) Next

MsgBox strMsg,                                                                           _

vblnformation + vbOkOnly,                                         _

Работа с WSHNetwork End If

Для подключения и отключения сетевых дисков существуют методы мар-NetworkDrive и RemoveNetworkDrive соответственно. Пример работы с ними (на JScript): WshNetwork.MapNetworkDrive(X:,   \\\\S2UVoll,   true,   Userl,   123};

Здесь обязательными являются только первые два параметра: буква, на которую будет подключаться диск и, собственно, путь к сетевому диску. Третий (true или false) параметр указывает, осуществлять или нет подключение этого диска при следующем входе в систему. Четвертый и пятый параметры — имя пользователя и пароль, с которыми может подключаться этот диск. Конечно, хранить пароль на подключение диска в открытом виде в сценарии не очень мудро. Лучше организовать доступ к диску нужным пользователям на сервере, средствами самой ОС. Тогда посторонние люди не смогут узнать пароль для работы с этим ресурсом.

Отключение сетевого диска: WshNetwork.RemoveNetworkDriveCX:,   true,   true);Здесь обязателен только первый параметр — буква отключаемого диска. Второй параметр — если true, отключает диск, даже если он в этот момент используется. Третий параметр сохраняет настройки для следующих регистрации.

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

П EnumPr interconnect ions — возвращает список всех подключенных в системе принтеров (аналогично дискам).

П AddPrinterConnection — подключает локальный порт компьютера к сетевому принтеру. Параметры у этого метода аналогичны методу MapNat-workDrive, только первым параметром идет не буква диска, а порт принтера (LPT1, например).

□  RemovePr-interConnection — отключает сетевой принтер (вместо буквы
диска — порт принтера).

П setDefaultFrinter — устанавливает заданный сетевой принтер принтером по умолчанию. В качестве параметра методу передается сетевое имя принтера, который будет использован по умолчанию: SetDefaultFrinter (UUConplUHPllOO);

□  Addwindows Printer connect ions — регистрирует принтер в Windows и под­
ключает его к сетевому ресурсу. Этот метод позволяет создать связь с сете­
вым принтером без явного перенаправления вывода в локальный порт.
Набор параметров этого метода для Windows 9х и Windows NT/2000/XP
отличается.

Для Windows 9x:

AddWindowsFrinterconnections{strPrnPath,   strDriverName   [,strPort]);

•       strPrnPath — путь к сетевому принтеру;

•       strDriverName — имя драйвера, необходимого для подключения принтера;

•       strPort — порт, куда будет перенаправлен вывод.

Для Windows NT/2000/XP последние два параметра игнорируются.

Управление программами

Возможно, читая предыдущий материал о WSH, вы задавались вопросом: Да что такого особенного в этих сценариях?. Действительно, редактировать реестр можно и из reg-файлов, запускать программы, работать с сетевыми дисками, файлами и папками можно из bat-файлов. Да, WSH имеет более богатые возможности в этой области, работать с ним проще и удобние, но стоят ли эти преимущества того, чтобы изучать данную тему? Однако у сценариев
WSH есть такие области при работе на компьютере, где бессильны все остальные средства (за исключением специально написанных программ). Далее хотелось бы рассказать о возможности управлять другими приложениями Windows (консольными приложениями для MS-DOS управлять не удастся).

В этот раз теории будет совсем чуть-чуть, зато постараемся привести много очень любопытных примеров, а дальше все будет зависеть от вашей фантазии.

Итак, что подразумевается под управлением другими приложениями? Активизация существующего окна и имитация нажатия в нем различных клавиш. Люди для этого пишут умные и сложные программы, а мы создадим простенький скрипт с тем же эффектом.

Начнем с того, что попытаемся активизировать окно уже запущенной программы.

//JScript

var WshShell = WScript.CreateObject(WScript.Shell);

WshShell.AppActivatelБлокнот);

Для активизации окна мы воспользовались методом wshshell.AppActivaten. В качестве параметра передается некоторая текстовая строка. Скрипт осуществляет поиск окна, название которого эквивалентно переданной строке. Если такого окна нет, то будет вестись поиск окна, начало заголовка которого совпадает со строкой, и в последнюю очередь ведется поиск окна, окончание заголовка которого эквивалентно переданной строке. Это очень удобно, т. к. например, в Word заголовок окна меняется в зависимости от имени редактируемого файла, но в имени окна всегда присутствует Microsoft Word. Если окон, удовлетворяющих условию поиска несколько, то активизируется первое найденное окно, Надо отметить, что если окно программы свернуто на панель задач, то оно не разворачивается, а просто кнопка приложения становится нажатой.

Но просто сама по себе такая возможность мало что дает полезного, зато в связке со следующим методом можно добиться потрясающего эффекта. И метод этот sendKeys(). Итак, давайте напишем небольшой забавный скрипт, позволяющий слегка позабавиться над друзьями (листинг 6.18).

i Листинг 6.18. Управление программой. JScript

//  Управление программой.   JScript

// Чейотарев И.

// http://www.whatis.ru

var WshShell = WScript.CreateObject(WScript.Shell),-

// Создадим ключ,   указывающий,   запущена или нет нужная нам программа

//  true — программа не запущена,   и надо дальше ожидать ее появления

//   false — программа запущена,   прекратить  слежение

KEY = true;
while (KEY) {

if (WshShell.AppActivate(Блокнот)) (

// Программа запущена, приступаем к основной части

WriteWordO ,■

// Прекращаем слежение за приложениями

KEY = false; } if (WshShell.AppActivate(Microsoft Word)) {

WriteWordf);

KEY = false,-)

// Повторять проверку с периодичностью в 10 секунд WScript.Sleep(WOOO) ; }

function WriteWordO { WshShell.SendKeys(THE ); WScript.Sleep(300); WshShell.SendKeys(MATRIX ); WScript.Sleep(300); WshShell.SendKeys(HAS ); WScript.Sleep(300); WshShell.SendKeysOYOU. ..),-WScript.Sleep(300); }

Каждые 10 секунд производится проверка на наличие открытого окна Word или Блокнота и если таковое обнаруживается, туда выводится текст, после чего скрипт завершает свою работу. Гораздо более красивого эффекта можно добиться, если выводить надпись по одной букве, но тогда размер текста программы будет раза в три длиннее, и мы не станем его приводить из-за экономии места.

Вот похожий пример, написанный на VBScript (листинг 6.19).

! Листинг 6.19. Управление программой. VBScript

1  Управление программой.   VBScript

1  Чеботарев И.

1 http://www.whatis.ru

set WshShell = wScript.CreateObject(WScript.Shell) KEY = true do while key

if WshShell.AppActivate(Microsoft Word) then

WriteWordO

KEY = false
end if

WScript.Sleep 3000 loop

function WriteWord[)

WshShell.SendKeys   HELLO,   WORLD! end function

Этот пример приведен для того, чтобы любители именно этого скриптового языка могли по аналогии переделать все остальные примеры данного материала, потому что они будут на JScript. Примеры листингов 6,18 и 6.19 вы найдете в файлах wsh_sendkeys.js и wsh_sendkeys.vbs соответственно.

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

Помимо алфавитно-цифровых символов в приложения можно передавать и нажатие специальных клавиш, например, <Enter>, <Tab<, <FI>, ..., <F12>, <Alt>, <Shift>, <Ctrl> и др. В табл. 6.2 приведены специальные обозначения для этих клавиш.

Таблица 6.2. Соответствие специальных клавиш их коду в WSH
Так, если вы хотите передать нажатие нескольких клавиш с нажатой клавишей <Shift>, то вам надо выполнять команду WshShell.SendKeys(+(ABC)) ,-

если только первую, то WshShell.SendKeysf+ABC) ,

Легко заметить, что такие символы, как +, \ % зарезервированы под обозначение специальных клавиш, так что просто так передать эти (и некоторые другие) символы не удастся. Для этого надо заключить их в фигурные скобки: {+}, {%}, Вот полный список символов, которые необходимо заключать в фигурные скобки: +, л, %, -, (, ), {, }, [, ].

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

WshShell.SendKeys({A 100});

эквивалента сотне нажатий клавиши <А>. Правда, есть ограничение на количество возможных повторений нажатия клавиш — 8175. При превышении этого значения в сценарии будет выдана ошибка.

На этом покончим с теорией и рассмотрим еще пример работы с программами именно с использованием клавиш, приведенных в табл. 6.2. Закроем приложение Word, сохранив предварительно все изменения в файле test (комментировать код, думаем, не стоит, итак все достаточно подробно объяснено выше) — листинг 6.20.

Листинг 6.20. Управление программой. JScript

// Управление программой. JScript

// Чеботарев И.

// http://www.whatia.ru

var WshShell = WScript.CreateObjectCWScript.Shell); if (WshShell.AppActivate(Microsoft Word)) С

WshShell.SendKeys(%);

WshShell.SendKeys({ENTER});

WshShell.SendKeys({DOWN))

WshShell.SendKeys({DOWN})

WshShell.SendKeys({down})

WshShell.SendKeys(■{DOWN}>

WshShell.SendKeys({ENTER}

WshShell.SendKeysCtest) ,■

WshShell.SendKeys!{ENTER))
Довольно забавно наблюдать, как пункт меню вдруг сам открывается, курсор перемещается по пунктам, а затем сохраняется документ. Конечно, проще было бы использовать горячие клавиши, но при русской раскладке клавиатуры это не пройдет (из-за некорректной передачи русских букв, о чем уже упоминалось выше), так что приходится выкручиваться таким способом. Ну, а для английской версии легко переделать скрипт под использование горячих клавиш, что несколько сократит его размер.

Обработка исключений

Вначале стоит определиться с терминами, ведь если любой программист прекрасно знает что такое исключения, то остальные далеко не всегда точно представляют, о чем идет речь. Говоря простым языком, исключения или исключительные ситуации — это ошибки, возникающие в холе работы программы (в нашем случае скрипта). Но это не те ошибки, когда вы забыли поставить закрывающую скобку, запятую или ошиблись в имени переменной. Это ошибки, возникающие в некоторых (исключительных) ситуациях во время выполнения рабочего скрипта.

Рассмотрим простенький пример скрипта на VBScript, пытающегося прочитать значение какого-то параметра в реестре и выдать его в сообщении:

Dim Perem

set WSHShell = WScript.CreateObject(WScript.Shell)

WSHShell.Popup Начало скрипта

Perem »

Perem = WSHShell.RegRead(HKCU\Software\Test)

WSHShell.Popup Perem

WSHShell.Popup Конец скрипта

Сообщение Начаю скрипта появилось, следовательно, синтаксических ошибок мы не допустили, но вот затем появляется сообщение об ошибке (рис. 6.10), что и неудивительно— параметра с именем Test в разделе нкси\software не существует. Из-за этого наш пример не отработал до конца.

Возникает логичный вопрос: а нельзя ли каким-то образом отловить момент появления ошибки, как-то его обработать и продолжить выполнение скрипта дальше? Оказывается, можно. Перепишем наш пример следующим образом:

Dim Perem

set WSHShell = WScript.CreateObject(WScript.Shell}

WSHShell.Popup Начало скрипта Perem =
On Error Resume Next

GetErr()

if £rr.Source=WshShell.RegRead then

Perem = Параметр не существует else

Perem = WSHShell.RegReadlHKOASoftwareN Test) end if Err.Clear

WSHShell.Popup Perem WSHShell.Popup Конец скрипта

Function GetErrf)

If WSHShell.RegRead(HKCU\Software\ Test) Then

End if End Function



Рис. 6.10. Сообщение об исключительной ситуации

Попытка прочитать параметр из реестра вынесена в отдельную функцию. Если происходит ошибка — функция возвращает код ошибки (Err.Number) и источник (егг.source). В операторе if мы проверяем, та ли это ошибка, что нам нужна, и если это именно так, значит, параметр не удалось прочитать по причине его отсутствия, о чем нас честно и предупреждают в появившемся сообщении. При этом скрипт корректно отрабатывает до конца. Если же ошибка не возникла, мы спокойно прочитываем значение нужного нам параметра.

Обратите внимание па объект Err. Это стандартный объект VBScript, содержащий информацию о так называемых run-time errors (ошибках времени выполнения). Свойство Source указывает на источник ошибки (в сообщении на рисунке это последняя строка). Метод Clear очищает свойства объекта, удаляя сведения об ошибке. Помимо Source и clear у объекта есть и другие свойства и методы, но реально может понадобиться, пожалуй, свойCTBO Number И Description. Number возвращает КОД произошедшей ошибки, a Description — ее описание. Измените в скрипте строку

Perem = Параметр не существует

на

Perem =  Ошибка  & Err.Number &  ,         & Err.Description

Во время выполнения скрипта появится сообщение: Ошибка -2147024894. Не удается открыть для чтения раздел реестра HKCU\Software\Test.

Это большое отрицательное число и есть код ошибки. При обработке исключений можно пользоваться и номерами ошибок.

Почему для объяснения работы с исключениями все объяснялось на примерах чтения данных из реестра? Во-первых, работа с реестром в WSH — одна из наиболее часто встречаемых задач. Во-вторых, другие ошибки (например попытка подключения сетевого диска на уже существующую букву, попытка открытия несуществующего файла и т. п.) могут быть обработаны другими способами (при открытии файла можно в начале проверить его наличие с помощью метода FileExists объекта fso). В то время как проверка наличия какого-либо параметра в реестре отсутствует в принципе. Поэтому вопросы обработки исключений при работе с реестром наиболее актуальны.

^     Примечание

Обработка ошибок run-time в данном разделе рассматривалась исключительно на примере VBScript. Дело в том, что в JScript нет для этого специального объекта, как в VBScript, Для этих целей служит специальная конструкция try{...) catch {...}■ Однако рассмотрение таких вопросов выходит ээ рамки данной книги. Если вы желаете более подробно ознакомиться с программированием на JScript, воспользуйтесь специальной литературой.

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

*   *   *

Конечно, на этом возможности WSH не заканчиваются. Есть еще немало вопросов для изучения. Если вы хотите узнать больше об этой технологии, приобретите литературу, посвященную данной тематике. Ну и, конечно, самая полная информация о WSH находится на официальном сайте Microsoft: http://msdn.microsoft.coin.

Обсудить статью на форуме


Если прочитаная статья из нашей обширной энциклопедия компьютера - "Работа с сетевым окружением", оказалась полезной или интересной, Вы можете поставить закладку в социальной сети или в своём блоге на данную страницу:

Так же Вы можете задать вопрос по статье через форму обратной связи, в сообщение обязательно указывайте название или ссылку на статью!
   


Copyright © 2008 - 2017 Дискета.info