Skip to content

3. Noções básicas de programação em VBScript

Depois de descrever os possíveis contextos de execução de um script VBScript, vamos agora discutir a própria linguagem. A partir daqui, assumiremos as seguintes condições:

  1. o contêiner do script é o WSH
  2. o script está num ficheiro com a extensão .vbs

Para introduzir um conceito, procedemos geralmente da seguinte forma:

  • apresentamos o conceito, se necessário
  • apresentamos um programa ilustrativo juntamente com os seus resultados
  • comentamos os resultados e o programa, se necessário

Os contêineres VBScript não distinguem maiúsculas de minúsculas no texto do script. Por isso, pode escrever tanto wscript.echo "hello" como WSCRIPT.ECHO "hello".

Os programas apresentados abaixo geram muitos resultados no ecrã, pelo que iremos rever os métodos de saída do objeto wscript.

3.1. Exibição de informações

Já utilizámos o método echo do objeto wscript, mas este possui outros métodos para escrever no ecrã, conforme demonstrado no seguinte script:

Programa
Resultados
1
2
3
4
um
dois três
quatro
cinco

Devem ser tidos em conta os seguintes pontos:

  • Qualquer texto que se siga a um apóstrofo é tratado como um comentário de script e não é interpretado pelo WSH (linha 1).
  • O método echo imprime os seus argumentos e passa para a linha seguinte, tal como o método writeLine (linhas 2 e 6)
  • O método write imprime os seus argumentos e não passa para a linha seguinte (linha 3)
  • Um caractere de fim de linha é representado pela sequência de dois caracteres ASCII 13 e 10. Assim, a linha 4 é representada pela expressão chr(13) & chr(10), onde chr(i) é o caractere ASCII i e & é o operador de concatenação de cadeias. Assim, "chat" & "eau" resulta na cadeia "chateau".
  • O carácter de fim de linha pode ser representado mais facilmente pela constante vbCRLF (linha 5)

3.2. : Escrever instruções num script VBScript

Por predefinição, escreve-se uma instrução por linha. No entanto, é possível escrever várias instruções numa única linha, separando-as com o caractere: como em inst1:inst2:inst3. Se uma linha for demasiado longa, pode ser dividida em partes. Neste caso, as diferentes partes da instrução devem ser terminadas pelos dois caracteres (espaço)_. Vamos revisitar o exemplo anterior, reescrevendo as instruções de forma diferente:

Programa
Resultados
1
2
3
4
um
dois três
quatro
cinco

3.3. Escrever com a função msgBox

Embora neste documento utilizemos o objeto wscript quase exclusivamente para exibir texto no ecrã, existe uma função mais sofisticada para exibir informações numa janela. Trata-se da função msgbox, que é geralmente utilizada com três parâmetros:

msgbox mensagem, ícones+botões, título

  • mensagem é o texto da mensagem a ser exibida
  • icons+buttons (opcional) é, na verdade, um número que especifica o tipo de ícone e os botões a colocar na janela da mensagem. Este número é, na maioria das vezes, a soma de dois números: o primeiro determina o ícone, o segundo os botões
  • título é o texto a ser colocado na barra de título da janela de mensagem

Os valores a utilizar para especificar o ícone e os botões na janela de exibição são os seguintes:

Constante
Valor
Descrição
vbOKOnly
   0
Exibe apenas o botão OK.
vbOKCancel
   1
Exibe os botões OK e Cancelar.
vbAbortRetryIgnore
   2
Exibe os botões Abortar, Repetir e Ignorar.
vbSimNãoCancelar
   3
Exibe os botões Sim, Não e Cancelar.
vbYesNo
   4
Exibe os botões Sim e Não.
vbRetryCancel
   5
Exibe os botões «Repetir» e «Cancelar».
vbCritical
16
Exibe o ícone de mensagem crítica.
vbQuestion
32
Exibe o ícone de Pedido de Aviso.
vbExclamation
48
Exibe o ícone de mensagem de aviso.
vbInformation
64
Exibe o ícone de mensagem de informação.
vbDefaultButton1
   0
O primeiro botão é o botão predefinido.
vbDefaultButton2
256
O segundo botão é o botão padrão.
vbDefaultButton3
512
O terceiro botão é o botão padrão.
vbDefaultButton4
768
O quarto botão é o botão padrão.
vbApplicationModal
   0
Aplicação modal; o utilizador deve responder à mensagem antes de continuar a trabalhar na aplicação atual.
vbSystemModal
4096
Modal do sistema; todas as aplicações são suspensas até que o utilizador responda à mensagem.

Aqui estão alguns exemplos:

Programa
Resultados
    
     
     

Em alguns casos, é apresentada uma janela de informação que também funciona como janela de entrada. Se for feita uma pergunta, por exemplo, queremos saber se o utilizador clicou no botão Sim ou no botão Não. A função msgBox devolve um resultado que não utilizámos no programa anterior. Este resultado é um número inteiro que representa o botão em que o utilizador clicou para fechar a janela de exibição:

Constante
Valor
Botão selecionado
vbOK
1
OK
vbCancel
2
Cancelar
vbAbort
3
Interromper
vbRetry
4
Repetir
vbIgnorar
5
Ignorar
vbSim
6
Sim
vbNão
7
Não

O programa seguinte demonstra como utilizar o resultado da função msgBox. É apresentada quatro vezes uma janela com os botões Sim, Não e Cancelar. A resposta é a seguinte:

  1. Clique em Sim
  2. clique em Não
  3. clique em Cancelar
  4. feche a janela sem utilizar um botão. O programa mostra que isto é equivalente a utilizar o botão Cancelar.
Programa
Resultados

3.4. Tipos de dados utilizáveis no VBScript

O VBScript reconhece apenas um tipo de dados: o variante. O valor de um variante pode ser um número (4, 10,2), uma cadeia de caracteres ("olá"), um valor booleano (verdadeiro/falso), uma data (#01/01/2002#), o endereço de um objeto ou uma coleção de todos estes tipos de dados colocados numa estrutura chamada matriz.

Vamos examinar o seguinte programa e os seus resultados:

Programa
Resultados
4
i=4
10,2
r1=10,2
0,014
r2=0,014
c1=olá
01/10/02
d1=10/01/02
01/10/02
d2=01/10/02
-1
b1=True
0
b2=False
v=4
v=10,2
v=olá
v=10/01/02
v=True

Comentários:

  • Várias linguagens de programação (C, C++, Pascal, Java, C#, etc.) exigem que uma variável seja declarada antes de ser utilizada. Esta declaração envolve especificar o nome da variável e o tipo de dados que ela pode conter (inteiro, ponto flutuante, cadeia de caracteres, data, booleano, etc.). A declaração de variáveis permite várias coisas:
    • determinar o espaço de memória necessário para a variável, uma vez que diferentes tipos de dados requerem diferentes quantidades de memória
    • verificar a consistência do programa. Por exemplo, se i for um inteiro e c for uma cadeia de caracteres, multiplicar i por c não faz sentido. Se os tipos das variáveis i e c tiverem sido declarados pelo programador, o programa responsável por analisar o código antes da execução pode sinalizar tal inconsistência.

Tal como a maioria das linguagens de script de tipo de dados único (Perl, Python, JavaScript, etc.), o VBScript permite que as variáveis sejam utilizadas sem declaração. Foi isso que se fez no exemplo acima.

  • Observe a sintaxe dos diferentes tipos de dados
    • 10,2 na linha 10 (ponto decimal, não uma vírgula). Repare que 10,2 é apresentado no ecrã.
    • 1,4e-2 na linha 13 (notação científica). O número 0,014 é exibido
    • [#01/10/2002#] (linha 26) para representar a data 10 de janeiro de 2002. O VBScript utiliza, portanto, o formato #mm/dd/aaaa# para representar a data dd do mês mm do ano aaaa
    • os booleanos true e false nas linhas 31 e 34. Estes dois valores são representados, respetivamente, pelos inteiros -1 e 0, conforme mostrado na saída das linhas 32 e 35. Quando um booleano é concatenado com uma cadeia de caracteres, estes valores tornam-se as cadeias «True» e «False», respetivamente, conforme mostrado nas linhas 33 e 36. Note-se que o operador de concatenação & pode ser utilizado para concatenar mais do que apenas cadeias de caracteres.
  • Uma vez que uma variável v não tem um tipo atribuído, pode sucessivamente conter valores de tipos diferentes ao longo do tempo.

3.5. L : Subtipos do tipo Variant

Eis o que a documentação oficial diz sobre os diferentes tipos de dados que uma variante pode conter:

Para além da simples distinção entre números e cadeias de caracteres, um Variant consegue distinguir entre diferentes tipos de informação numérica. Por exemplo, algumas informações numéricas representam uma data ou uma hora. Quando esta informação é utilizada em conjunto com outros dados de data ou hora, o resultado é sempre expresso como uma data ou uma hora. Existem também outros tipos de informação numérica, que vão desde valores booleanos até grandes números de ponto flutuante. Estas diferentes categorias de informação que podem estar contidas num Variant são subtipos. Na maioria dos casos, basta colocar os dados num Variant, e este comporta-se da forma mais adequada com base nesses dados.

A tabela seguinte lista os diferentes subtipos que podem estar contidos num Variant.

Subtipo
Descrição
Vazio
A Variável não está inicializada. O seu valor é zero para variáveis numéricas e uma cadeia nula ("") para variáveis de cadeia.
Nulo
A variante contém intencionalmente dados incorretos.
Booleano
Contém True ou False.
Byte
Contém um número inteiro de 0 a 255.
Inteiro
Contém um número inteiro de -32 768 a 32 767.
Moeda
-922 337 203 685 477,5808 a 922 337 203 685 477,5807.
Long
Contém um número inteiro entre -2.147.483.648 e 2.147.483.647.
Single
Contém um número de ponto flutuante de precisão simples que varia de -3,402823E38 a -1,401298E-45 para valores negativos; de 1,401298E-45 a 3,402823E38 para valores positivos.
Duplo
Contém um número de ponto flutuante de dupla precisão que varia de -1,79769313486232E308 a -4,94065645841247E-324 para valores negativos; de 4,94065645841247E-324 a 1,79769313486232E308 para valores positivos.
Data (Hora)
Contém um número que representa uma data entre 1 de janeiro de 100 e 31 de dezembro de 9999.
Cadeia
Contém uma cadeia de comprimento variável limitada a aproximadamente 2 mil milhões de caracteres.
Objeto
Contém um objeto.
Erro
Contém um número de erro.

3.6. C : Determinar o tipo exato dos dados contidos numa variante

Uma variável do tipo variant pode conter dados de vários tipos. Por vezes, precisamos de saber a natureza exata desses dados. Se escrevermos product = number1 \* number2 num programa, assumimos que number1 e number2 são ambos valores numéricos. Por vezes, não temos a certeza, porque esses valores podem provir de uma entrada do teclado, de um ficheiro ou de alguma outra fonte externa. Temos, então, de verificar a natureza dos dados armazenados em number1 e number2. A função typename(var) permite-nos determinar o tipo de dados contidos na variável var. Aqui estão alguns exemplos:

Programa
Resultados
var=1,type=Integer
var=two, tipo=String
var=True, tipo=Booleano
var=4,5,type=Duplo
var=11/10/01,type=Date

Outra função possível é vartype(var), que devolve um número que representa o tipo dos dados contidos na variável var:

Constante
Valor
Descrição
vbEmpty
0
Vazio (não inicializado)
vbNull
1
Nulo (sem dados válidos)
vbInteger
2
Inteiro
vbLong
3
Inteiro longo
vbSingle
4
Número de ponto flutuante de precisão simples
vbDouble
5
Número de ponto flutuante de dupla precisão
vbCurrency
6
Moeda
vbDate
7
Data
vbString
8
String
vbObject
9
Objeto de automação
vbError
10
Erro
vbBoolean
11
Booleano
vbVariant
12
Variant (utilizado apenas com matrizes Variant)
vbDataObject
13
Objeto não de automação
vbByte
17
Byte
vbArray
8192
Matriz

Nota: Estas constantes são definidas pelo VBScript. Consequentemente, os nomes podem ser utilizados em qualquer parte do seu código em vez dos valores reais.

A informação acima provém da documentação do VBScript. Por vezes, esta informação está incorreta, provavelmente devido à cópia e colagem da documentação do VB. A função vartype do VBScript executa apenas parte do que está descrito acima.

O programa anterior, reescrito para vartype, produz os seguintes resultados:

Programa
Resultados
var=1,type=2
var=dois,type=8
var=True, tipo=11
var=4,5,type=5
var=11/10/01,type=7

3.7. D Declarar variáveis utilizadas pelo script

Mencionámos que não é obrigatório declarar as variáveis utilizadas pelo script. Neste caso, se escrevermos:


1) somme=4
...
2) somme=smme+10

Se houver um erro ortográfico — como «smme» em vez de «somme» — na linha 2, o VBScript não irá reportar um erro. Irá assumir que «smme» é uma nova variável. Irá criá-la e, no contexto da linha 2, utilizá-la inicializando-a com o valor 0.

Este tipo de erros pode ser muito difícil de detetar. Por isso, é aconselhável impor a declaração de variáveis utilizando a diretiva option explicit colocada no início do script. Assim, todas as variáveis devem ser declaradas com uma instrução dim antes da sua primeira utilização:


option explicit
...
dim somme
1) somme=4
...
2) somme=smme+10

Neste exemplo, o VBScript indicará que existe uma variável smme não declarada no ponto 2), conforme mostrado no exemplo seguinte:

Programa
Resultados
dim1.vbs(9, 1) Erro de tempo de execução da Microsoft
 VBScript: Variável indefinida: 'smme'

Embora as variáveis não sejam, na sua maioria, declaradas nos breves exemplos deste documento, será necessário declará-las assim que escrevermos os nossos primeiros scripts significativos. A diretiva Option Explicit será então utilizada de forma sistemática.

3.8. Funções de conversão do

O VBScript converte dados de tipo variant em cadeias de caracteres, números, valores booleanos, etc., dependendo do contexto. Na maioria das vezes, isto funciona bem, mas por vezes leva a resultados inesperados, como veremos mais adiante. Por isso, poderá querer «forçar» o tipo de dados do variant. O VBScript possui funções de conversão que transformam uma expressão em vários tipos de dados. Aqui estão algumas delas:

Cint (expressão)
converte a expressão num inteiro curto
Clng (expressão)
converte a expressão num inteiro longo
Cdbl (expressão)
converte a expressão num número de precisão dupla
Csng (expressão)
converte a expressão num número de ponto flutuante de precisão simples (single)
Ccur (expressão)
converte a expressão em moeda

Aqui estão alguns exemplos:

Programa
Resultados
var=4, tipo de código=8, nome do tipo=String
var=4,tipo de código=2,tipo de nome=Inteiro
var=1000000,código do tipo=8,nome do tipo=String
var=1000000,código do tipo=3,nome do tipo=Long
var=3,4e-5,código do tipo=8,nome do tipo=String
var=0.000034,código do tipo=5,nome do tipo=Double
var=3.4e-5,código do tipo=8,nome do tipo=String
var=0.000034,código do tipo=4,nome do tipo=Single
var=1000,45,código do tipo=8,nome do tipo=String
var=1000,45,código do tipo=6,nome do tipo=Currency
var=14,código do tipo=2,nome do tipo=Inteiro
var=14,código do tipo=8,nome do tipo=String
var=1000,45,código do tipo=5,nome do tipo=Duplo
var=1000,código do tipo=2,nome do tipo=Inteiro
var=1000,75,código do tipo=5,nome do tipo=Duplo
var=1001,código do tipo=2,nome do tipo=Inteiro

3.9. Dados digitados no teclado

O objeto wscript permite que um script recupere dados introduzidos através do teclado. O método wscript.stdin.readLine lê uma linha de texto introduzida através do teclado e confirmada premindo a tecla «Enter». Esta linha lida pode ser atribuída a uma variável.

Programa
Resultados

Digite o seu nome: st
Olá, st

Comentários:

  • Na coluna de resultados e na linha [Digite o seu nome: st], st é o texto introduzido pelo utilizador.

Se o texto digitado no teclado representar um número, este continua a ser tratado principalmente como uma sequência de caracteres, conforme ilustrado no exemplo abaixo:

Programa
Resultados
Introduza um número: 14
número lido=14, tipo=String

Se este número for utilizado numa operação aritmética, o VBScript converterá automaticamente a cadeia de caracteres num número, mas nem sempre. Vejamos o seguinte exemplo:

Programa
Resultados
1
2
3
4
5
6
número1: 3
número 2: 4
3+4=34
3-4=-1
3 × 4 = 12
3/4 = 0,75

