|
|
Windows Scripting (выпуск 4)
|
|
|
Здравствуйте!
Рад приветствовать Вас на странице моей рассылки!
Эта рассылка посвящена самым различным аспектам программирования в среде Microsoft Windows Scripting - от конфигурирования и администрирования Microsoft Windows, IIS, Exchange Server и SQL Server до особенностей программирования на VBScript и JScript.
Не забудьте посетить сайт рассылки scripting.narod.ru, где имеется много другой полезной информации, посвященной Windows Script и не вошедшей в рассылку.
Буду также рад получить от Вас письмо с Вашими вопросами, пожеланиями, предложениями и замечаниями: [email protected].
Настоятельная рекомендация тем, кто подписан на текстовую версию рассылки: ***Подпишитесь на HTML-вариант***! Я подготавливаю только HTML-версию рассылки, а текстовая версия генерируется из нее автоматически.
Посмотрите на HTML-версию этой рассылки, которая находится здесь: http://scripting.narod.ru/issues/issue004.htm.
|
|
|
|
|
|
|
21.10.2000
Как выяснилось, можно значительно уменьшить утечки памяти web-серверов на базе
Microsoft Windows NT 4.0 и Internet Information Server (IIS) 4.0,
если произвести upgrade на VBScript 5.5.
См. статью Q274519 из Microsoft Knowledge Base:
INFO: VBScript Version 5.5 Upgrade May Reduce Memory Leaks.
|
|
|
17.10.2000
Вышел ноябрьский номер журнала
MSDN Magazine. |
|
|
16.10.2000
В журнале MSDN Online Voices
опубликована новая статья Andrew Clinick -
Linking Office and the Web via Script,
посвященная интеграции Microsoft Office и Интернета.
Очередная статья из серии Scripting Clinic ожидается 20 ноября.
|
|
|
|
Создать базу данных Microsoft Access можно с помощью библиотеки ADOX
(Microsoft ADO Extensions for Data Definition Language and Security).
В следущем примере мы создадим базу данных phones.mdb,
а в ней - таблицу "Phone Book" с двумя текстовыми полями: "Name" и "Phone".
Обратите внимание, что в качестве провайдера OLE DB мы указываем Microsoft Jet,
поскольку только этот провайдер полностью поддерживает ADOX.
Другие провайдеры могут не поддерживать часть функциональности ADOX.
Например, Microsoft SQL Server OLE DB Provider не поддерживает создание
баз данных. При попытке использовать неподдерживаемую функциональность
возвращается ошибка 80004002 "No such interface supported".
И еще одно: если база данных уже существует, то при вызове метода Create
возникнет ошибка 80040E17 "Database already exists".
Листинг
Option Explicit
Const DatabaseName = "phones.mdb"
Dim Catalog
Set Catalog = CreateObject("ADOX.Catalog")
Catalog.Create _
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & DatabaseName
Dim Table
Set Table = CreateObject("ADOX.Table")
Table.Name = "Phone Book"
Table.Columns.Append "Name"
Table.Columns.Append "Phone"
Catalog.Tables.Append Table
Set Catalog = Nothing
|
|
|
Самый простой способ программно открыть сессию CDO - это указать имя MAPI-профайла.
К сожалению, CDO не предоставляет возможности узнать имена профайлов.
Рассмотрим простой способ получения имени MAPI-профайла по умолчанию -
извлечем его из Registry. Единственная тонкость - эта информация хранится там
в разных ключах, в зависимости от типа операционной системы.
Листинг
Option Explicit
Function GetDefaultMapiProfile()
Dim Shell
Set Shell = WScript.CreateObject("WScript.Shell")
Dim RegKey9x, RegKeyNT
RegKey9x = _
"HKCU\Software\Microsoft\Windows Messaging Subsystem\" & _
"Profiles\DefaultProfile"
RegKeyNT = _
"HKCU\Software\Microsoft\Windows NT\CurrentVersion\" & _
"Windows Messaging Subsystem\Profiles\DefaultProfile"
On Error Resume Next
Err.Clear
GetDefaultMapiProfile = Shell.RegRead(RegKey9x)
If Err.Number <> 0 Then
Err.Clear
GetDefaultMapiProfile = Shell.RegRead(RegKeyNT)
If Err.Number <> 0 Then GetDefaultMapiProfile = ""
End If
Set Shell = Nothing
End Function
MsgBox GetDefaultMapiProfile
|
|
|
|
Как и многие другие, я использую Microsoft Outlook для ведения базы данных о людях,
с которыми я общаюсь.
"Карточки" с записями находятся в папке Contacts (Контакты) и ее подпапках.
В числе прочего, в этих карточках хранятся дни рождения.
Чтобы не забывать о них и заранее к ним готовиться, я написал скрипт,
который просматривает папку Contacts и ее подпапки, составляет список
ближайших дней рождений, и посылает мне письмо с этой информацией.
Этот скрипт вызывается каждое утро планировщиком задач Windows.
Комментарии к коду:
- Для доступа к моему почтовому ящику используется библиотека CDO версии 1.21.
- Прежде всего, скрипт открывает MAPI-сессию. В качестве профайла используем
профайл по умолчанию. Чтобы узнать его, используется функция GetDefaultMapiProfile,
описанная мной здесь.
- Просмотр папок происходит рекурсивно (в процедуре ProcessFolder),
начиная со стандартной папки Contacts.
- День рождения находится в поле PR_BIRTHDAY (тэг определен в файле mapitags.h).
- Если этого поля нет, то при попытке его извлечь CDO генерирует ошибку
CdoE_NOT_FOUND, поэтому необходимо отлавливать ошибки
с помощью On Error Resume Next.
- Чтобы вычислить разницу в днях между днем рождения и текущей датой,
используется функция DateDiff с параметром "y".
- Поскольку день рождения и текущая дата находятся (как правило) в разных годах,
то приходится приводить дни рождения к текущему году
с помощью функции DateSerial.
- Обратите внимание, как указывается получатель для посылки письма самому себе.
Листинг
Option Explicit
' открываем сессию MAPI с помощью профайла по умолчанию
Dim Session
Set Session = CreateObject("MAPI.Session")
Session.Logon GetDefaultMapiProfile
' в этой строке будет собираться информация о днях рождения
Dim Body
' будет использоваться для приведения дня рождения к текущему году
Dim CurrentYear
CurrentYear = Year(Now)
' получаем корневую папку Contacts
Dim Root
Set Root = Session.GetDefaultFolder(5) ' 5 = CdoDefaultFolderContacts
' начинаем рекурсивную обработку папок
ProcessFolder Root
' отсылаем самому себе письмо со списком ближайших дней рождения
Dim Message
Set Message = Session.Outbox.Messages.Add("Ближайшие дни рождения", Body)
' в качестве получателя указываем идентификатор текущего пользователя
Message.Recipients.Add ,, 1, Session.CurrentUser.ID
Message.Update
Message.Send False, False
' закрываем сессию MAPI
Session.Logoff
Set Session = Nothing
'---------------------------------------------------------------------
' эта функция используется для рекурсивной обработки папок
Sub ProcessFolder(Folder)
' просматриваем все карточки
Dim Message
For Each Message In Folder.Messages
' ищем день рождения
Dim Value
On Error Resume Next
Err.Clear
Value = Message.Fields(&H3A420040) ' 0x3A420040 = PR_BIRTHDAY
If Err.Number <> 0 Then Value = ""
On Error GoTo 0
If Len(Value) > 0 Then
Dim Birthday
Birthday = CDate(Value)
' приводим день рождения к текущему году
Birthday = _
DateSerial(CurrentYear, Month(Birthday), Day(Birthday))
' вычисляем разницу в днях между днем рождения и текущей датой
Dim Diff
Diff = DateDiff("y", Now, Birthday)
If (Diff >= 0) And (Diff <= 7) Then
' если она меньше 7 - добавляем информацию о нем в письмо
Body = Body & Birthday & vbTab & Message.Subject & vbNewLine
End If
End If
Next
' рекурсивно просматриваем все подпапки
Dim SubFolder
For Each SubFolder In Folder.Folders
ProcessFolder SubFolder
Next
End Sub
'---------------------------------------------------------------------
' эта функция возвращает имя MAPI-профайла по умолчанию
Function GetDefaultMapiProfile()
Dim Shell
Set Shell = WScript.CreateObject("WScript.Shell")
Dim RegKey9x, RegKeyNT
RegKey9x = _
"HKCU\Software\Microsoft\Windows Messaging Subsystem\" & _
"Profiles\DefaultProfile"
RegKeyNT = _
"HKCU\Software\Microsoft\Windows NT\CurrentVersion\" & _
"Windows Messaging Subsystem\Profiles\DefaultProfile"
On Error Resume Next
Err.Clear
GetDefaultMapiProfile = Shell.RegRead(RegKey9x)
If Err.Number <> 0 Then
Err.Clear
GetDefaultMapiProfile = Shell.RegRead(RegKeyNT)
If Err.Number <> 0 Then GetDefaultMapiProfile = ""
End If
Set Shell = Nothing
End Function
'---------------------------------------------------------------------
Смотри также
Как узнать имя MAPI-профайла по умолчанию?
|
|
|
Кратко
Этот бесплатный ActiveX предназначен для посылки отладочных сообщений
(релизуется через Win32 API-функцию OutputDebugString).
Может быть использован как в скриптах Windows Scripting Host, так и на ASP-страницах.
Ссылки
Домашняя страница Zaks.Trace
Домашняя страница компании Zaks Solutions
Прямой download
Инструкция по инсталляции
- Скачайте архив trace10.zip (см.ссылку вверху)
- Распакуйте его в какую-нибудь папку (например, C:\Program Files\ZaksTrace)
- В этой папке, выполните команду: regsvr32 trace.dll
Чем смотреть отладочные сообщения
Отладочные сообщения могут быть перехвачены и просмотрены, например, с помощью утилиты DbMon из состава
Microsoft Platform SDK (есть исходный текст). Лично я рекомендую отличную утилиту
DebugView/EE, написанную Mark Russinovich.
Кстати, если Вы еще не посещали его сайт sysinternals.com
- сделайте это прямо сейчас!
Обратите внимание
Этот ActiveX содержит всего один метод Trace и он является методом по умолчанию,
поэтому вызывать его можно двумя способами: указывая имя метода, и не указывая его.
В приведенном примере используются оба способа.
Пример
Единственный и очень простой пример: создаем объект Zaks.Trace и
посылаем с его помощью отладочное сообщение.
Option Explicit
Dim Tracer
Set Tracer = CreateObject("Zaks.Trace")
Tracer "This is a debug output from script (1)."
Tracer.Trace "This is a debug output from script (2)."
Set Tracer = Nothing
|
|
|
|
|
|
|
- Главная страница -
Главная страница сайта: scripting.narod.ru.
- Новости -
Новости мира Windows Scripting.
- Вопросы и ответы -
В этом разделе Вы можете найти ответы на часто задаваемые вопросы и задать свой.
- Скрипты -
Здесь содержатся исходные тексты скриптов, в основном на VBScript.
- ActiveX -
Аннотированный список ActiveX-компонент, которые могут быть полезными при написании скриптов.
- Книжная полка -
Избранные книги по тематике сайта.
- Knowledge Base -
Ссылки на избранные статьи из Microsoft Knowledge Base.
- Конференции -
Список избранных телеконференций, посвященных скриптингу.
- Ссылки -
Список ссылок на сайты схожей тематики.
|
|
|
|
|
|
|