Объекты Windows Scripting Host (WSH)

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,069
Реакции
5,784
Всем привет.
Объясните мне пожалуйста на пальцах что есть объекты.
Я так понял создание функции в скрипте есть ссылка на создаваемый объект.
А что куда создается,в каком месте,удаляется ли и т.д.

Спасибо.
 
XML DOM TutorialОбъяснить "на пальцах" нам поможет издательство Диалектика (которое я цитирую ниже).
Итак, здесь про VBA. Все тоже самое актуально и в VBScript.
Напомню: VBA - это диалект языка Visual Basic, используемый внутри всех офисных приложений Microsoft Office.
___________________
Обычно тяжело представить объект VBA как нечто материальное. И это к лучшему: чем дальше удастся отойти от подобных представлений, тем проще работать со всем многообразием предоставляемых объектов. Определение, используемое программистами, на самом деле, достаточно простое. Объект — это именованный элемент, обладающий:

свойствами (настройки, которые может проверять и изменять пользователь);

методами (действия, которые может выполнять объект по запросу программы);

а также в некоторых случаях

■ событиями (то, что происходит с объектом и на что он может отреагировать, автоматически предпринимая заранее заданные действия).

Вам может показаться, что термин объекты не подходит таким "богато одаренным созданиям".
Действительно, объекты больше похожи на живые существа, чем на мертвые глыбы.
Свойства
Тигр или кит обладает такими характерными чертами, как глаза, конечности и хвост — объект обладает свойствами.
Методы
Лошадь или собака (объект) могут выполнять команды или убегать от опасности — объект имеет методы и события.

Dragokas написал(а):
Ред. - при этом, событием можно назвать - например, лошадь ускорила свое движение (событие) - ответ наездника: потянуть за поводок (процедура, которую Вы хотите выполнить по этому событию).
Переход от объекта к свойству или методу происходит через знак точки.
Пример:
VB.NET / VBA:
'создаем экземпляр класса Звери, который хранится в библиотеке Зоопарк
'Библиотека - это файл dll, ocx, tlb, ... зарегистрированный для всеобщего использования (иначе: COM - Component Object Model)
'Сведения о Зоопарке хранятся в реестре Windows.
'Команда set присваивает переменной Тигр ссылку на созданный объект Зверь
set Тигр = CreateObject("Зоопарк.Звери")
'Даем нашему Зверю некоторые свойства, чтобы он мог выполнить то, что мы от него хотим
Тигр.Цвет = "Белый"
Тигр.Поведение = "Агрессивное"
'Выполняем процедуру
Тигр.Бежать
'Запрашиваем выполнение функции Устал с передачей ей аргумента "Проверить тщательно"
'Записываем в переменную "Устал_ли_наш_тигр" значение, которое нам вернет эта функция.
Устал_ли_наш_тигр = Тигр.Устал("Проверить тщательно")
'Проверяем значение переменной
if Устал_ли_наш_тигр = true then Тигр.Отдохнуть
'Выведем на экран, голодный ли наш тигр
'Здесь получаем значение свойства Голодный.
Статус = Тигр.Голодный
'Свойство отличается от функции тем, что оно представляет из себя одну переменную и мы просто получаем ее значение.
'а функция - это совокупность кода, который сначала выполняется и затем решается, какое значение вернуть.
'Заметьте, что свойство в отличие от функции, вызывается без круглых скоб

'Уничтожаем объект Тигр и высвобождаем в ОЗУ использованные ресурсы
set Тигр = Nothing

Все еще хочется услышать техническое определение? Попробуем следующее: объект — это именованный элемент программы, который содержит информацию и код, обрабатывающий эту информацию. Объект, говорят, инкапсулирует информацию и соответствующий код.
_____________
Ну как, еще не испугались ? :D
Ничего страшного. Главное начать этим пользоваться. Понимание прийдет само собою.

Мы подходим к тому, что есть:
  • внутренние объекты.
  • внешние объекты;
