Все команды vbscript. VBScript

Продолжение

Visual Basic Script

Зачем нужны VBS-скрипты

VBS-скрипт - это мощное решение для автоматизации действий пользователя в системах семейства Windows. Такой тип сценариев обычно используется для:

  • создания сложных сценариев;
  • использования объектов из других приложений и библиотек;
  • скрытия окон в ходе выполнения сценария;
  • шифрования логики сценария.

В основном VBS-сценарии применяются для обработки данных, управления системой, работы с учетными записями пользователей и компьютеров, взаимодействия с офисными приложениями, работы с базами данными и прочих сложных задач.

Основные положения

В зависимости от языка сценария, содержания и шифрования встречаются такие типы скриптов:

  • vbs - Visual Basic Script
  • vbe - зашифрованный Visual Basic Script
  • js - Java Script
  • jse - зашифрованный Java Script
  • wsh - настройки скрипта
  • wsf - XML-интегрированный сценарий

В этой статье я буду рассматривать сценарии типа vbs.

Сценарии обычно редактируются в блокноте Windows, но я рекомедую использовать Notepad2 , который подсвечивает ключевые слова языка Visual Basic и помогает форматировать тело сценария. Итак, vbs-сценарий - это обычный текстовый файл с именем *.VBS, который легко править в блокноте, а запускать на исполнение - двойным щелчком мыши или вызовом по имени в консоли.

Как уже было описано выше, сценарии не компилируются, а интерпретируются. То есть для обработки скрипта в системе должен присутствовать интерпретатор языка VBS, и таких интерпретатора в Windows есть даже две штуки: оконный WScript и консольный CScript - оба интерпритатора - это Windows Script Host (WSH).

По умолчанию все скрипты выполняются через WScript, то есть никаких настроек не требуется, но чтобы выполнить скрипт в окне консоли, необходимо запустить его через CScript, либо установить CScript как интерпретатор, используемый по умолчанию. Для этого в командной строке нужно выполнить следующее:

CScript //H:CScript

После чего все сценарии будут выполняться в режиме консоли. Возврат в оконный режим осуществляется следующей командой:

CScript //H:WScript

В Visual Basic работают следующие правила:

  • длина строки не ограничена;
  • регистр символов не учитывается;
  • количество пробелов между параметрами не учитывается;
  • строку команды можно разрывать, а на месте разрыва нужно вставлять символ " _ ";
  • максимальная длина имени переменной 255 символов;
  • комментарии обозначаются сиволом " " ".

" === Script Information Header === " Script Name: " название сценария; " Date: " дата изменения; " Author: " автор; " Description: " описание; " === Initialization Block === Option Explicit " директива, запрещающая автоматическое создание " переменных; Dim " объявление переменных; Dim () " объявление массивов; Set " подключение объектов; " === Script Main Logic === " тело сценария; " === Functions and Procedures === " процедуры и функции;

Переменные

По умолчанию переменные в сценариях объявляются автоматически при первом использовании в теле скрипта, если это не запрещено директивойOption Explicit. Если же в начале сценария объявить директивуOption Explicit, то все переменные нужно определять заранее с помощью следующих конструкций:

Dim " переменная, доступная всем подпрограммам; Public " переменная, доступная всем подпрограммам; Private " переменная, доступная только текущей программе и ее подпрограммам;

Константы объявляются в начале сценария с помощью конструкции:

Const = " константа, доступная всем подпрограммам; Public Const = " константа, доступная всем подпрограммам; Private Const = " константа, доступная только текущей программе " и ее подпрограммам.

Тип переменной присваивается автоматически после внесения в нее первого значения. В Visual Basic существуют следующие типы данных:

  • empty - неинициализированная переменная;
  • null - пустая переменная;
  • boolean - логический тип, возможные значения: False, True или 0, 1;
  • byte - 8-битное целое число без знака, возможные значения: 0 .. 255;
  • integer - 32-битное целое число, возможные значения: -32768 .. 32767;
  • long - 64-битное целое число, возможные значения: -2147483648 .. 2147483647;
  • currency - денежный тип, возможные значения: -922337203685477,5808 до 922337203685477,5807;
  • single - число с плавающей точкой, возможные значения: -3.402823e38 .. -1.401298e-45 для отрицательных чисел и 1.401298e-45 .. 3.402823e38 для положительных чисел;
  • double - число с плавающей точкой, возможные значения: 1.79769313486232e308 .. -4.94065645841247e-324 для отрицательных чисел и 4.94065645841247e-324 .. 1.79769313486232e308 для положительных чисел;
  • date - дата, возможные значения: 01.01.1900 и 31.01.9999;
  • string - строковая переменная, вместимость до 2 миллиардов символов;
  • object - указатель на объект;
  • error - код ошибки.

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

VarType() " возврат номера типа переменной; TypeName() " возврат имени типа переменной; IsArray() " проверка, что переменная - это массив; IsDate() " проверка, что переменная - это дата; IsEmpty() " проверка, что переменная неинициализирована; IsNull() " проверка, что переменная пустая; IsNumeric() " проверка, что переменная - это число; IsObject() " проверка, что переменная - это объект; CCur() " конвертация в тип currency; CBool() " конвертация переменной в тип boolean; CByte() " конвертация переменной в тип byte; CDate() " конвертация переменной в тип date; CDbl() " конвертация переменной в тип double; CInt() " конвертация переменной в тип integer; CLng() " конвертация переменной в тип long; CSng() " конвертация переменной в тип single; CStr() " конвертация переменной в тип string.

Как было сказано выше, Visual Basic не накладывает строгих ограничений на имена переменных, но в то же время существуют рекомендации для названий переменных, чтобы в тексте сценария легко определять тип данных. Для этого перед именем переменной рекомендуется ставить условные символы, которые определяют тип переменной:

  • iValueName - числовые типы
  • sValueName - строковый тип
  • bValueName - логический тип
  • dValueName - дата
  • oValueName - объект
  • cValueName - константа
  • aArrayName - массив

В VBS-сценариях возможно использование массивов переменных, которые позволяют хранить списки, таблицы и даже более сложные конструкции. Одномерные массивы (списки) могут быть динамическими, то есть они позволяют изменять свою размерность в ходе работы сценария. Все массивы объявляются командойDim:

Dim

Пример использования массивов

Dim aMyArray1(10,10) " создание статического массива размерностью 11х11; Dim aMyArray2() " создание динамического массива; aMyArray1(0,0) = "Hello" " заполнение массива; aMyArray1(0,1) = "People" " заполнение массива; aMyArray1(1,0) = "World" " заполнение массива.

Прежде, чем пользоваться динамическим массивом, ему нужно указать текущую размерность с помощью командыReDim, после чего массив можно переформировать в любом месте сценария, при этом либо очистить весь массив, либо сохранить старые значения ячеек командойPreserve:

ReDim aMyArray2(0) " формирование массива из одного элемента; aMyArray2(0) = "Hello" " заполнение массива; ReDim aMyArray2(1) " удаление старого массива и формирование нового из " друх элементов; aMyArray2(0) = "Hello" " заполнение массива; aMyArray2(1) = "World" " заполнение массива; ReDim Preserve aMyArray2(2) " формирование массива из трех элементов, оставляя " старые значения элементов в тех ячейках, где они были; aMyArray2(1) = "!" " заполнение массива; Erase aMyArray2 " удаляление массива.

Чтобы узнать размерность массива, обычно пользуются функциейUBound, которая будет рассмотрена ниже вместе с остальными функциями работы с данными.

Ветвления по условию

Ни один полноценный сценарий не обходится без ветвлений, ветвления помогают выбрать верный путь при выполнении или невыполнении какого-то заложенного условия. Иными словами, ветвления реализуют логику сценария. В VBS-сценариях реализованы несколько механизмов ветвлений. Рассмотрим их по порядку.

Конструкция для одного действия, выполняемого по условию:

If Then

Конструкция для нескольких действий, выполняемых по условию:

If Then End if

Конструкция "развилка":

If Then Else End if

Конструкция "развилка на несколько путей" (вариант сIf):

If Then ElseIf Then Else End if

Во всех приведенных выше конструкциях применяется следующее правило: "Если выполняется условие , то произвести список действий , которые расположеные под текущем блоком условия. Если текущее условие не выполняется, то перейти к списку действий под командойElse."

Конструкция "развилка на несколько путей" (вариант сSelect):

Select Case Case Case Case Else End Select

В данной конструкции работает правило: "Если значение переменной равно значению , то произвети список действий под этим значением, иначе перейти к проверке следующего значения ."

Циклы

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

Обычный цикл организуется структуройFor - Next, в аргументах которой задаются такие параметры как имя счетчика (), начальное значение счетчика (), конечное значение счетчика () и, при необходимости, шаг счетчика (Step ).

For = To Next

Если в процессе работы цикла потребуется прекратить перебор значений, то это можно сделать с помощью командыExit For

For = To If Then Exit For Next

Цикл с неизвестным количеством итераций обычно применяется для перебора всех значений в коллекции объекта, когда не известна его размерность. Эта структура переберет все значения () массива, переданного как парамер цикла ().

For Each In Next

For Each oCurrentFile In oFiles WScript.Echo oCurrentFile.Name Next

Циклы с условиями применяются для обработки данных, при выполнении какого-то условия. Такие циклы бывают двух видов: с проверкой в начале цикла и с проверкой в конце.

Цикл, пока выполняется условие, с проверкой в начале

Do While Loop

Цикл, пока не выполнится условие, с проверкой в начале

Do Until Loop

Как уже было сказано выше, условия можно ставить в конец цикла. В этом случае тело цикла будет выполнено как минимум один раз. Так же как и в обычных циклах, цикл с условием можно прервать командойExit Do:

Do If Then Exit Do Loop Until

Встроенные функции

Чтобы работать с данными и строить свои процедуры и функции, разработчки Visual Basic уже позаботились об основе сценариев - базовых функциях. VBS-скрипты функции для работы с датами, строками и числами, а так же базовые процедуры ввода-вывода и процедуры работы с сетью. Давайте вкратце рассмотрим встроенные функции.

Функции обработки дат:

Date " возврат текущей даты; Time " возврат текущего времени; Now " возврат текущих даты и времени; DateDiff(, , ) " возврат разницы между датами; MonthName() " возврат названия месяца; WeekDayName(, , ) " возврат названия дня недели; Day() " возврат дня из указанной даты; Month() " возврат месяца из указанной даты; Year() " возврат года из указанной даты; Hour() " возврат часа из указанной даты; Minute() " возврат минуты из указанной даты; Second() " возврат секунды из указанной даты.

Функции обработки строк:

