Отправляет email-рассылки с помощью сервиса Sendsay

Ресурсы сети InDev

  Все выпуски  

Ресурсы сети InDev


Служба Рассылок Subscribe.Ru


Ресурсы сети lnDev No. 11

Сценарии в windows
Сегодня, я хотел рассказать вам о сценариях в windows. Напомню, сценарии - файлы содержащие код на зарегистрированных в ОС языках. Обычно имеют расширение vbs, js, jse для языков JScript, VBScript. Языки интерпретируются собственно зарегистрированными engine-ами. В интернете есть engine ActivePerl, другие не искал. У jscript и vbscript есть возможность создавать и использовать сервера автоматизации такие как Microsoft Access. Собственно в состав WSH (Windows Scripting Host) - интерфейс между файлами сценариев и зарегистрированными engine-ами входят примеры автоматизации именно приложений офиса. В версии WSH 5.6, если не ошибаюсь, появилась возможность создавать файлы сценариев в формате XML (описание смотрите в MSDN). Там, в одном файле можно писать сценарии на разных языках. Код делится на задания (job). Запускать нужно именно задания по имени в указанном файле. Файлы сценариев в XML имеют расширение wsf.
     Создание сервера сценария осуществляется методом WScript.CreateObject(). Ее параметром должен быть ProgID. Есть еще интересная функция GetObject, которая тоже создает сервера автоматизации. Ее параметром могут быть строка соединения ADSI или путь к файлу с расширением, для которого зарегистрирован редактор, поддерживающий автоматизацию.

Пример на jscript с ProgID:
var oacc = WScript.CreateObject("Access.Application");

Пример с ADSI (точно работает в W2000AS):
var ns = GetObject("WinNT://myserver");

"Ну и что дальше?",- скажете вы. "Зачем мне сервер автоматизации?" Я думаю он вам все таки может пригодиться. Как минимум, сценарии windows мощнее пакетных файлов (bat) и вы можете написать на jscript более сложную логику. У вас есть доступ к реестру. Точно не проверял, но думаю можно использовать и "JScript.Encode" и не показывать открытым кодом, что делает сценарий. Чтобы получить закодированный код из Jscript, попробуйте воспользоваться утилитой screnc.exe. Ее можно взять на сайте Microsoft (Usage: screnc [/?] [/s] [/f] [/xl] [/l ScriptLanguage] [/e DefaultExtension] ). Вам не нужен установленный компилятор т.к. сценарий интерпретируется. Вы можете работать с файлами на уровне чтения и записи с объектом FileSystemObject (FSO). Вы можете работать по протоколам HTTP, FTP. Думаю, можно найти еще что-то, но оставлю эти открытия вам.
     ADSI (Active Directory Service Interface) о котором я говорил выше, тоже стоит минуты внимания. Это достаточно удобное средство для получения сведений о компьютере, пользователях, локальной сети. Некоторые интерфейсы ADSI в сценариях создаются достаточно долго, но их получение требуется только один раз. Вот пример программы, которая выводит на экран список пользователей из базы пользователей ОС.

// запуск "cscript //nologo file.jse" 
var ns, uo, e, list; 
ns = GetObject("WinNT://myserver"); 
ns.Filter = Array("user"); 
e = new Enumerator(ns); 
list = ""; 
while (!e.atEnd()) 
{ 
 uo = e.item(); 
 if (uo.Class == "User")  
  list += uo.Name + "\n"; 
 e.moveNext(); 
} 
WScript.Echo(list);

Получить такую функциональность в пакетном файле достаточно проблематично. Еще один вопрос, о котором я вам напомню, это: как получить информацию о методах доступных для автоматизации сервера. Первое, куда стоит посмотреть это HELP. Может быть интерфейсы описаны. Если это не поможет, то в составе Visual Studio есть утилита OLEVIEW.EXE, которая создает IDL файлы из DLL и EXE. В IDL на вполне читаемом языке описаны методы наследника IDispatch интерфейса. Бывает, что у некоторых программ есть сервера автоматизации, которые предоставляют именно те возможности, которых нет в меню, но именно их вам так не хватало.
     Вот вам пример программы, которая копирует в буфер windows SQL-запросы (Query). База данных - Microsoft Access 2000. Результат не заметен и после выполнения в буфере останется только последний запрос, но вы можете потренироваться и после строки "copy to clipboard" написать запуск программы, которая будет сохранять содержимое буфера. В этой программе важен фокус окна. Поэтому вы должны использовать внешнюю программу, которая захватывает (или захватывает и потом отдает обратно) фокус у Access. Кроме того версии WSH 2.0 есть возможность переключать фокус с окна на окно.

var osh = WScript.CreateObject("WScript.Shell"); 
var oacc = WScript.CreateObject("Access.Application"); 
oacc.Visible = true; 
 
// открыть файл 
oacc.OpenCurrentDatabase("C:\\db.mdb"); 
 
for (c=0; c < oacc.CurrentData.AllQueries.Count; c++) 
{ 
 // открыть запрос 
 oacc.DoCmd.OpenQuery( 
oacc.CurrentData.AllQueries.Item(c).Name,  
  1, 2); // Name, Design, Read Only 
 
 oacc.RunCommand(190); // copy to clipboard 
 
 osh.Popup( 
oacc.CurrentData.AllQueries.Item(c).Name); 
 
 // закрыть запрос 
 oacc.DoCmd.Close(); 
} 
 
// закрыть БД 
oacc.CloseCurrentDatabase();
Темы, затронутые в этой статье: COM, Jscript, ADSI, IDL, SQL, Access. Удачи вам и новых знаний.

-KOYOT

Предыдущие выпуски
Вы всегда можете найти все номера на нашем сайте в разделе "Рассылка" и в архиве службы рассылок http://subscribe.ru/archive/comp.soft.prog.indev. Кроме того привожу список на настоящий момент.

P.S.
Ну вот вроде и все на сегодня. Напоследок предложу вам подписать на нашу рассылку друзей и знакомых, что можно будет сделать формой внизу и если есть желание, то присылать новости и замечания.

 Subscribe.Ru

Авторские права охраняются. Перепечатка данного материала
или его части в любом виде разрешена только с указанием
авторства InDev и ссылки на сайт Ресурсы сети InDev




 

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное