3. Podstawy programowania VBSCRIPT
Po omówieniu możliwych kontekstów wykonywania skryptu VBScript przechodzimy teraz do samego języka. W dalszej części artykułu zakładamy następujące warunki:
- kontenerem skryptu jest WSH
- skrypt znajduje się w pliku z rozszerzeniem .vbs
Aby przedstawić daną koncepcję, zazwyczaj postępujemy w następujący sposób:
- w razie potrzeby wprowadzamy pojęcie
- przedstawiamy program ilustrujący wraz z wynikami
- w razie potrzeby komentujemy wyniki i program
Kontenery VBScript nie rozróżniają wielkości liter (wielkie/małe) w tekście skryptu. Można więc bez różnicy napisać wscript.echo „coucou” lub WSCRIPT.ECHO „coucou”.
Programy przedstawione poniżej wyświetlają na ekranie wiele informacji, dlatego ponownie omówimy metody zapisywania obiektu wscript.
3.1. Wyświetlanie informacji
Korzystaliśmy już z metody echo obiektu wscript, jednak obiekt ten posiada również inne metody umożliwiające wyświetlanie treści na ekranie, co pokazuje poniższy skrypt:
Program | Wyniki |
![]() |
Należy zwrócić uwagę na następujące kwestie:
- Każdy tekst umieszczony po apostrofie jest traktowany jako komentarz do skryptu i nie jest interpretowany przez metodę WSH (wiersz 1).
- Metoda echo zapisuje swoje argumenty i przechodzi do następnego wiersza, podobnie jak metoda writeLine (wiersze 2 i 6)
- metoda write zapisuje swoje argumenty i nie przechodzi do następnego wiersza (wiersz 3)
- Znak końca linii jest reprezentowany przez sekwencję dwóch znaków o kodach ASCII 13 i 10. Zatem wiersz 4 jest reprezentowany przez wyrażenie chr(13) & chr(10), gdzie chr(i) oznacza znak o kodzie ASCII i, a & jest operatorem konkatenacji ciągów znaków. Tak więc „chat” & „eau” tworzy ciąg znaków „chateau”.
- Znak końca linii można łatwiej przedstawić za pomocą stałej vbCRLF (wiersz 5)
3.2. E pisywanie instrukcji w skrypcie VBScript
Domyślnie w każdym wierszu zapisuje się jedną instrukcję. Można jednak zapisać kilka instrukcji w jednym wierszu, oddzielając je znakiem :, tak jak w inst1:inst2:inst3. Jeśli wiersz jest zbyt długi, można go podzielić na części. W takim przypadku poszczególne części instrukcji muszą kończyć się dwoma znakami (spacja)_. Wróćmy do poprzedniego przykładu, przepisując instrukcje w inny sposób:
Program | Wyniki |
![]() |
3.3. Zapis za pomocą funkcji msgBox
Chociaż w niniejszym dokumencie do wyświetlania treści na ekranie używamy niemal wyłącznie obiektu wscript, istnieje bardziej zaawansowana funkcja służąca do wyświetlania informacji w oknie. Jest to funkcja msgbox, z której zazwyczaj korzysta się z trzema parametrami:
msgbox komunikat, ikony+przyciski, tytuł
- message to tekst komunikatu, który ma zostać wyświetlony
- ikony+przyciski (opcjonalne) to w rzeczywistości liczba określająca typ ikony oraz przyciski, które mają zostać umieszczone w oknie komunikatu. Liczba ta jest najczęściej sumą dwóch liczb: pierwsza określa ikonę, a druga przyciski
- tytuł to tekst, który ma zostać umieszczony w pasku tytułu okna komunikatu
Wartości, których należy użyć do określenia ikony i przycisków w oknie komunikatu, są następujące:
Stała | Wartość | Opis |
vbOKOnly | 0 | Wyświetla wyłącznie przycisk OK. |
vbOKCancel | 1 | Wyświetla przyciski OK i Anuluj. |
vbAbortRetryIgnore | 2 | Wyświetla przyciski „Zrezygnuj”, „Spróbuj ponownie” i „Pomiń”. |
vbYesNoCancel | 3 | Wyświetla przyciski „Tak”, „Nie” i „Anuluj”. |
vbYesNo | 4 | Wyświetla przyciski „Tak” i „Nie”. |
vbRetryCancel | 5 | Wyświetla przyciski „Spróbuj ponownie” i „Anuluj”. |
vbCritical | 16 | Wyświetla ikonę „Komunikat krytyczny”. |
vbQuestion | 32 | Wyświetla ikonę „Prośba o ostrzeżenie”. |
vbExclamation | 48 | Wyświetla ikonę „Komunikat ostrzegawczy”. |
vbInformation | 64 | Wyświetla ikonę komunikatu informacyjnego. |
vbDefaultButton1 | 0 | Pierwszy przycisk jest przyciskiem domyślnym. |
vbDefaultButton2 | 256 | Drugi przycisk jest przyciskiem domyślnym. |
vbDefaultButton3 | 512 | Trzeci przycisk jest przyciskiem domyślnym. |
vbDefaultButton4 | 768 | Czwarty przycisk jest przyciskiem domyślnym. |
vbApplicationModal | 0 | Aplikacja modalna; użytkownik musi odpowiedzieć na komunikat, zanim będzie mógł kontynuować pracę w bieżącej aplikacji. |
vbSystemModal | 4096 | System modalny; wszystkie aplikacje są zawieszone do momentu, aż użytkownik odpowie na komunikat. |
Oto przykłady:
Program | ||||||||||||||||||
![]() | ||||||||||||||||||
Wyniki | ||||||||||||||||||
| ||||||||||||||||||
W niektórych przypadkach wyświetlane jest okno informacyjne, które pełni również funkcję okna wprowadzania danych. Jeśli zadajemy pytanie, chcemy na przykład dowiedzieć się, czy użytkownik kliknął przycisk oui, czy przycisk non. Funkcja msgBox zwraca wynik, którego w poprzednim programie nie wykorzystaliśmy. Wynik ten jest liczbą całkowitą reprezentującą przycisk użyty przez użytkownika do zamknięcia okna wyświetlania:
Stała | Wartość | Wybrany przycisk |
vbOK | 1 | OK |
vbCancel | 2 | Anuluj |
vbAbort | 3 | Rezygnacja |
vbRetry | 4 | Spróbuj ponownie |
vbIgnore | 5 | Pomiń |
vbYes | 6 | Tak |
vbNo | 7 | Nie |
Poniższy program pokazuje wykorzystanie wyniku funkcji msgBox. Czterokrotnie wyświetlane jest okno z przyciskami „tak”, „nie” i „anuluj”. Odpowiada się w następujący sposób:
- klika się „tak”
- klikamy „Nie”
- klikamy „Anuluj”
- zamykamy okno bez użycia żadnego przycisku. Program pokazuje, że jest to równoznaczne z użyciem przycisku „Anuluj”.
Program | ||||
![]() | ||||
Wyniki | ||||
|
3.4. uje dane, które można wykorzystać w VBScript
VBscript rozpoznaje tylko jeden typ danych: wariant. Wartością typu variant może być liczba (4, 10,2), ciąg znaków („cześć”), wartość logiczna (true/false), data (#01/01/2002#), adres obiektu lub zbiór wszystkich tych danych umieszczonych w strukturze zwanej tablicą.
Przyjrzyjmy się poniższemu programowi i jego wynikom:
Program | Wyniki |
![]() |
Uwagi:
- wiele języków programowania (C, C++, Pascal, Java, C# itp.) wymaga uprzedniego zadeklarowania zmiennej przed jej użyciem. Deklaracja ta polega na podaniu nazwy zmiennej oraz typu danych, które może ona zawierać (liczba całkowita, liczba rzeczywista, ciąg znaków, data, wartość logiczna itp.). Deklaracja zmiennych pozwala na:
- ustalenie ilości pamięci potrzebnej dla zmiennej, jeśli różne typy danych wymagają różnej ilości pamięci
- sprawdzenie spójności programu. Jeśli więc i jest liczbą całkowitą, a c ciągiem znaków, to pomnożenie i przez c nie ma sensu. Jeśli typ zmiennych i i c został zadeklarowany przez programistę, program odpowiedzialny za analizę kodu przed jego uruchomieniem może zgłosić taką niespójność.
Podobnie jak większość języków skryptowych o jednym typie danych (Perl, Python, JavaScript itp.), VBScript pozwala na nie deklarowanie zmiennych. Tak właśnie postąpiono w powyższym przykładzie.
- Zwróćmy uwagę na składnię różnych wartości
- 10,2 w wierszu 10 (kropka dziesiętna zamiast przecinka). Należy zauważyć, że na ekranie wyświetlana jest wartość 10,2.
- 1.4e-2 w wierszu 13 (notacja naukowa). Na ekranie wyświetlono liczbę 0,014
- [#01/10/2002#] (wiersz 26) do przedstawienia daty 10 stycznia 2002 r. VBScript używa więc formatu #mm/dd/rrrr# do przedstawienia daty jj z miesiąca mm roku aaaa
- wartości logiczne true i false (prawda/fałsz) w wierszach 31 i 34. Te dwie wartości są reprezentowane odpowiednio przez liczby całkowite -1 i 0, jak pokazuje wyświetlenie w wierszach 32 i 35. Gdy wartość logiczna jest łączona z ciągiem znaków, wartości te stają się odpowiednio ciągami „Vrai” i „Faux”, jak pokazują wiersze 33 i 36. Warto przy okazji zauważyć, że operator łączenia & może służyć do łączenia nie tylko ciągów znaków.
- Ponieważ zmienna v nie ma przypisanego typu, może ona kolejno przyjmować wartości różnych typów.
3.5. L y podtypów typu variant
Oto, co mówi oficjalna dokumentacja na temat różnych typów danych, które może zawierać typ variant:
Oprócz prostego rozróżnienia między liczbą a ciągiem znaków, typ Variant może rozróżniać różne rodzaje informacji numerycznych. Na przykład niektóre informacje numeryczne reprezentują datę lub godzinę. Gdy informacje te są używane wraz z innymi danymi dotyczącymi daty lub godziny, wynik jest zawsze wyrażany w postaci daty lub godziny. Dostępne są również inne rodzaje informacji numerycznych, od wartości logicznych po duże liczby zmiennoprzecinkowe. Te różne kategorie informacji, które mogą być zawarte w typie Variant, stanowią podtypy. W większości przypadków wystarczy po prostu umieścić dane w typie Variant, a ten zachowa się w sposób najbardziej odpowiedni dla tych danych.
Poniższa tabela przedstawia różne podtypy, które mogą być zawarte w typie Variant.
Podtyp | Opis |
Empty | Variant nie jest zainicjowany. Jego wartość wynosi zero dla zmiennych liczbowych oraz ciąg znaków o zerowej długości („”) dla zmiennych typu ciąg znaków. |
Null | Wariant celowo zawiera nieprawidłowe dane. |
Boolean | Zawiera wartość True (prawda) lub False (fałsz). |
Bajt | Zawiera liczbę całkowitą z zakresu od 0 do 255. |
Integer | Zawiera liczbę całkowitą z zakresu od -32 768 do 32 767. |
Waluta | Od -922 337 203 685 477,5808 do 922 337 203 685 477,5807. |
Long | Zawiera liczbę całkowitą z przedziału od -2 147 483 648 do 2 147 483 647. |
Single | Zawiera liczbę zmiennoprzecinkową o precyzji pojedynczej w zakresie od -3,402823E38 do -1,401298E-45 dla wartości ujemnych; od 1,401298E-45 do 3,402823E38 dla wartości dodatnich. |
Podwójna | Zawiera liczbę zmiennoprzecinkową o podwójnej precyzji w zakresie od -1,79769313486232E308 do -4,94065645841247E-324 dla wartości ujemnych; od 4,94065645841247E-324 do 1,79769313486232E308 dla wartości dodatnich. |
Data (czas) | Zawiera liczbę reprezentującą datę z przedziału od 1 stycznia 100 r. do 31 grudnia 9999 r. |
Ciąg znaków | Zawiera ciąg znaków o zmiennej długości, ograniczony do około 2 miliardów znaków. |
Obiekt | Zawiera obiekt. |
Error | Zawiera numer błędu. |
3.6. C ustalenie dokładnego typu danych zawartych w wariancie
Zmienna typu variant może zawierać dane różnych typów. Czasami musimy znać dokładny charakter tych danych. Jeśli w programie wpisujemy produit=nombre1*nombre2, zakładamy, że nombre1 i nombre2 to dwie wartości liczbowe. Czasami nie mamy co do tego pewności, ponieważ wartości te mogą pochodzić z wprowadzania z klawiatury, z pliku lub z dowolnego źródła zewnętrznego. Musimy zatem sprawdzić rodzaj danych umieszczonych w zmiennych nombre1 i nombre2. Funkcja typename(var) pozwala nam określić typ danych zawartych w zmiennej var. Oto kilka przykładów:
Program | Wyniki |
![]() |
Inną możliwą funkcją jest vartype(var), która zwraca liczbę reprezentującą typ danych zawartych w zmiennej var:
Stała | Wartość | Opis |
vbEmpty | 0 | Puste (niezainicjowane) |
vbNull | 1 | Null (brak prawidłowych danych) |
vbInteger | 2 | Liczba całkowita |
vbLong | 3 | Liczba całkowita długa |
vbSingle | 4 | Liczba zmiennoprzecinkowa o pojedynczej precyzji |
vbDouble | 5 | Liczba zmiennoprzecinkowa o podwójnej precyzji |
vbCurrency | 6 | Waluta |
vbDate | 7 | Data |
vbString | 8 | Kanał |
vbObject | 9 | Obiekt automatyki |
vbError | 10 | Błąd |
vbBoolean | 11 | Wartość logiczna |
vbVariant | 12 | Wariant (używany wyłącznie z tablicami wariantów) |
vbDataObject | 13 | Obiekt niebędący elementem automatyzacji |
vbByte | 17 | Bajt |
vbArray | 8192 | Tabela |
Uwaga: Stałe te są określone przez VBScript. W związku z tym nazwy te można wykorzystać w dowolnym miejscu kodu zamiast rzeczywistych wartości.
Powyższe informacje pochodzą z dokumentacji funkcji VBscript. Dokumentacja ta jest czasami niepoprawna, prawdopodobnie z powodu skopiowania i wklejenia treści z dokumentacji funkcji VB. Funkcja vartype z modułu VBScript realizuje jedynie część funkcji opisanych powyżej.
Poprzedni program, przepisany dla vartype, daje następujące wyniki:
Program | Wyniki |
![]() |
3.7. D eklarowanie zmiennych używanych przez skrypt
Wspomnieliśmy, że deklarowanie zmiennych używanych przez skrypt nie jest obowiązkowe. W takim przypadku, jeśli napiszemy:
1) somme=4
...
2) somme=smme+10
W przypadku literówki „smme” zamiast „somme” w instrukcji nr 2, VBScript nie zgłosi żadnego błędu. Zakłada on, że „smme” jest nową zmienną. Utworzy ją i w kontekście instrukcji nr 2 wykorzysta, inicjując jej wartość na 0.
Tego rodzaju błędy mogą być bardzo trudne do wykrycia. Dlatego zaleca się wymuszenie deklaracji zmiennych za pomocą dyrektywy „option explicit” umieszczonej na początku skryptu. Następnie każda zmienna musi zostać zadeklarowana za pomocą instrukcji „dim” przed jej pierwszym użyciem:
option explicit
...
dim somme
1) somme=4
...
2) somme=smme+10
W tym przykładzie VBScript zgłosi, że istnieje niezadeklarowana zmienna, podobnie jak w punkcie 2), co pokazuje poniższy przykład:
Program | Wyniki |
![]() |
Chociaż w krótkich przykładach zawartych w niniejszym dokumencie zmienne w większości przypadków nie są deklarowane, będziemy wymuszać ich deklarację, gdy tylko zaczniemy pisać pierwsze znaczące skrypty. Dyrektywa Option explicit będzie wówczas stosowana systematycznie.
3.8. Funkcje konwersji w języku
VBScript przekształca dane wariantów na ciągi znaków, liczby, wartości logiczne itp. w zależności od kontekstu. W większości przypadków działa to dobrze, ale czasami może to powodować pewne niespodzianki, co zobaczymy później. W takiej sytuacji możemy chcieć „wymusić” typ danych wariantu. VBscript posiada funkcje konwersji, które przekształcają wyrażenie na różne typy danych. Oto kilka z nich:
Cint (wyrażenie) | przekształca wyrażenie na liczbę całkowitą typu short (integer) |
Clng (wyrażenie) | przekształca wyrażenie w liczbę całkowitą długą (long) |
Cdbl (wyrażenie) | przekształca wyrażenie w liczbę zmiennoprzecinkową typu double (double) |
Csng (wyrażenie) | przekształca wyrażenie w liczbę rzeczywistą typu single (single) |
Ccur (wyrażenie) | przekształca wyrażenie na wartość walutową (currency) |
Oto kilka przykładów:
3.9. owanie danych wpisanych z klawiatury
Obiekt wscript umożliwia skryptowi pobieranie danych wprowadzonych z klawiatury. Metoda wscript.stdin.readLine pozwala odczytać wiersz tekstu wpisanego z klawiatury i zatwierdzonego klawiszem „Enter”. Odczytany wiersz można przypisać do zmiennej.
Program | Wyniki |
![]() | |
Komentarze:
- W kolumnie wyników, w wierszu [Tapez votre nom : st], st to wiersz wpisany przez użytkownika.
Jeśli tekst wpisany z klawiatury stanowi liczbę, jest on mimo to traktowany przede wszystkim jako ciąg znaków, jak pokazuje poniższy przykład:
Program | Wyniki |
![]() |
Jeśli liczba ta pojawia się w operacji arytmetycznej, VBscript automatycznie przekształci ciąg znaków na liczbę, ale nie zawsze. Spójrzmy na poniższy przykład:
Program | Wyniki |
![]() |
W wynikach widać, że wiersz 8 skryptu nie przebiegł zgodnie z oczekiwaniami, ponieważ (niestety) w VBScript operator + ma dwa znaczenia: dodawanie dwóch liczb lub konkatenację dwóch ciągów znaków (oba ciągi są łączone ze sobą). Wcześniej widzieliśmy, że liczby wpisywane z klawiatury są odczytywane jako ciągi znaków, a VBScript przekształca je w liczby w zależności od potrzeb. Zrobił to poprawnie w przypadku operacji -, *, /, które mogą obejmować wyłącznie liczby, ale nie w przypadku operatora +, który może również obejmować ciągi znaków. W tym przypadku program założył, że chcemy wykonać konkatenację ciągów znaków.
Prostym rozwiązaniem tego problemu jest przekształcenie ciągów znaków na liczby już w momencie ich odczytu, jak pokazuje poniższa poprawiona wersja poprzedniego programu:
Program | Wyniki |
![]() |
3.10. S prowadzanie danych za pomocą funkcji inputbox
Czasami może zaistnieć potrzeba wprowadzania danych za pomocą interfejsu graficznego zamiast klawiatury. W takim przypadku stosuje się funkcję inputBox. Funkcja ta przyjmuje wiele parametrów, z których najczęściej używane są tylko dwa pierwsze:
reponse=inputBox(message,title)
- wiadomość: pytanie, które zadajesz użytkownikowi
- tytuł (opcjonalnie): tytuł nadany oknu wprowadzania danych
- odpowiedź: tekst wpisany przez użytkownika. Jeśli użytkownik zamknął okno bez udzielenia odpowiedzi, odpowiedź jest ciągiem pustym.
Oto przykład, w którym pytamy o imię i wiek osoby. W przypadku imienia podajemy informację i wybieramy opcję „OK”. W przypadku wieku również podajemy informację, ale wybieramy opcję „Anuluj”.
Program | ||||
![]() | ||||
Wyniki | ||||
|
3.11. U sługiwanie się obiektami strukturalnymi
Za pomocą języka VBScript można tworzyć obiekty posiadające metody i właściwości. Aby nie komplikować sprawy, przedstawimy tutaj obiekt posiadający właściwości, ale bez metod. Rozważmy osobę. Ma ona wiele właściwości, które ją charakteryzują: wzrost, wagę, kolor skóry, oczu, włosów... Wyróżnimy tylko dwie: imię i wiek. Zanim będziemy mogli korzystać z obiektów, musimy stworzyć szablon, który pozwoli je utworzyć. W języku VBScript odbywa się to za pomocą klasy. Klasę personne można zdefiniować w następujący sposób:
class personne
Dim nom,age
End class
To instrukcja [Dim nom,age] definiuje dwie właściwości klasy personne. Aby utworzyć egzemplarze (zwane instancjami) klasy personne, piszemy:
Dlaczego nie napisać
Ponieważ wariant nie może zawierać obiektu. Może zawierać jedynie jego adres. Po wpisaniu set osoba1=new osoba następuje następująca sekwencja zdarzeń:
- tworzony jest obiekt personne. Oznacza to, że przydzielana jest mu pamięć.
- adres tego obiektu personne jest przypisywany do zmiennej personne1
Otrzymujemy wówczas następujący schemat pamięci dla zmiennych personne1 i personne2:
![]() |
W pewnym sensie można powiedzieć, że personne1 jest obiektem personne. Można zaakceptować to nieprecyzyjne sformułowanie, jeśli przypomnimy sobie, że personne1 jest w rzeczywistości adresem obiektu personne, a nie samym obiektem personne.
Powiedzieliśmy, że obiekt personne ma dwie właściwości: nom i age. Jak wykorzystać te właściwości? Poprzez notację objet.propriété, jak wyjaśniono nieco wyżej. Zatem
personne1.nom oznacza imię osoby 1, a personne1.age – jej wiek. Oto krótki program ilustrujący to zagadnienie:
Program | Wyniki |
![]() |
Powyższy program można zmodyfikować w następujący sposób:
Program | Wyniki |
![]() |
W tym przypadku zastosowaliśmy konstrukcję „with ... end with”, która pozwala na „wyodrębnienie” nazw obiektów w wyrażeniach. Konstrukcja „with p1 ... end with” w wierszach 9–12 oraz 15–18 pozwala następnie na użycie składni .nom zamiast p1.nom oraz .age zamiast p1.age. Pozwala to uprościć pisanie instrukcji, w których ta sama nazwa obiektu jest używana wielokrotnie.
3.12. Przypisanie wartości do zmiennej
Istnieją dwie instrukcje służące do przypisania wartości do zmiennej:
- zmienna=wyrażenie
- ustaw zmienną=wyrażenie
Forma 2 jest zarezerwowana dla wyrażeń, których wynikiem jest odwołanie do obiektu. W przypadku wszystkich innych typów wyrażeń należy stosować formę 1. Różnica między tymi dwiema formami jest następująca:
- w instrukcji variable=expression zmienna otrzymuje wartość. Jeśli v1 i v2 to dwie zmienne, zapis v1=v2 przypisuje wartość v1 do v2. Mamy zatem powielenie wartości w dwóch różnych miejscach. Jeśli następnie wartość v2 zostanie zmieniona, wartość v1 pozostaje niezmieniona.
![]() |
- W instrukcji set variable=expression zmienna otrzymuje jako wartość adres obiektu. Jeśli v1 i v2 to dwie zmienne, a v2 jest adresem obiektu obj2, to wpisanie set v1=v2 przypisuje wartość v1 do v2, a więc adres obiektu obj2. Kiedy skrypt następnie operuje na v1 i v2, nie są to „wartości” v1 i v2, na których się operuje, ale obiekty, na które „wskazują” v1 i v2, a więc w tym przypadku ten sam obiekt. Mówi się, że v1 i v2 są dwoma odwołaniami do tego samego obiektu, a manipulowanie nim za pomocą v1 lub v2 nie ma żadnego znaczenia. Innymi słowy, zmiana obiektu, do którego odwołuje się v2, powoduje zmianę obiektu, do którego odwołuje się v1.
![]() |
Oto przykład:
Program | Wyniki |
![]() |
3.13. E waluać wyrażenia
Główne operatory służące do obliczania wyrażeń to:
Rodzaj operatorów | Operatory | Przykład |
Arytmetyczne | +,-,*,/ | |
mod | ||
\ | ||
^ | ||
Porównanie | <, <= >, >= =,<> | a<>b jest prawdziwe, jeśli a różni się od b a=b jest prawdziwe, jeśli a jest równe b a i b mogą być zarówno liczbami, jak i ciągami znaków. W tym ostatnim przypadku ciąg1<ciąg2, jeśli w porządku alfabetycznym ciąg1 poprzedza ciąg2. Podczas porównywania ciągów znaków wielkie litery poprzedzają małe w porządku alfabetycznym. |
is | ||
Logika | and, or, not, xor | Wszystkie operandy są tutaj wartościami logicznymi. bool1 or bool2 jest prawdziwe, jeśli bool1 lub bool2 jest prawdziwe bool1 and bool2 jest prawdziwe, jeśli bool1 i bool2 są prawdziwe not bool1 jest prawdziwe, jeśli bool1 jest fałszywe i odwrotnie bool1 xor bool2 jest prawdziwe, jeśli tylko jedna z wartości logicznych bool1 lub bool2 jest prawdziwa |
Koncatenacja | &, + | Nie zaleca się używania operatora + do łączenia dwóch ciągów znaków ze względu na możliwe pomylenie z dodawaniem dwóch liczb. Należy zatem używać wyłącznie operatora &. |
3.14. C ntrolowanie przebiegu programu
3.14.1. E wykonanie czynności warunkowo
Instrukcja VBScript umożliwiająca wykonywanie czynności w zależności od wartości prawdziwej/fałszywej warunku jest następująca:
| Najpierw oceniane jest wyrażenie expression. Wyrażenie to musi mieć wartość logiczną. Jeśli ma wartość prawdziwą, wykonywane są akcje z then, w przeciwnym razie – akcje z else, o ile istnieje. |
Poniżej znajduje się program przedstawiający różne warianty konstrukcji if-then-else:
Program | Wyniki |
![]() |
Komentarze:
- W języku VBScript można zapisać instrukcję1:instrukcja2:...:instrukcjan zamiast pisać jedną instrukcję w każdym wierszu. Z tej możliwości skorzystano na przykład w wierszu 10.
3.14.2. E xekwowanie czynności w sposób powtarzalny
Pętla o znanej liczbie iteracji |
Z pętli for można wyjść w dowolnym momencie za pomocą instrukcji exit for. |
Pętla o nieznanej liczbie iteracji |
Z pętli do while można wyjść w dowolnym momencie za pomocą instrukcji exit do. |
Poniższy program ilustruje te kwestie:
Program |
![]() |
Wyniki |
Uwaga: Na etapie tworzenia programu często zdarza się, że program „zaciąga się” (c.a.d) i nigdy się nie zatrzymuje. Zazwyczaj program wykonuje pętlę, której warunku wyjścia nie da się zweryfikować, jak na przykład w poniższym przykładzie:
' pętla nieskończona
i=0
Do While 1=1
i=i+1
wscript.echo i
Loop
' kolejna z tej samej serii
i=0
Do While true
i=i+1
wscript.echo i
Loop
Jeśli uruchomimy powyższy program, pierwsza pętla nigdy nie zatrzyma się sama. Można wymusić jej zatrzymanie, wpisując na klawiaturze CTRL-C (trzeba jednocześnie przytrzymać klawisz CTRL i klawisz C).
3.14.3. Zakończenie wykonywania programu
Instrukcja wscript.quit n kończy wykonywanie programu, zwracając kod błędu równy n. W instrukcji DOS kod błędu można sprawdzić za pomocą instrukcji if ERRORLEVEL n, która zwraca wartość true, jeśli kod błędu zwrócony przez ostatnio wykonany program jest >=n. Rozważmy następujący program i jego wyniki:
![]() |
Zaraz po wykonaniu programu wysyłamy trzy następujące polecenia DOS:
Polecenie DOS 1 sprawdza, czy kod błędu zwrócony przez program jest >=5. Jeśli tak, wyświetla (echo) 5, w przeciwnym razie nic.
Polecenie DOS 3 sprawdza, czy kod błędu zwrócony przez program jest >=4. Jeśli tak, wyświetla 4, w przeciwnym razie nic.
Polecenie DOS 5 sprawdza, czy kod błędu zwrócony przez program jest >=3. Jeśli tak, wyświetla 3, w przeciwnym razie nic.
Na podstawie wyświetlonych wyników można wywnioskować, że kod błędu zwrócony przez program wynosił 4.
3.15. owanie tablic danych w wariancie
xml-ph-0000@deepl.internala tablic danych w wariancie Wariant T może zawierać listę wartości. Mówi się wówczas, że jest to tablica. Tablica T posiada różne właściwości:
- Dostęp do elementu i tablicy T uzyskuje się za pomocą składni T(i), gdzie i jest liczbą całkowitą zwaną indeksem, z zakresu od 0 do n-1, jeśli T ma n elementów.
- Indeks ostatniego elementu tablicy T można uzyskać za pomocą wyrażenia ubound(T). Liczba elementów tablicy T wynosi wówczas ubound(T)+1. Liczbę tę często nazywa się rozmiarem tablicy.
- Zmienna typu T może zostać zainicjowana pustą tablicą za pomocą składni T=array() lub sekwencją elementów za pomocą składni T=array(element0, element1, ...., elementn)
- Do już utworzonej tablicy T można dodawać elementy. W tym celu stosuje się instrukcję redim preserve T(N), gdzie N jest nowym indeksem ostatniego elementu tablicy T. Operacja ta nazywana jest zmianą rozmiaru (redim). Słowo kluczowe preserve oznacza, że podczas tej zmiany rozmiaru aktualna zawartość tablicy musi zostać zachowana. W przypadku braku tego słowa kluczowego tablica T jest redimensionowana i opróżniana z elementów.
- Element T(i) tablicy T jest typu variant i może zatem zawierać dowolną wartość, a w szczególności tablicę. W tym przypadku zapis T(i)(j) oznacza element j tablicy T(i).
Te różne właściwości tablic ilustruje poniższy program:
Program | Wyniki |
![]() |
Komentarze
- W tym miejscu wykorzystano funkcję o nazwie join, która została nieco dokładniej wyjaśniona poniżej.
3.16. yzm zmiennych tablicowych
W języku VBScript istnieje inny sposób korzystania z tablicy – jest to użycie zmiennej tablicowej. W przeciwieństwie do zmiennych skalarnych, taka zmienna musi zostać zadeklarowana za pomocą instrukcji dim. Możliwe są różne deklaracje:
- dim tablica(n) deklaruje statyczną tablicę o n+1 elementach, ponumerowanych od 0 do n. Tego typu tablicy nie można zmienić rozmiaru
- dim tablica() deklaruje pustą tablicę dynamiczną. Aby można było z niej korzystać, należy zmienić jej rozmiar za pomocą instrukcji redim, tak samo jak w przypadku zmiennej typu variant zawierającej tablicę
- dim tablica(n,m) deklaruje tablicę dwuwymiarową o wymiarach (n+1)*(m+1). Element (i,j) tablicy jest oznaczony jako tableau(i,j). Należy zwrócić uwagę na różnicę w stosunku do wariantu, w którym ten sam element byłby oznaczony jako tableau(i)(j).
Dlaczego istnieją dwa rodzaje tablic, które w gruncie rzeczy są do siebie bardzo podobne? Dokumentacja języka VBScript nie porusza tej kwestii ani nie wskazuje, czy jeden z nich jest wydajniejszy od drugiego. W dalszej części naszych przykładów będziemy korzystać niemal wyłącznie z tablicy w wariancie. Należy jednak pamiętać, że VBscript wywodzi się z języka Visual Basic, który zawiera typy danych (integer, double, boolean itp.). W takim przypadku, jeśli musimy na przykład użyć tablicy liczb rzeczywistych, zmienna typu tablica będzie wydajniejsza niż zmienna typu variant. W takim przypadku zadeklarujemy coś w rodzaju dim tablica(1000) as double, aby zadeklarować tablicę liczb rzeczywistych, lub po prostu dim tablica() as double, jeśli tablica jest dynamiczna.
Oto przykład ilustrujący wykorzystanie zmiennych tablicowych:
Program | Wyniki |
![]() |
3.17. L e funkcje split i join
Funkcje split i join umożliwiają przekształcenie ciągu znaków w tablicę i odwrotnie:
- Jeśli T jest tablicą, a car ciągiem znaków, to join(T,car) jest ciągiem znaków utworzonym przez połączenie wszystkich elementów tablicy T, przy czym każdy element jest oddzielony od następnego ciągiem znaków car. Tak więc join(array(1,2,3),"abcd") da ciąg znaków "1abcd2abcd3"
- Jeśli C jest ciągiem znaków złożonym z sekwencji pól oddzielonych ciągiem car, to funkcja split(C,car) zwraca tablicę, której elementami są poszczególne części ciągu C. Tak więc split("1abcd2abcd3", "abcd") zwróci tablicę (1,2,3)
Oto przykład:
Program | Wyniki |
|
3.18. Tablice
Dostęp do elementu tablicy T uzyskuje się, znając jego numer i. Można go wówczas zapisać w postaci T(i). Istnieją tablice, do których elementów uzyskuje się dostęp nie za pomocą numeru, ale za pomocą ciągu znaków. Typowym przykładem tego rodzaju tablicy jest słownik. Kiedy szukamy znaczenia słowa w „Larousse” lub „Le petit Robert”, uzyskujemy do niego dostęp za pomocą samego słowa. Słownik ten można przedstawić za pomocą tablicy o dwóch kolumnach:
słowo1 | opis1 |
słowo2 | opis2 |
słowo3 | opis3 |
.... |
Można by wtedy zapisać coś takiego:
słownik("słowo1") = "opis1"
słownik("słowo2")="opis2"
...
Działa to podobnie jak tablica, z tą różnicą, że indeksami tablicy nie są liczby całkowite, lecz ciągi znaków. Tego typu tablicę nazywamy słownikiem (lub tablicą asocjacyjną, hashtable), a indeksy będące ciągami znaków – kluczami słownika (keys). Słowniki są niezwykle powszechnie stosowane w informatyce. Każdy z nas posiada kartę ubezpieczenia społecznego z nadrukowanym numerem. Numer ten jednoznacznie nas identyfikuje i zapewnia dostęp do informacji, które nas dotyczą. W modelu słownik("klucz")="informacje" „kluczem” byłby tutaj numer ubezpieczenia społecznego, a „informacjami” – wszystkie dane na nasz temat przechowywane w systemach informatycznych ubezpieczenia społecznego.
W systemie Windows dostępny jest obiekt ActiveX o nazwie „Scripting.Dictionary”, który umożliwia tworzenie słowników i zarządzanie nimi. Obiekt ActiveX to komponent oprogramowania udostępniający interfejs, z którego mogą korzystać programy napisane w różnych językach, o ile są one zgodne ze standardem korzystania z obiektów ActiveX. Obiekt Scripting.dictionary może być zatem wykorzystywany przez języki programowania systemu Windows: JavaScript, Perl, Python, C, C++, VB, VBA... a nie tylko przez VBScript.
1 | Obiekt Scripting.Dictionary tworzy się za pomocą instrukcji set dico=wscript.CreateObject("Scripting.Dictionary") lub po prostu set dico=CreateObject("Scripting.Dictionary") CreateObject to metoda obiektu WScript umożliwiająca tworzenie instancji obiektów ActiveX. Wersja 2 pokazuje, że wscript może być obiektem domyślnym. Gdy nie można „przyporządkować” metody do żadnego obiektu, kontener WSH spróbuje przyporządkować ją do obiektu wscript. |
2 | Po utworzeniu słownika będziemy mogli dodawać do niego elementy za pomocą metody add: dico.add „klucz”,wartość utworzy nowy wpis w słowniku powiązany z kluczem „klucz”. Powiązaną wartością jest wariant zawierający dowolną dany. |
3 | Aby pobrać wartość powiązaną z danym kluczem, używamy metody item słownika: var = dico.item("klucz") lub set var=dico.item("klucz"), jeśli wartość powiązana z kluczem jest obiektem. |
4 | Zbiór wszystkich kluczy słownika można pobrać do tablicy typu variant za pomocą metody `keys`: klucze = dico.keys klucze to tablica, której elementy można przeglądać. |
5 | Zbiór wartości słownika można pobrać do tablicy zmiennej za pomocą metody `items`: wartości = słownik.items items to tablica, której elementy można przeglądać. |
6 | Istnienie klucza można sprawdzić za pomocą metody `exists`: dico.exists("klucz") zwraca wartość prawdziwą, jeśli klucz „klucz” występuje w słowniku |
7 | Można usunąć wpis ze słownika (klucz+wartość) za pomocą metody remove: dico.remove("klucz") usuwa z słownika wpis powiązany z kluczem „klucz”. dico.removeall usuwa wszystkie klucze, a c.a.d opróżnia słownik. |
Poniższy program wykorzystuje te różne możliwości:
Program |
|
Wyniki |
|
3.19. Sortowanie tablicy lub słownika
Często zdarza się, że chcemy posortować tablicę lub słownik w porządku rosnącym lub malejącym według wartości lub kluczy w przypadku słownika. Chociaż w większości języków programowania istnieją funkcje sortowania, wydaje się, że w VBScript ich brakuje. Jest to pewna luka.
3.20. Argumenty programu
Można wywołać program VBScript, przekazując mu parametry, tak jak w poniższym przykładzie:
Pozwala to użytkownikowi na przekazanie informacji do programu. W jaki sposób program je pobiera? Przyjrzyjmy się poniższemu programowi:
Program | Wyniki |
![]() |
Komentarze
- WScript.Arguments to kolekcja argumentów przekazanych do skryptu
- kolekcja C to obiekt posiadający
- właściwość count, która określa liczbę elementów w kolekcji
- metodę C(i), która zwraca element i kolekcji
3.21. Pierwsze zastosowanie: IMPOTS
Postanawiamy napisać program umożliwiający obliczenie podatku podatnika. Rozważamy uproszczony przypadek podatnika, który ma do zadeklarowania wyłącznie swoje wynagrodzenie:
- obliczamy liczbę udziałów pracownika nbParts = nbEnfants/2 + 1, jeśli jest on osobą stanu wolnego, nbEnfants/2+2, jeśli jest żonaty, gdzie nbEnfants to liczba jego dzieci.
- Następnie oblicza się jego dochód podlegający opodatkowaniu R = 0,72 * S, gdzie S to jego roczne wynagrodzenie
- oblicza się jego współczynnik rodzinny Q = R/N
oblicza się jego podatek I na podstawie następujących danych
12620,0 | 0 | 0 |
13 190 | 0,05 | 631 |
15640 | 0,1 | 1290,5 |
24 740 | 0,15 | 2072,5 |
31810 | 0,2 | 3309,5 |
39 970 | 0,25 | 4900 |
48360 | 0,3 | 6898,5 |
55790 | 0,35 | 9316,5 |
92970 | 0,4 | 12106 |
127860 | 0,45 | 16754,5 |
151250 | 0,50 | 23147,5 |
172 040 | 0,55 | 30710 |
195 000 | 0,60 | 39312 |
0 | 0,65 | 49 062 |
Każdy wiersz zawiera 3 pola. Aby obliczyć podatek I, należy znaleźć pierwszy wiersz, w którym QF ≤ pole1. Na przykład, jeśli QF = 30000, znajdziemy wiersz
Podatek I wynosi wówczas 0,15*R – 2072,5*nbParts. Jeśli QF jest takie, że warunek QF <= pole1 nigdy nie jest spełniony, wówczas stosuje się współczynniki z ostatniego wiersza. W tym przypadku:
co daje podatek I = 0,65 * R – 49062 * nbParts.
Program wygląda następująco:
Program | ||
| ||
Wyniki | ||
|
Komentarze:
- program wykorzystuje elementy omówione wcześniej (deklaracja zmiennych, argumenty, zmiany typów, testy, pętle, tablica w wariancie)
- nie sprawdza poprawności danych, co w rzeczywistym programie byłoby nieprawidłowe
- Jedynie pętla while stanowi pewną trudność. Ma ona na celu ustalenie indeksu i tablicy „limites”, dla którego zachodzi warunek limites(i) > qf, i to dla i < ubound(limites) (c.a.d. Tutaj i < 13), ponieważ ostatni element tablicy „limites” nie ma znaczenia. Został on dodany wyłącznie po to, aby test [Do While i<ubound(limites) And qf>limites(i)] mógł zostać przeprowadzony dla i=13. Test ten ma wówczas postać 13<13 oraz qf>limites(13), a zatem (w VBScript) element limites(13) musi istnieć. Po wyjściu z pętli while ostatnia obliczona wartość i pozwala obliczyć podatek: [impot=int(revenu*coeffr(i)-nbParts*coeffn(i))].









