Nos resultados, vemos que a linha 8 do script não foi executada como esperado, porque (infelizmente) no VBScript o operador + tem dois significados: adição de dois números ou concatenação de duas cadeias de caracteres (as duas cadeias são unidas). Vimos anteriormente que os números digitados no teclado eram lidos como cadeias de caracteres e que o VBScript os convertia em números conforme necessário. Fê-lo corretamente para as operações -, *, /, que só podem envolver números, mas não para o operador +, que também pode envolver cadeias de caracteres. Aqui, assumiu que queríamos concatenar cadeias de caracteres.

Uma solução simples para este problema consiste em converter as cadeias de caracteres em números assim que forem lidas, tal como se pode ver na seguinte melhoria ao programa anterior:

Programa
Resultados
número1: 3
número1=3,tipo=String
número1=3,tipo=Long
número2: 4
número2=4,tipo=String
número2=4,tipo=Long
3+4=7
3-4=-1
3 × 4 = 12
3/4=0,75

3.10. S Introdução de dados com a função inputBox

Pode preferir introduzir dados através de uma interface gráfica em vez de utilizar o teclado. Nesse caso, utilize a função inputBox. Esta função aceita vários parâmetros, mas apenas os dois primeiros são normalmente utilizados:

response = inputBox(message, title)

  • message: a pergunta que faz ao utilizador
  • title (opcional): o título que atribui à janela de entrada
  • resposta: o texto digitado pelo utilizador. Se o utilizador fechou a janela sem responder, a resposta é uma cadeia de caracteres vazia.

Aqui está um exemplo em que solicitamos o nome e a idade de uma pessoa. Para o nome, introduzimos a informação e clicamos em OK. Para a idade, também introduzimos a informação, mas clicamos em Cancelar.

Programa
Resultados

3.11. U ando objetos estruturados

É possível criar objetos com métodos e propriedades utilizando VBScript. Para simplificar, apresentaremos aqui um objeto com propriedades, mas sem métodos. Considere uma pessoa. Ela tem muitas propriedades que a caracterizam: altura, peso, cor da pele, cor dos olhos, cor do cabelo, etc. Vamos concentrar-nos apenas em duas: o nome e a idade. Antes de poder utilizar objetos, deve criar o modelo que lhe permitirá construí-los. No VBScript, isto é feito utilizando uma classe. A classe Pessoa poderia ser definida da seguinte forma:


class personne
    Dim nom,age
End class

É a instrução [Dim nome, idade] que define as duas propriedades da classe Pessoa. Para criar cópias (chamadas instâncias) da classe Pessoa, escrevemos:

set personne1=new personne
set personne2=new personne

Porque não escrever

personne1=new personne
personne2=new personne

Porque uma variável não pode conter um objeto. Só pode conter o endereço do objeto. Quando escreve set pessoa1 = nova pessoa, ocorre a seguinte sequência de eventos:

  1. É criado um objeto Pessoa. Isto significa que é-lhe atribuída memória.
  2. O endereço deste objeto person é atribuído à variável person1

Temos então a seguinte disposição de memória para as variáveis person1 e person2:

A título de figura de estilo, poderíamos dizer que a pessoa1 é um objeto pessoa. Podemos aceitar esta figura de estilo se nos lembrarmos de que a pessoa1 é, na verdade, o endereço de um objeto pessoa e não o próprio objeto pessoa.

Dissemos que um objeto Pessoa tem duas propriedades: nome e idade. Como acedemos a estas propriedades? Utilizando a notação objeto.propriedade, tal como explicado anteriormente. Assim

pessoa1.nome refere-se ao nome da pessoa 1 e pessoa1.idade refere-se à sua idade. Aqui está um pequeno programa para ilustrar isto:

Programa
Resultados
p1=(dupont,18)

O programa anterior poderia ser modificado da seguinte forma:

Programa
Resultados
nome=dupont
idade=18

Aqui utilizámos a estrutura with ... end with, que nos permite "extrair" nomes de objetos em expressões. A estrutura with p1 ... end with* nas linhas 9–12 e 15–18 permite-nos usar a sintaxe .name em vez de p1.name* e .age* em vez de p1.age*. Isto simplifica a escrita de instruções em que o mesmo nome de objeto é usado repetidamente.

3.12. Atribuir um valor a uma variável

Existem duas instruções para atribuir um valor a uma variável:

  1. variável=expressão
  2. set variável=expressão

A forma 2 é reservada para expressões cujo resultado é uma referência a um objeto. Para todos os outros tipos de expressões, a forma 1 é a adequada. A diferença entre as duas formas é a seguinte:

  • Na instrução variável=expressão, a variável recebe um valor. Se v1 e v2 forem duas variáveis, escrever v1=v2 atribui o valor de v1 a v2. Isto resulta na duplicação de um valor em dois locais diferentes. Se o valor de v2 for posteriormente modificado, o valor de v1 permanece inalterado.
  • Na instrução `set variable=expression`, a `variable` recebe o endereço de um objeto. Se `v1` e `v2` forem duas variáveis e `v2` for o endereço de um objeto `obj2`, escrever `set v1=v2` atribui o valor de `v1` a `v2`, ou seja, o endereço do objeto `obj2`. Quando o script manipula posteriormente v1 e v2, não são os «valores» de v1 e v2 que estão a ser manipulados, mas sim os objetos «apontados» por v1 e v2 — neste caso, o mesmo objeto. Dizemos que v1 e v2 são duas referências ao mesmo objeto, e manipulá-lo através de v1 ou v2 não faz diferença. Por outras palavras, modificar o objeto referenciado por v2 modifica aquele referenciado por v1.

Eis um exemplo:

Programa
Resultados
i=4
j=4
i=4
j=5
p1.apelido=dupont
p1.idade=18
p1.apelido=dupont
p1.idade=19
p2.nome=dupont
p2.idade=19