Для языка VBA (например, в Excel-е) встроенными являются такие объекты как:
  • книга
  • лист
  • ячейка
  • диаграмма и т.д.
В VBScript такой объект по сути один:
Некоторые из функций (например, msgbox) можно использовать в качестве процедуры.
Процедура/функция - какая разница, спросите Вы?
Процедура - это совокупность кода, который можно вызвать на исполнение по имени.
Например:
VB.NET / VBA:
'Вызываем процедуру по имени
Моя_процедура

'А вот здесь сам код процедуры
Sub Моя_Процедура
  'Здесь много разного кода, все что Ваша фантазия захочет :)
End Sub
Функция - это тоже самое, что процедура, только она умеет возвращать значение.
Пример:
VB.NET / VBA:
'Вызываем функцию по имени:
Переменная = Моя_функция()
'Выведем на экран значение переменной
msgbox Переменная

'Код функции
Function Моя_функция
  'Кодим, что желаем
  'А здесь запишем, какое значение нужно вернуть
  Моя_функция = значение
End Function

И функции, и процедуры подразделяются на:
  • встроенные (код которых Вы не видите - встроено в движок)
  • пользовательские (то, что в примере выше)
  • и те, что вызываются из других объектов (помните пример с тигром?)

Но, вернемся к нашей теме:
Примеры работы со встроенным объектом WScript

Например, чтобы отобразить на экране полный путь к выполняемому скрипту, нужно обратится к объекту WScript и через точку написать имя его свойства ScriptFullName :
Код:
msgbox WScript.ScriptFullName
Чтобы приостановить работу скрипта на 5 секунд, необходимо выполнить метод Sleep с параметром "кол-во мс.":
Код:
WScript.Sleep(5000)

Теперь по поводу таинственных слов
set Переменная = CreateObject(Библиотека.Класс)
Что же здесь происходит?

Класс - это совокупность свойств и методов.
CreateObject создает экземпляр этого класса.
set присваивает переменной ссылку на этот экземпляр.

Пример
Представьте, что класс - это план строительства здания.
Создания экземпляра - это строительство дома.
Вы можете выполнить процедуру жить в доме, но не можете жить в плане, пока не создадите экземпляр - объект Дом.
В одном скрипте вполне можно использовать несколько разных объектов одного и того же класса (иначе говоря - несколько домов).
При чем каждый из них в процессе работы Вы можете можете наделить разными свойствами (иначе - покрасить в разные цвета).
Эти свойства (как и сам объект) будут хранится (существовать) до тех пор, пока Вы не решите уничтожить объект командой set Объект = nothing

В Windows, как правило, библиотеки классов реализованы при помощи COM-технологий.

Вот, что нам про это пишут:
______________________________________________
В программах, написанных при помощи VBA, пользователь не ограничен в применении объектов одного приложения. Фактически, пользователь даже не ограничен приложениями VBA. Другие приложения и специализированные "компоненты" тоже подходят, если они соответствуют стандарту Microsoft Component Object Model (COM).

COM — это технические требования, описывающие, как объекты определяются в приложениях и других программных элементах и как они могут использоваться в других приложениях. Слово "автоматизация" указывает на способность приложений, основанных на СОМ, быть управляемыми другой программой. Между прочим, СОМ не является технологией, присущей исключительно VBA или даже Visual Basic. Некоторые из инструментов разработки программного обеспечения, такие как C++, понимают СОМ и могут получать доступ к объектам СОМ.
______________________________________________
Итак в системе у нас есть как уже уже зарегистрированные библиотеки, доступ к которым можно получить посредством COM.
Такие библиотеки типов откомпилированы - классы из них можно использовать, но просмотреть их исходный код нельзя (технология "черного ящика").

К основным предустановленным в системе объектам, с которыми мы будем работать в VBScript/JScript, можно отнести:
  • Windows Script Host Object Model или WSH (wshom.exe) - работа с сетью, ярлыками, средой Windows и т.п.
