Войти
 
 
   
 
  
Новости Notes.ру Библиотека Биржа труда Вопрос - ответ Форум Регистрация Поиск О проекте
Разделы
О Notes
Советы
Шаблоны и примеры
Литература
Презентации
 
Всё о задаче AdminP. Часть вторая   Во второй части мы завершаем рассмотрение AdminP. В ней рассмотрены запросы междоменного администрирования и способы управления функциями AdminP с помощью настроек документа сервера, команд консоли сервера, файла Notes.ini и интервалов очистки базы данных. В этой статье предполагается, что вы опытный администратор Domino и прочитали первую часть
О Notes Читать статью
 
Всё о задаче AdminP. Proxy-действия в R5 и Domino 6   Приложение к статье об административном процессе
О Notes Читать статью
 
Всё о задаче AdminP. Часть первая   Перевод классической статьи 2003-его года о задаче административного процесса (AdminP). Очень полезна для понимания работы механизма этой задачи. В первой части статьи описаны компоненты задачи AdminP, как они работают, и как их использование помогает сделать работу администратора Domino проще. Задача AdminP (сакращённо от Administration Process, Административный процесс) работает с базой административных запросов (Administration Requests, admin4.nsf)
О Notes Читать статью
 


Советы

Главная   Библиотека   Советы

Расширяем возможности разработки в среде Lotus Notes при помощи Windows Script Host

Андрей Черепанов, Красноярск
LotusScript сам по себе обладает неплохим набором функций по работе с дисками и файлами, но в ряде случаев приходится изыскивать дополнительные возможности. В качестве одного из решений могут быть использованы обращения к COM-объектам Windows Script Host (WSH), которые являются частью Windows, начиная с Windows’98. К сожалению, в Windows’95 и в Windows NT до ServicePack 4, этот набор объектов не присутствует и его необходимо устанавливать отдельно.

В Windows Script Host входят четыре COM-объекта:
ОбъектОписание
WScript.ShellОбеспечивает доступ к оболочке Windows
WScript.NetworkОбеспечивает доступ к ресурсам сети, находящимся в общем пользовании
Scripting.FileSystemObjectПрименяется для дисковых операций. Это включает чтение, запись, удаление файлов и создание каталогов
Scripting.DictionaryАналог ассоциативных массивов Perl - хэшей

WScript.Shell

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

WScript.Network

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

Scripting.FileSystemObject

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

Scripting.Dictionary

Этот объект является аналогом ассоциативных массивов Perl - хэшей. Элементы массива могут быть любой формой данных сохраненной в массиве. Каждый элемент связан с уникальным ключом. Ключ (целое число или строка) используется, чтобы получить элемент.

Более полную информацию можно получить на сайте MSDN: msdn.microsoft.com/scripting. Так же можно посмотреть информацию о данной технологии и на русскоязычных сайтах, например: http://www.whatis.ru/reg/reg_s1.shtml

Для получения доступа к данным объектам необходимо их создать при помощи функции LotusScript CreateObject:

Dim sh As Variant
Dim net As Variant
Dim fso As Variant
Set sh = createObject("WScript.Shell")
Set net = createObject("WScript.Network")
Set fso = createObject("Scripting.FileSystemObject")

После этого можно обращаться к свойствам и методам данных объектов. Необходимо напомнить, что при обращении к функциям COM-объектов, у которых отсутствуют передаваемые параметры, следует писать пустые круглые скобки, например: i%=Obj.Count(), иначе исполняемый код LotusScript будет пытаться обратится к функции как к свойству, что приведет к ошибке. Также следует обращать внимание на возвращаемые функцией значения, которые зачастую представляют собой внутренние COM-объекты. В этом случае, возвращаемые значения следует присваивать переменным типа Variant через инструкцию Set. Например: Set enDrv = net.EnumNetworkDrives().

В качестве примера использования описываемого инструментария можно привести код агента, который выводит информацию о компьютере пользователя в файл, затем открывает файл в текстовом редакторе и по закрытию редактора удаляет файл.
Следует оговориться, что приводимый код тестировался только в системе Windows2000
Кроме того, используемое решение «самоудаляющихся» файлов работает только в случае, когда возможно определить момент завершения работы приложения, в котором открыт файл. Так, например, при открытии документа в приложении MS Word’2000, попытка открытия еще одного документа через подобный скрипт приведет к ошибке, поскольку MS WSH не сможет определить момент завершения работы со вторым документом, о чем и сообщит в диалоге ошибки времени исполнения.