3.13. E es de avaliação de expressões

Os principais operadores utilizados para avaliar expressões são os seguintes:

Tipo de operadores
Operadores
Exemplo
Aritméticos
+,-,*,/
 
  
  
  
   
Comparação
<, <=
>, >=
=,<>
a<>b é verdadeiro se a não for igual a b
a=b é verdadeiro se a for igual a b
a e b podem ser ambos números ou ambos cadeias de caracteres. Neste último caso, string1<string2 se string1 vier antes de string2 por ordem alfabética. Na comparação de cadeias de caracteres, as letras maiúsculas vêm antes das minúsculas por ordem alfabética.
  
   
Lógica
e, ou, não, xor
Todos os operandos aqui são booleanos.
bool1 ou bool2 é verdadeiro se bool1 ou bool2 for verdadeiro
bool1 e bool2 é verdadeiro se tanto bool1 como bool2 forem verdadeiros
não bool1 é verdadeiro se bool1 for falso, e vice-versa
bool1 xor bool2 é verdadeiro se apenas um dos booleanos bool1 ou bool2 for verdadeiro
   
Concatenação
&, +
Não é recomendável utilizar o operador + para concatenar duas cadeias de caracteres, uma vez que isso pode ser confundido com a soma de dois números. Por conseguinte, deve utilizar apenas o operador &.

3.14. C : Controlo da execução do programa

3.14.1. E xecutar ações condicionalmente

A instrução VBScript utilizada para executar ações com base no facto de uma condição ser verdadeira ou falsa é a seguinte:

if expressão then
    ação-verdadeira-1
    ação-2-verdadeira
    ..
caso contrário
    ação-falsa-1
    ação-falsa-2
    ...
fim se
A expressão é avaliada primeiro. Esta expressão deve ter um valor booleano. Se for avaliada como verdadeira, as ações no bloco then são executadas; caso contrário, as ações no bloco else são executadas, se existirem.

Aqui está um programa que demonstra diferentes variações da instrução if-then-else:

Programa
Resultados
1
2
3
4
5
3 é maior que 0
3 é maior que 2
i=4
4 é menor que 10
i=3

Comentários:

  • No VBScript, pode escrever instrução1:instrução2:... : instruçãon em vez de escrever uma instrução por linha. Esta funcionalidade é utilizada na linha 10, por exemplo.

3.14.2. E xecutar ações repetidamente

Loop com um número conhecido de iterações

para i=início a fim, passo a passo
    ações
próximo
  1. A variável i é chamada aqui de variável de loop. Pode ter qualquer nome
  2. i assume o valor início
  3. O valor de i é comparado com ifin. Se i <= ifin, as ações entre for... next são executadas
  4. i é incrementado pelo valor ipas (i = i + ipas)
  5. Voltamos ao passo 3 acima. Após um número finito de passos, o valor de i excederá ifin. O script continua com a instrução seguinte ao next
  6. se o incremento ipas for negativo, a condição na etapa 3 é alterada. As ações dentro do for...next são executadas apenas se i >= ifin.
Pode sair de um ciclo for a qualquer momento utilizando a instrução exit for.
Loop com um número desconhecido de iterações
do while condição
    ações
loop
  1. A expressão da condição é avaliada. Se for verdadeira, as ações no while...loop são executadas
  2. As ações executadas podem ter alterado o valor da condição. O processo regressa ao passo 1 acima.
  3. Quando a expressão da condição se torna falsa, o ciclo termina
Pode sair de um ciclo do-while a qualquer momento utilizando a instrução exit do.

O programa abaixo ilustra estes pontos:

Programa
Resultados

i=0, array[i]=10, soma=10
i=1, matriz(i)=20, soma=30
i=2, matriz(i)=30, soma=60
i=3, matriz(i)=40, soma=100
i=0, matriz(i)=10, soma=10
i=1, matriz(i)=20, soma=30
i=2,matriz(i)=30,soma=60
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
i=10
i=11
i=1
i=2
i=3
i=4
i=5
i=6

Nota: Durante a fase de desenvolvimento de um programa, não é invulgar que um programa entre em «loop», ou seja, que nunca pare. Geralmente, o programa executa um loop cuja condição de saída não pode ser verificada, como no exemplo seguinte:


' infinite loop
i=0
Do While 1=1
  i=i+1
  wscript.echo i
Loop
 
' another of the same kind
i=0
Do While true
  i=i+1
  wscript.echo i
Loop

Se executar o programa anterior, o primeiro ciclo nunca irá parar por si próprio. Pode forçá-lo a parar premindo CTRL-C no teclado (mantenha premidas as teclas CTRL e C ao mesmo tempo).

3.14.3. Terminar a execução do programa

A instrução wscript.quit n encerra o programa, devolvendo um código de erro igual a n. No DOS, este código de erro pode ser verificado utilizando a instrução if ERRORLEVEL n, que resulta em verdadeiro se o código de erro devolvido pelo último programa executado for >=n. Considere o seguinte programa e os seus resultados:

  
começar

Imediatamente após a execução do programa, são emitidos os seguintes três comandos DOS:

1
2
3
4
5
6
7
C:\>if ERRORLEVEL 5 echo 5

C:\>if ERRORLEVEL 4 echo 4
4

C: >if ERRORLEVEL 3 echo 3
3

O comando DOS 1 verifica se o código de erro devolvido pelo programa é >=5. Se for esse o caso, exibe (echo) 5; caso contrário, nada.

O comando DOS 3 verifica se o código de erro devolvido pelo programa é >=4. Se for esse o caso, exibe 4; caso contrário, nada.

O comando DOS 5 verifica se o código de erro devolvido pelo programa é >=3. Se for esse o caso, exibe 3; caso contrário, nada.

