Язык программирования VBScript
Наверное нет языка программирования проще, чем VBScript – Visual Basic Scripting Edition. Даже начинающий программист способен освоить его за два-три дня, а человек знакомый с Visual Basic или Visual Basic for Applications (VBA) практически сразу может приступать к работе. Ниже приведены основные сведения по синтаксису языка, дано описание операторов и встроенных функций. К сожалению, обработка ошибок в VBScript реализована на очень примитивном уровне. Разработчики не предусмотрели конструкций для обработки исключительных ситуаций, таких как try-except и try-finally в Delphi. В разделах "!!!" и "!!!" мы рассмотрим способы преодоления этих ограничений.
VBScript является интерпретируемым языком. За выполнение программы отвечает Windows Script Host, который поставляется в составе операционной системы начиная с версии Windows 98. На момент написания данной книги, последняя версия VBScript имела номер 5.7 и поставлялась в составе Windows Vista. Обновления для предыдущих версий операционной системы можно скачать с сайта компании Microsoft.
Содержание |
Подготовительные мероприятия
Учебные примеры мы будем выполнять в Гедымине, для чего создадим глобальный макрос согласно приведенным ниже инструкциям:
- Запустим Гедымин;
- Подключимся к демонстрационной базе данных под учетной записью Administrator;
- Откроем окно Редактора скрипт-объектов;
- Создадим новый глобальный макрос под названием "Test VBScript";
- В поле Наименование функции введем TestVBScript.
Основы VBScript
Типы данных
В языке VBScript используется единственный тип данных – Variant (Вариант), который позволяет хранить в переменной число, строку, дату, булевское значение, ссылку на объект и другую информацию. Определить тип содержимого переменной можно с помощью набора функций: VarType, TypeName, IsArray, IsDate, IsEmpty, IsNull, IsNumeric, IsObject, которые будут рассмотрены ниже. Тип содержащейся информации еще называется подтипом варианта. Полный список подтипов приведен в следующей таблице:
| Подтип | Описание |
|---|---|
| Empty | Переменной не присвоено значение. При использовании неинициализированной переменной в числовых выражениях, будет подставляться 0, а в строковых – пустая строка. |
| Null | Переменная не содержит данных. |
| Boolean | Булевская переменная может принимать значения True, или False. |
| Byte | Целое число в диапазоне от 0 до 255. |
| Integer | Целое число в диапазоне от -32 768 до 32 767. |
| Currency | Число с фиксированной точкой в диапазоне от -922 337 203 685 477.5808 до 922 337 203 685 477.5807. |
| Long | Целое число в диапазоне от -2 147 483 648 до 2 147 483 647. |
| Single | Число с плавающей точкой одинарной точности. Для отрицательных значений допустимый диапазон
от -3.402823E38 до -1.401298E-45. Для положительных – от 1.401298E-45 до 3.402823E38. |
| Double | Число с плавающей точкой двойной точности. Для отрицательных значений допустимый диапазон от
-79769313486232E308 до -4.94065645841247E-324. Для положительных -- от 4.94065645841247E-324 до 1.79769313486232E308. |
| Date (Time) | Содержит число, представляющее дату в диапазоне от 1-го января 100 года, до 31 декабря 9999 года. |
| String | Последовательность символов. Максимальная длина в районе 2-х миллиардов знаков. |
| Object | Объект. |
| Error | Номер ошибки. |
В зависимости от выражения, в котором участвует переменная, ее содержимое будет автоматически приведено к нужному типу. Рассмотрим такой пример:
Option Explicit Sub TestVBScript Dim A, B A = 5 B = "12" Application.MessageBox A + B, "", vbOkOnly End Sub
Так как в выражении участвует числовая переменная A, интерпретатор преобразует значение переменной B из строки "12" в число и просуммирует их:
Изменим макрос так, чтобы переменная А тоже содержала строку:
Option Explicit Sub TestVBScript Dim A, B A = "5" B = "12" Application.MessageBox A + B, "", vbOkOnly End Sub
Запустим его на выполнение. Теперь на экране появится результат слияния (конкатенции) двух строк, а не сумма их числовых представлений:
Во избежании путаницы с автоматическим приведением типов, рекомендуется использовать функции конверсии: CBool, CByte, CCur, CDate, CDbl, CInt, CLng, CSng, CStr.
Если результатом выражения должно быть именно слияние строк, а не сумма их числовых представлений, то следует использовать оператор & вместо +.
Переменные
Переменная – это удобное символьное обозначение области памяти, где приложение хранит некоторые данные. В процессе выполнения приложения значение переменной может изменяться. Перед использованием переменную следует объявить с помощью оператора Dim.
Dim A
С помощью одного оператора можно объявить сразу несколько переменных, если перечислить их имена через запятую:
Dim Left, Right, Top, Bottom
При объявлении нет необходимости в указании типа данных, так как все переменные имеют тип Variant.
Если в первой строке текста скрипта не указано Option Explicit, то использовать переменные можно без объявления. Но, такой путь может привести к трудно выявимым ошибкам. Достаточно один раз ошибиться в написании имени переменной в тексте программы, чтобы получить непредсказуемый результат. Мы рекомендуем всегда указывать Option Explicit и объявлять переменные.
Имя переменной должно соответствовать следующим требованиям:
- Начинаться с символа латинского алфавита;
- Состоять только из символов латинского алфавита или из символов латинского алфавита и цифр;
- Не превышать 255 символов в длину;
- Быть уникальным в пределах своей области видимости.
Область видимости и время жизни
Область видимости переменной определяется тем, где она была объявлена. Если внутри тела процедуры[1], то такая переменная называется локальной и доступна только в пределах этой процедуры. Если переменная объявлена в тексте скрипта, то она будет видима для всех процедур или функций определенных в этом скрипте. Локальные переменные могут иметь одинакове имена, если объявлены в разных процедурах.
В дереве Проводника окна Редактора скрипт-объектов присутствует специальный раздел – Константы и переменные – для объявления глобальных переменных, видимых для всех скрипт-функций проекта.
Интерпретатор выделяет память для локальных переменных в момент их объявления и высвобождает по выходу из процедуры. Глобальные переменные существуют с момента их объявления и пока скрипт не закончит свое выполнение. Применительно к Гедымину это означает, что глобальные переменные существуют на протяжении всего времени выполнения программы.
Присваивание значения переменной
Значение объявленной переменной присваивается с помощью оператора =. Имя переменной указывается слева от оператора, новое значение – справа. Например:
A = 200 B = "Наименование"
Скалярные переменные и массивы
Переменная содержащая единственное значение называется скалярной. Иногда, возникает необходимость хранить несколько значений в одной переменной. В этом случае следует объявить массив. Синтаксис объявления идентичен объявлению скалярной переменной за тем исключением, что после имени в круглых скобках мы задаем размерность массива. Следующее объявление создаст массив из 12 элементов:
Dim Monthes(11)
В языке VBScript левая граница индекса массива всегда 0. Таким образом размер массива вычисляется, как число указанное в скобках плюс один. При присваивании значения элементу массива следует указать его индекс в круглых скобках:
Monthes(0) = "Январь" Monthes(1) = "Февраль" Monthes(2) = "Март" ... Monthes(10) = "Ноябрь" Monthes(11) = "Декабрь"
Аналогично, при обращении к значению элемента мы используем его индекс:
MonthName = Monthes(5)
Массив не обязательно должен быть одномерным. VBScript позволяет нам задать до 60 размерностей при объявлении массива. Например, следующий оператор создаст двумерный массив из 12 строк и двух колонок [2]:
Dim MonthDays(11, 1)
При обращении к элементам многомерного массива следует указывать все индексы:
MonthDays(0, 0) = "Январь" MonthDays(0, 1) = 31 MonthDays(1, 0) = "Февраль" MonthDays(1, 1) = 28 ...
Выше мы объявляли массивы, размер которых не меняется в процессе работы программы. Если заранее не известно сколько элементов понадобится, то можно объявить динамический массив:
Dim A()
Перед использованием следует установить размер динамического массива с помощью оператора ReDim:
ReDim A(25)
В процессе выполнения можно вызывать оператор ReDim многократно, каждый раз изменяя размер массива. Опция Preserve сохраняет значения элементов массива при изменении размера. Например, следующий код увеличит объявленный выше массив на пять элементов, оставив существующие нетронутыми:
ReDim Preserve A(30)
Помните, что при уменьшении размера массива, значения удаленных элементов будут безвозвратно утеряны. С помощью оператора Erase можно очистить элементы фиксированного массива или освободить память, занимаемую динамическим массивом.
Dim A ReDim A(25) ... Erase A
Константы
Правилом хорошего тона является объявление констант для многократно используемых в тексте программы значений. Грамотно присвоенное имя константы улучшает читабельность, а само использование -- упрощает процесс внесения изменений в код. В отличие от переменных, значение константы нельзя изменить в процессе выполнения программы. Создание константы происходит с помощью оператора Const:
Const CountryName = "Belarus" Const CountryCode = 375
Несколько констант могут быть объявлены в рамках одного оператора, через запятую. Как и переменная, константа обладает своей областью видимости в зависимости от того, где (в процедуре или за ее пределами) и как (Public или Private) она была объявлена. Константы, созданные оператором Const без указания Public или Private являются общедоступными по-умолчанию.
В дереве Проводника окна Редактора скрипт-объектов присутствует специальный раздел – Константы и переменные – для объявления глобальных констант, видимых для всех скрипт-функций проекта.
Значения строковых констант заключаются в двойные кавычки. Значения типа Дата следует обрамлять символами решетки (#) и использовать американский формат: месяц/день/год. Например:
Const Public IndependenceDay = #03/25/1918#
Во избежание путаницы между константами и переменными рекомендуется использовать единый префикс для всех констант, например "con", или набирать имя константы в верхнем регистре.
Для облегчения труда программиста VBScript содержит набор предопределенных констант.
Операторы
Операторы VBScript подразделяются на пять категорий: арифметические, сравнения, слияния, логические и присваивания.
Арифметические операторы
| Оператор | Пример использования | Описание |
|---|---|---|
| ^ | number ^ exponent | Возводит number в степень exponent. Number может быть меньше нуля только в случае целочисленной степени. Если один из операндов Null, все выражение принимает значение Null. Если несколько возведений в степень выполняются подряд, результат вычисляется слева направо. |
| * | number1 * number2 | Произведение двух чисел. Если операнд имеет значение Empty, то он принимается равным нулю. Если хотя бы один из операндов Null, все выражение принимает значение Null. |
| / | number1 / number2 | Вещественное деление двух чисел. Для операндов действуют правила аналогично оператору умножения. |
| \ | number1 \ number2 | Целочисленное деление. Перед вычислением оба операнда приводятся к типу Byte, Integer или Long. В остальном действуют правила как для оператора деления. |
| Mod | number1 Mod number2 | Остаток от целочисленного деления. Приведение операндов к целому, а также правила обращения с Empty и Null, как у целочисленного деления. |
| + | expression1 + expression2 | Если оба операнда числа, результатом является их арифметическая сумма. Если оба операнда строки – слияние (конкатенция) двух строк. Если один операнд число, а другой строка, то строковый операнд будет преобразован в число и прибавлен к числовому. Если хотя бы один из операндов Null, все выражение принимает значение Null. Если оба операнда Empty, результат имеет целочисленное значение 0. Если только один оператор Empty, в качестве результата возвращается значение второго операнда. |
| - | number1 – number2 или - number | В первом случае возвращает разность двух чисел. Во втором – инвертирует знак числа. Правила для операндов со значениями Null и Empty, как для оператора умножения. |
Операторы сравнения
Формат использования операторов сравнения:
result = expression1 comparisonoperator expression2
где используются следующие операторы сравнения: < (меньше), <= (меньше или равно), > (больше), >= (больше или равно), = (равно), <> (не равно).
В зависимости от типов и значений операндов, сравнение осуществляется следующим образом:
| Если | То |
|---|---|
| Оба операнда числа. | Выполняется сравнение двух чисел. |
| Оба операнда строки. | Выполняется сравнение двух строк. |
| Один из операндов число, а второй строка. | Строковый операнд приводится к числу и выполняется сравнение двух чисел. |
| Один из операндов Empty, а второй число. | Операнд со значением Empty принимается равным 0. |
| Один из операндов Empty, а второй строка. | Операнд со значением Empty принимается равным пустой строке "". Осуществляется сравнение двух строк. |
| Оба операнда Empty. | Операнды считаются равными. |
| Хотя бы один из операндов Null. | Результат принимает значение Null. |
Специальный оператор Is применяется для сравнения двух объектных переменных и возвращает Истину, если обе переменных ссылаются на один и тотже экземпляр объекта.
Операторы конкатенции
В данной категории находятся два оператора: + и &. Первый подробно описан в разделе "Арифметические операторы" выше. Рассмотрим использование оператора &.
result = expression1 & expression2
Если операнд не является строкой, он приводится к строковому типу. Если оба операнда Null, то результат также принимает значение Null, однако, в отличие от остальных операторов, если только один операнд Null, то он принимается равным пустой строке. Операнд, имеющий значение Empty, также воспринимается как пустая строка "".
Логические операторы
VBScript предоставляет нам следующие логические операторы:
- Логическое отрицание, инверсия (Not);
- Логическое умножение, коньюнкция (And);
- Логическое сложение, дизьюнкция (Or);
- Логическое исключение (Xor);
- Логический эквивалент (Eqv);
- Логическая импликация (Imp).
В качестве операндов логических операторов могут выступать булевские выражения или числовые значения. В первом случае результатом будет булевская константа, во втором – число. В зависимости от оператора подача на вход одного или двух значений Null может приводить к Null результату. Оператор Not является унарным и возвращает логическое отрицание выражения. Над числовым операндом оператор Not производит побитовую инверсию. Остальные логические операторы являются бинарными. В таблице ниже приведены результаты выполнения каждого из операторов в зависимости от значения операндов Exp1 и Exp2:
| Exp1 | Exp2 | And | Or | Xor | Eqv | Imp |
|---|---|---|---|---|---|---|
| True | True | True | True | False | True | True |
| True | False | False | True | True | False | False |
| False | True | False | True | True | False | True |
| False | False | False | False | False | True | True |
| True | Null | Null | True | Null | Null | Null |
| False | Null | False | Null | Null | Null | True |
| Null | True | Null | True | Null | Null | True |
| Null | False | False | Null | Null | Null | Null |
| Null | Null | Null | Null | Null | Null | Null |
В жизни чаще всего используются операторы And и Or и гораздо реже – Xor. Нам не приходилось сталкиваться с использованием на практике операторов Eqv и Imp. Если вам тяжело разбираться с приведенной выше таблицей резюмируем действие данных операторов:
- And принимает значение Истина только если оба операнда Истина. В любом другом случае – это либо Ложь, либо Null.
- Or принимает значение Истина, если хотябы один из операндов Истина.
- Xor принимает значение Истина, если значения операндов различаются и Ложь, если они одинаковы.
При побитовом выполнении над числовыми операндами результат логического оператора определяется по следующей таблице:
| Exp1 | Exp2 | And | Or | Xor | Eqv | Imp |
|---|
==== Оператор присваивания ====
Оператор присваивания (=) подробно описан в разделе "Переменные".
Очередность применения операторов
Если выражение содержит несколько операторов, то они применяются в соответствии с установленным порядком, который называется приоритетом операторов. Изменить порядок по-умолчанию можно с помощью круглых скобок. Выражение внутри скобок всегда вычисляется в первую очередь.
В выражении, содержащем операторы разных категорий, арифметические действия выполняются в первую очередь, затем выполняются операторы сравнения и, в последнюю очередь, -- логические операторы. Все операторы сравнения имеют одинаковый приоритет и вычисляются слева-направо. Арифметические и логические операторы вычисляются в следующем порядке:
- Возведение в степень (^);
- Смена знака числа, унарный минус (-);
- Умножение (*) и деление (/);
- Целочисленное деление (\);
- Остаток от целочисленного деления (Mod);
- Сложение (+) и вычитание (-);
- Слияние строк (&).
Если умножение и деление встречаются в одном выражении, то операции выполняются в порядке следования слева-направо. Аналогичное правило действует в случае одновременного присутствия операторов сложения и вычитания.
Оператор слияния строк (&) не является арифметическим и по приоритету располагается между арифметическими операторами и операторами сравнения.
Очередность для логических операторов установлена следующая:
- Логическое отрицание, инверсия (Not);
- Логическое умножение, коньюнкция (And);
- Логическое сложение, дизьюнкция (Or);
- Логическое исключение (Xor);
- Логический эквивалент (Eqv);
- Логическая импликация (Imp).