Типи даних
У мові VBScript використовується єдиний тип даних – Variant (Варіант), який дозволяє зберігати змінну число, рядок, дату, булевское значення, посилання об'єкт та іншу інформацію. Визначити тип вмісту змінної можна за допомогою набору функцій: VarType, TypeName, IsArray, IsDate, IsEmpty, IsNull, IsNumeric, IsObject, які будуть розглянуті нижче. Тип інформації, що міститься, ще називається підтипом варіанта. Повний список підтипів наведено у наступній таблиці:
Підтип | Опис |
---|---|
Empty | Змінної не надано значення. При використанні неініціалізованої змінної в числових виразах буде підставлятися 0, а в рядкових - порожній рядок. |
Null | Змінна інформація не містить даних. |
Boolean | Булевська змінна може набувати значення True, або False. |
Byte | Ціле число в діапазоні від 0 до 255. |
Integer | Ціле число в діапазоні від -32768 до 32767. |
Currency | Число з фіксованою точкою в діапазоні від -922337203685 477.5808 до 922337203685 477.5807. |
Long | Ціле число в діапазоні від -2147483648 до 2147483647. |
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 Left, Right, Top, Bottom
При оголошенні немає необхідності вказувати тип даних, оскільки всі змінні мають тип Variant.
Якщо в першому рядку тексту скрипта не вказано Option Explicit, використовувати змінні можна без оголошення. Але, такий шлях може призвести до помилок, які важко виявити. Достатньо один раз помилитися в написанні імені змінної в тексті програми, щоб отримати непередбачуваний результат. Ми рекомендуємо завжди вказувати Option Explicit та оголошувати змінні.
Ім'я змінної має відповідати таким вимогам:
- Починатися із символу латинського алфавіту;
- Складатися лише із символів латинського алфавіту або із символів латинського алфавіту та цифр;
- Не перевищувати 255 символів завдовжки;
- Бути унікальним у межах своєї області видимості.
Область видимості та час життя
Область видимості змінної визначається тим, де вона була оголошена. Якщо всередині тіла процедури то така змінна називається локальною і доступна тільки в межах цієї процедури. Якщо змінна оголошена в тексті скрипта, вона буде видима для всіх процедур або функцій, визначених у цьому скрипті. Локальні змінні можуть мати однакові імена, якщо оголошено у різних процедурах.
У дереві Провідника вікна Редактора скрипт-об'єктів є спеціальний розділ – Константи та змінні – для оголошення глобальних змінних, видимих для всіх скрипт-функцій проекту.
Інтерпретатор виділяє пам'ять для локальних змінних на момент їх оголошення і вивільняє після виходу з процедури. Глобальні змінні існують з моменту їх оголошення і поки що скрипт не закінчить своє виконання. Щодо Гедимина це означає, що глобальні змінні існують протягом усього часу виконання програми.
Привласнення значення змінної
Значення оголошеної змінної надається за допомогою оператора =. Ім'я змінної вказується зліва від оператора, нове значення – праворуч. Наприклад:
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 рядків і двох колонок:
Dim MonthDays(11, 1)
При зверненні до елементів багатовимірного масиву слід зазначати всі індекси:
MonthDays(0, 0) = "Січень" MonthDays(0, 1) = 31 MonthDays(1, 0) = "Лютий" MonthDays(1, 1) = 28 ...
Вище ми оголошували масиви, розмір яких змінюється у процесі роботи програми. Якщо заздалегідь не відомо скільки елементів знадобиться, можна оголосити динамічний масив:
Перед використанням слід встановити розмір динамічного масиву за допомогою оператора 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 | Зводить номер у ступінь 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 надає нам наступні логічні оператори:
- Логічне виняток (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 |
---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 1 | 0 | 0 |
1 | 1 | 1 | 1 | 0 | 1 | 1 |
Оператор присвоєння
Оператор присвоєння (=) докладно описаний у розділі "Змінні".
Черговість застосування операторів
Якщо вираз містить кілька операторів, то вони застосовуються відповідно до встановленого порядку, який називається пріоритетом операторів. Змінити порядок за замовчуванням можна за допомогою круглих дужок. Вираз усередині дужок завжди обчислюється насамперед.
У виразі, що містить оператори різних категорій, арифметичні дії виконуються в першу чергу, потім виконуються оператори порівняння і в останню чергу - логічні оператори. Усі оператори порівняння мають однаковий пріоритет та обчислюються зліва-направо. Арифметичні та логічні оператори обчислюються у такому порядку:
- Зведення у ступінь (^);
- Зміна знака числа, мінус унарний (-);
- множення (*) та розподіл (/);
- Цілочисельне розподіл (\);
- Залишок від цілого розподілу (Mod);
- Додавання (+) та віднімання (-);
- Злиття рядків (&).
Якщо множення та розподіл зустрічаються в одному вираженні, то операції виконуються в порядку прямування зліва-направо. Аналогічне правило діє у разі одночасної присутності операторів складання та віднімання.
Оператор злиття рядків (&) не є арифметичним і за пріоритетом розташовується між арифметичними операторами та операторами порівняння.
Черговість для логічних операторів встановлена така:
- Логічне заперечення, інверсія (Not);
- Логічне множення, кон'юнкція (And);
- Логічне складання, диз'юнкція (Or);
- Логічне виняток (Xor);
- Логічний еквівалент (Eqv);
- Логічна імплікація (Imp).
Умовні вирази
Умовні висловлювання застосовуються керувати порядком виконання команд програми і дозволяють організувати переходи (розгалуження) і повторення команд. Як правило, оператори порівняння використовуються разом із умовними виразами.
Вираз If..Then..Else
Вираз умовного переходу If дозволяє виконати ту чи іншу групу команд залежно від результату логічного виразу чи значення булевської змінної.
Для виконання єдиної команди при виконанні заданої умови використовується однорядковий синтаксис виразу:
Dim S If DatePart("w", Now) = vbMonday Then S = "Понеділок" Application.MessageBox S, "", vbOkOnly
Зверніть увагу, що секція Else у цьому випадку опущена. Для виконання групи операторів слід укласти їх між ключовими словами Then та End If.
Dim S If DatePart("w", Now) = vbMonday Then S = "Сьогодні понеділок" Application.MessageBox S, "", vbOkOnly End If
Якщо під час виконання умови потрібно виконати один код, а при невиконанні – інший, то використовується синтаксис виразу з секцією Else:
Dim S If DatePart("w", Now) = vbMonday Then S = "Сьогодні понеділок" Else S = "Сьогодні не понеділок" End If Application.MessageBox S, "", vbOkOnly
При необхідності вибору з кількох альтернатив підійде синтаксис із конструкцією ElseIf:
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
Вирази If можуть бути вкладеними:
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
Хоча кількість секцій ElseIf в умовному вираженні не обмежена, інтенсивне їх використання може призвести до заплутаного, незручного коду. У разі вибору однієї альтернативи з багатьох можливих залежно від значення деякого селектора рекомендується використовувати вираз Select Case.
Вираз Select..Case
Перепишемо приклад із днями тижня з використанням виразу вибору:
Dim S Select Case DatePart("w", Now) Case vbMonday S = "Понеділок" Case vbTuesday S = "Вівторок" Case vbWednesday S = "Середовище" ... Case Else Err.Raise 32000, "", "Невідомий день тижня End Select
Оскільки вираз селектора обчислюється лише один раз, використання Select..Case призводить до ефективнішого коду. Рекомендується завжди використовувати секцію Case Else для відлову некоректних або необроблених значень селектора.
Оператори циклу
Часто виникає ситуація, коли код потрібно запустити повторно. Для цього слід написати оператор циклу, який повторює певні команди знову та знову. Оператори циклу використовуються в багатьох ситуаціях: при обчисленні підсумкової суми за списком чисел, переміщенні за записами набору даних або запуску блоку коду для декількох об'єктів. Існує кілька циклів, описаних у наступних розділах. Деякі з них виконуються, поки умова має значення Істина, деякі – поки Брехня. І, нарешті, є такі, що виконуються задане число разів.
Оператор Do..Loop
Цей оператор призначений для виконання групи команд поки що задана умова Істинно або до тих пір, коли вона не стане Істинною. Перевірка умови може здійснюватися як на початку циклу:
Do [(While | Until) condition] Loop
так і наприкінці:
Do Loop [(While | Until) condition]
Команда Exit Do може зустрічатися необмежену кількість разів у тілі циклу. Зазвичай вона використовується разом із умовним виразом If..Then і дозволяє передати керування на оператор, що прямує безпосередньо за циклом. При використанні Exit Do всередині вкладеного циклу керування перейде у зовнішній цикл.
Наступний код дозволяє замінити гральний кубик:
Dim Resp, Num Do Num = Int(6 * Rnd + 1) Resp = Application.MessageBox(Num & "Іще число?", "",_ vbYesNo or vbQuestion)
While..Wend
Являє собою зрізану версію оператора Do..Loop і дозволяє виконувати групу команд поки що умова Істинно. Синтаксис оператора:
While condition Wend
Зверніть увагу, що Exit Do не діє всередині цього циклу. Цикли While..Wend можуть бути вкладеними.
For..Next
Цей цикл повторює заданий набір команд вказану кількість разів. Синтаксис оператора має вигляд:
For counter = start Перейти до наступного
Перед стартом циклу змінної counter надається значення start. Далі перевіряється виконання умови counter<= end, при step >= 0, або counter> = end, при негативному кроці. Після виконання блоку команд змінна counter збільшується на значення step і все повторюється спочатку.
Зміна лічильника в тілі циклу не заборонено, але настійно не рекомендується, оскільки ускладнює розуміння логіки програми та її налагодження.
Exit For може зустрічатися в тілі циклу довільне число разів. Цикли можуть бути вкладені. Наприклад, такий цикл ініціалізує тривимірний масив:
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
For Each..Next
Оператор циклу For Each..Next повторює заданий набір команд кожного елемента масиву чи колекції і має наступний синтаксис:
For Each element In group Next
Цикл виконується, якщо в масиві або колекції присутні хоча б один елемент. Exit For може зустрічатися в тілі циклу довільну кількість разів.
Проілюструємо використання For Each..Next на прикладі наступного коду, який виводить на екран список файлів з кореневого каталогу диска:
Dim fso, f, f1, fc, s Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.GetFolder("c:\") Set fc = f. .name & vbNewLine Next Application.MessageBox s, "Файли на c:\", vbOkOnly
Процедури
Для економії пам'яті та структурування програми фрагмент коду, що викликається багаторазово в різних місцях, може бути оформлений у вигляді процедури. У мові VBScript існують два види процедур: підпрограми (Sub) та функції (Function). Підпрограма – це послідовність операторів, обрамлена ключовими словами Sub та End Sub. Підпрограма може приймати параметри на вхід, але не повертає значення. Функція – послідовність операторів, укладена між Function та End Function, - повертає результат і тому може бути використана у виразі. Кожна процедура повинна мати ім'я унікальне в межах модуля. Імена процедур, оголошених у глобальному модулі, мають бути унікальними в рамках усього проекту.
Визначення підпрограми та функції має наступний синтаксис:
| Private] Sub name [(arglist)] End Sub | Private] Function name [(arglist)] End Function
Public процедури є глобальними та доступні у всіх скриптах програми. Private процедури доступні лише в тому скрипті, де вони були оголошені. Якщо не зазначено інше, оголошена процедура є загальнодоступною. Ключове слово Default може бути використане тільки в тілі класу і служить для вказівки методу за промовчанням цього класу.
Список параметрів має наступний синтаксис:
Varname [, ...]
Параметри можуть передаватися за значенням (ByVal) або за посиланням (ByRef). За промовчанням всі параметри передаються за значенням. Константи, результати обчислення виразів можуть бути лише за значенням. Зміна параметра, надісланого за посиланням, призведе до зміни значення зовнішньої змінної. Пояснимо передачу параметрів усередину процедури на наступному прикладі:
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
Змінні, оголошені всередині тіла процедури є локальними і знищуються після завершення її виконання. Значення локальних змінних не зберігаються.
Список параметрів вказується в круглих дужках під час виклику функції або підпрограми за допомогою оператора Call . Так, виклик процедури DoCalculation у наведеному вище прикладі ми могли написати так:
Call DoCalculation(V1, V2, 10)
Вираз Execute
Класи VBScript
VBScript дозволяє створювати нові класи, які надалі ми називатимемо VB класами. Взагалі кажучи, повноцінними класами у розумінні об'єктно-орієнтованого програмування вони не є, оскільки не підтримують успадкування та, відповідно, поліморфізм. Так що з трьох китів, на яких базується об'єктно-орієнтована парадигма, залишається тільки інкапсуляція - можливість об'єднувати в рамках однієї сутності дані та методи.
Визначення класу здійснюється за допомогою наступної конструкції:
Class name statements End Class
де name - це ім'я класу, а statements - це одне або кілька визначень змінних, властивостей, процедур або функцій, які називаються членами класу. Зверніть увагу, що на відміну від Delphi, де код визначення класу містить лише оголошення процедур і функцій, у класі VB код членів прописується прямо в тексті класу.
Члени класу можуть бути оголошені як Private чи Public. Перші видні лише всередині коду даного класу, другі ж доступні як для внутрішнього коду, так і зовні. Якщо змінна або функція (процедура) не містять явного визначення Public або Private, вони вважаються загальнодоступними. Процедури або функції, оголошені як Public всередині блоку класу, стають методами даного класу.
Змінні, оголошені як загальнодоступні, стають властивостями класу нарівні з властивостями, оголошеними безпосередньо за допомогою конструкцій Property Get, Property Let, Property Set.
Визначення властивостей класу
Вище ми вже говорили про те, що поля класу явно чи не явно оголошені як Public стають його властивостями. Крім цього, створити властивість класу можна визначивши спеціальні функції для зчитування значення властивості (Property Get), а також для його присвоєння (Property Let або Property Set).
Синтаксис визначення таких функцій наступний:
| Private] Property Get name [(arglist)] [ name = expression] [ name = expression] End Property Property Let name ( value) End Property Property Set name ( reference ) End Property
Визначивши лише одну функцію, зчитування чи присвоєння, можна створити властивість відповідно лише для читання або запису. Процедура Property Let використовується для присвоєння простих типів даних, а Property Set для передачі на об'єкт. Зауважте, що всі три функції можуть приймати на вхід довільний список параметрів. Таким чином можна організувати, наприклад, властивості-масиви, передаючи як аргумент індекс елемента.
Створення та знищення екземпляра VB класу
Створення екземпляра VB класу здійснюється за допомогою оператора New.
Dim X Set X = New classname
Знищення раніше створеного екземпляра відбувається автоматично після завершення блоку коду, де була оголошена відповідна змінна та за умови, що на неї немає зовнішніх посилань. Якщо необхідно знищити екземпляр вручну, необхідно присвоїти значення Nothing змінної.
' оголошення змінної та створення екземпляра класу Dim X Set X = New classname ... ' використання екземпляра класу... ' знищення екземпляра класу Set X = Notning ...
Події Initialize та Terminate
Подія Initialize відбувається при створенні екземпляра класу, а Terminate – при його знищенні. Розробник може визначити свої обробники даних подій. Нижче наведено приклад використання подій створення та видалення об'єкта:
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
Продовження
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
Змінні
За умовчанням змінні у сценаріях оголошуються автоматично при першому використанні в тілі скрипта, якщо це не заборонено директивою Option Explicit. Якщо ж на початку сценарію оголосити директиву Option Explicit, то всі змінні потрібно заздалегідь визначати за допомогою наступних конструкцій:
Dim
Константи оголошуються на початку сценарію за допомогою конструкції:
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 .8 3.2;
- date - дата, можливі значення: 01.01.1900 та 31.01.9999;
- string – рядкова змінна, місткість до 2 мільярдів символів;
- object – покажчик на об'єкт;
- error – код помилки.
Дані можна перевіряти на відповідність типу, а також перекладати з одного типу в інший, якщо значення дозволяють це зробити. Для операцій над типами даних використовуються такі команди:
VarType(
Як було сказано вище, 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
Конструкція для кількох дій, які виконуються за умовою:
If
Конструкція "розвилка":
If
Конструкція "розвилка на кілька шляхів" (варіант з If):
If
У всіх наведених вище конструкціях застосовується таке правило: "Якщо виконується умова
Конструкція "розвилка на кілька шляхів" (варіант сSelect):
Select Case
У цій конструкції працює правило: "Якщо значення змінної
Цикли
Для організації повторюваних процесів або перебору елементів масиву зазвичай використовуються цикли. У VBS-сценаріях організовано кілька видів циклів: звичайний цикл, цикл із невідомою кількістю ітерацій, цикл за умовою.
Звичайний цикл організується структурою For - Next, в аргументах якої задаються такі параметри як ім'я лічильника (
For
Якщо в процесі роботи циклу потрібно припинити перебір значень, це можна зробити за допомогою командиExit For
For
Цикл з невідомою кількістю ітерацій зазвичай застосовується для перебору всіх значень колекції об'єкта, коли відома його розмірність. Ця структура перебере всі значення (
For Each
For Each oCurrentFile In oFiles WScript.Echo oCurrentFile.Name Next
Цикли з умовами застосовуються для обробки даних при виконанні якоїсь умови. Такі цикли бувають двох видів: з перевіркою на початку циклу та з перевіркою наприкінці.
Цикл, поки виконується умова, з перевіркою на початку
Do While
Цикл, доки не виконається умова, з перевіркою на початку
Do Until
Як було зазначено вище, умови можна ставити на кінець циклу. У цьому випадку тіло циклу буде виконане щонайменше один раз. Так само як і у звичайних циклах, цикл з умовою можна перервати командою Exit Do:
Do
Вбудовані функції
Щоб працювати з даними та будувати свої процедури та функції, розробники Visual Basic вже подбали про основу сценаріїв - базові функції. VBS-скрипти функції для роботи з датами, рядками та числами, а також базові процедури введення-виводу та процедури роботи з мережею. Давайте коротко розглянемо вбудовані функції.
Функції обробки дат:
Date " повернення поточної дати; Time " повернення поточного часу; Now " повернення поточних дати та часу; DateDiff(
Функції обробки рядків:
Asc(
Математичні функції:
Randomize" ініціалізація механізму випадкових чисел (нічого не повертає); Rnd" повернення випадкового нецілочисельного значення від 0 до 1; Atn (
І, звичайно, крім згаданих функцій, сценарії підтримують всі найпростіші математичні та логічні операції:
- = - Оператор присвоєння;
- + - сума двох чисел;
- - - віднімання двох чисел;
- * - множення двох чисел;
- / - Поділ двох чисел;
- \ - цілочисельне розподіл двох чисел;
- Mod – залишок від розподілу двох чисел;
- ^ - Зведення в ступінь;
- & - з'єднання двох рядків;
- Is – порівняння двох об'єктів;
- Eqv – порівняння двох виразів;
- Not – логічна операція заперечення;
- And – логічна операція кон'юнкції;
- Or – логічна операція диз'юнкції;
- Xor – логічна операція виключення;
- Imp – логічна операція імплікації.
Черговість виконання операцій визначається як і у всіх мовах програмування: спочатку виконуються операції в дужках, потім обчислюються функції, потім операції множення та поділу, слідом йдуть додавання та віднімання, і завершують обчислення логічні операції.
Функції користувача
Сценарії, написані на Visual Basic, дозволяють визначати користувацькі процедури та функції та викликати їх з основної програми. Між процедурою і функцією практично немає різниці, різниця полягає у логічному сенсі цих підпрограм: функції зазвичай використовуються обчислення якогось значення, а процедури - до виконання дій. Проте і процедури, і функції можуть виконувати операції та передавати значення основній програмі. Незважаючи на це, все ж таки не варто забувати про призначення цих підпрограм: функції - для обчислення, процедури - для дій.
Функція оголошується операторомFunction, після якого слід назва користувальницької функції, яка не повинна збігатися з жодним зарезервованим словом мови Visual Basic, далі вказуються змінні, які будуть передаватися підпрограмі як параметри - вказівка змінних у цій конструкції означає виділення осередків пам'яті для змінних підпрограм ( змінних функції). У тілі підпрограми структура сценарію нічим не відрізняється від звичайної програми (тут можна оголошувати додаткові змінні, робити операції, використовувати інші функції та процедури), в кінці тіла повинен бути оператор присвоєння функції якомусь значенню - це значення і буде повернено основній програмі. Перервати виконання функції можна оператором Exit Function, але в цьому випадку потрібно не забути надати функції якесь значення, інакше сценарій видасть помилку. Завершується функція оператором End Function.
Визначення функції
Function
Виклик функції
Процедура визначається аналогічно до функції, але іншим оператором -Sub. Оскільки процедура не повертає основній програмі жодних значень, то оператора присвоєння перед виходом із процедури немає. Перервати виконання процедури можна за допомогою команди Exit Sub, а завершується вся конструкція оператором End Sub. Щоб в основній програмі викликати процедуру, необхідно використовувати ключове слово Callі ім'я функції з необхідними аргументами. (Ключове слово Call не є обов'язковим, але я рекомендую його використовувати, щоб уникнути неправильних викликів процедури.)
Визначення процедури
Sub
Виклик процедури
До речі, процедури та функції повинні розташовуватися наприкінці сценарію.
Під час роботи підпрограми значення змінних основної частини скрипта не змінюються, навіть якщо підпрограмі є однойменні змінні. Щоб підпрограма мала можливість змінювати значення змінних основного сценарію, необхідно в аргументах підпрограми задати властивість змінних як ByRef. За замовчуванням, всі змінні визначаються з властивістю ByVal.
Sub
В даному випадку аргумент
Обробка помилок виконання сценарію
За замовчуванням усі помилки обробляються сценарієм в автоматичному режимі, і при виникненні помилки робота сценарію зупиняється. Для відключення автоматичної обробки помилок потрібно використовувати спеціальну директиву 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 " немає помилок; CStr(iAvarage) Case 11" розподіл на нуль; WScript.Echo "Кількість тестів не може дорівнювати нулю" Case 13 "невідповідність типів; WScript.Echo "Ви ввели нечислове значення "Case Else" немає помилок; WScript.Echo "Невідома помилка WScript.Quit" End Select
Об'єкти, їх методи та властивості
VBS-сценарії, як і їхній батько - мова Visual Basic, є об'єктно-орієнтованою мовою програмування, тобто основною концепцією є поняття об'єктів та класів
Клас - це тип, що описує пристрій об'єктів. Об'єкт має на увазі під собою щось, що має певну поведінку і спосіб подання, об'єкт - це екземпляр класу. Клас можна порівняти з кресленням, за яким створюються об'єкти. Зазвичай, класи розробляють таким чином, щоб їх об'єкти відповідали об'єктам предметної області.
Отже, щоб працювати з об'єктом, його потрібно спочатку створити, використовуючи класи з потрібної бібліотеки:
Set
Видалити об'єкт можна, надавши йому значення Nothing:
Set
Усі об'єкти, з якими працює Windows Script Host, мають методи та властивості. Щоб звернутися до методу, необхідно вказати об'єкт, а через точку – метод із необхідними параметрами.
Аналогічна ситуація з властивостями, але властивості можна як призначати, так і зчитувати в змінні та інші властивості, щоправда, слід враховувати тип змінних і властивостей, інакше сценарій видасть помилку несумісності типів даних.
приклад. Створення об'єкта файлової системи, звернення до способу створення папки, видалення об'єкта. Set oFSO = CreateObject("Scripting.FileSystemObject") Call oFSO.CreateFolder("C:\Test") Set oFSO = Nothing Зверніть увагу, що поняття об'єкт відноситься до логіки сценарію, а не до логіки файлової системи. Тобто коли ми говоримо "видалення об'єкта", ми маємо на увазі логічний об'єкт сценарію, який ніяк не впливає на видалення якихось частин файлової системи. Щоб дізнатися, які існують бібліотеки у Вашій операційній системі, включені в бібліотеки класи, їх методи та властивості, можна скористатися провідником об'єктів, наприклад Microsoft Word: Якщо якась бібліотека не відображена у списку, її можна підключити через меню Tools -> References. У сценаріях є методи, які не входять до жодного класу, вони доступні безпосередньо в тілі сценарію: MsgBox( Приклад виведення діалогового вікна із запитом тексту, а потім виведення на екран віконного повідомлення із введеним текстом. MyValue = InputBox("Введіть текст", "Перше вікно", "Текст потрібно ввести тут") MyResult = MsgBox(MyValue, 1, "Друге вікно") Методи та властивості кореневого класу WScript не вимагають створення об'єкта - вони автоматично доступні для використання безпосередньо в тілі сценарію. CreateObject( Застосування цих методів і властивостей докладніше ми розберемо у прикладах інших класів. Для роботи з операційною системою використовується спеціальний клас Shell, який дозволяє виконувати такі операції як запуск програм, зміна реєстру, створення ярликів, доступ до системних папок та системних змінних, доступ до системного журналу. Отже, методи та властивості класу Shell: ExpandEnvironmentStrings( приклад. Використання методів та властивостей класу Shell. " Створення об'єкта класу 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 .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 = oShellLog. , "Test Script Completed") Як ми вже переконалися, VBS-сценарії можуть працювати з оболонкою Windows, але це не єдина їхня можливість. За допомогою класу Network можна отримати доступ до мережних об'єктів та керувати ними. Давайте краще розберемо клас Network: ComputerName " повернення імені комп'ютера; UserDomain " повернення імені домену; UserName " повернення імені користувача; EnumNetworkDrives " повернення списку підключених мережевих дисків; MapNetworkDrive( приклад. Використання методів та властивостей класу Network. " Створення об'єкта класу 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 Для 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.EnumPrinter Дуже часто в сценаріях трапляються такі випадки, коли необхідно створити, видалити, перемістити або змінити на диску комп'ютера. Це завдання дозволяє вирішити клас FileSystemObject, призначений для роботи з файловою системою. Нижче наведено об'єкти, які можуть створити цей клас: Методи та властивості класу FileSystemObject (головного об'єкта): BuildPath( Об'єкти Drives, Folders і Files класу FileSystemObject зберігають у собі інформацію про диски, папках і файлах і, переважно, використовуються для збору інформації про файлову систему. Вони мають лише дві властивості: Count " повертає кількість елементів у колекції; Item( Щоб було зрозуміліше, що таке колекція об'єктів, розглянемо приклад виведення на екран списку файлів кореня диска C: " Створення об'єкта класу FileSystemObject set oFSO = CreateObject("Scripting.FileSystemObject") " Створення об'єкта Folder Set oFolder = oFSO.GetFolder("C:\") " Отримання колекції файлів Set oFilesCollection = oFolder.Files " Отримання кількості елементів у колекції sResul = sResult & oFilesCollection.Count & " files in C:\" & vbCrLf " Читання атрибутів кожного файлу з колекції For Each oFile in oFilesCollection sResult = sResult & oFile.Name & vbTab sResult = sResult & " на екран MsgBox(sResult) Об'єкт Drive надає доступ до властивостей локального або мережного диска: AvailableSpace "повертає розмір вільного місця на диску, доступного користувачеві; DriveLetter" повертає букву диска; DriveType "повертає тип диска; FileSystem" повертає тип файлової системи диска; FreeSpace "повертає розмір вільного місця на диску; IsReady" повертає доступність диска; Path "повертає шлях до диска; RootFolder" створює об'єкт Folder, що вказує на корінь диска; SerialNumber " повертає серійний номер диска; ShareName " повертає мережне ім'я диска; TotalSize " повертає ємність диска в байтах; VolumeName " повертає або встановлює мітку диска. Об'єкт Folder надає доступ до всіх властивостей папки, а також дозволяє робити над нею дії: Attributes " повертає атрибути папки; DateCreated " повертає дату створення папки; DateLastAccessed " повертає дату останнього доступу до папки; DateLastModified " повертає дату зміни папки; Drive "повертає букву диска, на якому розташована папка; Files" повертає колекцію файлів папки; IsRootFolder " повертає True, якщо папка - це корінь диска; Name " повертає ім'я папки; ParentFolder створює об'єкт Folder, що вказує на батьківську папку; Path "повертає шлях до папки; ShortName" повертає ім'я папки у форматі 8.3; ShortPath "повертає шлях до папки у форматі 8.3; Size" повертає розмір папки; SubFolders "повертає колекцію підпапок; Type" повертає тип папки; Copy( Об'єкт File аналогічний об'єкту Folder - він надає доступ до всіх властивостей файлу, а також дозволяє робити над ним дії: Attributes " повертає атрибути файлу; DateCreated " повертає дату створення файла; DateLastAccessed " повертає дату останнього доступу до файлу; DateLastModified " повертає дату зміни файлу; Drive " повертає букву диска, у якому розташований файл; Name " повертає ім'я файла; ParentFolder створює об'єкт Folder, що вказує на батьківську папку; Path "повертає шлях до файлу; ShortName" повертає ім'я файлу у форматі 8.3; ShortPath "повертає шлях до файлу у форматі 8.3; Size" повертає розмір файлу; Type " повертає тип файлу; Copy( Об'єкт TextStream - інструмент доступу до вмісту файлу. За допомогою нього можна читати та змінювати файл: AtEndOfLine " показує, чи досягнуто кінець рядка; AtEndOfStream " показує, чи досягнуто кінець рядка; Column" повертає номер колонки, в якій знаходиться курсор читання; Line" повертає номер рядка, в якому знаходиться курсор читання; Close "закриває файл - звільняє його інших процесів; Read( Ми познайомилися з усіма методами та властивостями класу FileSystemObject, розглянемо приклад використання цього класу: " Завдання констант кодів системних папок Const WindowsFolder = 0 Const SystemFolder = 1 Const TemporaryFolder = 2 " Завдання констант кодів типів доступу до текстового файлу Const ForReading = 1 Const ForWriting = 2 Const ForAppending = 8 " Створення об'єкта класу FileSystem Scripting.FileSystemObject") " Отримання колекції дисків Set DrivesCollection = oFSO.Drives " Обробка кожного диска для отримання його мітки або мережного імені For Each oDrive in DrivesCollection = sResult & oDrive.ShareName & vbCrLf ElseIf oDrive.IsReady Then sResult = sResult & oDrive.VolumeName & vbCrLf Else sResult = sResult & vbCrLf End If Next = 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. oDrive.AvailableSpace/1024, 0) & " Kbytes" Else sResult = sResult & "No ready" End If " Виведення результатів на екран Wscript.Echo(sResult) " Створення об'єкта службової папки (папка тимчасових файлів Windows) Set oTempFolder 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) Цей сценарій призначений для очищення системи від застарілих файлів у тимчасових каталогах Windows та профілю користувача. У цьому прикладі можна побачити як працюють практично всі описані конструкції: структура сценарію, назва змінних, робота з масивами і колекціями, ручна обробка помилок, зчитування системних змінних, створення текстового файлу журналу роботи сценарію, робота з файловою системою, використання процедур. " ==== 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 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 вExceptions if InStr(oProfile.Path,sException) > 0 bFlag = true exit for end if Next If bFlag = False Then PurgeFolder(oProfile.Path & "\Local Settings\Temp") PurgeFolder(oProfile.Path & " 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.Write 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 " Рекурсивний виклик процедури видалення старих файлів - підпрограма викликає " сама P. If oSubFolder.Size = 0 Then " Запис повідомлення в журнал сценарію oLogFile.Writeline oSubFolder.Path & vbTab & oSubFolder.DateCreated " Видалення порожньої папки oFSO.DeleteFolder oSubFolder.Path " Перевірка на наявність помилок.<>0 then " Запис повідомлення про помилку в журнал сценарію oLogFile.Writeline "-----> Error # " & CStr(Err.Number) _ & " " & Err.Description " Очищення помилки Err.Clear End if End if Next End Sub Ми познайомилися з основами сценаріїв Visual Basic Script. Давайте підіб'ємо підсумок, і визначимо переваги та недоліки таких сценаріїв: Віталій Бочкарьов Секція зовнішніх посилань, тобто посилань на інші сайти, до яких даний ресурс не має жодного відношення. Щось я зовсім втік уперед і не розповів вам про дві функції діалогових вікон: MsgBox та InputBox. У цьому дуже невеликому уроці я розповім про всі приблуди до цих двох функцій. Так само існують інші способи створення діалогових вікон, але для цього знадобляться об'єкти WSH, про які буде розмова у наступних уроках. Найпростіша функція для виведення повідомлення. Звичайно вона складніша, ніж Echo об'єкта WScript, Але й об'єкт їй не потрібний. Параметр Buttonsможе одночасно набувати кількох значень. Для того щоб їх вказати, використовується знак «+» або просто використовую суму значень. Значення цього параметра наведено нижче. Варто зазначити, що параметр Buttonsне може набувати кількох значень з однієї і тієї ж категорії. Дані значення просто складаються. Тобто, вам не вдасться встановити кілька наборів кнопок або іконок одночасно. "Урок VBScript №16: "Функція MsgBox та InputBox "file_1.vbs "********************************** ********************** MsgBox "Привіт", 5+16, "Назва" MsgBox "Привіт", vbRetryCancel+16, "Назва" MsgBox "Привіт" , vbRetryCancel+524288, "Назва" MsgBox "Привіт", vbAbortRetryIgnore + vbInformation + vbDefaultButton2 + vbSystemModal + 524288, "Назва" MsgBox "Привіт", 528706 "********************************************************
"Урок VBScript №16: "Функція MsgBox та InputBox "file_1.vbs "********************************************************
MsgBox "Привіт", 5 + 16, "Назва" MsgBox "Привіт", vbRetryCancel + 16, "Назва" MsgBox "Привіт", vbRetryCancel + 524288, "Назва" MsgBox "Привіт" , vbAbortRetryIgnore + vbInformation + vbDefaultButton2 + vbSystemModal + 524288 , "Назва" MsgBox "Привіт" , 528706 , "Назва" Крім того, функція MsgBox може повертати результат натискання кнопок. Його можна присвоїти змінною і в такий спосіб визначити натиснуту кнопку. "************************************************* ******* "Урок 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 "************************************************* ******* "Урок VBScript №16: "Функція MsgBox та InputBox "file_4.vbs "*************************** ***************************** Dim Dict, AboutBomb Set Dict = CreateObject("Scripting.Dictionary") Dict.CompareMode = 1 Dict .Add "Жовтий", "Бомба вибухнула!" Dict.Add "Червоний", "Ви знешкодили бомбу!" Dict.Add "Синій", "Бомба вибухнула!" InputBox("Виявлено бомбу! Який провід різати: жовтий, червоний, синій чи зелений??","Виявлено бомбу!!!","Вводити колір дроту сюди...") If Dict.Exists(AboutBomb) then MsgBox Dict.Item(AboutBomb) else MsgBox "У тебе погано із зором! Такого дроту немає! Бомба вибухнула! end if "********************************************************
Методи та властивості кореневого класу WScript
Методи та властивості класу Shell
Методи та властивості класу Network
Методи та властивості класу FileSystemObject
Сценарій "Видалення старих файлів"
Зовнішні посилання
Функція MsgBox
Синтаксис: MsgBox (Prompt[, Buttons][, Title][, Helpfile, Context])Константи для діалогових вікон (кнопки, що виводяться):
Константи для діалогових вікон (значки):
Константи для діалогових вікон (за замовчуванням):
Константи для діалогових вікон (Режим вікна):
Інше:
Результат, що повертається натиснутих кнопок (константи):