содержит такие объекты как:
- WScript.Shell
- Shell.Application
- VBScript.RegExp
- WScript.Network
  • Microsoft Scripting Runtime (scrrun.dll) - классы для работы с файлами, папками, дисками, шифрованием и т.п.
- Scripting.Dictionary
- Scripting.FileSystemObject
- Scripting.Signer

  • Microsoft ADO (набор файлов, начинающийся на msado) - классы для работы с базами данных; также чтение бинарных файлов в байтовый массив.
- ADODB.connection
- ADODB.recordset
- ADODB.Stream Примеры
- и другие
  • MSXML2.XMLHTTP, WinHttp.WinHttpRequest.5.1, Msxml2.ServerXMLHTTP.4.0 Скачивание файла из сети Интернет. Примеры здесь.
  • Active Directory Scripting Interface (adsldp.dll, wldap32.dll, adsnt.dll, adsnds.dll, adsnw.dll) - взаимодействие с объектами в каталогах Active Directory, NT, NetWare и т.п.
  • Internet Explorer Object Library (iexplore.exe) - библиотека классов для работы с Internet Explorer; Примеры.
  • Microsoft WMI Scripting (wbemdisp.tlb) - расширение возможностей программ через программный интерфейс WMI.
Dragokas написал(а):
Примеры кода:
Генератор скриптов Scriptomatic (with Win7 fix)
WMI Scripting Examples by Rob Van Der Woude
Рецепты WMI: работа с реестром Windows
Рецепты WMI: управление сеансом пользователя
Рецепты WMI: сбор сведений о конфигурации операционной системы и установленном программном обеспечении
Рецепты WMI: сбор сведений об аппаратной конфигурации компьютера
Рецепты WMI: управление процессами
Про связь с WMI и что это такое:
К. Леонтьев. Вы всё ещё не используете WMI, ЧЧ.1,2
К. Леонтьев. Узнай секреты WMI, ЧЧ.1,2
К. Леонтьев. Узнай секреты WMI: события и провайдеры Ч.1.
К. Леонтьев. Узнай секреты WMI: события и провайдеры. Часть II: ключ к управлению системой и приложениями
MSDN. Разрешение проблем с WMI
Uros Calakovic WMI Query Language by Example
Комаров А. (Skvoznoi) WMI-трюки для хакера: Разбираемся с WMI
Людоговский А. Введение в WMI
wutils.com On-Line справочник объектов и методов WMI
MSDN WMI Win32 Classes - Дерево классов, с описанием всех значений.

Другие часто используемые объекты будут доступны при установке соответствующей программы:

  • Microsoft CDO (версии 1.21, for NTS версии 1.2, for Windows 2000 версии 1.0) - файлы olemsg.dll, cdonts.dll, cdosys.dll) - наборы классов для работы с электронной почтой;
  • Microsoft Office 11.0 Object Library (mso.dll) и сопутствующие ей библиотеки отдельных приложений Office - наборы классов для работы с приложениями Office; Примеры.
  • Microsoft SQLDMO Object Library (файл sqldmo.dll) - набор классов для получения полного контроля над Microsoft SQL Server (возможность производить любые административные операции, выполнять запросы и т.п.)
  • Microsoft Capicom (capicom.dll) - работа с сертификатами, цифровой подписью и шифрованием данных. Пример кода. CAPICOM Reference.
Прочие объекты и библиотеки свободных разработчиков:

VBS и Win API. Юрий Попов. Библиотека dynwrapx.dll и вызов функций Win 32 API
VBS и NET.Framework

Также советую "пощелкать" CHM-справочник с примерами.
 
Последнее редактирование:
Dragokas, спасибо-доходчиво и просто.
Получается объекты не имеют физической формы а являют собой некое виртуальное пространство имеющее функционал,определенный типом этого так называемого объекта?
Я все верно понял?
 
