Главная страница

Новости

Вопрос-ответ

Скрипты

ActiveX

Статьи

Книжная полка

Knowledge Base

Конференции

Ссылки

 

Гостевая книга

Напишите мне письмо

 

Подписка на рассылку

Рассылка 'Windows Scripting'  Архив

 

 

Лучше смотреть с Microsoft Internet Explorer 4.0 и выше

 

Создано с помощью UltraEdit

 

 

Windows Scripting (выпуск 4)

 
Вступление
 
Здравствуйте!

Рад приветствовать Вас на странице моей рассылки!

Эта рассылка посвящена самым различным аспектам программирования в среде Microsoft Windows Scripting - от конфигурирования и администрирования Microsoft Windows, IIS, Exchange Server и SQL Server до особенностей программирования на VBScript и JScript.

Не забудьте посетить сайт рассылки scripting.narod.ru, где имеется много другой полезной информации, посвященной Windows Script и не вошедшей в рассылку.

Буду также рад получить от Вас письмо с Вашими вопросами, пожеланиями, предложениями и замечаниями: scripting@narod.ru.

Настоятельная рекомендация тем, кто подписан на текстовую версию рассылки: ***Подпишитесь на HTML-вариант***! Я подготавливаю только HTML-версию рассылки, а текстовая версия генерируется из нее автоматически.

Посмотрите на HTML-версию этой рассылки, которая находится здесь: http://scripting.narod.ru/issues/issue004.htm.

 
Оглавление рассылки
 
 
Новости
 
Upgrade на VBScript 5.5 уменьшает утечки памяти
 
  • 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.
  •  
    Вышел ноябрьский номер журнала MSDN Magazine
     
  • 17.10.2000
    Вышел ноябрьский номер журнала MSDN Magazine.
  •  
    Новая статья из серии Scripting Clinic
     
  • 16.10.2000
    В журнале MSDN Online Voices опубликована новая статья Andrew Clinick - Linking Office and the Web via Script, посвященная интеграции Microsoft Office и Интернета. Очередная статья из серии Scripting Clinic ожидается 20 ноября.
  •  
    Вопросы и ответы
     
    Как создать базу данных Microsoft Access?
     
    Создать базу данных 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
     
    Как узнать имя MAPI-профайла по умолчанию?
     
    Самый простой способ программно открыть сессию 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
     
    Zaks.Trace
     

    Кратко

    Этот бесплатный 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
     
    Новые статьи из Microsoft Knowledge Base
     
     
    Разное
     
    Основные разделы сайта рассылки
     
    • Главная страница - Главная страница сайта: scripting.narod.ru.
    • Новости - Новости мира Windows Scripting.
    • Вопросы и ответы - В этом разделе Вы можете найти ответы на часто задаваемые вопросы и задать свой.
    • Скрипты - Здесь содержатся исходные тексты скриптов, в основном на VBScript.
    • ActiveX - Аннотированный список ActiveX-компонент, которые могут быть полезными при написании скриптов.
    • Книжная полка - Избранные книги по тематике сайта.
    • Knowledge Base - Ссылки на избранные статьи из Microsoft Knowledge Base.
    • Конференции - Список избранных телеконференций, посвященных скриптингу.
    • Ссылки - Список ссылок на сайты схожей тематики.
     
    Обратная связь