A partir dos resultados apresentados, podemos deduzir que o código de erro devolvido pelo programa foi 4.

3.15. L s matrizes de dados numa variante

Uma variante T pode conter uma lista de valores. Dizemos então que se trata de uma matriz. Uma matriz T tem várias propriedades:

  • Acedemos ao elemento i da matriz T utilizando a sintaxe T(i), em que i é um número inteiro chamado índice, compreendido entre 0 e n-1, se T tiver n elementos.
  • O índice do último elemento da matriz T pode ser determinado utilizando a expressão ubound(T). O número de elementos na matriz T é, então, ubound(T)+1. Este número é frequentemente referido como o tamanho da matriz.
  • Uma variante T pode ser inicializada com uma matriz vazia utilizando a sintaxe T=array() ou com uma sequência de elementos utilizando a sintaxe T=array(element0, element1, ...., elementn)
  • Pode adicionar elementos a uma matriz T que já tenha sido criada. Para o fazer, utilize a instrução redim preserve T(N), em que N é o novo índice do último elemento da matriz T. Esta operação é denominada redimensionamento (redim). A palavra-chave preserve indica que, durante este redimensionamento, o conteúdo atual da matriz deve ser preservado. Na ausência desta palavra-chave, T é redimensionada e os seus elementos são apagados.
  • Um elemento T(i) da matriz T é do tipo variante e pode, portanto, conter qualquer valor, incluindo outra matriz. Neste caso, a notação T(i)(j) refere-se ao j-ésimo elemento da matriz T(i).

Estas várias propriedades das matrizes são ilustradas pelo seguinte programa:

Programa
Resultados
A matriz t1 tem 5 elementos
t1(0)=1
t1(1)=-4,5
t1(2)=2
t1(3)=True
t1(4)=1/10/02
t1=1:-4,5:dois:Verdadeiro:01/10/02
t1(5)=10:20:30
t1(5)(1)=20
t1=1 ~ -4,5 ~ dois
t1=:::

Comentários

  • Aqui utilizámos uma função chamada join, que é explicada em mais pormenor abaixo.

3.16. L e de variáveis de matriz

No VBScript, existe outra forma de utilizar uma matriz: através de uma variável de matriz. Ao contrário das variáveis escalares, essa variável deve ser declarada utilizando uma instrução dim. São possíveis várias declarações:

  • dim array(n) declara uma matriz estática de n+1 elementos numerados de 0 a n. Este tipo de matriz não pode ser redimensionado
  • dim array() declara uma matriz dinâmica vazia. Deve ser redimensionada para utilização com a instrução redim, da mesma forma que para uma variante que contenha uma matriz
  • dim array(n,m) declara uma matriz bidimensional com (n+1)*(m+1) elementos. O elemento (i,j) da matriz é denotado como array(i,j). Note a diferença em relação a uma variante, onde o mesmo elemento teria sido denotado como array(i)(j).

Por que existem dois tipos de matrizes que, no fundo, são muito semelhantes? A documentação do VBScript não aborda esta questão e não indica se um é mais eficiente do que o outro. Daqui em diante, utilizaremos matrizes dentro de variantes quase exclusivamente nos nossos exemplos. No entanto, vale a pena referir que o VBScript deriva da linguagem Visual Basic, que por sua vez contém tipos de dados (inteiro, duplo, booleano, etc.). Neste caso, se precisarmos de utilizar uma matriz de números reais, por exemplo, a variável de matriz será mais eficiente do que a variável de variante. Declararíamos então algo como dim array(1000) as double para declarar uma matriz de números reais, ou simplesmente dim array() as double se a matriz for dinâmica.

Aqui está um exemplo que ilustra a utilização de variáveis de matriz:

Programa
Resultados
A matriz t1 tem 5 elementos
t1(0)=1
t1(1)=-4,5
t1(2)=2
t1(3)=True
t1(4)=1/10/02
t1=1:-4,5:2:True:10/01/02
A matriz t1 tem 5 elementos
t2(0)=0
t2(1)(2)=30
t2=:::
t3(0,0)=0
t3(0,1) = 1
t3(1,0)=10
t3(1,1)=11

3.17. L : as funções split e join

As funções split e join permitem converter uma cadeia de caracteres numa matriz e vice-versa:

  • Se T for uma matriz e car for uma cadeia de caracteres, join(T,car) é uma cadeia de caracteres formada pela concatenação de todos os elementos da matriz T, cada um separado do seguinte pela cadeia de caracteres car. Assim, join(array(1,2,3),"abcd") produzirá a cadeia de caracteres "1abcd2abcd3"
  • Se C for uma cadeia de caracteres constituída por uma sequência de campos separados pela cadeia de caracteres car, a função split(C,car) devolve uma matriz cujos elementos são as partes individuais da cadeia de caracteres C. Assim, split("1abcd2abcd3", "abcd") devolverá a matriz (1,2,3)

Eis um exemplo:

Programa
Resultados

' conversão de matriz para cadeia de caracteres e vice-versa

' matriz --> cadeia
array = array("um", 2, "três")
string = join(array, ",")
wscript.echo string

' string --> matriz
array2 = split(string, ",")
Para i=0 Até ubound(array2)
  wscript.echo array2(i)
Next


um, dois, três
um
2
três

3.18. Dicionários

Podemos aceder a um elemento de uma matriz T quando conhecemos o seu índice i. Este fica então acessível utilizando a notação T(i). Existem matrizes cujos elementos são acedidos não por um índice, mas por uma cadeia de caracteres. Um exemplo típico deste tipo de matriz é um dicionário. Ao procurar o significado de uma palavra no «Larousse» ou no «Le petit Robert», acedemos a ela através da palavra. Poderíamos representar este dicionário como uma matriz de duas colunas:

