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

Тема в разделе "Изучение основ языка", создана пользователем Kиpилл, 30 янв 2014.

  1. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.232
    Симпатии:
    4.980
    Всем привет.
    Объясните мне пожалуйста на пальцах что есть объекты.
    Я так понял создание функции в скрипте есть ссылка на создаваемый объект.
    А что куда создается,в каком месте,удаляется ли и т.д.

    Спасибо.
     
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

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

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

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

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

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

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

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

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

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

    'Вызываем функцию по имени:
    Переменная = Моя_функция()
    'Выведем на экран значение переменной
    msgbox Переменная

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

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

    Например, чтобы отобразить на экране полный путь к выполняемому скрипту, нужно обратится к объекту WScript и через точку написать имя его свойства ScriptFullName :
    Код (Text):
    msgbox WScript.ScriptFullName
    Чтобы приостановить работу скрипта на 5 секунд, необходимо выполнить метод Sleep с параметром "кол-во мс.":
    Код (Text):
    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.
    Другие часто используемые объекты будут доступны при установке соответствующей программы:

    • 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-справочник с примерами.
     
    Последнее редактирование: 1 май 2016
    akok и Kиpилл нравится это.
  3. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.232
    Симпатии:
    4.980
    Dragokas, спасибо-доходчиво и просто.
    Получается объекты не имеют физической формы а являют собой некое виртуальное пространство имеющее функционал,определенный типом этого так называемого объекта?
    Я все верно понял?
     
    Последнее редактирование: 31 янв 2014
  4. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

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

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

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

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

    Код (vb.net):

    ' создаем объект 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):

    'Создаем Объект - Словарь
    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):
    For each Key in oDict.Keys
        'Выводим информацию в консоль, если скрипт запущен через CSCRIPT.exe
        ' <---- Уберите комментарий, когда будете запускать скрипт из командной строки командой cscript имя_скрипта.vbs
        'WScript.Echo "ID: " & Key & " Имя процесса: " & oDict(Key)
    Next
    В словаре также можно хранить другие объекты.
     
    akok и Kиpилл нравится это.
  5. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.497
    Симпатии:
    4.312
    Вот, кстати, объектная модель.
    - штука, на которой видно иерархию вложенности объектов и принадлежащие им свойства и методы.

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

    WScript. Object Model.gif

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

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

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

    :: Более удачный пример - пауза в скрипте
    WScript.Sleep(1000)
    2) Через ссылку на объект:
    Код (vb.net):
    :: создаем ссылку на объект
    set oLNK = CreateObject("WScript.Shell").CreateShortCut("H:\notepad.lnk")
    :: Обращаемся к объекту по ссылке, выполняем метод Save
    oLNK.Save
    :: Уничтожаем объект, высвобождаем занятые ресурсы
    set oLNK = nothing
    2.1.) Через несколько ссылок (вариаций может быть сколько угодно):

    Код (vb.net):
    set oShell = CreateObject("WScript.Shell")
    set oLNK = oShell.CreateShortCut("H:\notepad.lnk")
    oLNK.Save

    set oLNK = nothing: set oShell = nothing
    3) Через оператор with
    (удобно, например, когда необходимо установить подряд несколько свойств одному и тому же объекту)
    Код (vb.net):
    :: такой вариант наиболее читабельный

    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):
    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
     
    Последнее редактирование: 3 фев 2014
    akok и Kиpилл нравится это.

Поделиться этой страницей