Sub Initialize
' Данный пример демонстрирует работу Lotus Notes с объектами Windows Script Host
' Объявление и создание COM-объектов
Dim sh As Variant
Dim net As Variant
Dim fso As Variant

On Error Goto NoWScript
Set sh = createObject("WScript.Shell")
Set net = createObject("WScript.Network")
Set fso = createObject("Scripting.FileSystemObject")

' Использование функции WSH для получения переменных окружения системы
' (пути к каталогу временных файлов) и определения имен временных файлов
Dim envP As Variant
Set envP = sh.Environment("Process")

tmpFolder$ = sh.ExpandEnvironmentStrings(envP.Item("TEMP"))
tmpFile$ = fso.GetTempName()
tmpVBS$ = fso.GetTempName()

' Использование функций WSH для операций чтения-записи в файл
Dim f As Variant ' объявление объекта файла
Set f = fso.CreateTextFile(tmpFolder$+"\"+tmpFile$+".txt", True)
On Error Resume Next
Call f.WriteLine("* TEST REPORT *")
Call f.WriteLine("===============")

' Использование функций для получения информации о сетевом окружении
Call f.WriteBlankLines(2)
Call f.WriteLine("-NETWORK-")
Call f.WriteLine("~~~~~~~~~")
Call f.WriteLine("ComputerName: "+net.ComputerName)
Call f.WriteLine("UserName: "+net.UserName)
Call f.WriteLine("UserDomain: "+net.UserDomain)

' Функции возвращает список сетевых дисков...
Call f.WriteBlankLines(1)
Call f.WriteLine("Network Drivers")
Call f.WriteLine("~~~~~~~~~~~~~~")
Dim enDrv As Variant
Set enDrv = net.EnumNetworkDrives()
If enDrv.Count()=0 Then
Call f.WriteLine("Сетевые диски отсутствуют")
Else
For i%=0 To enDrv.Count()-1 Step 2
Call f.Write(enDrv.Item(i%)+" - ")
Call f.WriteLine(enDrv.Item(i%+1))
Next
End If

' ... и список сетевых принтеров...
Call f.WriteBlankLines(1)
Call f.WriteLine("Network Printers")
Call f.WriteLine("~~~~~~~~~~~~~~")
Set enDrv = net.EnumPrinterConnections()
If enDrv.Count()=0 Then
Call f.WriteLine("Сетевые принтеры отсутствуют")
Else
For i%=0 To enDrv.Count()-1 Step 2
Call f.Write(enDrv.Item(i%)+" - ")
Call f.WriteLine(enDrv.Item(i%+1))
Next
End If

' а также информацию о доступных дисках
Call f.WriteBlankLines(2)
Call f.WriteLine("DRIVES")
Call f.WriteLine("~~~~~")
Dim drv As Variant
Set drv = fso.Drives
Forall d In drv
Call f.WriteLine("Drive "+d.Path+" ("+d.DriveLetter+")")
Call f.Write("DriveType: "+Cstr(d.DriveType))
Select Case d.DriveType
Case 0: Call f.WriteLine(" (Unknown)")
Case 1: Call f.WriteLine(" (Removable)")
Case 2: Call f.WriteLine(" (Fixed)")
Case 3: Call f.WriteLine(" (Network)")
Case 4: Call f.WriteLine(" (CD-ROM)")
Case 5: Call f.WriteLine(" (RAM Disk)")
End Select
Call f.WriteLine("IsReady: "+Cstr(d.IsReady))
If d.IsReady Then
Call f.WriteLine("FileSystem: "+Cstr(d.FileSystem))
Call f.WriteLine("AvailableSpace: "+d.AvailableSpace)
Call f.WriteLine("TotalSize: "+d.TotalSize)
Call f.WriteLine("FreeSpace: "+d.FreeSpace)
Call f.WriteLine("SerialNumber: "+d.SerialNumber)
Call f.WriteLine("VolumeName: "+d.VolumeName)
Call f.WriteLine("ShareName: "+d.ShareName)
End If
Call f.WriteBlankLines(1)
End Forall
' Окончание записи в файл. Закрытие файла отчета
On Error Goto NoWScript ' Установка обработчика ошибки на следующую критическую функцию..
Call f.Close()


' Ниже следует пример реализации механизма открытия файла сторонним приложением и
' удаления файла по закрытии приложения

' Использование функции для получения из реестра пути к приложению, ассоциированному с расширением TXT
On Error Goto Rerr ' Если при чтении из реестра возникнут какие-либо ошибки,
' что вероятно, если код работает не на NT/2000/XP,
' то будет применена более простой метод
Dim tmp As Variant
Dim App As String
ExtType$ = sh.RegRead("HKCR\.txt\") ' возвращает значения ключа "по умолчанию"
If ExtType$<>"" Then ' Если полученное значение не пустое, то формируется строка вызова приложения по этому "ключу"
App = sh.ExpandEnvironmentStrings(sh.RegRead("HKCR\"+ExtType$+"\shell\open\command\"))
' Замена одинарных кавычек на двойные
beg%=1
While Instr(beg%, App, """" )>0
pos%=Instr(beg%, App, """" )
App = Left(App, pos%-1)+""""""+Right(App, Len(App)-pos%)
beg%=pos%+2
Wend
' Включение в строку вызова имени файла документа-отчета
' может быть оформлено как %1, "%1" или вообще отсутствовать параметр
If Instr(App, """%1""" )>0 Then
pos%=Instr( App, "%1" )
App = Left(App, pos%-1)+tmpFolder$+"\"+tmpFile$+".txt"+Right(App, Len(App)-pos%-1)
Elseif Instr(App, "%1" )>0 Then
pos%=Instr( App, "%1" )
App = Left(App, pos%-1)+""""""+tmpFolder$+"\"+tmpFile$+".txt"""""+Right(App, Len(App)-pos%-1)
Else
App = App +" """""+tmpFolder$+"\"+tmpFile$+".txt"""""
End If
Else
RErr:
' Если при чтении ключей из реестра произошла ошибка, то в качестве строки вызова приложения
' передается имя файла
App = """"""+tmpFolder$+"\"+tmpFile$+".txt"""""
End If

On Error Resume Next
' Создание VBS скриптового файла, который будет открывать, и уничтожать документ-отчет
Set f = fso.CreateTextFile(tmpFolder$+"\"+tmpVBS$+".vbs", True)
Call f.WriteLine("Dim sh, fso")
Call f.WriteLine("Set sh = Wscript.CreateObject(""WScript.Shell"")")
Call f.WriteLine("Set fso = Wscript.CreateObject(""Scripting.FileSystemObject"")")
Call f.WriteLine("sh.Run """+Trim(App)+""", 3, True")
Call f.WriteLine("fso.DeleteFile """+tmpFolder$+"\"+tmpFile$+".txt""")
Call f.WriteLine("fso.DeleteFile """+tmpFolder$+"\"+tmpVBS$+".vbs""")
Call f.Close
' Выполнение скриптового файла...
Call sh.Run( """"+tmpFolder$+"\"+tmpVBS$+".vbs""", 0, False)
' Управление немедленно передается обратно после запуска скрипта
' и пользователь может продолжить работать с Notes в то время, как открыт документ-отчет.
' После закрытия приложения, открывшего документ-отчет, файл будет удален
Exit Sub
NoWScript:
Messagebox "Необратимые ошибки при работе примера..."
Exit Sub
End Sub

Читайте также на Notesnet.ru материал Microsoft Office и Lotus Notes >>>
 
  Опубликовано — 12/18/2003 |    

Денис Лукин, 12.01.2004:
Да я уже узнал, оказывается потому что jscript в notes netscape'сковский, поэтому скрипты, которые работают в виндах не хотят идти под клиентом notes. Достаточно, скажем создать в форме кнопку и сунуть туда код из http://www.whatis.ru/reg/reg_s1.shtml, сразу идёт ругачка на wscript. А так это в общем не важно, есть ведь лотускрипт, и выход как в случае с VB - изменение синтаксиса программы.

Николай Норкин, 06.01.2004:
Денис, приветствую! Это для меня совсем экзотика... JS для Notes + WSH... Так что... если это важно, давайте все по-подробней... Релиз клиента, платформа, а также событие, вызывающее JS и собственно код обработки... как должно работать и что не работает...

Лукин Денис, 05.01.2004:
Кстати, непонятно почему WSH не хочет работать в Лотусовом Jscripte? Хотя в дизайнере можно даже импортировать .js файлы.



Добавить комментарий
Имя * :
e-mail
Комментарий * :
Код подтверждения * :


Мероприятия
Пресс-релизы
Биржа труда
Последнее на форуме
 
А так же:
Как удалить профиль?
16.04.2016 00:08:51
Скопировать в буфер поле документа
24.05.2015 08:55:52
Импорт DXL-описания документов в Lotus Domino. Одноимённые поля
16.04.2015 16:49:58
 
© LOGOSPHERE.RU