Последнее редактирование:
Все верно.
имеющее функционал,определенный типом этого так называемого объекта?
Да. Все так. Когда ты задаешь:
Set Переменная = ...
говорят, что тип переменной - объект.
Но и сам объект имеет свой тип:
Например, объект WScript.Shell имеет тип IShellDispatch. Но на этом не стоит заострять особое внимание.
объекты не имеют физической формы а являют собой некое виртуальное пространство имеющее функционал
Но объект не только содержит функционал, а еще и информацию, с которой может взаимодействовать внутри себя.
В виде файла хранится только библиотека (скомпилированный код классов),
из которой в ОЗУ создается экземпляр класса (объект),
с которым в дальнейшем ты работаешь.

На счет информации, а также хранении объектов в объекте
Поясню еще в двух примерах.

1) Хранение объектов в объекте.
Если объект содержит внутри себя несколько однотипных объектов - он называется коллекцией.
Пример:
Объект Каталог (Folders) хранит в себе:
  • коллекцию подкаталогов (SubFolders)
  • коллекцию файлов (Files)
При этом каждый отдельный файл или каталог является тоже объектом.
А это значит, что ты может получить у него такие свойства, как
  • имя
  • тип
  • путь
  • размер
  • дату создания, модификации, последнего доступа.
  • атрибуты.
Подробнее с примерами здесь.

Чтобы перечислить каждый отдельный файл в коллекции файлов,
нужно написать такой цикл:

VB.NET / VBA:
' создаем объект FSO для работы с файловой системой
set oFSO = CreateObject("Scripting.FileSystemObject")
' создаем объект каталог
set oFolder = oFSO.GetFolder("c:\temp")
' Пройдемся по коллекции файлов Files в этом каталоге
For each oFile in oFolder.Files
' Это буквально переводится как - Для Каждого oFile (объекта - Файл) в коллекции Files объекта Каталог (oFolder)
  ' Снимаем с файла все атрибуты, кроме архивный
  oFile.Attributes = 32 '32 = Archieve
' Переходим к следующему объекту Файл в коллекции
Next

2) На счет хранении информации внутри объекта.
Приведем пример, как можно добавить свою инфу в объект и затем ее использовать.

Допустим, задача: мы хотим один раз засечь список выполняющихся в системе процессов,
чтобы затем в любой момент обратиться к этой информации
и узнать существовал ли в то время такой-то ProcessID и каково было его имя.
Этот принцип положен в основу Task Monitor.

  • Получить список процессов мы сможем через WMI и класс Win32_Process
  • Сохранить соответствие "ProcessID -> Имя процесса" мы можем, сохранив информацию внутри объекта Dictionary.

VB.NET / VBA:
'Создаем Объект - Словарь
set oDict = CreateObject("Scripting.Dictionary")

' точка - текущий компьютер
sComputer = "."
' Подключаемся к пространству имен WMI
Set objWMIService = GetObject("winmgmts:\\" & sComputer & "\root\cimv2")
' Создаем объект - коллекцию Процессов
set oProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process")

' Перечисляем каждый из Процессов в коллекции Процессы
For Each oProcess in oProcesses
    ' Добавляем в словарь ключ - ID процесса, а значение ключа - Имя процесса
    ' clng - это функция преобразования в тип Long - целочисленное число
    oDict.Add clng(oProcess.ProcessID), oProcess.Name
Next

' Спрашиваем у пользователя ProcessID, по которому он хочет узнать имя
ProcID = clng(inputbox("Введите ProcessID"))

' Проверяем существовал ли на момент получения снимка процессов такой ProcessID
if oDict.Exists(ProcID) then
    msgbox "Имя процесса: " & oDict(ProcID) ' а здесь мы получаем значение из словаря по указанному ключу
else
    msgbox "Процесса с таким ID не было."
end if

