|
|
|
Windows Scripting (выпуск 7)
|
|
|
Здравствуйте!
Приношу свои извинения за то, что рассылка долго не выходила -
у ведущего были некоторые проблемы, которые наконец начинают
разрешаться. Надеюсь, что отныне рассылка будет выходить более
регулярно.
Из приятного: Ваш покорный слуга недавно пересдал на
Brainbench
экзамен VBScript 5.5 с результатом 4.6 балла и оказался на 15 месте в мире :)
- из 3370 уже сдавших этот экзамен.
В этом выпуске:
Архив рассылки Вы найдете на сайте
scripting.narod.ru.
|
|
|
|
11.04.2001
Выпущена вторая бета-версия Windows Script 5.6. Скачать ее можно здесь:
http://www.microsoft.com/msdownload/vbscript/scripting56.asp.
|
|
|
20.03.2001
Вышел в свет апрельский номер журнала MSDN Magazine.
Среди его статей:
|
|
|
13.03.2000
В журнале MSDN Online Voices
опубликована очередная статья Andrew Clinick -
Scripting the Experience with Microsoft Office Developer.
На этот раз она посвящена использованию скриптов в разработке приложений под новую версию
Microsoft Office - Microsoft Office XP.
Очередная статья из серии Scripting Clinic ожидается 9 апреля.
|
|
|
26.01.2001
Perl. Архив программ - Браун М., "Бином" - 2001, 720 стр.
В книге представлена и подробно описана библиотека программ,
предназначеных для использования в различных областях программирования.
Тематика программ подобрана таким образом, чтобы продемонстрировать преимущества языка PERL при решении тех задач,
для которых и создавался язык.
[Подробнее]
[Заказать]
|
|
|
16.01.2001
В журнале MSDN Online Voices
опубликована очередная статья Andrew Clinick -
Introducing Visual Studio for Applications,
посвященная этому новому продукту Microsoft. VSA - гибрид технологий Visual Basic for Applications (VBA) и Windows Script -
предназначается для настройки (customization) программ в Windows .NET.
Очередная статья из серии Scripting Clinic ожидается 12 февраля.
|
|
|
11.01.2000
Вышел в свет февральский номер журнала MSDN Magazine.
Среди его статей:
Как нетрудно заметить, Microsoft активно переходит на .NET. Думаю, и нам пора...
Тем, кто заинтересовался, предлагаю для начала посетить
.NET Developer Center на сайте Microsoft.
Кстати, к февральскому номеру прилагается CDROM с Microsoft .NET Beta 1.
Если, конечно, вы покупаете печатную версию.
|
|
|
|
Номера журнала
MSND Magazine
за 2001 год можно скачать в виде CHM-файлов и потом не торопясь просматривать в offline.
Очень удобно и то, что система HTML Help предоставляет полноценный поиск.
Вот текущие ссылки:
Как дальше - догадайтесь сами :)
|
|
|
|
Все сервера Microsoft Exchange Server 2000, находящиеся в домене,
можно перечислить через Active Directory.
В данном примере используется доступ к Active Directory через ADO.
Листинг: enumerate.vbs
Option Explicit
' узнаем имя локального компьютера
Dim ServerName
Dim Network
Set Network = WScript.CreateObject("WScript.Network")
ServerName = Network.ComputerName
Set Network = Nothing
' выбираем RootDSE
Dim RootDSE
Set RootDSE = GetObject("LDAP://" & ServerName & "/RootDSE")
' можно было бы и так:
' Set RootDSE = GetObject("LDAP://RootDSE")
' но так иногда возникают проблемы на Windows NT
' выбираем configurationNamingContext
Dim CNC
CNC = RootDSE.Get("configurationNamingContext")
' открываем коннекцию ADO через ADSI провайдер OLE DB
Dim Connection
Set Connection = CreateObject("ADODB.Connection")
Connection.Provider = "ADsDSOObject"
Connection.Open "ADs Provider"
' кстати, первым параметром метода Open может быть любая
' (в том числе пустая) строка
' традиционно указывается "ADs Provider"
' самое интересное - строка запроса
Dim Query
Query = ";(objectCategory=msExchExchangeServer);" & _
"name,serialNumber;subtree"
' исполняем команду
Dim Command
Set Command = CreateObject("ADODB.Command")
Command.ActiveConnection = Connection
Command.CommandText = Query
Dim Recordset
Set Recordset = Command.Execute
' пробегаемся по результатам
Dim S
Do While Not Recordset.EOF
' версия возвращается почему-то как Variant,
' т.е. следующая строка не пройдет:
' S = S & Recordset.Fields("serialNumber")
Dim Version
Version = Recordset.Fields("serialNumber").Value
' записываем результат
S = S & Recordset.Fields("name") & " - " & Version(0) & vbNewLine
Recordset.MoveNext
Loop
' закрываем все, что открыли
Recordset.Close
Connection.Close
Set Recordset = Nothing
Set Command = Nothing
Set Connection = Nothing
' сообщаем результат
If Len(S) = 0 Then
S = "No Microsoft Exchange servers found!"
Else
S = "Servers found:"& vbNewLine & S
End If
MsgBox S, vbOkOnly + vbInformation
Смотри также
Как определить версию Microsoft Exchange Server 2000?
|
|
|
|
Вашему вниманию предлагается ActiveX, написанный на VBScript и
предназначенный для чтения тегов MP3-файлов
(название песни, исполнитель, из какого альбома, т.д.).
Разработан он с помощью малоизвестной и малоиспользуемой технологии Microsoft
под названием Windows Script Components (бывшие scriptlets).
Windows Script Components - это технология, позволяющая писать компоненты COM (ActiveX)
на скриптовых языках. Подробнее о технологии Windows Script Components можно прочитать
на сайте Microsoft и в других источниках (см. список ссылок
в конце статьи). Особенно рекомендуется документация по Windows Script Components,
ссылка на которую дана чуть ниже.
Ссылки
Последняя версия Windows Script (со встроенными Windows Script Components)
Документация по Windows Script Components
Windows Script Component Wizard, облегчающий создание WSC-файлов
Инсталляция
- Скачайте и проинсталлируйте последнюю версию Windows Script (см.ссылку вверху).
Если Вы работаете под Windows 2000, это делать не обязательно.
- Скачайте файл mp3tags.wsc.
Это и есть ActiveX, написанный на VBScript.
- Зарегистрируйте его (так же, как и обычный ActiveX):
regsvr32 mp3tags.wsc
- Все, теперь скрипт готов к употреблению.
Чтобы использовать ActiveX, необходимо его создать стандартным способом:
Dim MP3Tags
Set MP3Tags = CreateObject("Scripting.Mp3TagsReader")
А теперь - несколько примеров.
Пример 1: sample1.vbs
Этот скрипт показывает теги MP3-файла, имя которого передано в командной строке.
Option Explicit
Const AppName = "MP3 Tags Reader sample 1"
' проверяем число аргументов
If WScript.Arguments.Count <> 1 Then
ShowHelp
WScript.Quit
End If
' получаем имя MP3-файла
Dim Mp3Name
Mp3Name = WScript.Arguments(0)
' создаем объект Mp3TagsReader
Dim Reader
Set Reader = CreateObject("Scripting.Mp3TagsReader")
' читаем теги файла
Dim Result
Result = Reader.Read(Mp3Name)
' если ошибка - показываем ее код
If Result <> 0 Then
MsgBox "Error " & Result & " reading MP3 tags from file" & _
vbNewLine & Mp3Name, vbExclamation, AppName
WScript.Quit
End If
' если все нормально - показываем все теги
MsgBox "File:" & vbTab & Reader.FileName & vbNewLine & _
"Title:" & vbTab & Reader.Title & vbNewLine & _
"Artist:" & vbTab & Reader.Artist & vbNewLine & _
"Album:" & vbTab & Reader.Album & vbNewLine & _
"Year:" & vbTab & Reader.Year & vbNewLine & _
"Comment:" & vbTab & Reader.Comment & vbNewLine & _
"Genre:" & vbTab & Reader.Genre & _
" (" & Reader.GenreIndex & ")" & vbNewLine & _
"Track:" & vbTab & Reader.Track & vbNewLine, _
vbInformation, AppName
' уничтожаем созданный ранее объект
Set Reader = Nothing
' показывает справку
Sub ShowHelp
MsgBox "MP3 file name is not specified." & _
vbNewLine & vbNewLine & "Usage:" & vbNewLine & _
" " & WScript.ScriptName & " mp3_file_name", _
vbCritical, AppName
End Sub
Пример 2: sample2.vbs
Этот скрипт находит все MP3-файлы, в тегах которых есть заданная строка.
Поиск начинается с каталога, где находится скрипт, и включает все подкаталоги.
Option Explicit
Const AppName = "MP3 Tags Reader sample 2"
' запрашиваем текст для поиска
Dim SearchText
SearchText = InputBox("Enter text to search in MP3 tags:", AppName)
If Len(SearchText) = 0 Then WScript.Quit
' определяем стартовый каталог
Dim Root
Root = WScript.ScriptFullName
Dim I
I = InStrRev(Root, "\")
If I = 0 Then I = InStrRev(Root, "/")
Root = Left(Root, I - 1)
' создаем объект FileSystemObject -
' он будет использоваться в функции рекурсивного обхода каталогов
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")
' создаем объект Mp3TagsReader для тех же целей
Dim Reader
Set Reader = WScript.CreateObject("Scripting.Mp3TagsReader")
' строка, в которой будут накапливаться имена найденных файлов
Dim S
' начинаем рекурсивный обход каталогов
ScanFolder Root
' уничтожаем созданные ранее объекты
Set Reader = Nothing
Set FSO = Nothing
If Len(S) = 0 Then
' если ничего не найдено
S = "Search string not found!"
Else
' иначе добавляем вводную строчку
S = "Search string found in:" & vbNewLine & S
End If
' выводим диалог с результатом
MsgBox S, vbOkOnly + vbInformation, AppName
' это функция рекурсивного обхода каталогов
Sub ScanFolder(FolderName)
' порлучаем текущий каталог
Dim Folder
Set Folder = FSO.GetFolder(FolderName)
' рекурсивно проходим все файлы
Dim File
For Each File In Folder.Files
' пытаемся прочитать теги MP3
Dim Result
Result = Reader.Read(File.Path)
If Result = 0 Then ' этот файл содержит теги MP3
' ищем строку поиска в тегах
If InStr(Reader.Title, SearchText) > 0 Or _
InStr(Reader.Artist, SearchText) > 0 Or _
InStr(Reader.Album, SearchText) > 0 Or _
InStr(Reader.Comment, SearchText) > 0 Then
' если нашли - добавляем к строке результата
S = S & File.Path & vbNewLine
End If
End If
Next
' рекурсивно проходим все подкаталоги
Dim SubFolder
For Each SubFolder In Folder.SubFolders
ScanFolder SubFolder.Path
Next
End Sub
Листинг: mp3tags.wsc
Исходный текст ActiveX.
XML version="1.0" standalone="yes" encoding="UTF-16"?>
component error="true" debug="true"?>
Смотри также
Windows Script Components на сайте Microsoft
Колонка Visual Programmer в журнале Microsoft Systems Journal (февраль 2000)
ASP and Windows Script Components (Microsoft Internet Developer, декабрь 1999)
Windows Script Components - They Get Around, by Andrew Clinick
Создание COM-компонентов с помощью скриптовых языков в журнале "Технология Клиент-Сервер" (1 квартал 2000)
Статьи из Microsoft Knowledge Base, посвященные Windows Script Components
|
|
|
|
Класс CLog преназначен для записи текста в файл журнала (log).
Это может быть как отладочная информация, так и информация о ходе выполнения скрипта.
Основные особенности класса CLog:
- Имя файла журнала генерируется автоматически: он создается в том же каталоге,
где находится файл исполняемого скрипта, и имеет то же имя, но с расширением .log.
- Имя файла журнала можно узнать или поменять.
- Для удобства работы можно узнать каталог, в котором находится файл исполняемого скрипта,
а также имя этого файла (без расширения).
- Журнал можно вести как в формате ANSI (по умолчанию), так и формате Unicode.
- При записи строчки в ее начало автоматически помещается текущее время
(эта опция может быть отключена).
- Специальная функция позволяет очистить (точнее, удалить) файл журнала.
- Можно также считать весь журнал в строковую переменную.
Методы и свойства класса
Метод
|
Описание
|
Write(Text)
|
Записывает строку Text в файл журнала.
Возвращает True в случае успеха, иначе - False.
|
ReadAll
|
Считывает файл журнала целиком.
В случае ошибки возвращается пустая строка.
|
Clear
|
Удаляет файл журнала.
Возвращает True в случае успеха, иначе - False.
|
Свойство
|
Описание
|
LogFullName
|
Полное имя файла журнала.
Read/Write.
|
ScriptPath
|
Каталог, в котором находится файл исполняемого скрипта.
Read only.
|
ScriptName
|
Имя файла исполняемого скрипта (без расширения).
Read only.
|
Format
|
Формат записи журнала: ANSI (0), Unicode (-1), по умолчанию (-2).
По умолчанию - ANSI.
Read/Write.
|
IncludeTime
|
Определяет, помещать ли в начало строки текущее время.
По умолчанию - True.
Read/Write.
|
FSO
|
Возвращает объект типа FileSystemObject, используемый классом CLog.
Read only.
|
Пример 1
Самый простой пример: создаем объект Log типа CLog;
удаляем файл журнала, если он был (метод Clear);
пишем в журнал строку (метод Write).
Пример 2
В этом примере мы поменяем путь к файлу журнала - он будет сохраняться
в TEMP-каталоге.
Обратите внимание на отсутствие метода Clear -
в этом случае файл журнала не будет удаляться при каждом запуске скрипта.
И еще - путь к TEMP-каталогу получается через объект FileSystemObject
(свойство FSO), который используется классом CLog.
Пример 3
Еще один простой пример - мы отменим запись текущего времени в начало строки
и будем использовать формат Unicode.
Пример 4
И последний пример - после записи двух строк в журнал мы прочитаем его
и выведем в диалоговом окне.
А вот наконец собственно листинг класса CLog:
Листинг: clog.vbs
Option Explicit
Class CLog
Private m_FSO
Private m_LogFullName
Private m_ScriptName
Private m_ScriptPath
Private m_Format
Private m_IncludeTime
Private Sub Class_Initialize
Set m_FSO = CreateObject("Scripting.FileSystemObject")
m_ScriptName = WScript.ScriptName
Dim I
I = InStrRev(m_ScriptName, ".")
If I > 0 Then m_ScriptName = Left(m_ScriptName, I - 1)
m_ScriptPath = WScript.ScriptFullName
I = InStrRev(m_ScriptPath, "\")
If I > 0 Then m_ScriptPath = Left(m_ScriptPath, I)
m_LogFullName = m_ScriptPath & m_ScriptName & ".log"
m_Format = 0 ' ANSI
m_IncludeTime = True
End Sub
Private Sub Class_Terminate
Set m_FSO = Nothing
End Sub
Property Get FSO
Set FSO = m_FSO
End Property
Property Let LogFullName(NewName)
m_LogFullName = NewName
End Property
Property Get LogFullName
LogFullName = m_LogFullName
End Property
Property Get ScriptPath
ScriptPath = m_ScriptPath
End Property
Property Get ScriptName
ScriptName = m_ScriptName
End Property
Property Let Format(NewFormat)
m_Format = NewFormat
End Property
Property Get Format
Format = m_Format
End Property
Property Let IncludeTime(NewValue)
m_IncludeTime = NewValue
End Property
Property Get IncludeTime
IncludeTime = m_IncludeTime
End Property
Function Write(Text)
On Error Resume Next ' for example if access is denied
Dim File
Set File = _
m_FSO.OpenTextFile(m_LogFullName, 8, True, m_Format)
Write = Err = 0
If Write Then
If m_IncludeTime Then Text = Now & " " & Text
File.Write Text & vbNewLine
File.Close
End If
Set File = Nothing
On Error GoTo 0
End Function
Function ReadAll
On Error Resume Next ' if file does not exist
Dim File
Set File = _
m_FSO.OpenTextFile(m_LogFullName, 1, False, m_Format)
If Err = 0 Then
ReadAll = File.ReadAll
File.Close
Else
ReadAll = ""
End If
Set File = Nothing
On Error GoTo 0
End Function
Function Clear
On Error Resume Next ' if file does not exist
m_FSO.DeleteFile m_LogFullName, True
Clear = Err = 0
On Error GoTo 0
End Function
End Class
|
|
|
|
|
|
Архив рассылки Вы найдете на сайте
scripting.narod.ru.
|
|
|
|