palavra1
descrição1
palavra2
descrição2
palavra3
descrição3
....
 

Poderíamos então escrever coisas como:

dicionário("palavra1") = "descrição1"

dicionário("palavra2") = "descrição2"

...

Isto é semelhante ao funcionamento de uma matriz, exceto que os índices da matriz não são números inteiros, mas sim cadeias de caracteres. Este tipo de matriz é chamado de dicionário (ou matriz associativa, tabela hash), e os índices de cadeias de caracteres são chamados de chaves do dicionário. Os dicionários são utilizados com extrema frequência no mundo da informática. Todos nós temos um cartão de segurança social com um número. Este número identifica-nos de forma única e dá acesso a informações sobre nós. No modelo dicionário("chave")="informação", "chave" seria o número de segurança social e "informação" seria toda a informação armazenada sobre nós nos computadores da segurança social.

No Windows, existe um objeto ActiveX chamado "Scripting.Dictionary" que permite criar e gerir dicionários. Um objeto ActiveX é um componente de software que expõe uma interface utilizável por programas escritos em várias linguagens, desde que estejam em conformidade com o padrão de objetos ActiveX. O objeto Scripting.Dictionary pode, portanto, ser utilizado por linguagens de programação do Windows, tais como JavaScript, Perl, Python, C, C++, VB, VBA e outras — não apenas VBScript.

1
Um objeto Scripting.Dictionary é criado utilizando a seguinte instrução
set dico=wscript.CreateObject("Scripting.Dictionary")
ou simplesmente
set dico=CreateObject("Scripting.Dictionary")
CreateObject é um método do objeto WScript utilizado para criar instâncias de objetos ActiveX. A versão 2 mostra que wscript pode ser um objeto implícito. Quando um método não pode ser «resolvido» para um objeto, o contentor WSH tentará resolvê-lo para o objeto wscript.
2
Assim que o dicionário for criado, podemos adicionar-lhe elementos utilizando o método add:
dico.add "key",value
criará uma nova entrada no dicionário associada à chave "key". O valor associado é um Variant que contém quaisquer dados.
3
Para recuperar o valor associado a uma determinada chave, usamos o método item do dicionário:
var = dic.item("key")
ou set var = dic.item("chave") se o valor associado à chave for um objeto.
4
Todas as chaves do dicionário podem ser recuperadas numa matriz variável utilizando o método `keys`:
keys = dic.keys
keys é uma matriz cujos elementos podem ser iterados.
5
Todos os valores do dicionário podem ser recuperados numa matriz variável utilizando o método `items`:
values = dic.items
items é uma matriz cujos elementos podem ser iterados.
6
A existência de uma chave pode ser verificada utilizando o método `exists`:
dico.exists("key") é verdadeiro se a chave "key" existir no dicionário
7
Pode remover uma entrada do dicionário (chave+valor) utilizando o método remove:
dico.remove("key") remove a entrada do dicionário associada à chave "key". dico.removeall remove todas as chaves, ou seja, esvazia o dicionário.

O programa a seguir utiliza estas várias opções:

Programa


' creating and using a dictionary
Set dico=CreateObject("Scripting.Dictionary")
 
' dico filling
dico.add "clé1","valeur1"
dico.add "clé2","valeur2"
dico.add "clé3","valeur3"
 
' number of elements
wscript.echo "Le dictionnaire a " & dico.count & " éléments"
 
' kEY LIST
wscript.echo "liste des clés"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo cles(i)
Next
 
' list of values
wscript.echo "liste des valeurs"
valeurs=dico.items
For i=0 To ubound(valeurs)
  wscript.echo valeurs(i)
Next
 
' list of keys and values
wscript.echo "liste des clés et valeurs"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next
 
' item search
' key1
If dico.exists("clé1") Then
    wscript.echo "La clé clé1 existe dans le dictionnaire et la valeur associée est " & dico.item("clé1")
  Else
    wscript.echo "La clé clé1  n'existe pas dans le dictionnaire"
  End If
' key4
If dico.exists("clé4") Then
    wscript.echo "La clé clé4 existe dans le dictionnaire et la valeur associée est " & dico.item("clé4")
  Else
    wscript.echo "La clé clé4  n'existe pas dans le dictionnaire"
  End If
 
' remove key 1
dico.remove("clé1")
 
' list of keys and values
wscript.echo "liste des clés et valeurs après suppression de clé1"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next
 
' we do away with everything
dico.removeall
 
' list of keys and values
wscript.echo "liste des clés et valeurs après suppression de tous les éléments"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next
 
' end
wscript.quit 0

Resultados

Le dictionnaire a 3 éléments
liste des clés
clé1
clé2
clé3
liste des valeurs
valeur1
valeur2
valeur3
liste des clés et valeurs
dico(clé1)=valeur1
dico(clé2)=valeur2
dico(clé3)=valeur3
La clé clé1 existe dans le dictionnaire et la valeur associée est valeur1
La clé clé4  n'existe pas dans le dictionnaire
liste des clés et valeurs après suppression de clé1
dico(clé2)=valeur2
dico(clé3)=valeur3
liste des clés et valeurs après suppression de tous les éléments

3.19. Ordenar uma matriz ou um dicionário

É comum querer ordenar uma matriz ou um dicionário por ordem crescente ou decrescente, com base nos seus valores ou, no caso de um dicionário, nas suas chaves. Embora a maioria das linguagens disponha de funções de ordenação, não parece haver nenhuma no VBScript. Esta é uma lacuna.

3.20. Argumentos do programa

É possível chamar um programa VBScript passando-lhe parâmetros, como em:

cscript prog1.vbs arg1 arg2 .... argn

