Skip to content

3. Fundamentos de la programación VBSCRIPT

Tras haber descrito los posibles contextos de ejecución de un script VBScript, abordamos ahora el lenguaje en sí. En lo que sigue, nos situamos en las siguientes condiciones:

  1. el contenedor del script es WSH
  2. el script se encuentra en un archivo con la extensión .vbs

Para presentar un concepto, solemos proceder de la siguiente manera:

  • introducimos el concepto si es necesario
  • presentamos un programa de ejemplo con sus resultados
  • comentamos los resultados y el programa si es necesario

Los contenedores VBScript no distinguen entre mayúsculas y minúsculas en el texto del script. Por lo tanto, se puede escribir indistintamente wscript.echo «hola» o WSCRIPT.ECHO «hola».

Los programas que se presentan a continuación realizan muchas operaciones de escritura en pantalla, por lo que volveremos a presentar los métodos de escritura del objeto wscript.

3.1. Mostrar información

Ya hemos utilizado el método echo del objeto wscript, pero este último dispone de otros métodos que permiten escribir en pantalla, como muestra el siguiente script:

Programa
Resultados
1
2
3
4
un
deuxtrois
quatre
cinq

Cabe destacar los siguientes puntos:

  • Cualquier texto situado después de un apóstrofo se considera un comentario del script y no es interpretado por WSH (línea 1).
  • El método echo escribe sus argumentos y pasa a la línea siguiente, al igual que el método writeLine (líneas 2 y 6).
  • El método write escribe sus argumentos y no pasa a la línea siguiente (línea 3).
  • Un marcador de fin de línea se representa mediante la secuencia de dos caracteres de código ASCII 13 y 10. Así, la línea 4 se representa mediante la expresión chr(13) & chr(10), donde chr(i) es el carácter de código ASCII i y & el operador de concatenación de cadenas. De este modo, «chat» & «eau» es la cadena «chateau».
  • El marcador de fin de línea se puede representar más fácilmente mediante la constante vbCRLF (línea 5)

3.2. E a escritura de instrucciones en un script VBScript

Por defecto, se escribe una instrucción por línea. No obstante, se pueden escribir varias instrucciones en una misma línea separándolas con el carácter :, como en inst1:inst2:inst3. Si una línea es demasiado larga, se puede dividir en partes. En ese caso, las diferentes partes de la instrucción deben terminar con los dos caracteres (espacio)_. Retomamos el ejemplo anterior reescribiendo las instrucciones de otra manera:

Programa
Resultados
1
2
3
4
un
deuxtrois
quatre
cinq

3.3. Escribir con la función msgBox

Aunque en este documento utilizamos casi exclusivamente el objeto wscript para escribir en pantalla, existe una función más sofisticada para mostrar información en una ventana. Se trata de la función msgbox, que se suele utilizar con tres parámetros:

msgbox mensaje, iconos+botones, título

  • mensaje es el texto del mensaje que se va a mostrar
  • iconos+botones (opcional) es, en realidad, un número que indica el tipo de icono y los botones que se colocarán en la ventana del mensaje. Este número suele ser la suma de dos números: el primero determina el icono, el segundo los botones
  • título es el texto que se colocará en la barra de título de la ventana del mensaje

Los valores que se deben utilizar para especificar el icono y los botones de la ventana de visualización son los siguientes:

Constante
Valor
Descripción
vbOKOnly
   0
Muestra únicamente el botón OK.
vbOKCancel
   1
Muestra los botones OK y Cancelar.
vbAbortRetryIgnore
   2
Muestra los botones Abandonar, Reintentar e Ignorar.
vbYesNoCancel
   3
Muestra los botones , No y Cancelar.
vbYesNo
   4
Muestra los botones y No.
vbRetryCancel
   5
Muestra los botones «Reintentar» y «Cancelar».
vbCritical
16
Muestra el icono de mensaje crítico.
vbQuestion
32
Muestra el icono «Solicitud de aviso».
vbExclamation
48
Muestra el icono de mensaje de advertencia.
vbInformation
64
Muestra el icono de mensaje informativo.
vbDefaultButton1
   0
El primer botón es el botón predeterminado.
vbDefaultButton2
256
El segundo botón es el botón predeterminado.
vbDefaultButton3
512
El tercer botón es el botón predeterminado.
vbDefaultButton4
768
El cuarto botón es el botón predeterminado.
vbApplicationModal
   0
Aplicación modal; el usuario debe responder al mensaje antes de continuar trabajando en la aplicación actual.
vbSystemModal
4096
Sistema modal; todas las aplicaciones se suspenden hasta que el usuario responda al mensaje.

Estos son algunos ejemplos:

Programa
Resultados
    
     
     

En algunos casos, se muestra una ventana de información que también es una ventana de entrada. Si se plantea una pregunta, se quiere saber, por ejemplo, si el usuario ha hecho clic en el botón oui o en el botón non. La función msgBox devuelve un resultado que en el programa anterior no hemos utilizado. Este resultado es un número entero que representa el botón utilizado por el usuario para cerrar la ventana de visualización:

Constante
Valor
Botón seleccionado
vbOK
1
OK
vbCancel
2
Cancelar
vbAbort
3
Abandono
vbRetry
4
Intentarlo de nuevo
vbIgnore
5
Ignorar
vbYes
6
vbNo
7
No

