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

Новости

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

Скрипты

ActiveX

Статьи

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

Knowledge Base

Конференции

Ссылки

 

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

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

 

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

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

 

 

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

 

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

 

 

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.

 
Оглавление рассылки
 
 
Новости
 
Новая статья Andrew Clinick
 
  • 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 октября.
  •  
    Выпущен Microsoft Exchange Server 2000
     
  • 01.09.2000
    Как сообщается в пресс-релизе компании Microsoft, 31 августа был отправлен на тиражирование Microsoft Exchange Server 2000. Ознакомительную версию сервера можно скачать с сайта компании: http://www.microsoft.com/exchange/.
  •  
    Вопросы и ответы
     
    Как узнать IP-адрес локального компьютера?
     
    Узнать IP-адрес локального компьютера можно, например, с помощью Microsoft Winsock control. Необходимый для этого код настолько прост, что приводится без комментариев.

    Листинг

    Option Explicit Dim Winsock Set Winsock = CreateObject("MSWinsock.Winsock") MsgBox Winsock.LocalIP Set Winsock = Nothing
     
    Скрипты
     
    Удаление содержимого временного каталога Windows
     
    В файле 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
    Полезные ActiveX
     
    Xceed Zip Compression Library
    (Окончание)
     

    Пример 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.
    • Конференции - Список избранных телеконференций, посвященных скриптингу.
    • Ссылки - Список ссылок на сайты схожей тематики.
     
    Обратная связь