Isto permite ao utilizador passar informações para o programa. Como é que o programa recupera estas informações? Vejamos o seguinte programa:

Programa
Resultados
C:\>cscript arg1.vbs a b c

Existem 3 argumentos
a
b
c

Comentários

  • WScript.Arguments é a coleção de argumentos passados para o script
  • Uma coleção C é um objeto que possui
    • uma propriedade count, que é o número de elementos na coleção
    • um método C(i) que devolve o i-ésimo elemento da coleção

3.21. Uma primeira aplicação: IMPOSTOS

Propomos escrever um programa para calcular o imposto de um contribuinte. Consideramos o caso simplificado de um contribuinte que tem apenas o seu salário para declarar:

  • O número de quotas para o trabalhador é calculado da seguinte forma: nbParts = nbEnfants / 2 + 1 se o trabalhador for solteiro, ou nbEnfants / 2 + 2 se o trabalhador for casado, sendo nbEnfants o número de filhos.
  • Calculamos o seu rendimento tributável R = 0,72 * S, em que S é o seu salário anual
  • Calculamos o seu coeficiente familiar Q = R / N

Calculamos o seu imposto I com base nos seguintes dados

12620,0
0
0
13 190
0,05
631
15 640
0,1
1.290,5
24.740
0,15
2.072,5
31 810
0,2
3.309,5
39 970
0,25
4.900
48 360
0,3
6.898,5
55 790
0,35
9.316,5
92 970
0,4
12 106
127 860
0,45
16 754,5
151 250
0,50
23 147,5
172 040
0,55
30 710
195 000
0,60
39 312
0
0,65
49 062

Cada linha tem 3 campos. Para calcular o imposto I, procuramos a primeira linha em que QF <= campo1. Por exemplo, se QF = 30000, encontraremos a linha

    24740        0.15        2072.5

O Imposto I é então igual a 0,15*R - 2072,5*nbParts. Se QF for tal que a condição QF<=field1 nunca seja satisfeita, então são utilizados os coeficientes da última linha. Aqui:

    0                0.65        49062

o que dá o imposto I = 0,65*R - 49062*nbParts.

O programa é o seguinte:

Programa

' calculating a taxpayer's tax liability
' the program must be called with three parameters: married children salary
' married: character Y if married, N if unmarried
' children: number of children
' salary: annual salary without cents

' no verification of data validity is performed, but we do
' check that there are three of them

' mandatory variable declaration
Option Explicit

' we check that there are 3 arguments
Dim nbArguments
nbArguments=wscript.arguments.count
If nbArguments<>3 Then
    wscript.echo "Syntaxe : pg marié enfants salaire"
    wscript.echo "marié : caractère O si marié, N si non marié"
    wscript.echo "enfants : nombre d'enfants"
    wscript.echo "salaire : salaire annuel sans les centimes"
    ' stop with error code 1
    wscript.quit 1
End If

' retrieve arguments without checking their validity
Dim marie, enfants, salaire
If wscript.arguments(0) = "O" Or wscript.arguments(0)="o" Then
    marie=true
Else
    marie=false
End If
' children is an integer
enfants=cint(wscript.arguments(1))
' salary is a long integer
salaire=clng(wscript.arguments(2))

' we define the data needed to calculate the tax in 3 tables
Dim limites, coeffn, coeffr
limites=array(12620,13190,15640,24740,31810,39970,48360, _
55790,92970,127860,151250,172040,195000,0)
coeffr=array(0,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45, _
0.5,0.55,0.6,0.65)
coeffn=array(0,631,1290.5,2072.5,3309.5,4900,6898.5,9316.5, _
12106,16754.5,23147.5,30710,39312,49062)

' the number of shares is calculated
Dim nbParts
If marie=true Then
    nbParts=(enfants/2)+2
Else
    nbParts=(enfants/2)+1
End If
If enfants>=3 Then nbParts=nbParts+0.5

' we calculate the family quotient and taxable income
Dim revenu, qf
revenu=0.72*salaire
qf=revenu/nbParts

' tax calculation
Dim i, impot
i=0
Do While i<ubound(limites) And qf>limites(i)
    i=i+1
Loop
impot=int(revenu*coeffr(i)-nbParts*coeffn(i))

' the result is displayed
wscript.echo "impôt=" & impot

' leave without error
wscript.quit 0

Resultados

C:\>cscript impots1.vbs o 2 200000

impôt=22504

C:\>cscript impots1.vbs o 2 20000

impôt=0

C:\>cscript impots1.vbs o 2 2000000

impôt=746064

C:\>cscript impots1.vbs n 2 200000

impôt=33388

C:\>cscript impots1.vbs n 3 200000

impôt=22504

C:\>cscript impots1.vbs

Syntaxe : pg marié enfants salaire
marié : caractère O si marié, N si non marié
enfants : nombre d'enfants
salaire : salaire annuel sans les centimes

Comentários:

  • O programa utiliza o que foi abordado anteriormente (declarações de variáveis, argumentos, conversões de tipos, testes, loops, matriz numa variante)
  • Não verifica a validade dos dados, o que seria invulgar num programa real
  • Apenas o ciclo while apresenta um desafio. Procura determinar o índice i da matriz limits para o qual limits(i) > qf, e isto para i < ubound(limits) (ou seja, aqui i < 13), porque o último elemento da matriz limits não é significativo. Foi adicionado apenas para que o teste [Do While i<ubound(limits) And qf>limits(i)] pudesse ser realizado para i=13. O teste passa então a ser 13<13 e qf>limits(13) e, por conseguinte (em VBScript), limits(13) deve existir. Ao sair do ciclo while, o último valor calculado de i é utilizado para calcular o imposto: [tax = Int(income * coeffr(i) - nbParts * coeffn(i))].