El siguiente programa muestra el uso del resultado de la función msgBox. Se muestra cuatro veces una ventana con los botones «Sí», «No» y «Cancelar». Se responde de la siguiente manera:

  1. se hace clic en «Sí»
  2. se hace clic en «No»
  3. se hace clic en «Cancelar»
  4. se cierra la ventana sin utilizar ningún botón. El programa muestra que esto equivale a utilizar el botón Cancelar.
Programa
Resultados

3.4. El e e datos utilizables en VBScript

VBscript solo conoce un tipo de datos: el variant. El valor de un variant puede ser un número (4, 10,2), una cadena de caracteres («hola»), un valor booleano (true/false), una fecha (#01/01/2002#), la dirección de un objeto o un conjunto de todos estos datos colocados en una estructura llamada matriz.

Veamos el siguiente programa y sus resultados:

Programa
Resultados
4
i=4
10,2
r1=10,2
0,014
r2=0,014
c1=bonjour
01/10/02
d1=01/10/02
10/01/02
d2=10/01/02
-1
b1=Vrai
0
b2=Faux
v=4
v=10,2
v=bonjour
v=01/10/02
v=Vrai

Comentarios:

  • Algunos lenguajes de programación (C, C++, Pascal, Java, C#, etc.) exigen la declaración previa de una variable antes de su uso. Esta declaración consiste en indicar el nombre de la variable y el tipo de datos que puede contener (entero, real, cadena, fecha, booleano, etc.). La declaración de variables permite varias cosas:
    • conocer el espacio de memoria necesario para la variable, ya que los diferentes tipos de datos requieren diferentes espacios de memoria
    • verificar la coherencia del programa. Así, si i es un entero y c una cadena de caracteres, multiplicar i por c no tiene ningún sentido. Si el programador ha declarado el tipo de las variables i y c, el programa encargado de analizar el código antes de su ejecución puede señalar dicha incoherencia.

Al igual que la mayoría de los lenguajes de script de tipo de datos único (Perl, Python, Javascript, etc.), VBScript permite no declarar las variables. Esto es lo que se ha hecho en el ejemplo anterior.

  • Observemos la sintaxis de los diferentes datos
    • 10,2 en la línea 10 (punto decimal, no coma). Cabe señalar que en la pantalla se muestra 10,2.
    • 1.4e-2 en la línea 13 (notación científica). En la pantalla se muestra el número 0,014
    • [#01/10/2002#] (línea 26) para representar la fecha del 10 de enero de 2002. Por lo tanto, VBScript utiliza el formato #mm/dd/aaaa# para representar la fecha jj del mes mm del año aaaa
    • los booleanos true y false (verdadero/falso) en las líneas 31 y 34. Estos dos valores se representan respectivamente por los enteros -1 y 0, como se muestra en las líneas 32 y 35. Cuando se concatena un valor booleano con una cadena de caracteres, estos valores se convierten, respectivamente, en las cadenas «Vrai» y «Faux», tal y como muestran las líneas 33 y 36. Cabe señalar, de paso, que el operador de concatenación & puede utilizarse para concatenar otros elementos además de cadenas.
  • Dado que una variable v no tiene un tipo asignado, puede albergar sucesivamente en el tiempo valores de diferentes tipos.

3.5. L os subtipos del tipo variant

Esto es lo que dice la documentación oficial sobre los diferentes tipos de datos que puede contener un variant:

Más allá de la simple distinción entre número y cadena, un Variant puede distinguir diferentes tipos de información numérica. Por ejemplo, cierta información numérica representa una fecha o una hora. Cuando esta información se utiliza con otros datos de fecha u hora, el resultado siempre se expresa en forma de fecha u hora. También dispone de otros tipos de información numérica, desde valores booleanos hasta grandes números de coma flotante. Estas diferentes categorías de información que pueden contenerse en un Variant son subtipos. En la mayoría de los casos, basta con colocar los datos en un Variant y este se comportará de la forma más adecuada en función de dichos datos.

La siguiente tabla presenta los diferentes subtipos que puede contener un Variant.

Subtipo
Descripción
Empty
El Variant no está inicializado. Su valor es igual a cero para las variables numéricas y a una cadena de longitud nula («») para las variables de cadena.
Null
El Variant contiene datos incorrectos de forma intencionada.
Boolean
Contiene True (verdadero) o False (falso).
Byte
Contiene un entero de 0 a 255.
Integer
Contiene un entero de -32 768 a 32 767.
Moneda
-922 337 203 685 477,5808 a 922 337 203 685 477,5807.
Long
Contiene un entero de -2 147 483 648 a 2 147 483 647.
Single
Contiene un número de coma flotante de precisión simple de -3,402823E38 a -1,401298E-45 para los valores negativos; de 1,401298E-45 a 3,402823E38 para los valores positivos.
Doble
Contiene un número de coma flotante de precisión doble de -1,79769313486232E308 a -4,94065645841247E-324 para los valores negativos; de 4,94065645841247E-324 a 1,79769313486232E308 para los valores positivos.
Fecha (Hora)
Contiene un número que representa una fecha comprendida entre el 1 de enero de 100 y el 31 de diciembre de 9999.
Cadena
Contiene una cadena de longitud variable limitada a unos 2000 millones de caracteres.
Objeto
Contiene un objeto.
Error
Contiene un número de error.

3.6. C onocer el tipo exacto de los datos contenidos en un variant

Una variable de tipo variante puede contener datos de diversos tipos. A veces necesitamos conocer la naturaleza exacta de estos datos. Si en un programa escribimos produit=nombre1*nombre2, suponemos que nombre1 y nombre2 son dos datos numéricos. A veces no estamos seguros, ya que estos valores pueden provenir de una entrada por teclado, de un archivo o de cualquier fuente externa. Por lo tanto, debemos verificar la naturaleza de los datos almacenados en nombre1 y nombre2. La función typename(var) nos permite conocer el tipo de datos contenidos en la variable var. A continuación se muestran algunos ejemplos:

Programa
Resultados
var=1,type=Integer
var=deux,type=String
var=Vrai,type=Boolean
var=4,5,type=Double
var=11/10/01,type=Date

Otra función posible es vartype(var), que devuelve un número que representa el tipo de los datos contenidos en la variable var:

Constante
Valor
Descripción
vbEmpty
0
Vacío (sin inicializar)
vbNull
1
Nulo (sin datos válidos)
vbInteger
2
Entero
vbLong
3
Entero largo
vbSingle
4
Número de coma flotante de precisión simple
vbDouble
5
Número de coma flotante de doble precisión
vbCurrency
6
Monetario
vbDate
7
Fecha
vbString
8
Cadena
vbObject
9
Objeto de automatización
vbError
10
Error
vbBoolean
11
Booleano
vbVariant
12
Variante (solo se utiliza con matrices de variantes)
vbDataObject
13
Objeto no Automation
vbByte
17
Byte
vbArray
8192
Tabla

Nota: Estas constantes están especificadas por VBScript. Por lo tanto, los nombres se pueden utilizar en cualquier parte del código en lugar de los valores reales.

La información anterior procede de la documentación de VBscript. En ocasiones es incorrecta, probablemente debido a copias y pegados realizados a partir de la documentación de VB. La función vartype de VBScript solo realiza una parte de lo que se indica anteriormente.

El programa anterior, reescrito para vartype, ofrece los siguientes resultados:

Programa
Resultados
var=1,type=2
var=deux,type=8
var=Vrai,type=11
var=4,5,type=5
var=11/10/01,type=7

3.7. D eclarar las variables utilizadas por el script

Hemos indicado que no es obligatorio declarar las variables utilizadas por el script. En este caso, si escribimos:


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

con un error tipográfico smme en lugar de suma en la instrucción 2, VBScript no señalará ningún error. Supondrá que smme es una nueva variable. La creará y, en el contexto de la instrucción 2, la utilizará inicializándola a 0.

Este tipo de errores puede ser muy difícil de detectar. Por lo tanto, se recomienda forzar la declaración de las variables con la directiva «option explicit» colocada al principio del script. A continuación, toda variable debe declararse con una instrucción «dim» antes de su primer uso:


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

En este ejemplo, VBScript indicará que hay una variable no declarada, tal y como se muestra en el siguiente ejemplo:

Programa
Resultados
dim1.vbs(9, 1) Erreur d'exécution Microsoft
 VBScript: Variable non définie: 'smme'

Aunque en los breves ejemplos del documento las variables no suelen declararse, nos veremos obligados a declararlas en cuanto empecemos a escribir los primeros scripts importantes. En ese momento, se utilizará sistemáticamente la directiva Option explicit.

3.8. : funciones de conversión

VBScript transforma los datos de las variantes en cadenas, números, booleanos, etc., según el contexto. La mayoría de las veces, esto funciona bien, pero a veces da algunas sorpresas, como veremos más adelante. Por lo tanto, puede que queramos «forzar» el tipo de datos de la variante. VBscript cuenta con funciones de conversión que transforman una expresión en diversos tipos de datos. Estas son algunas de ellas:

Cint (expresión)
convierte la expresión en un entero corto (integer)
Clng (expresión)
convierte la expresión en un entero largo (long)
Cdbl (expresión)
convierte la expresión en un número real de doble precisión (double)
Csng (expresión)
convierte la expresión en un número real simple (single)
Ccur (expresión)
convierte la expresión en un dato monetario (currency)

He aquí algunos ejemplos:

Programa
Resultados

var=4,code type=8,nom type=String
var=4,code type=2,nom type=Integer
var=1000000,code type=8,nom type=String
var=1000000,code type=3,nom type=Long
var=3,4e-5,code type=8,nom type=String
var=0,000034,code type=5,nom type=Double
var=3,4e-5,code type=8,nom type=String
var=0,000034,code type=4,nom type=Single
var=1000,45,code type=8,nom type=String
var=1000,45,code type=6,nom type=Currency
var=14,code type=2,nom type=Integer
var=14,code type=8,nom type=String
var=1000,45,code type=5,nom type=Double
var=1000,code type=2,nom type=Integer
var=1000,75,code type=5,nom type=Double
var=1001,code type=2,nom type=Integer

3.9. L eer datos introducidos mediante el teclado

El objeto wscript permite a un script recuperar datos introducidos mediante el teclado. El método wscript.stdin.readLine permite leer una línea de texto introducida mediante el teclado y validada con la tecla «Intro». Esta línea leída se puede asignar a una variable.

Programa
Resultados

Tapez votre nom : st
Bonjour st

Comentarios:

  • En la columna de resultados y en la línea [Tapez votre nom : st], st es la línea introducida por el usuario.

Si el texto introducido con el teclado representa un número, se considera ante todo como una cadena de caracteres, tal y como muestra el ejemplo siguiente:

Programa
Resultados
Tapez un nombre : 14
nombre lu=14,type=String

Si este número interviene en una operación aritmética, VBscript convertirá automáticamente la cadena en un número, pero no siempre. Veamos el siguiente ejemplo:

Programa
Resultados
1
2
3
4
5
6
nombre1 : 3
nombre2 : 4
3+4=34
3-4=-1
3x4=12
3/4=0,75

En los resultados, vemos que la línea 8 del script no se ha ejecutado como se esperaba, ya que (por desgracia) en VBScript el operador + tiene dos significados: suma de dos números o concatenación de dos cadenas (las dos cadenas se unen entre sí). Anteriormente vimos que los números introducidos con el teclado se leían como cadenas de caracteres y que VBScript las transformaba en números según fuera necesario. Lo hizo correctamente para las operaciones -, *, /, que solo pueden involucrar números, pero no para el operador +, que también puede involucrar cadenas. En este caso, ha supuesto que se quería realizar una concatenación de cadenas.

Una solución sencilla a este problema es convertir las cadenas en números en el momento de su lectura, tal y como muestra la siguiente mejora del programa anterior:

Programa
Resultados
nombre1 : 3
nombre1=3,type=String
nombre1=3,type=Long
nombre2 : 4
nombre2=4,type=String
nombre2=4,type=Long
3+4=7
3-4=-1
3x4=12
3/4=0,75

3.10. S Introducir datos con la función inputbox

Es posible que se desee introducir datos en una interfaz gráfica en lugar de hacerlo mediante el teclado. En ese caso, se utiliza la función inputBox. Esta admite numerosos parámetros, de los cuales solo los dos primeros se utilizan con frecuencia:

respuesta=inputBox(mensaje,título)

  • mensaje: la pregunta que se le plantea al usuario
  • título (opcional): el título que le da a la ventana de entrada
  • respuesta: el texto introducido por el usuario. Si este ha cerrado la ventana sin responder, respuesta es la cadena vacía.

A continuación se muestra un ejemplo en el que se solicita el nombre y la edad de una persona. Para el nombre, se proporciona una información y se ejecuta OK. Para la edad, también se proporciona una información, pero se ejecuta Cancelar.

Programa
Resultados

3.11. U tilizar objetos estructurados

Con VBScript es posible crear objetos que tengan métodos y propiedades. Para no complicar las cosas, aquí vamos a presentar un objeto con propiedades, pero sin métodos. Pensemos en una persona. Tiene muchas propiedades que la caracterizan: altura, peso, color de piel, de ojos, de pelo... Nos quedaremos solo con dos: su nombre y su edad. Antes de poder utilizar objetos, hay que crear el molde que permitirá fabricarlos. En VBScript, esto se hace mediante una clase. La clase personne podría definirse de la siguiente manera:


class personne
    Dim nom,age
End class

Es la instrucción [Dim nom,age] la que define las dos propiedades de la clase personne. Para crear ejemplares (lo que se conoce como instancias) de la clase personne, se escribe:

set personne1=new personne
set personne2=new personne

¿Por qué no escribir

personne1=new personne
personne2=new personne

Porque una variante no puede contener un objeto. Solo puede contener su dirección. Al escribir set persona1=new persona, tiene lugar la siguiente secuencia de eventos:

  1. se crea un objeto personne. Esto significa que se le asigna memoria.
  2. La dirección de este objeto personne se asigna a la variable personne1

Tenemos entonces el siguiente esquema de memoria para las variables personne1 y personne2:

Por licencia poética, podríamos decir que personne1 es un objeto personne. Podemos aceptar este uso coloquial si recordamos que personne1 es, de hecho, la dirección de un objeto personne y no el propio objeto personne.

Hemos dicho que un objeto personne tenía dos propiedades: nom y age. ¿Cómo se pueden utilizar estas propiedades? Mediante la notación objet.propriété, tal y como se ha explicado anteriormente. Así,

personne1.nom designa el nombre de la persona 1 y personne1.age su edad. He aquí un breve programa ilustrativo:

Programa
Resultados
p1=(dupont,18)

El programa anterior podría modificarse de la siguiente manera:

Programa
Resultados
nom=dupont
age=18

Aquí hemos utilizado la estructura with ... end with, que permite «factorizar» nombres de objetos en expresiones. La estructura with p1 ... end with de las líneas 9-12 y 15-18 permite utilizar a continuación la sintaxis .nom en lugar de p1.nom y .age en lugar de p1.age. Esto permite simplificar la escritura de las instrucciones en las que se utiliza repetidamente el mismo nombre de objeto.

3.12. Asignar un valor a una variable

Hay dos instrucciones para asignar un valor a una variable:

  1. variable=expresión
  2. set variable=expresión

La forma 2 está reservada para expresiones cuyo resultado es una referencia de objeto. Para todos los demás tipos de expresiones, se utiliza la forma 1. La diferencia entre ambas formas es la siguiente:

  • en la instrucción variable=expression, variable recibe un valor. Si v1 y v2 son dos variables, escribir v1=v2 asigna el valor de v1 a v2. Por lo tanto, se produce la duplicación de un valor en dos lugares diferentes. Si posteriormente se modifica el valor de v2, el de v1 no se ve afectado en absoluto.
  • En la instrucción set variable=expresión, la variable recibe como valor la dirección de un objeto. Si v1 y v2 son dos variables y v2 es la dirección de un objeto obj2, escribir set v1=v2 asigna el valor de v1 a v2, es decir, la dirección del objeto obj2. Cuando el script manipula posteriormente v1 y v2, no son los «valores» de v1 y v2 los que se manipulan, sino los objetos a los que «apuntan» v1 y v2, es decir, el mismo objeto en este caso. Se dice que v1 y v2 son dos referencias al mismo objeto y que manipular este último a través de v1 o v2 no supone ninguna diferencia. Dicho de otro modo, modificar el objeto al que hace referencia v2 modifica el que hace referencia v1.

He aquí un ejemplo:

Programa
Resultados
i=4
j=4
i=4
j=5
p1.nom=dupont
p1.age=18
p1.nom=dupont
p1.age=19
p2.nom=dupont
p2.age=19

3.13. E valuar expresiones

Los principales operadores que permiten evaluar expresiones son los siguientes:

Tipo de operadores
Operadores
Ejemplo
Aritméticos
+,-,*,/
 
  
  
  
   
Comparación
<, <=
>, >=
=,<>
a<>b es verdadero si a es diferente de b
a=b es verdadero si a es igual a b
a y b pueden ser ambos números o ambas cadenas de caracteres. En este último caso, cadena1<cadena2 si, en orden alfabético, cadena1 precede a cadena2. En la comparación de cadenas, las mayúsculas preceden a las minúsculas en el orden alfabético.
  
   
Lógica
and, or, not, xor
Aquí todos los operandos son booleanos.
bool1 or bool2 es verdadero si bool1 o bool2 es verdadero
bool1 and bool2 es verdadero si bool1 y bool2 son verdaderos
not bool1 es verdadero si bool1 es falso y viceversa
bool1 xor bool2 es verdadero si solo uno de los booleanos bool1 o bool2 es verdadero
   
Concatena
&, +
No se recomienda utilizar el operador + para concatenar dos cadenas debido a la posible confusión con la suma de dos números. Por lo tanto, se utilizará exclusivamente el operador &.

3.14. C ontrolar la ejecución del programa

3.14.1. E ejecutar acciones de forma condicional

La instrucción de VBScript que permite realizar acciones en función del valor verdadero/falso de una condición es la siguiente:

if expression then
    action-vrai-1
    action-vrai-2
    ..
else
    action-faux-1
    action-faux-2
    ...
end if
En primer lugar, se evalúa la expresión expression. Esta expresión debe tener un valor booleano. Si su valor es verdadero, se ejecutan las acciones de then; de lo contrario, se ejecutan las de else, si está presente.

A continuación se muestra un programa con diferentes variantes del if-then-else:

Programa
Resultados
1
2
3
4
5
3 est plus grand que 0
3 est plus grand que 2
i=4
4 est plus petit que 10
i=3

Comentarios:

  • En VBScript, se puede escribir instrucción1:instrucción2:... : instrucciónn en lugar de escribir una instrucción por línea. Esta posibilidad se ha aprovechado, por ejemplo, en la línea 10.

3.14.2. E ejecutar acciones de forma repetida

Bucle con número de iteraciones conocido

for i=idébut to ifin step ipas
    actions
next
  1. La variable i se denomina aquí variable de bucle. Puede tener cualquier nombre
  2. i toma el valor idebut
  3. el valor de i se compara con ifin. Si i <= ifin, se ejecutan las acciones situadas entre for... next
  4. i se incrementa en la cantidad ipas (i = i + ipas)
  5. Se vuelve al paso 3 anterior. Tras un número finito de pasos, el valor de i superará a ifin. La ejecución del script continúa con la instrucción que sigue a next
  6. si el incremento ipas es negativo, se modifica la condición del paso 3. Solo se ejecutan las acciones de for...next si i >= ifin.
Se puede salir de un bucle «for» en cualquier momento con la instrucción «exit for».
Bucle con número de iteraciones desconocido
do while condition
    actions
loop
  1. Se evalúa la expresión de condición. Si es verdadera, se ejecutan las acciones de while...loop
  2. Las acciones ejecutadas pueden haber modificado el valor de la condición. Se vuelve al paso 1 anterior.
  3. Cuando la expresión de condición pasa a ser falsa, el bucle finaliza
Se puede salir de un bucle do while en cualquier momento con la instrucción exit do.

El siguiente programa ilustra estos puntos:

Programa
Resultados
i=0,tableau(i)=10,somme=10
i=1,tableau(i)=20,somme=30
i=2,tableau(i)=30,somme=60
i=3,tableau(i)=40,somme=100
i=0,tableau(i)=10,somme=10
i=1,tableau(i)=20,somme=30
i=2,tableau(i)=30,somme=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: En la fase de desarrollo de un programa, no es raro que un programa «entre en bucle», c.a.d, y no se detenga nunca. Por lo general, el programa ejecuta un bucle cuya condición de salida no se puede verificar, como por ejemplo en el siguiente ejemplo:


' bucle infinito
i=0
Do While 1=1
  i=i+1
  wscript.echo i
Loop

' otra del mismo tipo
i=0
Do While true
  i=i+1
  wscript.echo i
Loop

Si se ejecuta el programa anterior, el primer bucle nunca se detendrá por sí solo. Se puede forzar su detención escribiendo CTRL-C en el teclado (teclas CTRL y C pulsadas al mismo tiempo).

3.14.3. Finalizar la ejecución del programa

La instrucción wscript.quit n finaliza la ejecución del programa devolviendo un código de error igual a n. En DOS, este código de error se puede comprobar con la instrucción if ERRORLEVEL n, que es verdadera si el código de error devuelto por el último programa ejecutado es >=n. Consideremos el siguiente programa y sus resultados:

  
début

Justo después de la ejecución del programa, se emiten los tres comandos DOS siguientes:

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

El comando DOS 1 comprueba si el código de error devuelto por el programa es >=5. Si es así, muestra (echo) 5; de lo contrario, nada.

El comando DOS 3 comprueba si el código de error devuelto por el programa es >=4. Si es así, muestra 4; de lo contrario, no muestra nada.

El comando DOS 5 comprueba si el código de error devuelto por el programa es >=3. Si es así, muestra 3; de lo contrario, no muestra nada.

De los resultados mostrados, se deduce que el código de error devuelto por el programa era 4.

3.15. L a tablas de datos en una variante

Una variante T puede contener una lista de valores. En ese caso, se dice que es una matriz. Una matriz T tiene varias propiedades:

  • se accede al elemento i de la matriz T mediante la sintaxis T(i), donde i es un entero llamado índice comprendido entre 0 y n-1 si T tiene n elementos.
  • Se puede conocer el índice del último elemento de la matriz T con la expresión ubound(T). El número de elementos de la matriz T es entonces ubound(T)+1. A este número se le suele llamar el tamaño de la matriz.
  • Una variante T se puede inicializar con una matriz vacía mediante la sintaxis T=array() o con una secuencia de elementos mediante la sintaxis T=array(elemento0, elemento1, ...., elementoN)
  • Se pueden añadir elementos a una matriz T ya creada. Para ello, se utiliza la instrucción redim preserve T(N), donde N es el nuevo índice del último elemento de la matriz T. La operación se denomina redimensionamiento (redim). La palabra clave preserve indica que, durante este redimensionamiento, se debe conservar el contenido actual de la matriz. En ausencia de esta palabra clave, T se redimensiona y se vacía de sus elementos.
  • Un elemento T(i) de la matriz T es de tipo variant y, por lo tanto, puede contener cualquier valor y, en particular, una matriz. En este caso, la notación T(i)(j) designa el elemento j de la matriz T(i).

Estas diversas propiedades de las matrices se ilustran en el siguiente programa:

Programa
Resultados
Le tableau t1 a 5 éléments
t1(0)=1
t1(1)=-4,5
t1(2)=deux
t1(3)=Vrai
t1(4)=10/01/02
t1=1:-4,5:deux:Vrai:10/01/02
t1(5)=10:20:30
t1(5)(1)=20
t1=1 ~ -4,5 ~ deux
t1=:::

Comentarios

  • Aquí se ha utilizado una función llamada «join», que se explica con más detalle más adelante.

3.16. L as variables de matriz

En VBScript existe otra forma de utilizar una matriz: mediante una variable de matriz. A diferencia de las variables escalares, este tipo de variable debe declararse obligatoriamente mediante una instrucción dim. Existen varias formas de declaración:

  • dim matriz(n) declara una matriz estática de n+1 elementos numerados del 0 al n. Este tipo de matriz no se puede redimensionar
  • dim matriz() declara una matriz dinámica vacía. Deberá redimensionarse para poder utilizarse mediante la instrucción redim, del mismo modo que para un variante que contenga una matriz
  • dim matriz(n,m) declara una matriz bidimensional de (n+1)*(m+1) elementos. El elemento (i,j) de la matriz se denota como tableau(i,j). Cabe destacar la diferencia con un variant, donde el mismo elemento se habría denotado como tableau(i)(j).

¿Por qué existen dos tipos de matrices que, en definitiva, son muy similares? La documentación de VBScript no lo menciona y tampoco indica si una es más eficiente que la otra. A partir de ahora, utilizaremos casi exclusivamente la matriz dentro de una variante en nuestros ejemplos. Sin embargo, recordaremos que VBscript deriva del lenguaje Visual Basic, que contiene datos tipados (integer, double, boolean, ...). En este caso, si debemos utilizar una matriz de números reales, por ejemplo, la variable matriz será más eficiente que la variable variante. Entonces declararemos algo como dim tabla(1000) as double para declarar una matriz de números reales o simplemente dim tabla() as double si la matriz es dinámica.

A continuación se muestra un ejemplo que ilustra el uso de variables de matriz:

Programa
Resultados
Le tableau t1 a 5 éléments
t1(0)=1
t1(1)=-4,5
t1(2)=deux
t1(3)=Vrai
t1(4)=10/01/02
t1=1:-4,5:deux:Vrai:10/01/02
Le tableau t1 a 5 éléments
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 funciones split y join

Las funciones split y join permiten pasar de una cadena de caracteres a una matriz y viceversa:

  • Si T es una matriz y car una cadena de caracteres, join(T,car) es una cadena de caracteres formada por la unión de todos los elementos de la matriz T, cada uno de ellos separado del siguiente por la cadena car. Así, join(array(1,2,3),"abcd") dará como resultado la cadena "1abcd2abcd3"
  • Si C es una cadena de caracteres formada por una secuencia de campos separados por la cadena car, la función split(C,car) es una matriz cuyos elementos son los distintos campos de la cadena C. Así, split("1abcd2abcd3","abcd") dará como resultado la matriz (1,2,3)

He aquí un ejemplo:

Programa
Resultados

' transformación de matriz a cadena y viceversa

' matriz --> cadena
tableau=array("un",2,"trois")
chaine=join(tableau,",")
wscript.echo chaine

' cadena --> matriz
tableau2=split(chaine,",")
For i=0 To ubound(tableau2)
  wscript.echo tableau2(i)
Next

un,2,trois
un
2
trois

3.18. Los diccionarios

Se accede a un elemento de una matriz T cuando se conoce su número i. En ese caso, se puede acceder a él mediante la notación T(i). Existen matrices a cuyos elementos no se accede mediante un número, sino mediante una cadena de caracteres. El ejemplo típico de este tipo de matriz es el diccionario. Cuando se busca el significado de una palabra en el «Larousse» o en «Le petit Robert», se accede a él mediante la palabra. Se podría representar este diccionario mediante una matriz de 2 columnas:

palabra1
descripción1
palabra2
descripción2
palabra3
descripción3
....
 

Entonces podríamos escribir cosas como:

diccionario("palabra1")="descripción1"

diccionario("palabra2")="descripción2"

...

Esto se parece mucho al funcionamiento de una matriz, salvo que los índices de la matriz no son números enteros, sino cadenas de caracteres. A este tipo de matriz se le llama diccionario (o matriz asociativa, tabla hash) y a los índices, que son cadenas de caracteres, se les llama claves del diccionario (keys). El uso de diccionarios es extremadamente frecuente en el mundo de la informática. Todos tenemos una tarjeta de la Seguridad Social con un número. Este número nos identifica de forma única y da acceso a la información que nos concierne. En el modelo diccionario("clave")="información", «clave» sería aquí el número de la Seguridad Social e «información» toda la información almacenada sobre nosotros en los ordenadores de la Seguridad Social.

En Windows, se dispone de un objeto ActiveX llamado «Scripting.Dictionary» que permite crear y gestionar diccionarios. Un objeto ActiveX es un componente de software que expone una interfaz utilizable por programas que pueden estar escritos en diferentes lenguajes, siempre que respeten el estándar de uso de los objetos ActiveX. Por lo tanto, el objeto Scripting.dictionary puede utilizarse con los lenguajes de programación de Windows: JavaScript, Perl, Python, C, C++, VB, VBA... y no solo con VBScript.

1
Un objeto Scripting.Dictionary se crea mediante una instrucción
set dico=wscript.CreateObject("Scripting.Dictionary")
o simplemente
set dico=CreateObject("Scripting.Dictionary")
CreateObject es un método del objeto WScript que permite crear instancias de objetos ActiveX. La versión 2 muestra que wscript puede ser un objeto implícito. Cuando un método no puede «asociarse» a un objeto, el contenedor WSH intentará asociarlo al objeto wscript.
2
Una vez creado el diccionario, podremos añadirle elementos con el método add:
dico.add «clave»,valor
creará una nueva entrada en el diccionario asociada a la clave «clave». El valor asociado es un variante que contiene cualquier dato.
3
Para recuperar el valor asociado a una clave determinada, se utiliza el método item del diccionario:
var=dico.item("clave")
o set var=dico.item("clave") si el valor asociado a la clave es un objeto.
4
El conjunto de claves del diccionario se puede recuperar en una matriz variable gracias al método keys:
claves=diccionario.keys
claves es una matriz cuyos elementos se pueden recorrer.
5
El conjunto de valores del diccionario se puede recuperar en una matriz variable mediante el método items:
valores = dic.items
items es una matriz cuyos elementos se pueden recorrer.
6
Se puede comprobar la existencia de una clave con el método exists:
dico.exists("clave") es verdadero si la clave "clave" existe en el diccionario
7
Se puede eliminar una entrada del diccionario (clave+valor) con el método remove:
dico.remove("clave") elimina la entrada del diccionario asociada a la clave "clave". dico.removeall elimina todas las claves, c.a.d vacía el diccionario.

El siguiente programa utiliza estas diversas posibilidades:

Programa


' creación y uso de un diccionario
Set dico=CreateObject("Scripting.Dictionary")

' rellenar diccionario
dico.add "clé1","valeur1"
dico.add "clé2","valeur2"
dico.add "clé3","valeur3"

' número de elementos
wscript.echo "Le dictionnaire a " & dico.count & " éléments"

' lista de claves
wscript.echo "liste des clés"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo cles(i)
Next

' lista de valores
wscript.echo "liste des valeurs"
valeurs=dico.items
For i=0 To ubound(valeurs)
  wscript.echo valeurs(i)
Next

' lista de claves y valores
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

' búsqueda de elementos
' clave1
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
' clave4
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

' se elimina la clave 1
dico.remove("clé1")

' lista de claves y valores
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

' se elimina todo
dico.removeall

' lista de claves y valores
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

' fin
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 una matriz o un diccionario

Es habitual querer ordenar una matriz o un diccionario en orden ascendente o descendente según sus valores o, en el caso de un diccionario, según sus claves. Aunque en la mayoría de los lenguajes existen funciones de ordenación, no parece haberlas en VBScript. Es una carencia.

3.20. Los argumentos de un programa

Es posible llamar a un programa de VBScript pasándole parámetros, como en:

cscript prog1.vbs arg1 arg2 .... argn

Esto permite al usuario pasar información al programa. ¿Cómo hace este para recuperarla? Veamos el siguiente programa:

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

Il y a 3 arguments
a
b
c

Comentarios

  • WScript.Arguments es la colección de argumentos pasados al script
  • una colección C es un objeto que tiene
    • una propiedad count que es el número de elementos de la colección
    • un método C(i) que devuelve el elemento i de la colección

3.21. Una primera aplicación: IMPOTS

Nos proponemos escribir un programa que permita calcular el impuesto de un contribuyente. Consideramos el caso simplificado de un contribuyente que solo tiene que declarar su salario:

  • se calcula el número de partes del asalariado nbParts=nbEnfants/2 +1 si no está casado, nbEnfants/2+2 si está casado, donde nbEnfants es el número de hijos que tiene.
  • se calcula su renta imponible R = 0,72 * S, donde S es su salario anual
  • se calcula su coeficiente familiar Q = R/N

se calcula su impuesto I a partir de los siguientes datos

12620,0
0
0
13 190
0,05
631
15640
0,1
1290,5
24 740
0,15
2072,5
31 810
0,2
3309,5
39 970
0,25
4900
48 360
0,3
6898,5
55 790
0,35
9316,5
92 970
0,4
12106
127860
0,45
16754,5
151 250
0,50
231 47,5
172 040
0,55
30710
195 000
0,60
39312
0
0,65
49062

Cada línea tiene 3 campos. Para calcular el impuesto I, se busca la primera línea donde QF<=campo1. Por ejemplo, si QF=30000, se encontrará la línea

    24740        0.15        2072.5

El impuesto I es entonces igual a 0,15*R - 2072,5*nbParts. Si QF es tal que la relación QF<=campo1 nunca se cumple, entonces se utilizan los coeficientes de la última línea. En este caso:

    0                0.65        49062

lo que da el impuesto I = 0,65 * R - 49062 * nbParts.

El programa es el siguiente:

Programa

' cálculo del impuesto de un contribuyente
' el programa debe ejecutarse con tres parámetros: casado, hijos, salario
' casado: carácter O si está casado, N si no lo está
' hijos: número de hijos
' salario: salario anual sin céntimos

' no se comprueba la validez de los datos, pero
' se comprueba que haya tres

' declaración obligatoria de las variables
Option Explicit

' se comprueba que haya 3 argumentos
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"
     ' parada con código de error 1
    wscript.quit 1
End If

' se recuperan los argumentos sin comprobar su validez
Dim marie, enfants, salaire
If wscript.arguments(0) = "O" Or wscript.arguments(0)="o" Then
    marie=true
Else
    marie=false
End If
' «hijos» es un número entero
enfants=cint(wscript.arguments(1))
' salario es un entero largo
salaire=clng(wscript.arguments(2))

' se definen los datos necesarios para el cálculo del impuesto en 3 tablas
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)

' se calcula el número de participaciones
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

' se calcula el coeficiente familiar y la base imponible
Dim revenu, qf
revenu=0.72*salaire
qf=revenu/nbParts

' se calcula el impuesto
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))

' se muestra el resultado
wscript.echo "impôt=" & impot

' salimos sin errores
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

Comentarios:

  • el programa utiliza lo que se ha expuesto anteriormente (declaración de variables, argumentos, cambios de tipo, comprobaciones, bucles, matriz en un variante)
  • No comprueba la validez de los datos, lo que sería inusual en un programa real
  • solo el bucle while presenta una dificultad. Busca determinar el índice i de la matriz límites para el que se cumple límites(i)>qf y esto para i<ubound(límites) (c.a.d. aquí i<13) ya que el último elemento de la matriz límites no es significativo. Se ha añadido únicamente para que la prueba [Do While i<ubound(limites) And qf>limites(i)] pueda realizarse para i=13. La prueba es entonces 13<13 y qf>limites(13) y, por lo tanto, es necesario (en VBScript) que limites(13) exista. Al salir del bucle while, el último valor de i calculado permite calcular el impuesto: [impot=int(revenu*coeffr(i)-nbParts*coeffn(i))].