Словарь также удобен тем, что можно перечислить все его ключи, и/или значения
VB.NET / VBA:
For each Key in oDict.Keys
    'Выводим информацию в консоль, если скрипт запущен через CSCRIPT.exe
    ' <---- Уберите комментарий, когда будете запускать скрипт из командной строки командой cscript имя_скрипта.vbs
    'WScript.Echo "ID: " & Key & " Имя процесса: " & oDict(Key)
Next
В словаре также можно хранить другие объекты.
 
Вот, кстати, объектная модель.
- штука, на которой видно иерархию вложенности объектов и принадлежащие им свойства и методы.

На рисунке - объекты, входящие в состав WSсript. Источник.

WScript. Object Model.gif


При написании кода, переход от одного объекта к другому объекту или свойству/методу реализуется через символ точки (.)
Есть 3 способа обращаться к ним:

1) Перечислив последовательно все члены этой цепочки в одной строке через точку:
Пример:

VB.NET / VBA:
:: Выполним метод Save, что означает - создать ярлык в указанном месте
CreateObject("WScript.Shell").CreateShortCut("H:\notepad.lnk").Save
:: правда он никуда пока не ведет. Мы ему никакие свойства не задали :)

:: Более удачный пример - пауза в скрипте
WScript.Sleep(1000)

2) Через ссылку на объект:
VB.NET / VBA:
:: создаем ссылку на объект
set oLNK = CreateObject("WScript.Shell").CreateShortCut("H:\notepad.lnk")
:: Обращаемся к объекту по ссылке, выполняем метод Save
oLNK.Save
:: Уничтожаем объект, высвобождаем занятые ресурсы
set oLNK = nothing

2.1.) Через несколько ссылок (вариаций может быть сколько угодно):

VB.NET / VBA:
set oShell = CreateObject("WScript.Shell")
set oLNK = oShell.CreateShortCut("H:\notepad.lnk")
oLNK.Save

set oLNK = nothing: set oShell = nothing

3) Через оператор with
(удобно, например, когда необходимо установить подряд несколько свойств одному и тому же объекту)
VB.NET / VBA:
:: такой вариант наиболее читабельный

set oShell = CreateObject("WScript.Shell")

with oShell.CreateShortCut("H:\notepad.lnk")
    .TargetPath = "notepad.exe" 'собственно целевая программа, вызываемая ярлыком
    .Arguments = "дополнительные аргументы, передаваемые вызываемой программе при запуске"
    .WorkingDirectory = "H:\" 'рабочий каталог
    .IconLocation = "shell32.dll, 5" 'номер ресурса, под которым хранится иконка для ярлыка в указанной библиотеке
    .WindowStyle = 1 'в каком виде развернуть программу при запуске
    .HotKey = "CTRL+ALT+F" 'горячая клавиша запуска
    .Description = "Описание ярлыка"
end with

set oShell = nothing
В результате получим полноценный ярлык.

Оператор with можно простыми словами объяснить как with - с англ.: используя указанный объект,
разрешить обращение к нему, указывая просто точку в начале.
Действует этот фокус до тех пор, пока не встретится оператор end with.
После этого объект уничтожается.

3.1.) Допускается вложенность with, например:

VB.NET / VBA:
with CreateObject("WScript.Shell")
    with .CreateShortCut("H:\notepad.lnk")
        .TargetPath = "notepad.exe" 'собственно целевая программа, вызываемая ярлыком
        .Arguments = "дополнительные аргументы, передаваемые вызываемой программе при запуске"
        .WorkingDirectory = "C:\" 'рабочий каталог
        .IconLocation = "shell32.dll, 5" 'номер под которым хранится иконка для ярлыка в указанной библиотеке
        .WindowStyle = 1 'в каком виде развернуть программу при запуске
        .HotKey = "CTRL+ALT+F" 'горячая клавиша запуска
        .Description = "Описание ярлыка"
    end with
end with
 
Последнее редактирование:
Назад
Сверху Снизу