|
|
Windows Scripting (выпуск 2)
|
|
|
Здравствуйте!
Рад приветствовать Вас на странице моей рассылки!
Эта рассылка посвящена самым различным аспектам программирования в среде Microsoft Windows Scripting - от конфигурирования и администрирования Microsoft Windows, IIS, Exchange Server и SQL Server до особенностей программирования на VBScript и JScript.
И не забудьте посетить сайт рассылки scripting.narod.ru, где имеется много другой полезной информации, посвященной Windows Script и не вошедшей в рассылку.
Буду также рад получить от Вас письмо с Вашими вопросами, пожеланиями, предложениями и замечаниями: [email protected].
Настоятельная рекомендация тем, кто подписан на текстовую версию рассылки: ***Подпишитесь на HTML-вариант***! Я подготавливаю только HTML-версию рассылки, а текстовая версия автоматически генерируется из нее на Subscribe.ru, причем не самым лучшим образом (:
Посмотрите на HTML-версию этой рассылки, которая находится здесь: http://scripting.narod.ru/issues/issue002.htm.
|
|
|
|
|
|
|
11.09.2000
В журнале MSDN Online Voices
опубликована новая статья Andrew Clinick -
Make Your E-mail System Love Script.
Она посвящена использованию скриптов для программирования Microsoft Exchange Server 2000.
Рассматриваются поддержка XML и HTTP, Outlook Web Access,
использование провайдера Exchange OLEDB и новой версии CDO.
Очередная статья из серии Scripting Clinic ожидается 9 октября.
|
|
|
01.09.2000
Как сообщается в пресс-релизе компании Microsoft,
31 августа был отправлен на тиражирование Microsoft Exchange Server 2000.
Ознакомительную версию сервера можно скачать с сайта компании: http://www.microsoft.com/exchange/.
|
|
|
|
Узнать IP-адрес локального компьютера можно, например, с помощью
Microsoft Winsock control. Необходимый для этого код настолько
прост, что приводится без комментариев.
Листинг
Option Explicit
Dim Winsock
Set Winsock = CreateObject("MSWinsock.Winsock")
MsgBox Winsock.LocalIP
Set Winsock = Nothing
|
|
|
|
В файле deltemp.vbs (см. листинг) помещен текст скрипта,
который удаляет содержимое временного каталога Windows.
Комментарии к коду:
- Все операции осуществляются через объект FileSystemObject.
- Полный путь ко временному каталогу Windows определяется через метод GetSpecialFolder.
К сожалению, в отличие от функций SHGetSpecialFolderLocation и SHGetSpecialFolderPath,
этот метод может вернуть пути только к трем каталогам: Windows, System и Temp.
- Перед тем, как удалить файл, скрипт обнуляет его атрибуты - чтобы можно было удалять
read-only файлы.
- Обязательно нужно обеспечить обработку ошибок (On Error):
как правило, во временном каталоге находятся несколько открытых на запись файлов,
которые используются разными программами для хранения своих временных данных.
Без обработчика ошибок скрипт завершит работу по ошибке доступа (Access denied)
после попытки удалить первый же такой файл.
Листинг
Option Explicit
Dim FSO
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
Dim TempFolder
Set TempFolder = FSO.GetSpecialFolder(2) ' 2 = TEMP
On Error Resume Next
Dim Files, File
Set Files = TempFolder.Files
For Each File In Files
File.Attributes = 0
File.Delete
Next
Set FSO = Nothing
|
|
|
Пример 2
А в этом примере мы разархивируем все файлы, находящиеся в архиве sample1.zip,
в родительский каталог:
Option Explicit
Dim XceedZip
Set XceedZip = CreateObject("XceedSoftware.XceedZip.4")
XceedZip.ZipFilename = "sample1.zip"
XceedZip1.UnzipToFolder = ".."
XceedZip.FilesToProcess = "*.*"
XceedZip.Unzip
Set XceedZip = Nothing
Пример 3
В этом простом примере мы просмотрим содержимое архива sample1.zip.
Обратите внимание, как сделан обработчик событий от ActiveX -
с помощью вызова метода WScript.CreateObject мы регистрируем ActiveX
как источник событий и определяем префикс для функций обработчиков.
Option Explicit
Dim XceedZip
Set XceedZip = WScript.CreateObject("XceedSoftware.XceedZip.4", "XceedZip_")
XceedZip.ZipFilename = "sample1.zip"
XceedZip.FilesToProcess = "*.*"
If XceedZip.ListZipContents <> 0 Then MsgBox "An error occured!"
WScript.DisconnectObject XceedZip
Set XceedZip = Nothing
Sub XceedZip_ListingFile(ByVal Filename, ByVal Comment, ByVal Size, _
ByVal CompressedSize, ByVal CompressionRatio, _
ByVal Attributes, ByVal CRC, ByVal LastModified, _
ByVal LastAccessed, ByVal Created, _
ByVal Method, ByVal Encrypted, ByVal DiskNumber, _
ByVal Excluded, ByVal Reason)
MsgBox Filename & ": " & CompressedSize & "/" & Size & " bytes."
End Sub
Пример 4: ZipShell
И, наконец, мы создадим настоящее большое приложение ZipShell,
являющееся расширением Проводника Windows (Windows Shell Extension).
С его помощью можно будет просматривать общие сведение о zip-архиве,
если в Проводнике щелкнуть по нему правой кнопкой мыши:
Я не буду рассказывать здесь про механизмы Windows Shell Extension,
подробнее о них можно прочитать в документации, а также в серии статей
в Microsoft Systems Journal:
Остановимся лишь на некоторых особенностях кода.
Во-первых, наша программа - это Shell Extension.
Это, в частности, значит, что ее нужно правильно зарегистрировать, иначе Explorer
не сможет ее использовать. Можно, конечно, сделать это вручную, но я решил реализовать
эту функциональность в том же скрипте: когда ему передается в командной строке ключ -r,
то он осуществляет регистрацию себя в качестве Shell Extension. Реализован этот код в
процедуре RegisterScript.
Прежде всего, мы должны найти тип документа, соответствующего расширению .zip
(скорее всего, это будет документ, связанный с установленным на Вашем
компьютере архиватором - например, с WinZip).
Если такого документа еще нет, то мы зададим свой документ с именем "ZipShell":
AppName = Shell.RegRead("HKEY_CLASSES_ROOT\.zip\")
If Len(AppName) = 0 Then
AppName = "ZipShell"
Shell.RegWrite "HKEY_CLASSES_ROOT\.zip\", AppName
End If
Затем мы создадим для этого документа новую команду "Свойства zip-архива",
с помощью которой будет вызываться наш Shell Extension:
Dim RegRoot
RegRoot = "HKEY_CLASSES_ROOT\" & AppName & "\shell\zipshell\"
Shell.RegWrite RegRoot, "Свойства zip-архива"
Shell.RegWrite RegRoot & "command\", _
"""" & WScript.Fullname & """ """ & WScript.ScriptFullName & _
""" ""%1"""
Обратите внимание, как мы формируем командную строку: через WScript.Fullname
узнаем полное имя программы, которая исполняет скрипты, через WScript.ScriptFullName
узнаем полное имя скрипта. Поскольку в этих именах могут оказаться пробелы, то
ограждаем их кавычками. В итоге, мы нигде не указываем жестко пути или имена файлов
и поэтому наш скрипт может исполняться на любом компьютере без изменений в коде.
Во-вторых, предусмотрена процедура дерегистрации скрипта, находящаяся
в процедуре UnregisterScript. Она несколько проще - она лишь удаляет нашу команду
"Свойства zip-архива":
Dim RegRoot
RegRoot = "HKEY_CLASSES_ROOT\" & AppName & "\shell\zipshell\"
Shell.RegDelete RegRoot & "command\"
Shell.RegDelete RegRoot
Обратите внимание, что мы вызываем RegDelete два раза, поскольку этот метод не может
удалять ключи с подключами.
В-третьих, в скрипте есть несколько обработчиков событий от ActiveX,
с идеей которых Вы уже знакомы по примеру 3.
Полный листинг
' -------------------------------------------------------------------
Option Explicit
' Получаем имя архива через командную строку
If WScript.Arguments.Count <> 1 Then
ShowHelp
WScript.Quit
End If
Dim ZipName
ZipName = WScript.Arguments(0)
' Регистрация/дерегистрация скрипта
Dim C
C = Mid(ZipName, 1, 1)
If (C = "-") Or (C = "/") Then
C = UCase(Mid(ZipName, 2, 1))
If C = "R" Then
RegisterScript
ElseIf C = "U" Then
UnregisterScript
Else
MsgBox "Неизвестный ключ: " & ZipName, vbCritical
End If
WScript.Quit
End If
' Создаем ActiveX
Dim XceedZip
Set XceedZip = WScript.CreateObject("XceedSoftware.XceedZip.4", "XceedZip_")
' Готовимся к перебору файлов
Dim List
Dim NumberOfDisks, NumberOfFiles, ZipComment
NumberOfDisks = 0
NumberOfFiles = 0
Dim TotalUncompressedSize, TotalCompressedSize
XceedZip.ZipFilename = ZipName
XceedZip.ProcessSubfolders = True
XceedZip.FilesToProcess = "*.*"
' Выполняем перебор файлов
Dim ResultCode, ResultDescription
ResultCode = XceedZip.ListZipContents
ResultDescription = XceedZip.GetErrorDescription(0, ResultCode)
' Уничтожаем ActiveX
WScript.DisconnectObject XceedZip
Set XceedZip = Nothing
' Обработка ошибок
If ResultCode <> 0 Then
MsgBox "Error " & ResultCode & ":" & vbNewLine & _
ResultDescription, vbCritical
WScript.Quit
End If
' Показываем общую статистику
Dim S
S = "Имя архива:" & vbTab & ZipName & vbNewLine & _
vbTab & "Число дисков:" & vbTab & vbTab & _
NumberOfDisks & vbNewLine & _
vbTab & "Число файлов:" & vbTab & vbTab & _
NumberOfFiles & vbNewLine & _
vbTab & "Комментарий к архиву:" & vbTab & _
ZipComment & vbNewLine & _
vbTab & "Размер несжатых файлов:" & vbTab & _
TotalUncompressedSize & " байт" & vbNewLine & _
vbTab & "Размер сжатых файлов:" & vbTab & _
TotalCompressedSize & " байт" & vbNewLine & _
vbTab & "Коэффициент сжатия:" & vbTab & _
TotalCompressedSize * 100 \ TotalUncompressedSize & "%" & _
vbNewLine & vbNewLine & "Показать список файлов?"
If (MsgBox(S, vbYesNoCancel + vbInformation, _
"Общая статистика") <> vbYes) Then WScript.Quit
' Показываем список файлов
List = "Имя файла, размер сжатого файла, размер несжатого файла, сжатие" & _
vbNewLine & vbNewLine & List
MsgBox List, vbInformation, "Список файлов"
' Заканчиваем работу скрипта
WScript.Quit
' -------------------------------------------------------------------
' Вызывается для каждого файла
Sub XceedZip_ListingFile(ByVal Filename, ByVal Comment, ByVal Size, _
ByVal CompressedSize, ByVal CompressionRatio, _
ByVal Attributes, ByVal CRC, ByVal LastModified, _
ByVal LastAccessed, ByVal Created, ByVal Method, _
ByVal Encrypted, ByVal DiskNumber, ByVal Excluded, _
ByVal Reason)
NumberOfFiles = NumberOfFiles + 1
TotalUncompressedSize = TotalUncompressedSize + Size
TotalCompressedSize = TotalCompressedSize + CompressedSize
List = List & Filename & ", " & CompressedSize & " байт, " & _
Size & " байт, " & CompressionRatio & "%" & vbNewLine
If DiskNumber > NumberOfDisks Then NumberOfDisks = DiskNumber
End Sub
' Вызывается, если найден комментарий к архиву
Sub XceedZip_ZipComment(ZipComment)
ZipComment = Comment
End Sub
' Вызывается, если нужно сменить диск
Sub XceedZip_InsertDisk(DiskNumber, ByRef DiskInserted)
DiskInserted = _
MsgBox("Вставьте диск номер " & DiskNumber, _
vbOkCancel + vbExclamation) = vbOk
End Sub
' Вызывается, если нужно показать предупреждение
Sub XceedZip_Warning(Filename, Warning)
MsgBox "Warning " & Warning & ":" & vbNewLine & _
XceedZip.GetErrorDescription(1, Warning), vbWarning
End Sub
' -------------------------------------------------------------------
Sub RegisterScript()
Dim Shell
Set Shell = WScript.CreateObject("WScript.Shell")
Dim AppName
AppName = Shell.RegRead("HKEY_CLASSES_ROOT\.zip\")
If Len(AppName) = 0 Then
AppName = "ZipShell"
Shell.RegWrite "HKEY_CLASSES_ROOT\.zip\", AppName
End If
Dim RegRoot
RegRoot = "HKEY_CLASSES_ROOT\" & AppName & "\shell\zipshell\"
Shell.RegWrite RegRoot, "Свойства zip-архива"
Shell.RegWrite RegRoot & "command\", _
"""" & WScript.Fullname & """ """ & _
WScript.ScriptFullName & """ ""%1"""
Set Shell = Nothing
MsgBox "Регистрация скрипта в качестве " & _
"Shell Extension завершена.", vbInformation
End Sub
Sub UnregisterScript()
Dim Shell
Set Shell = WScript.CreateObject("WScript.Shell")
Dim AppName
AppName = Shell.RegRead("HKEY_CLASSES_ROOT\.zip\")
If Len(AppName) = 0 Then Exit Sub
Dim RegRoot
RegRoot = "HKEY_CLASSES_ROOT\" & AppName & "\shell\zipshell\"
Shell.RegDelete RegRoot & "command\"
Shell.RegDelete RegRoot
Set Shell = Nothing
MsgBox "Дерегистрация скрипта в качестве " & _
"Shell Extension завершена.", vbInformation
End Sub
Sub ShowHelp
MsgBox "Нет обязательного параметра или их слишком много!" & _
vbNewLine & vbNewLine & "Формат вызова:" & vbNewLine & _
" zipshell.vbs имя_zip_архива" & vbTab & _
"- показ свойств архива" & vbNewLine & _
" zipshell.vbs -r" & vbTab & vbTab & _
"- регистрация скрипта в качестве " & _
"Shell Extension" & vbNewLine & _
" zipshell.vbs -u" & vbTab & vbTab & _
"- дерегистрация скрипта в качестве " & _
"Shell Extension", vbCritical
End Sub
' -------------------------------------------------------------------
|
|
|
|
- Главная страница -
Главная страница сайта: scripting.narod.ru.
- Новости -
Новости мира Windows Scripting.
- Вопросы и ответы -
В этом разделе Вы можете найти ответы на часто задаваемые вопросы и задать свой.
- Скрипты -
Здесь содержатся исходные тексты скриптов, в основном на VBScript.
- ActiveX -
Аннотированный список ActiveX-компонент, которые могут быть полезными при написании скриптов.
- Книжная полка -
Избранные книги по тематике сайта.
- Knowledge Base -
Ссылки на избранные статьи из Microsoft Knowledge Base.
- Конференции -
Список избранных телеконференций, посвященных скриптингу.
- Ссылки -
Список ссылок на сайты схожей тематики.
|
|
|
|
|
|
|