Asc() " возврат ANSI-кода символа; Chr() " возврат символа по ANSI-коду; InStr(, ) " возврат позиции подстроки в указанной " строке; InStrRev(, ) " возврат позиции подстроки в указанной " строке, начиная с конца строки; Join(, ) " преобразование массива в строку; Len() " возврат длины строки; LCase() " преобразование строки в строку из малых " символов; UCase() " преобразование строки в строку из больших " символов; Left(, ) " возврат указанного количества символов с " начала строки; Right(, ) " возврат указанного количества символов с " конца строки; Mid(, , ) " возврат указанного количества символов с " указанного номера символа строки; Replace(, , [, Params]) " замена подстроки в указанной строке; Space() " строки из указанного количества пробелов; Split(, [, Params]) " преобразование строки в массив; String(, ) " строка из указанного количества " определенных символов; SrtReverse() " зеркальное отображение строки; Trim() " обрезка пробелов слева и справа от строки; LTrim() " обрезка пробелов слева от строки; RTrim() " обрезка пробелов справа от строки.

Математические функции:

Randomize " инициализация механизма случайных чисел (ничего не возвращает); Rnd " возврат случайного нецелочисленного значения от 0 до 1; Atn() " вычисление арктангенса числа; Cos() " вычисление косинуса числа; Sin() " вычисление синуса числа; Exp() " вычисление натурального логарифма числа; Log() " вычисление десятичного логарифма числа; Sqr() " вычисление квадратного корня числа; Abs() " вычисление абсолютного значения числа; Hex() " вычисление шеснадцатеричного значения числа; Int() " округление числа; Fix() " вычисление целой части числа.

И, естественно, помимо упомянутых функций, сценарии поддерживают все простейшие математические и логические операции:

  • = - оператор присваивания;
  • + - сумма двух чисел;
  • - - вычитание двух чисел;
  • * - умножение двух чисел;
  • / - деление двух чисел;
  • \ - целочисленное деление двух чисел;
  • Mod - остаток от деления двух чисел;
  • ^ - возведение в степень;
  • & - соединение двух строк;
  • Is - сравнение двух объектов;
  • Eqv - сравнение двух выражений;
  • Not - логическая операция отрицания;
  • And - логическая операция конъюнкции;
  • Or - логическая операция дизъюнкции;
  • Xor - логическая операция исключения;
  • Imp - логическая операция импликации.

Очередность выполнения операций определяется как и во всех языках программирования: сначала выполняются операции в скобках, потом вычисляются функции, потом операции умножения и деления, следом идут сложение и вычитание, и завершают вычисление логические операции.

Пользовательские функции

Сценарии, написанные на Visual Basic, позволяют определять пользовательские процедуры и функции и вызывать их из основной программы. Между процедурой и функцией практически нет никакого различия, разница заключется в логическом смысле этих подпрограмм: функции обычно используются для вычисления какого-то значения, а процедуры - для выполнения действий. Тем не менее и процедуры, и функции могут выполнять операции и передавать значения основной программе. Несмотря на это, все же не стоит забывать о предназначении этих подпрограмм: функции - для вычисления, процедуры - для действий.

Функция объявляется операторомFunction, после которого следует название пользовательской функции, которое не должно совпадать ни с одним зарезервированным словом языка Visual Basic, далее указываются переменные, которые будут передаваться подпрограмме в качестве параметров - указание переменных в этой конструкции означает выделение ячеек памяти для переменных подпрограммы (объявление переменных для функции). В теле подпрограммы структура сценария ничем не отличается от обычной программы (здесь можно объявлять дополнительные переменные, поизводить операции, использовать другие функции и процедуры), в конце тела должен присутствовать оператор присвоения функции какому-то значению - это значение и будет возвращено основной программе. Прервать выполнение функции можно операторомExit Function, но в этом случае нужно не забыть присвоить функции какое-то значение, иначе сценарий выдаст ошибку. Завершается функция операторомEnd Function.

Определение функции

Function () If Then = Exit Function End If = End Function

Вызов функции

= ()

Процедура определяется аналогично функции, но другим оператором -Sub. Так как процедура не возвращает основной программе никаких значений, то оператора присвоения перед выходом из процедуры нет. Прервать выполнение процедуры можно с помощью командыExit Sub, а завершается вся конструкция операторомEnd Sub. Чтобы в основной программе вызвать процедуру, необходимо использовать ключевое словоCallи имя функции с необходимыми аргументами. (Ключевое словоCallне является обязательным, но я рекомендую его использовать чтобы избежать неправильных вызовов процедуры.)

Определение процедуры

Sub () If Then Exit Sub End If End Sub

Вызов процедуры

()

Кстати, процедуры и функции должны располагаются в конце сценария.

Во время работы подпрограммы значения переменных основной части скрипта не изменяются, даже если в подпрограмме есть одноименные переменные. Чтобы подпрограмма имела возможность менять значения переменных основного сценария, необходимо в аргументах подпрограммы задать свойство переменных как ByRef. По умолчанию все переменные определяются со свойством ByVal.

Sub (ByRef [, arguments]) = End Sub

В данном случае аргумент передается по ссылке на ячейку памяти - меняется значение переменной в основном сценарии. Иными словами, с помощью параметра ByRef процедура превращается в функцию - подпрограмма возвращает результат вычислений в основную программу.

Обработка ошибок выполнения сценария

По умолчанию все ошибки обрабатываются сценарием в автоматическом режиме, и, при возникновении ошибки, работа сценария останавливается. Для отключения автоматической обработки ошибок нужно использовать специальную директивуOn Error Resume Next, которая отключает автоматическую обработку ошибок и продолжает работы сценария даже при их наличии. Для ручной обработки ошибок необходимо обратится к встроенному объектуErr, который хранит в себе статус ошибок. Объект Err имеет следующие свойства и методы:

Number " возврат номера последней ошибки; Description " возврат описания последней ошибки; Clear " очистка объекта Err; Raise " вызов тестовой ошибки.

Пример ручной обработки ошибки:

On Error Resume Next iTotalPoints = InputBox("Введите общее количество очков") iNumberOfTests = InputBox("Введите количество тестов") iAvarage = iTotalPoints / iNumberOfTests Select Case Err.Number Case 0 " нет ошибок; WScript.Echo "Средний балл = " & CStr(iAvarage) Case 11 " деление на ноль; WScript.Echo "Количество тестов не может равняться нулю" Case 13 " несоотвествие типов; WScript.Echo "Вы ввели нечисловое значение" Case Else " нет ошибок; WScript.Echo "Неизвестная ошибка WScript.Quit" End Select

Объекты, их методы и свойства

VBS-сценарии, как и их родитель - язык Visual Basic, является объектно-ориентированным языком программирования, то есть основной концепцией является понятие объектов и классов

Класс - это тип, описывающий устройство объектов. Объект подразумевает под собой нечто, что обладает определённым поведением и способом представления, объект - это экземпляр класса. Класс можно сравнить с чертежом, согласно которому создаются объекты. Обычно классы разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной области.

Итак, чтобы работать с объектом, его нужно сначала создать, используя классы из нужной библиотеки:

Set = CreateObject(.)

Удалить объект можно, присвоив ему значение Nothing:

Set = Nothing

Все объекты, с которыми работает Windows Script Host, имеют методы и свойства. Чтобы обратиться к методу, необходимо указать объект, а через точку - метод с необходимыми параметрами.

. [, Param2, ..., ParamN] Call .([, Param2, ..., ParamN])

Аналогичная ситуация со свойствами, но свойства можно как назначать, так и считывать в переменные и другие свойства, правда, следует учитывать тип данных переменных и свойств, иначе сценарий выдаст ошибку несовместимости типов данных.

. = . = . = .

Пример. Создание объекта файловой системы, обращение к методу создания папки, удаление объекта.

Set oFSO = CreateObject("Scripting.FileSystemObject") Call oFSO.CreateFolder("C:\Test") Set oFSO = Nothing

Обратите внимание, что понятие "объект" относится к логике сценария, а не к логике файловой системы. То есть, когда мы говорим "удаление объекта", мы имеем ввиду логический объект сценария, который никак не влияет на удаление каких-то частей файловой системы.

Чтобы узнать, какие существуют библиотеки в Вашей операционной системе, включенные в библиотеки классы, их методы и свойства, можно воспользоваться проводником объектов, например из Microsoft Word:

  1. Запустить MS Word.
  2. В главном меню выбрать Tools -> Macro -> Visual Bacis Editor
  3. В окне редактирования макросов выбрать View -> Object Browser

Если какая-то библиотека не отражена в списке, то ее можно подключить через меню Tools -> References.

В сценариях есть методы, не входящие ни в какой класс, они доступны непосредственно в теле сценария:

MsgBox([, Params]) " вывод оконного сообщения на экран; InputBox([, Params]) " вывод диалогового окна на экран.

Пример вывода диалогового окна с запросом текста, а после этого вывод на экран оконного сообщения с введенным текстом.

MyValue = InputBox("Введите текст", "Первое окно", "Текст нужно ввести здесь") MyResult = MsgBox(MyValue, 1, "Второе окно")

Методы и свойства корневого класса WScript

Методы и свойства корневого класса WScript, не требуют создания объекта - они автоматически доступны для использования непосредственно в теле сценария.

CreateObject(.) " создание объекта; GetObject() " подключение объекта из файла; ConnectObject(, ) " подключение к событиям существующего объекта; DisconnectObject() " отключение от событий объекта; Echo() " вывод сообщения на экран; Arguments " возврат массива аргументов командной строки сценария; Name " возврат имени интерпретатора сценариев; Path " возврат пути к интерпретатору сценариев; FullName " возврат полного имени интерпретатора сценариев; Version " возврат версии интерпретатора сценариев; BuildVersion " возврат версии сборки интерпретатора сценариев; ScriptName " возврат имени файла сценария; ScriptFullName " возврат полного имени файла сценария; Interactive " установка или возврат режима интерактивности сценария; Sleep() " приостановка работы на указанное количество миллисекунд; Quit " прекращение работы сценария.

Применение этих методов и свойств более подробно мы разберем в примерах других классов.

Методы и свойства класса Shell

Для работы с операционной системой используется специальный класс Shell, который позволяет выполнять такие операции как запуск программ, изменение реестра, создание ярлыков, доступ к системным папкам и системным переменным, доступ к системному журналу. Итак, методы и свойства класса Shell:

ExpandEnvironmentStrings() " возврат значения запрошенной переменной системы; EnviEnvironment() " возврат массива переменных системы; CreateShortcut() " создание ярлыка; Popup([, Params]) " вывод оконного сообщения на экран; RegRead() " считывание значения из реестра; RegWrite(,[, Type]) " запись значения в реестр; RegDelete() " удаление значения из реестра; LogEvent(,) " запись события в системный журнал; Run([, Params]) " запуск программы в новом процессе; Exec() " запуск программы в дочерней консоли; AppActivate() " активация окна; SendKeys(<Keys>) " отправка символов в активное окно; CurrentDirectory " установка или возврат текущей директории; SpecialFolders() " возврат массива служебных папок или пути " запрошенной служебной папки. </p><p>Пример. Использование методов и свойств класса Shell.</p><p> " Создание объекта класса Shell Set oShell = Wscript.CreateObject("WScript.Shell") " Запуск калькулятора oShell.Run("Calc.exe") " Задержка WScript.Sleep(100) " Запуск блокнота oShell.Run("Notepad.exe") " Задержка WScript.Sleep(100) " Переключение на окно калькулятора oShell.AppActivate "Calculator" " Задержка WScript.Sleep(100) " Иммитация нажатия клавиш oShell.SendKeys("1{+}2{=}") " Получение пути к рабочему столу sDesktopPath = oShell.SpecialFolders("Desktop") " Создание объекта ярлыка Set oLink = oShell.CreateShortcut(sDesktopPath & "\Test.lnk") " Настрока ярлыка oLink.TargetPath = WScript.ScriptFullName oLink.WindowStyle = 1 oLink.Hotkey = "CTRL+SHIFT+T" oLink.IconLocation = "notepad.exe,0" oLink.Description = "Test link" oLink.WorkingDirectory = sDesktopPath oLink.Save " Создание объекта среды и получение в него свойств системы Set oSysEnv = oShell.Environment("SYSTEM") " Вывод сообщения о количестве процессоров на экран MyResult = oShell.Popup("Number of processors: " & oSysEnv("NUMBER_OF_PROCESSORS"), _ 3, "Message", 0) " Получение пути к папке Windows и вывод сообщения на экран MyResult = oShell.Popup("Windows directory: " & _ oShell.ExpandEnvironmentStrings("%WINDIR%"), 3, "Message", 0) " Чтение ключа реестра и вывод его значения на экран WScript.Echo oShell.RegRead ("HKLM\Software\Microsoft\Windows\CurrentVersion\ProductID") " Запись строкового значения в реестр MyResult = oShell.RegWrite("HKCU\ScriptEngine\Value", "My Value") " Запись числового значения в реестр MyResult = oShell.RegWrite("HKCU\ScriptEngine\Key", 1, "REG_DWORD") " Удаление ключа реестра MyResult = oShell.RegDelete("HKCU\ScriptEngine\") " Запись события в системный журнал MyResult = oShell.LogEvent(0, "Test Script Completed") </p><h3> Методы и свойства класса Network</h3> <p>Как мы уже убедились, VBS-сценарии могут работать с оболочкой Windows, но это не единственная их возможность. С помощью класса Network можно получить доступ к сетевым объектам и управлять ими. Давайте подребнее разберем класс Network:</p><p>ComputerName " возврат имени компьютера; UserDomain " возврат имени домена; UserName " возврат имени пользователя; EnumNetworkDrives " возврат списка подключенных сетевых дисков; MapNetworkDrive(<LocalName>, <RemoteName>, ) " подключение сетевого ресурса; RemoveNetworkDrive(<Name>, , ) " отключение сетевого ресурса; EnumPrinterConnections " возврат списка сетевых принтеров; AddWindowsPrinterConnection(<PrinterPath>) " подключение сетевого принтера; AddPrinterConnection(<LocalName>, <RemoteName>[, UpdateProfile, User, Password] " подключение сетевого принтера на указанный порт; RemovePrinterConnection(<Name>[,Force, UpdateProfile]) " отключение сетевого принтера; SetDefaultPrinter(<PrinterName>) " выбор принтера по умолчанию; </p><p>Пример. Использование методов и свойств класса Network.</p><p> " Создание объекта класса Network Set oNetwork = WScript.CreateObject("WScript.Network") " Вывод сообщения об имени компьютера WScript.Echo "Computer Name = " & oNetwork.ComputerName " Вывод сообщения об имени текущего пользователя WScript.Echo "User Name = " & oNetwork.UserDomain & "\" & oNetwork.UserName " Подключение сетевого диска oNetwork.MapNetworkDrive "Z:" "\\Server\Share" " Получение коллекции подключенных сетевых дисков Set oDrives = oNetwork.EnumNetworkDrives " Вывод сообщений о подключенных сетевых дисках For i=0 To oDrives.Count -1 step 2 WScript.Echo "Drive " & oDrives.Item(i) & " = " & oDrives.Item(i+1) Next " Удаление сетевого диска oNetwork.RemoveNetworkDrive "Z:" " Подключение сетевого принтера oNetwork.AddPrinterConnection "LPT1", "\\Server\Printer" " Установка принтера по умолчанию oNetwork.SetDefaultPrinter "\\Server\Printer" " Получение коллекции о подключенных принтерах Set oPrinters = oNetwork.EnumPrinterConnections </p><h3> Методы и свойства класса FileSystemObject</h3> <p>Очень часто в сценариях встречаются такие случаи, когда необходимо что-то создать, удалить, переместить или изменить на диске компьютера. Эту задачу позволяет решить класс FileSystemObject, предназначенный для работы с файловой системой. Ниже перечисленны объекты, которые может создать этот класс:</p> <ul><li>FileSystemObject - главный объект, который позволяет создавать, удалять, управлять дисками, папками и файлами в общем;</li> <li>Drive - объект, позволяюший собирать информацию о дисках системы;</li> <li>Drives - объект, хранящий в себе список дисков системы;</li> <li>Folder - объект, позволяющий создавать, удалять, перемещать папки, а также собирать информацию о них и их содержимом;</li> <li>Folders - объект, хранящий в себе список подпапок указанной папки;</li> <li>File - объект, позволяющий создавать, удалять, перемещать файлы, а также собирать информацию о них;</li> <li>Files - объект, хранящий в себе список файлов указанной папки;</li> <li>TextStream - объект, позволяющий читать и создавать текстовые файлы.</li> </ul><p>Методы и свойства класса FileSystemObject (главного объекта):</p><p>BuildPath(<Path>, <Name>) " добавляет имя к указанному пути; GetAbsolutePathName(<PathSpec>) " возвращает полный путь; GetBaseName(<Path>) " возвращает имя папки или файла (без " расширения) в указанном пути; GetDrive(<DriveSpec>) " создает объект Drive; GetDriveName(<Path>) " возвращает имя диска в указанном пути; GetExtensionName(<Path>) " возвращает расширение файла в " указанном пути; GetFile(<FileSpec>) " создает объект File; GetFileName(<PathSpec>) " возвращает имя файла (без расширения) " в указанном пути; GetFolder(<FolderSpec>) " создает объект Folder; GetParentFolderName(<Path>) " возвращает имя папки в котором хранится " файл или папка по указанному пути; GetSpecialFolder(<FolderSpec>) " создает объект Folder к указанной " служебной папке; GetTempName " возвращает случайно сгенерированное " имя файла; DriveExists(<DriveSpec>) " проверяет существование диска; FolderExists(<FileSpec>) " проверяет существование папки; CopyFolder(<Source>, <Destination>[, Overwrite]) " копирует папку; MoveFolder(<Source>, <Destination>) " перемещает папку; DeleteFolder(<FolderSpec>[, Force]) " удаляет папку; CreateFolder(<FolderName>) " создает папку; FileExists(<Filespec>) " проверяет существование файла; CopyFile(<Source>, <Destination>[, Overwrite]) " копирует файл; MoveFile(<Source>, <Destination>) " перемещает файл; DeleteFile(<FileSpec>[, Force]) " удаляет файл; CreateTextFile(<FileName>[, Overwrite, UnioCode]) " создает текстовый файл; OpenTextFile(<FileName>[, IOMode, Create, Format]) " открывает текстовый файл для чтения или " записи. </p><p>Объекты Drives, Folders и Files класса FileSystemObject хранят в себе информацию о дисках, папках и файлах и, в основном, используюся для сбора информации о файловой системе. Они имеют только два свойства:</p><p>Count " возвращает количество элементов в коллекции; Item(<ObjectName>) " возвращает запись с указанным индексом из коллекции (не используется), " для перебора элементов коллекции приметяется цикл For Each. </p><p>Чтобы было более понятно, что же такое коллекция объектов, рассмотрим пример вывода на экран списка файлов корня диска C:</p><p> " Создание объекта класса FileSystemObject Set oFSO = CreateObject("Scripting.FileSystemObject") " Создание объекта Folder Set oFolder = oFSO.GetFolder("C:\") " Получение коллекции файлов Set oFilesCollection = oFolder.Files " Получение количества элементов в коллекции sResult = sResult & oFilesCollection.Count & " files in C:\" & vbCrLf " Чтение атрибутов каждого файла из коллекции For Each oFile in oFilesCollection sResult = sResult & oFile.Name & vbTab sResult = sResult & oFile.Size & vbCrLf Next " Вывод результата на экран MsgBox(sResult) </p><p>Объект Drive предоставляет доступ к свойствам локального или сетевого диска:</p><p>AvailableSpace " возвращает размер свободного места на диске, доступного пользователю; DriveLetter " возвращает букву диска; DriveType " возвращает тип диска; FileSystem " возвращает тип файловой системы диска; FreeSpace " возвращает размер свободного места на диске; IsReady " возвращает доступность диска; Path " возвращает путь к диску; RootFolder " создает объект Folder, указывающий на корень диска; SerialNumber " возвращает серийный номер диска; ShareName " возвращает сетевое имя диска; TotalSize " возвращает емкость диска в байтах; VolumeName " возвращает или устанавливает метку диска. </p><p>Объект Folder предоставляет доступ ко всем свойствам папки, а также позволяет производить над ней действия:</p><p>Attributes " возвращает атрибуты папки; DateCreated " возвращает дату создания папки; DateLastAccessed " возвращает дату последнего доступа к папке; DateLastModified " возвращает дату изменения папки; Drive " возвращает букву диска, на котором расположена папка; Files " возвращает коллекцию файлов папки; IsRootFolder " возвращает True, если папка - это корень диска; Name " возвращает имя папки; ParentFolder " создает объект Folder, указывающий на " родительскую папку; Path " возвращает путь к папке; ShortName " возвращает имя папки в формате 8.3; ShortPath " возвращает путь к папке в формате 8.3; Size " возвращает размер папки; SubFolders " возвращает коллекцию подпапок; Type " возвращает тип папки; Copy(<Destination>[, Overwrite]) " копирует папку; Move(<Destination>) " перемещает папку; Delete(<Force>) " удаляет папку; CreateTextFile(<FileName>[, Overwrite, UniCode]) " создает в папке текстовый файл. </p><p>Объект File аналогичен объекту Folder - он предоставляет доступ ко всем свойствам файла, а также позволяет производить над ним действия:</p><p>Attributes " возвращает атрибуты файла; DateCreated " возвращает дату создания файла; DateLastAccessed " возвращает дату последнего доступа к файла; DateLastModified " возвращает дату изменения файла; Drive " возвращает букву диска, на котором расположен файл; Name " возвращает имя файла; ParentFolder " создает объект Folder, указывающий на " родительскую папку; Path " возвращает путь к файлу; ShortName " возвращает имя файла в формате 8.3; ShortPath " возвращает путь к файлу в формате 8.3; Size " возвращает размер файла; Type " возвращает тип файла; Copy(<Destination>[, Overwrite]) " копирует файл; Move(<Destination>) " перемещает файл; Delete(<Force>) " удаляет файл; OpenAsTextStream() " открывает текстовый файл для чтения или записи. </p><p>Объект TextStream - это инструмент доступа к содержимому файла. С помощью него можно читать и изменять файл:</p><p>AtEndOfLine " показывает, достигнут ли конец строки; AtEndOfStream " показывает, достигнут ли конец строки; Column " возвращает номер колонки, в которой находится курсор чтения; Line " возвращает номер строки, в которой находится курсор чтения; Close " закрывает файл - освобождает его для других процессов; Read(<CharactersNumber>) " считывает указанное количество символов, начиная от позиции " курсора чтения; ReadAll " считывает весь файл; ReadLine " считывает строку, в которой находится курсор чтения; Skip(<CharactersNumber>) " пропускает указанное количество символов, начиная от позиции " курсора чтения; SkipLine " пропускает строку, в которой находится курсор чтения; Write(<String>) " записывает строку; WriteLine(<String>) " записывает строку и переводит курсор записи на следующую строку; WriteBlankLines(<Lines>) " записывает указанное количество пустых строк. </p><p>Мы познакомились со всеми методами и свойствами класса FileSystemObject, рассмотрим пример использования этого класса:</p><p> " Задание констант кодов системных папок Const WindowsFolder = 0 Const SystemFolder = 1 Const TemporaryFolder = 2 " Задание констант кодов типов доступа к текстовому файлу Const ForReading = 1 Const ForWriting = 2 Const ForAppending = 8 " Создание объекта класса FileSystemObject Set oFSO = CreateObject("Scripting.FileSystemObject") " Получение коллекции дисков Set DrivesCollection = oFSO.Drives " Обработка каждого диска для получения его метки или сетевого имени For Each oDrive in DrivesCollection sResult = sResult & oDrive.DriveLetter & ": " If oDrive.DriveType = Remote Then sResult = sResult & oDrive.ShareName & vbCrLf ElseIf oDrive.IsReady Then sResult = sResult & oDrive.VolumeName & vbCrLf Else sResult = sResult & vbCrLf End If Next " Вывод результатов на экран Wscript.Echo(sResult) " Создание объекта диска C: Set oDrive = oFSO.GetDrive("C") sResult = oDrive.DriveLetter & ": - " " Получение типа диска C: Select Case oDrive.DriveType Case 0: sResult = sResult & "Unknown - " Case 1: sResult = sResult & "Removable - " Case 2: sResult = sResult & "Fixed - " Case 3: sResult = sResult & "Network - " Case 4: sResult = sResult & "CD-ROM - " Case 5: sResult = sResult & "RAM Disk - " End Select " Определение доступности диска и получение его свойств If oDrive.IsReady Then sResult = sResult & "Ready" & vbCrLf sResult = sResult & "FileSystem is " & oDrive.FileSystem & vbCrLf sResult = sResult & "Available Space: " & _ FormatNumber(oDrive.AvailableSpace/1024, 0) & " Kbytes" Else sResult = sResult & "Not ready" End If " Вывод результатов на экран Wscript.Echo(sResult) " Создание объекта служебной папки (папка временных фалов Windows) Set oTempFolder = oFSO.GetSpecialFolder(TemporaryFolder) " Создание объекта текстового файла (и создание его в корне диска C:) Set oFile = oFSO.CreateTextFile("C:\TestFile.txt", True) " Запись в текстовый файл oFile.WriteLine("This is a test.") oFile.WriteLine(sResult) " Закрытие текстового файла и освобождение его для других процессов oFile.Close " Проверка на наличие файла в папке временных файлов Windows, удаление этого файла If oFSO.FileExists(oFSo.BuildPath(oTempFolder.Path, "TestFile.txt")) Then _ oFSO.DeleteFile(oFSo.BuildPath(oTempFolder.Path, "TestFile.txt")) " Создание объекта файла Set oFile = oFSO.GetFile("C:\TestFile.txt") " Перемещение файла в папку временных файлов Windows oFile.Move(oFSo.BuildPath(oTempFolder.Path, "TestFile.txt")) " Изменение атрибута у файла If oFile.Attributes and 32 Then oFile.Attributes = oFile.attributes - 32 Wscript.Echo("Archive bit is cleared") Else oFile.Attributes = oFile.attributes + 32 Wscript.Echo("Archive bit is set") End If sResult = oFile.Path & vbCrLf & oFile.DateLastModified & ":" & vbCrLf " Создание объекта потока путем открытие файла на чтение Set oTestFile = oFSO.OpenTextFile(oFile.Path, ForReading, False) " Чтение потока, пока не встречен его конец Do While oTestFile.AtEndOfStream <> True sResult = sResult & oTestFile.ReadLine Loop " Закрытие текстового файла и освобождение его для других процессов oTestFile.Close " Вывод сообщения на экран Wscript.Echo(sResult) </p><h3> Сценарий "Удаление старых файлов"</h3> <p>Данный сценарий предназначен для очистки системы от устаревших файлов во временных каталогах Windows и профилях пользователей. В этом примере можно увидеть как работают практически все вышеописанные конструкции: структура сценария, название переменных, работа с массивами и коллекциями, ручная обработка ошибок, считывание системных переменных, создание текстового файла журнала работы сценария, работа с файловой системой, использование процедур.</p><p> " ==== Script Information Header ==== " script name: Purge Temp " version: 1.0 " date: 16.07.08 " autor: Bochkarev Vitaly " description: Скрипт удаляет устаревшие временные файлы с компьютера " ==== Script Main Logic ==== " Включение ручной обработки ошибок On Error Resume Next " Константа временного интервала, когда файлы считаются устаревшими Const PurgeTime = 14 " дней " Исключения - профили пользователей, которые не должны обрабатываться Dim aExceptions(3) aExceptions(0) = "Default User" aExceptions(1) = "LocalService" aExceptions(2) = "NetworkService" aExceptions(3) = "All Users" " Создание объектов оболочки и файловой системы Set oShell = CreateObject("wscript.shell") Set oFSO = CreateObject("Scripting.Filesystemobject") " Определение путей служебных папок sProgramFiles = oShell.ExpandEnvironmentStrings("%ProgramFiles%") sWinDir = oShell.ExpandEnvironmentStrings("%WinDir%") sWinTempFolder = sWinDir & "\Temp" sDocuments = "C:\Documents and Settings" " Создание фурнала работы сценария sLogFileName = sWinTempFolder & "\PurgeTemp_" & Date sLogFileName = Replace(sLogFileName, ".", "_") sLogFileName = Replace(sLogFileName, "/", "_") Set oLogFile = oFSO.CreateTextFile(sLogFileName & ".log",true) oLogFile.WriteLine "========== Start purging ==========" " Очистка временной папки Windows oLogFile.WriteLine vbCrLf & "========== Windows Temporary folder ==========" PurgeFolder(sWinTempFolder) " Очистка временной папки профиля пользователя и файлов Интернет oLogFile.WriteLine vbCrLf & _ "========== Users Temporary folder and Users Temporary Internet Files ==========" Set oDocuments = oFSO.GetFolder(sDocuments) Set colProfiles = oDocuments.SubFolders For Each oProfile In colProfiles bFlag = false For Each sException in aExceptions if InStr(oProfile.Path,sException) > 0 then bFlag = true exit for end if Next If bFlag = False Then PurgeFolder(oProfile.Path & "\Local Settings\Temp") PurgeFolder(oProfile.Path & "\Local Settings\Temporary Internet Files") End If Next " Очистка карантина NOD32 oLogFile.WriteLine vbCrLf & "========== NOD32 Quarantine ==========" sQuarantine = sProgramFiles & "\Eset\Infected" PurgeFolder(sQuarantine) " Закрытие файла журнала oLogFile.WriteLine vbCrLf & "========== Stop purging ==========" oLogFile.Close " Процедура PurgeFolder - удаление старых файлов Sub PurgeFolder(sFolderPath) " Создание объекта Folder Set oFolder = oFSO.GetFolder(sFolderPath) " Получение коллекции файлов Set colFiles = oFolder.Files " Обработка каждого файла из коллекции For each oFile in colFiles " Проверка, является ли файл устаревшим If (Date-oFile.DateLastModified) > PurgeTime and (Date-oFile.DateCreated) > _ PurgeTime Then " Запись сообщения в журнал сценария oLogFile.Writeline oFile.Path & vbTab & oFile.DateCreated " Удаление устаревшего файла oFSO.DeleteFile oFile.Path, True " Проверка на наличие ошибок if err.Number <> 0 then " Запись сообщения об ошибке в журнал сценария oLogFile.Writeline "-----> Error # " & CStr(Err.Number) _ & " " & Err.Description " Очистка ошибки Err.Clear end if " Пауза в 20 милисекунд WScript.Sleep 20 End if Next " Получение коллекции подпапок Set colSubFolders = oFolder.SubFolders " Обработка каждой подпапки For Each oSubFolder In colSubFolders " Рекурсивный вызов процедуры удаления старых файлов - подпрограмма вызывает " сама себя PurgeFolder(oSubFolder.Path) " Проверка размера папки If oSubFolder.Size = 0 Then " Запись сообщения в журнал сценария oLogFile.Writeline oSubFolder.Path & vbTab & oSubFolder.DateCreated " Удаление пустой папки oFSO.DeleteFolder oSubFolder.Path " Проверка на наличие ошибок If err.Number <> 0 then " Запись сообщения об ошибке в журнал сценария oLogFile.Writeline "-----> Error # " & CStr(Err.Number) _ & " " & Err.Description " Очистка ошибки Err.Clear End if End if Next End Sub </p><p>Итак, мы познакомились с основами сценариев Visual Basic Script. Давайте подведем итог, и определим достоинства и недостатки таких сценариев:</p> <ul><li>сценарии не требуют компиляции и их код в любой момент можно отредактировать;</li> <li>VBS-сценарии практически не ограничены в функциональности и могут использовать различные системные библиотеки и объекты других приложений;</li> <li>VBS-файлы могут выполняются как в консоли, так и в оконном режиме, поэтому пользователь может контролировать видимость хода выполнения сценария;</li> <li>VBS-сценарии позволяют использовать пользовательские процедуры и функции;</li> <li>этот язык идеально подходит для работы со строковыми и числовыми переменными, датами, а также для обработки текстовых файлов, управления системой и доменом;</li> <li>VBS-сценарии сложны в написании и требуют навыков программирования;</li> <li>такие сценарии работают только в операционных системах семейства Windows.</li> </ul><p>Виталий Бочкарев</p> <h2>Внешние ссылки</h2> <p>Секция внешних ссылок, то есть ссылок на другие сайты, к которым данный ресурс не имеет никакого отношения.. Кроме этого, владелец сайта сайт не несет никакой ответственности за доступность этих ресурсов и за их контент.</p> <h3> Типы данных </h3> <p>В языке VBScript используется единственный тип данных – Variant (Вариант), который позволяет хранить в переменной число, строку, дату, булевское значение, ссылку на объект и другую информацию. Определить тип содержимого переменной можно с помощью набора функций: <a href="/gs/wiki/index.php/VBScript._%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_VarType" title="VBScript. Функция VarType">VarType</a> , TypeName, IsArray, IsDate, IsEmpty, IsNull, IsNumeric, IsObject, которые будут рассмотрены ниже. Тип содержащейся информации еще называется подтипом варианта. Полный список подтипов приведен в следующей таблице:</p> <table class="wikitable" border="1"><tr><th> Подтип </th> <th> Описание </th> </tr><tr><td> Empty </td> <td> Переменной не присвоено значение. При использовании неинициализированной переменной в числовых выражениях, будет подставляться 0, а в строковых – пустая строка. </td> </tr><tr><td> Null </td> <td> Переменная не содержит данных. </td> </tr><tr><td> Boolean </td> <td> Булевская переменная может принимать значения True, или False. </td> </tr><tr><td> Byte </td> <td> Целое число в диапазоне от 0 до 255. </td> </tr><tr><td> Integer </td> <td> Целое число в диапазоне от -32 768 до 32 767. </td> </tr><tr><td> Currency </td> <td> Число с фиксированной точкой в диапазоне от -922 337 203 685 477.5808 до 922 337 203 685 477.5807. </td> </tr><tr><td> Long </td> <td> Целое число в диапазоне от -2 147 483 648 до 2 147 483 647. </td> </tr><tr><td> Single </td> <td> Число с плавающей точкой одинарной точности. Для отрицательных значений допустимый диапазон <p>от -3.402823E38 до -1.401298E-45. Для положительных – от 1.401298E-45 до 3.402823E38.</p> </td> </tr><tr><td> Double </td> <td> Число с плавающей точкой двойной точности. Для отрицательных значений допустимый диапазон от <p>79769313486232E308 до -4.94065645841247E-324. Для положительных -- от 4.94065645841247E-324 до 1.79769313486232E308.</p> </td> </tr><tr><td> Date (Time) </td> <td> Содержит число, представляющее дату в диапазоне от 1-го января 100 года, до 31 декабря 9999 года. </td> </tr><tr><td> String </td> <td> Последовательность символов. Максимальная длина в районе 2-х миллиардов знаков. </td> </tr><tr><td> Object </td> <td> Объект. </td> </tr><tr><td> Error </td> <td> Номер ошибки. </td> </tr></table><p>В зависимости от выражения, в котором участвует переменная, ее содержимое будет автоматически приведено к нужному типу. Рассмотрим такой пример:</p><p>Option Explicit Sub TestVBScript Dim A, B A = 5 B = "12" Application.MessageBox A + B, "", vbOkOnly End Sub </p><p>Так как в выражении участвует числовая переменная <b>A </b>, интерпретатор преобразует значение переменной <b>B </b> из строки <b>"12" </b> в число и просуммирует их:</p><p>Изменим макрос так, чтобы переменная <b>А </b> тоже содержала строку:</p><p>Option Explicit Sub TestVBScript Dim A, B A = "5" B = "12" Application.MessageBox A + B, "", vbOkOnly End Sub </p><p>Запустим его на выполнение. Теперь на экране появится результат слияния (конкатенции) двух строк, а не сумма их числовых представлений:</p><p><img src='https://i2.wp.com/gsbelarus.com/gs/images/gs/2009/book/VBScript.DataTypes.2.png' height="100" width="118" loading=lazy></p><p>Во избежании путаницы с автоматическим приведением типов, рекомендуется использовать функции конверсии: CBool, CByte, CCur, CDate, CDbl, CInt, CLng, CSng, CStr.</p><p>Если результатом выражения должно быть именно слияние строк, а не сумма их числовых представлений, то следует использовать оператор & вместо +.</p> <h3> Переменные </h3> <p>Переменная – это удобное символьное обозначение области памяти, где приложение хранит некоторые данные. В процессе выполнения приложения значение переменной может изменяться. Перед использованием переменную следует объявить с помощью оператора Dim.</p><p>С помощью одного оператора можно объявить сразу несколько переменных, если перечислить их имена через запятую:</p><p>Dim Left, Right, Top, Bottom </p><p>При объявлении нет необходимости в указании типа данных, так как все переменные имеют тип Variant.</p><p><i>Если в первой строке текста скрипта не указано Option Explicit, то использовать переменные можно без объявления. Но, такой путь может привести к трудно выявимым ошибкам. Достаточно один раз ошибиться в написании имени переменной в тексте программы, чтобы получить непредсказуемый результат. Мы рекомендуем всегда указывать Option Explicit и объявлять переменные. </i></p><p>Имя переменной должно соответствовать следующим требованиям:</p> <ol><li>Начинаться с символа латинского алфавита;</li><li>Состоять только из символов латинского алфавита или из символов латинского алфавита и цифр;</li><li>Не превышать 255 символов в длину;</li><li>Быть уникальным в пределах своей области видимости.</li> </ol><h3><span> Область видимости и время жизни </span></h3> <p>Область видимости переменной определяется тем, где она была объявлена. Если внутри тела процедуры , то такая переменная называется локальной и доступна только в пределах этой процедуры. Если переменная объявлена в тексте скрипта, то она будет видима для всех процедур или функций определенных в этом скрипте. Локальные переменные могут иметь одинакове имена, если объявлены в разных процедурах.</p><p><i>В дереве Проводника окна Редактора скрипт-объектов присутствует специальный раздел – Константы и переменные – для объявления глобальных переменных, видимых для всех скрипт-функций проекта. </i></p><p>Интерпретатор выделяет память для локальных переменных в момент их объявления и высвобождает по выходу из процедуры. Глобальные переменные существуют с момента их объявления и пока скрипт не закончит свое выполнение. Применительно к Гедымину это означает, что глобальные переменные существуют на протяжении всего времени выполнения программы.</p> <h3><span> Присваивание значения переменной </span></h3> <p>Значение объявленной переменной присваивается с помощью оператора =. Имя переменной указывается слева от оператора, новое значение – справа. Например:</p><p>A = 200 B = "Наименование" </p><h3><span> Скалярные переменные и массивы </span></h3> <p>Переменная содержащая единственное значение называется скалярной. Иногда, возникает необходимость хранить несколько значений в одной переменной. В этом случае следует объявить массив. Синтаксис объявления идентичен объявлению скалярной переменной за тем исключением, что после имени в круглых скобках мы задаем размерность массива. Следующее объявление создаст массив из 12 элементов:</p><p>Dim Monthes(11) </p><p>В языке VBScript левая граница индекса массива всегда 0. Таким образом размер массива вычисляется, как число указанное в скобках плюс один. При присваивании значения элементу массива следует указать его индекс в круглых скобках:</p><p>Monthes(0) = "Январь" Monthes(1) = "Февраль" Monthes(2) = "Март" ... Monthes(10) = "Ноябрь" Monthes(11) = "Декабрь" </p><p>Аналогично, при обращении к значению элемента мы используем его индекс:</p><p>MonthName = Monthes(5) </p><p>Массив не обязательно должен быть одномерным. VBScript позволяет нам задать до 60 размерностей при объявлении массива. Например, следующий оператор создаст двумерный массив из 12 строк и двух колонок :</p><p>Dim MonthDays(11, 1) </p><p>При обращении к элементам многомерного массива следует указывать все индексы:</p><p>MonthDays(0, 0) = "Январь" MonthDays(0, 1) = 31 MonthDays(1, 0) = "Февраль" MonthDays(1, 1) = 28 ... </p><p>Выше мы объявляли массивы, размер которых не меняется в процессе работы программы. Если заранее не известно сколько элементов понадобится, то можно объявить динамический массив:</p><p>Перед использованием следует установить размер динамического массива с помощью оператора ReDim:</p><p>ReDim A(25) </p><p>В процессе выполнения можно вызывать оператор ReDim многократно, каждый раз изменяя размер массива. Опция Preserve сохраняет значения элементов массива при изменении размера. Например, следующий код увеличит объявленный выше массив на пять элементов, оставив существующие нетронутыми:</p><p>ReDim Preserve A(30) </p><p>Помните, что при уменьшении размера массива, значения удаленных элементов будут безвозвратно утеряны. С помощью оператора Erase можно очистить элементы фиксированного массива или освободить память, занимаемую динамическим массивом.</p><p>Dim A ReDim A(25) ... Erase A </p><h3> Константы </h3> <p>Правилом хорошего тона является объявление констант для многократно используемых в тексте программы значений. Грамотно присвоенное имя константы улучшает читабельность, а само использование -- упрощает процесс внесения изменений в код. В отличие от переменных, значение константы нельзя изменить в процессе выполнения программы. Создание константы происходит с помощью оператора Const:</p><p>Const CountryName = "Belarus" Const CountryCode = 375 </p><p>Несколько констант могут быть объявлены в рамках одного оператора, через запятую. Как и переменная, константа обладает своей областью видимости в зависимости от того, где (в процедуре или за ее пределами) и как (Public или Private) она была объявлена. Константы, созданные оператором Const без указания Public или Private являются общедоступными по-умолчанию.</p><p><i>В дереве Проводника окна Редактора скрипт-объектов присутствует специальный раздел – Константы и переменные – для объявления глобальных констант, видимых для всех скрипт-функций проекта. </i></p><p>Значения строковых констант заключаются в двойные кавычки.</p><p>Значения типа Дата следует обрамлять символами решетки (#) и использовать американский формат: месяц/день/год. Например:</p><p>Const Public IndependenceDay = #03/25/1918# </p><p>Во избежание путаницы между константами и переменными рекомендуется использовать единый префикс для всех констант, например "con", или набирать имя константы в верхнем регистре.</p><p>Для облегчения труда программиста VBScript содержит набор <a href="/gs/wiki/index.php/VBScript._%D0%9F%D1%80%D0%B5%D0%B4%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82%D1%8B" title="VBScript. Предопределенные константы">предопределенных констант</a> .</p> <h3> Операторы </h3> <p>Операторы VBScript подразделяются на пять категорий: арифметические, сравнения, слияния, логические и присваивания.</p> <h4><span> Арифметические операторы </span></h4> <table class="wikitable" border="1"><tr><th> Оператор </th> <th> Пример использования </th> <th> Описание </th> </tr><tr><td> ^ </td> <td> number ^ exponent </td> <td> Возводит number в степень exponent. Number может быть меньше нуля только в случае целочисленной степени. Если один из операндов Null, все выражение принимает значение Null. Если несколько возведений в степень выполняются подряд, результат вычисляется слева направо. </td> </tr><tr><td> * </td> <td> number1 * number2 </td> <td> Произведение двух чисел. Если операнд имеет значение Empty, то он принимается равным нулю. Если хотя бы один из операндов Null, все выражение принимает значение Null. </td> </tr><tr><td> / </td> <td> number1 / number2 </td> <td> Вещественное деление двух чисел. Для операндов действуют правила аналогично оператору умножения. </td> </tr><tr><td> \ </td> <td> number1 \ number2 </td> <td> Целочисленное деление. Перед вычислением оба операнда приводятся к типу Byte, Integer или Long. В остальном действуют правила как для оператора деления. </td> </tr><tr><td> Mod </td> <td> number1 Mod number2 </td> <td> Остаток от целочисленного деления. Приведение операндов к целому, а также правила обращения с Empty и Null, как у целочисленного деления. </td> </tr><tr><td> + </td> <td> expression1 + expression2 </td> <td> Если оба операнда числа, результатом является их арифметическая сумма. Если оба операнда строки – слияние (конкатенция) двух строк. Если один операнд число, а другой строка, то строковый операнд будет преобразован в число и прибавлен к числовому. Если хотя бы один из операндов Null, все выражение принимает значение Null. Если оба операнда Empty, результат имеет целочисленное значение 0. Если только один оператор Empty, в качестве результата возвращается значение второго операнда. </td> </tr><tr><td> - </td> <td> number1 – number2 или - number </td> <td> В первом случае возвращает разность двух чисел. Во втором – инвертирует знак числа. Правила для операндов со значениями Null и Empty, как для оператора умножения. </td> </tr></table><h4><span> Операторы сравнения </span></h4> <p>Формат использования операторов сравнения:</p><p>Result = expression1 comparisonoperator expression2 </p><p>где используются следующие операторы сравнения: < (меньше), <= (меньше или равно), > (больше), >= (больше или равно), = (равно), <> (не равно).</p><p>В зависимости от типов и значений операндов, сравнение осуществляется следующим образом:</p> <table class="wikitable" border="1"><tr><th> Если </th> <th> То </th> </tr><tr><td> Оба операнда числа. </td> <td> Выполняется сравнение двух чисел. </td> </tr><tr><td> Оба операнда строки. </td> <td> Выполняется сравнение двух строк. </td> </tr><tr><td> Один из операндов число, а второй строка. </td> <td> Строковый операнд приводится к числу и выполняется сравнение двух чисел. </td> </tr><tr><td> Один из операндов Empty, а второй число. </td> <td> Операнд со значением Empty принимается равным 0. </td> </tr><tr><td> Один из операндов Empty, а второй строка. </td> <td> Операнд со значением Empty принимается равным пустой строке "". Осуществляется сравнение двух строк. </td> </tr><tr><td> Оба операнда Empty. </td> <td> Операнды считаются равными. </td> </tr><tr><td> Хотя бы один из операндов Null. </td> <td> Результат принимает значение Null. </td> </tr></table><p>Специальный оператор Is применяется для сравнения двух объектных переменных и возвращает Истину, если обе переменных ссылаются на один и тотже экземпляр объекта.</p> <h4><span> Операторы конкатенции </span></h4> <p>Result = expression1 & expression2 </p><p>Если операнд не является строкой, он приводится к строковому типу. Если оба операнда Null, то результат также принимает значение Null, однако, в отличие от остальных операторов, если только один операнд Null, то он принимается равным пустой строке. Операнд, имеющий значение Empty, также воспринимается как пустая строка "".</p> <h4><span> Логические операторы </span></h4> <p>VBScript предоставляет нам следующие логические операторы:</p> <ol><li>Логическое исключение (Xor);</li><li>Логический эквивалент (Eqv);</li><li>Логическая импликация (Imp).</li> </ol><p>В качестве операндов логических операторов могут выступать булевские выражения или числовые значения. В первом случае результатом будет булевская константа, во втором – число. В зависимости от оператора подача на вход одного или двух значений Null может приводить к Null результату. Оператор Not является унарным и возвращает логическое отрицание выражения. Над числовым операндом оператор Not производит побитовую инверсию. Остальные логические операторы являются бинарными. В таблице ниже приведены результаты выполнения каждого из операторов в зависимости от значения операндов Exp1 и Exp2:</p> <table class="wikitable" border="1"><tr><th>Exp1 </th> <th> Exp2 </th> <th> And </th> <th> Or </th> <th> Xor </th> <th> Eqv </th> <th> Imp </th> </tr><tr><td> True </td> <td> True </td> <td> True </td> <td> True </td> <td> False </td> <td> True </td> <td> True </td> </tr><tr><td>True </td> <td> False </td> <td> False </td> <td> True </td> <td> True </td> <td> False </td> <td> False </td> </tr><tr><td>False </td> <td> True </td> <td> False </td> <td> True </td> <td> True </td> <td> False </td> <td> True </td> </tr><tr><td>False </td> <td> False </td> <td> False </td> <td> False </td> <td> False </td> <td> True </td> <td> True </td> </tr><tr><td>True </td> <td> Null </td> <td> Null </td> <td> True </td> <td> Null </td> <td> Null </td> <td> Null </td> </tr><tr><td>False </td> <td> Null </td> <td> False </td> <td> Null </td> <td> Null </td> <td> Null </td> <td> True </td> </tr><tr><td>Null </td> <td> True </td> <td> Null </td> <td> True </td> <td> Null </td> <td> Null </td> <td> True </td> </tr><tr><td>Null </td> <td> False </td> <td> False </td> <td> Null </td> <td> Null </td> <td> Null </td> <td> Null </td> </tr><tr><td>Null </td> <td> Null </td> <td> Null </td> <td> Null </td> <td> Null </td> <td> Null </td> <td> Null </td> </tr></table><p>В жизни чаще всего используются операторы And и Or и гораздо реже – Xor. Нам не приходилось сталкиваться с использованием на практике операторов Eqv и Imp. Если вам тяжело разбираться с приведенной выше таблицей резюмируем действие данных операторов:</p> <ul><li>And принимает значение Истина только если оба операнда Истина. В любом другом случае – это либо Ложь, либо Null.</li><li>Or принимает значение Истина, если хотябы один из операндов Истина.</li><li>Xor принимает значение Истина, если значения операндов различаются и Ложь, если они одинаковы.</li> </ul><p>При побитовом выполнении над числовыми операндами результат логического оператора определяется по следующей таблице:</p> <table class="wikitable" border="1"><tr><th>Exp1 </th> <th> Exp2 </th> <th> And </th> <th> Or </th> <th> Xor </th> <th> Eqv </th> <th> Imp </th> </tr><tr><td> 0 </td> <td> 0 </td> <td> 0 </td> <td> 0 </td> <td> 0 </td> <td> 1 </td> <td> 1 </td> </tr><tr><td> 0 </td> <td> 1 </td> <td> 0 </td> <td> 1 </td> <td> 1 </td> <td> 0 </td> <td> 1 </td> </tr><tr><td> 1 </td> <td> 0 </td> <td> 0 </td> <td> 1 </td> <td> 1 </td> <td> 0 </td> <td> 0 </td> </tr><tr><td> 1 </td> <td> 1 </td> <td> 1 </td> <td> 1 </td> <td> 0 </td> <td> 1 </td> <td> 1 </td> </tr></table><h4><span> Оператор присваивания </span></h4> <p>Оператор присваивания (=) подробно описан в разделе "Переменные".</p> <h4><span> Очередность применения операторов </span></h4> <p>Если выражение содержит несколько операторов, то они применяются в соответствии с установленным порядком, который называется приоритетом операторов. Изменить порядок по-умолчанию можно с помощью круглых скобок. Выражение внутри скобок всегда вычисляется в первую очередь.</p><p>В выражении, содержащем операторы разных категорий, арифметические действия выполняются в первую очередь, затем выполняются операторы сравнения и, в последнюю очередь, -- логические операторы. Все операторы сравнения имеют одинаковый приоритет и вычисляются слева-направо. Арифметические и логические операторы вычисляются в следующем порядке:</p> <ol><li>Возведение в степень (^);</li><li>Смена знака числа, унарный минус (-);</li><li>Умножение (*) и деление (/);</li><li>Целочисленное деление (\);</li><li>Остаток от целочисленного деления (Mod);</li><li>Сложение (+) и вычитание (-);</li><li>Слияние строк (&).</li> </ol><p>Если умножение и деление встречаются в одном выражении, то операции выполняются в порядке следования слева-направо. Аналогичное правило действует в случае одновременного присутствия операторов сложения и вычитания.</p><p>Оператор слияния строк (&) не является арифметическим и по приоритету располагается между арифметическими операторами и операторами сравнения.</p><p>Очередность для логических операторов установлена следующая:</p> <ol><li>Логическое отрицание, инверсия (Not);</li><li>Логическое умножение, коньюнкция (And);</li><li>Логическое сложение, дизьюнкция (Or);</li><li>Логическое исключение (Xor);</li><li>Логический эквивалент (Eqv);</li><li>Логическая импликация (Imp).</li> </ol><h3><span> Условные выражения </span></h3> <p>Условные выражения применяются для управления порядком выполнения команд программы и позволяют организовать переходы (ветвления) и повторения команд. Как правило, операторы сравнения используются вместе с условными выражениями.</p> <h4><span> Выражение If..Then..Else </span></h4> <p>Выражение условного перехода If позволяет выполнить ту или иную группу команд в зависимости от результата логического выражения или значения булевской переменной.</p><p>Для выполнения единственной команды при выполнении заданного условия используется однострочный синтаксис выражения:</p><p>Dim S If DatePart("w", Now) = vbMonday Then S = "Понедельник" Application.MessageBox S, "", vbOkOnly </p><p>Обратите внимание, что секция Else в этом случае опущена. Для выполнения группы операторов следует заключить их между ключевыми словами Then и End If.</p><p>Dim S If DatePart("w", Now) = vbMonday Then S = "Сегодня понедельник" Application.MessageBox S, "", vbOkOnly End If </p><p>Если при выполнении условия требуется выполнить один код, а при невыполнении – другой, то используется синтаксис выражения с секцией Else:</p><p>Dim S If DatePart("w", Now) = vbMonday Then S = "Сегодня понедельник" Else S = "Сегодня не понедельник" End If Application.MessageBox S, "", vbOkOnly </p><p>При необходимости выбора из нескольких альтернатив подойдет синтаксис с конструкцией ElseIf:</p><p>Dim S, D D = DatePart("w", Now) If D = vbMonday Then S = "Понедельник" ElseIf D = vbTuesday Then S = "Вторник" ElseIf D = vbWednesday Then S = "Среда" ... End If Application.MessageBox S, "", vbOkOnly </p><p>Выражения If могут быть вложенными:</p><p>Dim S, D D = DatePart("w", Now) If D = vbMonday Then S = "Понедельник" Else If D = vbTuesday Then S = "Вторник" Else If D = vbWednesday Then S = "Среда" Else ... End If End If End If </p><p>Хотя количество секций ElseIf в условном выражении не ограничено, интенсивное их использование может привести к запутанному, неудобочитаемому коду. В случае выбора одной альтернативы из множества возможных в зависимости от значения некоторого селектора рекомендуется использовать выражение Select Case.</p> <h4><span> Выражение Select..Case </span></h4> <p>Перепишем пример с днями недели с использованием выражения выбора:</p><p>Dim S Select Case DatePart("w", Now) Case vbMonday S = "Понедельник" Case vbTuesday S = "Вторник" Case vbWednesday S = "Среда" ... Case Else Err.Raise 32000, "", "Неизвестный день недели" End Select </p><p>Так как выражение селектора вычисляется только один раз, использование Select..Case приводит к более эффективному коду. Рекомендуется всегда использовать секцию Case Else для отлавливания некорректных или необработанных значений селектора.</p> <h3><span> Операторы цикла </span></h3> <p>Довольно часто возникает ситуация, когда код требуется запустить повторно. Для этого следует написать оператор цикла, который повторяет определенные команды снова и снова. Операторы цикла используются во многих ситуациях: при вычислении итоговой суммы по списку чисел, перемещении по записям набора данных или для запуска блока кода для нескольких объектов. Существует несколько циклов, описанных в следующих разделах. Некоторые из них выполняются, пока условие имеет значение Истина, некоторые – пока Ложь. И, наконец, есть такие, которые выполняются заданное число раз.</p> <h4> Оператор Do..Loop </h4> <p>Данный оператор предназначен для выполнения группы команд пока заданное условие Истинно или до тех пор, когда оно не станет Истинным. Проверка условия может осуществляться как в начале цикла:</p><p>Do [{While | Until} condition] Loop </p><p>так и в конце:</p><p>Do Loop [{While | Until} condition] </p><p>Команда Exit Do может встречаться неограниченное число раз в теле цикла. Обычно она используется вместе с условным выражением If..Then и позволяет передать управление на оператор, следующий непосредственно за циклом. При использовании Exit Do внутри вложенного цикла, управление перейдет во внешний цикл.</p><p>Следующий код позволяет заменить игральный кубик:</p><p>Dim Resp, Num Do Num = Int(6 * Rnd + 1) Resp = Application.MessageBox(Num & " Еще число?", "",_ vbYesNo or vbQuestion) Loop Until Resp = vbNo </p><h4> While..Wend </h4> <p>Представляет собой усеченную версию оператора Do..Loop и позволяет выполнять группу команд пока условие Истинно. Синтаксис оператора:</p><p>While condition Wend </p><p>Обратите внимание, что Exit Do не действует внутри данного цикла. Циклы While..Wend могут быть вложенными.</p> <h4> For..Next </h4> <p>Данный цикл повторяет заданный набор команд указанное число раз. Синтаксис оператора имеет вид:</p><p>For counter = start To end Next </p><p>Перед стартом цикла переменной counter присваивается значение start. Далее проверяется выполнение условия counter <= end, при step >= 0, или counter >= end, при отрицательном шаге. После выполнение блока команд переменная counter увеличивается на значение step и все повторяется сначала.</p><p>Изменение счетчика в теле цикла не запрещено, но настоятельно не рекомендуется, так как затрудняет понимание логики программы и ее отладку.</p><p>Exit For может встречаться в теле цикла произвольное число раз. Циклы могут быть вложенными. Например, такой цикл инициализирует трехмерный массив:</p><p>Dim A(9, 9, 9) Dim I, J, K For I = 0 To 9 For J = 0 To 9 For K = 0 To 9 A(I, J, K) = 1 Next Next Next </p><h4> For Each..Next </h4> <p>Оператор цикла For Each..Next повторяет заданный набор команд для каждого элемента массива или коллекции и имеет следующий синтаксис:</p><p>For Each element In group Next </p><p>Цикл выполняется, если в массиве или коллекции присутствует хотябы один элемент. Exit For может встречаться в теле цикла произвольное количество раз.</p><p>Проиллюстрируем использование For Each..Next на примере следующего кода, который выводит на экран список файлов из корневого каталога диска с:\</p><p>Dim fso, f, f1, fc, s Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.GetFolder("c:\") Set fc = f.Files For Each f1 in fc s = s & f1.name & vbNewLine Next Application.MessageBox s, "Файлы на c:\", vbOkOnly </p><h3> Процедуры </h3> <p>Для экономии памяти и структурирования программы, фрагмент кода, вызываемый многократно в разных местах, может быть оформлен ввиде процедуры. В языке VBScript существуют два вида процедур: подпрограммы (Sub) и функции (Function). Подпрограмма – это последовательность операторов, обрамленная ключевыми словами Sub и End Sub. Подпрограмма может принимать на вход параметры, но не возвращает значения. Функция – последовательность операторов, заключенная между Function и End Function, -- возвращает результат и поэтому может быть использована в выражении. Каждая процедура должна иметь имя, уникальное в пределах модуля. Имена процедур, объявленных в глобальном модуле, должны быть уникальны в рамках всего проекта.</p><p>Определение подпрограммы и функции имеет следующий синтаксис:</p><p> | Private] Sub name [(arglist)] End Sub | Private] Function name [(arglist)] End Function </p><p>Public процедуры являются глобальными и доступны во всех скриптах программы. Private процедуры доступны только в том скрипте, где они были объявлены. Если не указано иное, объявленная процедура является общедоступной. Ключевое слово Default может быть использовано только в теле класса и служит для указания метода по-умолчанию этого класса.</p><p>Список параметров имеет следующий синтаксис:</p><p>Varname [, ...] </p><p>Параметры могут передаваться по значению (ByVal) или по ссылке (ByRef). По-умолчанию все параметры передаются по значению. Константы, результаты вычисления выражений могут быть переданы только по значению. Изменение параметра, переданного по ссылке, приведет к изменению значения наружной переменной. Поясним передачу параметров внутрь процедуры на следующем примере:</p><p>Sub DoCalculation(ByRef A, ByVal B, ByVal C) A = C * 2 B = C / 2 End Sub Sub TestVar Dim V1, V2 V1 = 1 V2 = 2 DoCalculation V1, V2, 10 " После выполнения процедуры DoCalculation " V1 = 20 " V2 = 2 End Sub </p><p>Переменные, объявленные внутри тела процедуры, являются локальными и уничтожаются по завершении ее выполнения. Значения локальных переменных не сохраняются.</p><p>Список параметров указывается в круглых скобках при вызове функции или при вызове подпрограммы с помощью оператора Call . Так, вызов процедуры DoCalculation в приведенном выше примере мы могли написать следующим образом:</p><p>Call DoCalculation(V1, V2, 10) </p><h3> Выражение Execute </h3> <h3> Классы VBScript </h3> <p>VBScript позволяет создавать новые классы, которые в дальнейшем мы будем называть VB классами. Вообще говоря, полноценными классами в понимании объектно-ориентированного программирования они не являются, поскольку не поддерживают наследование и, соответственно, полиморфизм. Так что из трех китов, на которых базируется объектно-ориентированная парадигма остается только инкапсуляция - возможность объединять в рамках одной сущности данные и методы.</p><p>Определение класса осуществляется с помощью следующей конструкции:</p><p>Class name statements End Class </p><p>где name - это имя класса, а statements - это одно или несколько определений переменных, свойств, процедур или функций, называемых так же членами класса. Обратите внимание, что в отличие от Delphi, где код определения класса содержит только объявления процедур и функций, в VB классе код членов прописывается прямо в тексте класса.</p><p>Члены класса могут быть объявлены как Private или Public. Первые видны только внутри кода данного класса, вторые же доступны как для внутреннего кода, так и снаружи. Если переменная или функция (процедура) не содержат явного определения Public или Private, то они считаются общедоступными. Процедуры или функции объявленные как Public внутри блока класса становятся методами данного класса.</p><p>Переменные, объявленные как общедоступные, становятся свойствами класса наравне со свойствами объявленными непосредственно с помощью конструкций Property Get, Property Let, Property Set.</p> <h4><span> Определение свойств класса </span></h4> <p>Выше мы уже говорили о том, что поля класса явно или не явно объявленные как Public, становятся его свойствами. Кроме этого, создать свойство класса можно определив специальные функции для считывания значения свойства (Property Get), а также для его присвоения (Property Let или Property Set).</p><p>Синтаксис определения таких функций следующий:</p><p> | Private] Property Get name [(arglist)] [ name = expression] [ name = expression] End Property Property Let name ( value) End Property Property Set name( reference) End Property </p><p>Определив только одну функцию, считывания или присвоения, можно создать свойство, соответственно, только для чтения или записи. Процедура Property Let используется для присвоения простых типов данных, а Property Set для передачи ссылки на объект. Обратите внимание, что все три функции могут принимать на вход произвольный список параметров. Таким образом можно организовать, например, свойства-массивы, передавая в качестве аргумента индекс элемента.</p> <h4><span> Создание и уничтожение экземпляра VB класса </span></h4> <p>Создание экземпляра VB класса осуществляется с помощью оператора New.</p><p>Dim X Set X = New classname </p><p>Уничтожение ранее созданного экземпляра происходит автоматически по завершении блока кода, где была объявлена соответсвующая переменная и при условии, что на нее нет внешних ссылок. Если необходимо уничтожить экземпляр вручную, то необходимо присвоить значение Nothing переменной.</p><p> ‘ объявление переменной и создание экземпляра класса Dim X Set X = New classname ... ‘ использование экземпляра класса... ‘ уничтожение экземпляра класса Set X = Notning ... </p><h4><span> События Initialize и Terminate </span></h4> <p>Событие Initialize происходит при создании экземпляра класса, а Terminate - при его уничтожении. Разработчик может определить свои обработчики данных событий. Ниже приведен пример использования событий создания и удаления объекта:</p><p>Class TestClass " Определение обработчика события Initialize. Private Sub Class_Initialize MsgBox("TestClass started") End Sub " Определение обработчика события Terminate. Private Sub Class_Terminate MsgBox("TestClass terminated") End Sub End Class " Создание экземпляра класса TestClass. " На экран будет выведено сообщение "TestClass started" Set X = New TestClass " Уничтожение экземпляра. " На экран будет выведено сообщение "TestClass terminated" Set X = Nothing </p> <p>Что то я совсем убежал вперёд и не рассказал вам про две <b>функции диалоговых окон: MsgBox и InputBox </b>. В этом очень небольшом уроке я и расскажу про все приблуды к этим двум функциям. Так же существуют и другие способы создания диалоговых окон, но для этого потребуются<b> объекты WSH </b>, о которых будет разговор в следующих уроках.</p> <h2>Функция MsgBox</h2> <p>Самая обычная функция для вывода сообщения. Конечно она сложнее, чем <b>Echo объекта WScript </b>, но и объект ей не нужен.<br><i>Синтаксис: </i> <b>MsgBox (Prompt[, Buttons][, Title][, Helpfile, Context]) </b></p> <ul><li><b>Prompt </b> — Текст сообщения.</li> <li><b>Buttons </b> — Выводимые кнопки и режим окна.</li> <li><b>Title </b> — Название окошка.</li> <li><b>Helpfile </b> — файл справки (*.hlp)</li> <li><b>Context </b> — Номер раздела справки.</li> </ul><p>Параметр <b>Buttons </b>может одновременно принимать несколько значений. Для того что бы их указать, используется знак «+» или просто использую сумму значений. Значения данного параметра приведены ниже.</p> <h3>Константы для диалоговых окон (выводимые кнопки):</h3> <ul><li><b>vbOKOnly </b> — Значение 0. Выводить кнопку ОК.</li> <li><b>vbOKCancel </b> — Значение 1. Выводить кнопки: ОК и Отмена.</li> <li><b>vbAbortRetryIgnore </b> — Значение 2. Выводить кнопки: Прервать, Повтор и Пропустить.</li> <li><b>vbYesNoCancel </b> — Значение 3. Выводить кнопки: Да, Нет и Отмена.</li> <li><b>vbYesNo </b> — Значение 4. Выводить кнопки: Да и Нет.</li> <li><b>vbRetryCancel </b> — Значение 5. Выводить кнопки: Повтор и Отмена.</li> </ul><h3>Константы для диалоговых окон (выводимые значки):</h3> <ul><li><b>vbCritical </b> — Значение 16. Вывести значок Stop Mark.</li> <li><b>vbQuestion </b> — Значение 32. Вывести значок Question Mark.</li> <li><b>vbExclamation </b> — Значение 48. Вывести значок Exclamation Mark.</li> <li><b>vbInformation </b> — Значение 64. Вывести значок Information Mark.</li> </ul><h3>Константы для диалоговых окон (кнопки по умолчанию):</h3> <ul><li><b>vbDefaultButton1 </b> — Значение 0. Первая кнопка выбирается по умолчанию.</li> <li><b>vbDefaultButton2 </b> — Значение 256. Вторая кнопка выбирается по умолчанию.</li> <li><b>vbDefaultButton3 </b> — Значение 512. Третья кнопка выбирается по умолчанию.</li> <li><b>vbDefaultButton4 </b> — Значение 768. Четвёртая кнопка выбирается по умолчанию.</li> </ul><h3>Константы для диалоговых окон (Режим окна):</h3> <ul><li><b>vbApplicationModal </b> — Значение 0. Выводится в модальном режиме.</li> <li><b>vbSystemModal </b> — Значение 4096. Выводится в модальном режиме и располагается поверх всех приложений.</li> </ul><h3>Другое:</h3> <ul><li><b>Значение 262144 </b> — Поверх всех окон.</li> <li><b>Значение 524288 </b> — Текст в окошке выводится по правому краю.</li> </ul><p>Стоит отметить, что параметр <b>Buttons </b>не может принимать несколько значений из одной и той же категории. Данные значения будут просто складываться. То есть, у вас не получится установить несколько наборов кнопок или иконок одновременно.</p> <p>"Урок VBScript №16: "Функция MsgBox и InputBox "file_1.vbs "******************************************************** MsgBox "Привет", 5+16, "Название" MsgBox "Привет", vbRetryCancel+16, "Название" MsgBox "Привет", vbRetryCancel+524288, "Название" MsgBox "Привет", vbAbortRetryIgnore + vbInformation + vbDefaultButton2 + vbSystemModal + 524288, "Название" MsgBox "Привет", 528706, "Название"</p> <table class="crayon-table"><tr class="crayon-row"><td class="crayon-nums " data-settings="show"> </td> <td class="crayon-code"><p>"******************************************************** </p><p>"Урок VBScript №16: </p><p>"Функция MsgBox и InputBox </p><p>"file_1.vbs </p><p>"******************************************************** </p><p>MsgBox "Привет" , 5 + 16 , "Название" </p><p>MsgBox "Привет" , vbRetryCancel + 16 , "Название" </p><p>MsgBox "Привет" , vbRetryCancel + 524288 , "Название" </p><p>MsgBox "Привет" , vbAbortRetryIgnore + vbInformation + vbDefaultButton2 + vbSystemModal + 524288 , "Название" </p><p>MsgBox "Привет" , 528706 , "Название" </p> </td> </tr></table><p>Помимо этого, функция MsgBox может возвращать результат нажатия кнопок. Его можно присвоить переменной и таким способом определить нажатую кнопку.</p> <h3>Возвращаемый результат нажатых кнопок (константы):</h3> <ul><li><b>vbOK </b> — Значение 1. Кнопка Ок.</li> <li><b>vbCancel </b> — Значение 2. Кнопка Отмена.</li> <li><b>vbAbort </b> — Значение 3. Кнопка Прервать.</li> <li><b>vbRetry </b> — Значение 4. Кнопка Повтор.</li> <li><b>vbIgnore </b> — Значение 5. Кнопка Пропустить.</li> <li><b>vbYes </b> — Значение 6. Кнопка Да.</li> <li><b>vbNo </b> — Значение 7. Кнопка Нет.</li> </ul><p>"******************************************************** "Урок VBScript №16: "Функция MsgBox и InputBox "file_2.vbs "******************************************************** Dim Knopka Knopka = MsgBox("Нажми на любую кнопку",2,"Заголовок") If Knopka = 3 Then MsgBox "Вы нажали ктопку - Прервать" ElseIf Knopka = 4 Then MsgBox "Вы нажали ктопку - Повтор" Else MsgBox "Вы нажали ктопку - Пропустить" End If</p> <p>"******************************************************** "Урок VBScript №16: "Функция MsgBox и InputBox "file_4.vbs "******************************************************** Dim Dict, AboutBomb Set Dict = CreateObject("Scripting.Dictionary") Dict.CompareMode = 1 Dict.Add "Жёлтый", "Бомба взорвалась!" Dict.Add "Красный", "Вы обезвредили бомбу!" Dict.Add "Синий", "Бомба взорвалась!" Dict.Add "Зелёный", "Бомба взорвалась!" AboutBomb = InputBox("Обнаружена бомба!!! Какой провод резать: жёлтый, красный, синий или зелёный??","Обнаружена бомба!!!","Вводить цвет провода сюда...") If Dict.Exists(AboutBomb) then MsgBox Dict.Item(AboutBomb) else MsgBox "У тебя плохо со зрением! Такого провода нет! Бомба взорвалась!!!" end if</p> <table class="crayon-table"><tr class="crayon-row"><td class="crayon-nums " data-settings="show"> </td> <td class="crayon-code"><p>"******************************************************** </p></td></tr></table> </div> </div> </div> </div> <div id="sidebar" class="span4 sidebar_right"> <div class="inside"> <div class="sidebar_module sidebar_module_"> <h3 class="sidebar_module_heading"><span>Последние</span></h3> <div class="sidebar_module_content"> <ul class="nav menu"> <li class="item"><a href="/prilozhenie-zapisyvayushchee-telefonnyi-razgovor-dlya-windows-phone-kak/">Как записать телефонный разговор?</a></li> <li class="item"><a href="/kak-pravilno-zaryazhat-planshet-pervyi-raz-sovety-i-tonkosti-pyat/">Пять мифов о зарядке батареи смартфона Можно использовать планшет во время зарядки</a></li> <li class="item"><a href="/podrobnyi-obzor-i-testirovanie-plansheta-asus-transformer-pad-infinity-tf700t-obzor-asus/">Обзор ASUS Transformer Pad TF103C с док-станцией Программы и скорость работы</a></li> <li class="item"><a href="/bluetooth-garnitura-dlya-telefona-jabra-bt2045-harakteristika-instrukciya/">Bluetooth-гарнитура для телефона Jabra BT2045: характеристика, инструкция, отзывы Недостатки гарнитуры Jabra</a></li> <li class="item"><a href="/gde-chernyi-spisok-v-samsunge-a3-gde-v-telefone-chernyi-spisok-popast-v/">Где в телефоне черный список</a></li> <li class="item"><a href="/programma-dlya-vneseniya-izmenenii-v-shrift-ttf-dva-instrumenta-dlya-sozdaniya/">Два инструмента для создания шрифтов</a></li> <li class="item"><a href="/nastroika-shablona-vordpress-attitude-shablon-dlya-wordpress-so-mnozhestvom-nastroek/">Attitude — шаблон для wordpress со множеством настроек</a></li> <li class="item"><a href="/kak-sozdat-trafik-v-vk-pribylnaya-konvertaciya-trafika-iz/">Прибыльная конвертация трафика из вконтакте</a></li> <li class="item"><a href="/skachat-wi-fi-podklyuchenie-plansheta-chto-podklyuchit-planshet-s-pomoshchyu-wi-fi-kak/">Что подключить планшет с помощью wi fi</a></li> <li class="item"><a href="/alisa-otkroi-kameru-test-draiv-golosovogo-pomoshchnika-alisa-ot-yandeksa-kak/">Тест-драйв голосового помощника «Алиса» от «Яндекса</a></li> </ul> </div> </div> <div class="sidebar_module sidebar_module_"> <h3 class="sidebar_module_heading"><span>Это нужно знать</span></h3> <div class="sidebar_module_content"> <ul class="nav menu"> <li class="item"><a href="/pechat-fotografii-onlain-pechat-fotografii-onlain-online-pechat-fotografii-s/">Печать фотографий онлайн Online печать фотографий с доставкой</a></li> <li class="item"><a href="/hammond-organ-prednaznachalsya-dlya-domashnego-ispolzovaniya-i-v/">Adam Monroe Music Rotary Organ v1</a></li> <li class="item"><a href="/kak-otmenit-zhalobu-v-kontakte-skolko-nuzhno-zhalob-na-stranicu-vk-chtoby-ee/">Сколько нужно жалоб на страницу вк чтобы ее заблокировали</a></li> <li class="item"><a href="/pochemu-u-menya-ne-rabotaet-minecraft-chto-delat-esli-minecraft-ne/">Что делать, если Minecraft не запускается</a></li> <li class="item"><a href="/ustanovit-mod-prevrashcheniya-mod-advance-morphing---prevrashchenie-v-mobov/">Мод Advance Morphing - Превращение в мобов</a></li> <li class="item"><a href="/kakoi-shrift-bukvy-na-list-a4-kak-sdelat-bukvy-na-ves-list-a4-v/">Как сделать буквы на весь лист А4 в Word</a></li> <li class="item"><a href="/kalendarnaya-setka-vektor-v-dve-stroki-kalendar-kalendar/">Календарная сетка вектор в две строки</a></li> <li class="item"><a href="/kak-narisovat-zavetnyi-klyuch-ot-shkoly-kak-narisovat-klyuch-podrobnoe-opisanie/">Как нарисовать заветный ключ от школы</a></li> <li class="item"><a href="/kak-razognat-processor-s-pomoshchyu-amd-overdrive-razgonyaem-processor-amd-nastroika/">Как разогнать процессор с помощью amd overdrive</a></li> <li class="item"><a href="/radion-serii-550-videokarty-tehnologiya-radeon-chill/">Радион серии 550. Видеокарты. Технология Radeon Chill</a></li> </ul> </div> </div> <div class="sidebar_module sidebar_module_"> <!--s_links--><!--check code--><!--/s_links--> </div> </div> </div> </div> </div> </section> <footer id="footer" class="container"> <div id="copyright"> <div> <p class="copytext"> © 2024 boldcreation.ru - Компьютерные уроки для начинающих </p> <ul class="nav menu"> <li class="item-113"><a href="/map.html">Список статей</a></li> <li class="item-113"><a href="/sitemap.xml">Карта сайта</a></li> </ul> </div> </div> </footer> <div id="gotop" class=""> <a href="#" class="scrollup">TPL_TPL_FIELD_SCROLL</a> </div> <!-- Yandex.Metrika counter --> <script type="text/javascript" > (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date(); for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); ym(97014667, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true }); </script> <noscript><div><img src="https://mc.yandex.ru/watch/97014667" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> </body> </html>