Skip to content

3. Los fundamentos de la programación VBSCRIPT

Una vez descritos los posibles contextos de ejecución de un vbscript script, pasamos a hablar del lenguaje en sí. En lo que sigue, asumimos las siguientes condiciones:

  1. el contenedor script es WSH
  2. el script se coloca en un archivo con sufijo .vbs

Para presentar un concepto, en general operamos del siguiente modo:

  • introducir el concepto si es necesario
  • se presenta un programa ilustrativo y sus resultados
  • comentar los resultados y el programa si es necesario

Los contenedores vbscript no distinguen entre mayúsculas y minúsculas en el texto script. Por lo tanto, es posible escribir wscript.echo "peekaboo o WSCRIPT.ECHO "peekaboo.

Los programas presentados en la siguiente sección hacen mucha escritura en la pantalla, así que vamos a reintroducir los métodos para escribir el objeto wscript.

3.1. Mostrar información

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

Programa
Resultados
1
2
3
4
un
deuxtrois
quatre
cinq

Hay que tener en cuenta los siguientes puntos:

  • Cualquier texto colocado después de un apóstrofo es considerado como un comentario por 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)
  • una marca de fin de línea está representada por la secuencia de dos caracteres con códigos ASCII 13 y 10. Por ejemplo, la línea 4 está representada por la expresión chr(13) & chr(10) donde chr(i) es el carácter de código ASCII i y & es el operador de concatenación de cadenas. Así, "chat" & "eau" es la cadena "chateau".
  • la marca de fin de línea puede representarse más fácilmente mediante la constante vbCRLF (línea 5)

3.2. Eescribir instrucciones en un script Vbscript

Por defecto, se escribe una instrucción por línea. Sin embargo, puede escribir varias instrucciones por línea, separándolos con el carácter :, como en inst1:inst2:inst3. Si una línea es demasiado larga, puede cortarse en trozos. A continuación, las distintas partes de la instrucción deben terminarse con los dos caracteres (espacio)_. Tomemos el ejemplo anterior y reescribamos las instrucciones de otra manera:

Programa
Resultados
1
2
3
4
un
deuxtrois
quatre
cinq

3.3. Escribir con la función msgBox

Aunque utilizamos el wscript para escribir en la pantalla, esta vez existe una función más sofisticada para mostrar información en una ventana. Se trata de la función msgbox que se utiliza generalmente con tres parámetros:

msgbox mensaje, iconos+botones, título

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

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

Constante
Valor
Descripción
vbOKOnly
   0
Muestra sólo el OK.
vbOKCancel
   1
Muestra los botones OK y Cancelar.
vbAbortRetryIgnore
   2
Muestra los botones Abandone, Inténtalo de nuevo y Ignore.
vbYesNoCancel
   3
Muestra los botones , No y Cancelar.
vbYesNo
   4
Muestra los botones y No.
vbRetryCancel
   5
Muestra los botones Inténtalo de nuevo y Cancelar.
vbCritical
16
Muestra el icono de mensaje crítico.
vbQuestion
32
Muestra el icono de solicitud de advertencia.
vbExclamation
48
Muestra el icono de mensaje de advertencia.
vbInformation
64
Muestra el icono de mensaje de información.
vbDefaultButton1
   0
El primer botón es el botón por defecto.
vbDefaultButton2
 256
El segundo botón es el botón por defecto.
vbDefaultButton3
 512
El tercer botón es el botón por defecto.
vbDefaultButton4
 768
El cuarto botón es el botón por defecto.
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 responde al mensaje.

He aquí algunos ejemplos:

Programa
Resultados
 
 

En algunos casos, presentamos una ventana de información que es también una ventana de entrada. Si hacemos una pregunta, por ejemplo, queremos saber si el usuario ha hecho clic en el botón o en el no. La función msgBox devuelve un resultado que no hemos utilizado en el programa anterior. 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
Abandone
vbRetry
4
Inténtalo de nuevo
vbIgnore
5
Ignore
vbYes
6
vbNo
7
No

El siguiente programa muestra cómo utilizar el resultado de la función msgBox. Se muestra 4 veces una ventana con los botones sí, no y cancelar. La respuesta es la siguiente:

  1. haga clic en sí
  2. haga clic en no
  3. haga clic en cancelar
  4. cerrar la ventana sin utilizar un botón. El programa muestra que es lo mismo que utilizar el botón Cancelar.
Programa
Resultados

3.4. Les datos utilizables en Vbscript

VBscript sólo conoce un tipo de datos: los variante. El valor de una variante puede ser un número (4, 10.2), una cadena de caracteres ("hola"), un 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 array.

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 :

  • varios lenguajes de programación (C, C++, Pascal, Java, C#, etc.) exigen declarar una variable antes de poder utilizarla. 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 hacer varias cosas:
    • conocer el espacio de memoria necesario para la variable si diferentes tipos de datos requieren diferentes espacios de memoria
    • comprobar la coherencia del programa. Así, si i es un número entero y c una cadena de caracteres, multiplicar i por c no tiene sentido. Si el tipo de variables i y c ha sido declarada por el programador, el programa encargado de analizar el programa antes de su ejecución puede informar de dicha incoherencia.

Como la mayoría de lenguajes script con un único tipo de datos (Perl, Python, Javascript, etc.), Vbscript permite no declarar variables. Esto es lo que se ha hecho en el ejemplo anterior.

  • observe la sintaxis de los diferentes datos
    • 10.2 en la línea 10 (punto decimal, no coma). Observe que aparece 10,2.
    • 1.4e-2 en la línea 13 (notación científica). En pantalla aparecía el número 0,014
    • [#01/10/2002#] (línea 26) para representar la fecha 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 están representados por los enteros -1 y 0 respectivamente, como se muestra en las líneas 32 y 35. Cuando se concatena un booleano con una cadena de caracteres, estos valores se convierten en las cadenas "Verdadero" y "Falso" respectivamente, como se muestra en las líneas 33 y 36. Observe de paso que el operador de concatenación & puede utilizarse para concatenar algo distinto de cadenas.
  • como una variable v no tiene tipo asignado, puede albergar valores de distintos tipos sucesivamente a lo largo del tiempo.

3.5. Los subtipos del tipo variante

Esto es lo que dice la documentación oficial sobre los distintos tipos de datos que puede contener una variante:

Más allá de la simple distinción entre número y cadena, un Variante puede distinguir entre distintos tipos de información digital. Por ejemplo, algunas informaciones digitales representan una fecha o una hora. Cuando esta información se utiliza con otros datos de fecha u hora, el resultado siempre se expresa como fecha u hora. También existen otros tipos de información numérica, desde valores booleanos hasta grandes números en coma flotante. Estas diferentes categorías de información que puede contener un Variante son subtipos. En la mayoría de los casos, basta con colocar los datos en un subtipo Variante y se comporta de la manera más adecuada en función de estos datos.

La siguiente tabla muestra los diferentes subtipos que puede contener un Variante.

Subtipo
Descripción
Empty
Le Variante no se inicializa. Su valor es cero para las variables numéricas y una cadena de longitud cero ("") para las variables de cadena.
Null
Le Variante contiene intencionadamente datos incorrectos.
Boolean
Contiene True (verdadero) o False (falso).
Byte
Contiene un número entero de 0 a 255.
Integer
Contiene un número entero de -32 768 a 32 767.
Currency
-922 337 203 685 477,5808 à 922 337 203 685 477,5807.
Long
Contiene un número entero comprendido entre -2 147 483 648 y 2 147 483 647.
Single
Contiene un número en coma flotante con precisión simple de -3,402823E38 a -1,401298E-45 para valores negativos; de 1,401298E-45 a 3,402823E38 para valores positivos valores positivos.
Double
Contiene un número en coma flotante de doble precisión de -1,79769313486232E308 a -4,94065645841247E-324 para valores negativos; de 4,94065645841247E-324 a 1,79769313486232E308 para valores positivos.
Date (Time)
Contiene un número que representa una fecha comprendida entre el 1 de enero de 100 y el 31 de diciembre de 9999.
String
Contiene una cadena de longitud variable limitada a unos 2.000 millones de caracteres.
Object
Contiene un objeto.
Error
Contiene un número de error.

3.6. Cómo saber el tipo exacto de datos contenidos en una variante

Una variable de tipo variant puede contener datos de varios tipos. A veces necesitamos conocer la naturaleza exacta de estos datos. Si escribimos producto=número1*número2suponemos que número1 y número2 son dos valores numéricos. A veces no podemos estar seguros, porque los valores pueden proceder de una entrada de teclado, de un fichero o de alguna otra fuente externa. Entonces tenemos que comprobar la naturaleza de los datos introducidos en número1 y número2. La función typename(var) nos permite averiguar el tipo de datos que contiene la variable var. He aquí 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 datos contenidos en la variable var :

Constante
Valor
Descripción
vbEmpty
0
Vacío (no inicializado)
vbNull
1
Null (sin datos válidos)
vbInteger
2
Integral
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
Canal
vbObject
9
Objeto de automatización
vbError
10
Error
vbBoolean
11
Booleano
vbVariant
12
Variante (sólo se utiliza con las tablas Variante)
vbDataObject
13
Objeto no automatizado
vbByte
17
Byte
vbArray
8192
Cuadro

Nota   Estas constantes se especifican mediante VBScript. Como resultado, 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. La documentación es a veces incorrecta, probablemente como resultado de copiar y pegar de la documentación VB. La función vartype de VBScript es sólo una parte de lo anunciado anteriormente.

El programa anterior, reescrito para vartype da 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. Declarar 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 sum en la instrucción 2, vbscript no informará de ningún error. Asumirá 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 error puede ser muy difícil de encontrar. Por lo tanto, es aconsejable forzar la declaración de variables mediante el método opción explícita al principio de script. A continuación, cualquier variable debe declararse con un sol antes de utilizarlo por primera vez:

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

En este ejemplo, vbscript indicará que hay una variable no declarada smme en 2), como muestra el siguiente ejemplo:

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

Aunque las variables no se declaran en la mayoría de los ejemplos breves de este documento, obligaremos a declararlas en cuanto escribamos los primeros scripts significativos. El sitio Opción explícita se utilizará sistemáticamente.

3.8. Les funciones de conversión

Vbscript transforma los datos de la variante en cadenas, números, booleanos, etc. dependiendo del contexto. La mayoría de las veces, esto funciona bien, pero a veces puede dar lugar a algunas sorpresas, como veremos más adelante. En este caso, es posible que desee "forzar" el tipo de datos de la variante. VBscript tiene funciones de conversión que transforman una expresión en varios tipos de datos. He aquí algunas de ellas:

Cint (expresión)
transforma la expresión en un entero corto (integer)
Clng (expresión)
transformar expresión en entero long (largo)
Cdbl (expresión)
transforma la expresión en doble real (double)
Csng (expresión)
transforma la expresión en un único real
Ccur (expresión)
transforma la expresión en moneda

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. Leer datos introducidos mediante el teclado

El objeto wscript permite a un script recuperar los datos tecleados en el teclado. El método wscript.stdin.readLine se utiliza para leer una línea de texto escrita en el teclado y confirmada pulsando la tecla "Intro". Esta línea puede asignarse a una variable.

Programa
Resultados
Tapez votre nom : st
Bonjour st

Comentarios :

  • En la columna de resultados y en la fila [Escriba su nombre : st] , st es la línea tecleada por el usuario.

Aunque el texto escrito en el teclado represente un número, sigue considerándose ante todo una cadena de caracteres, como se muestra en el ejemplo siguiente:

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

Si este número se utiliza 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, podemos ver que la línea 8 de script no se ejecutó como se esperaba, porque (desafortunadamente) en vbscript el operador + tiene dos significados: suma de dos números o concatenación de dos cadenas (las dos cadenas se pegan juntas). Anteriormente vimos que los números escritos en el teclado se leían como cadenas y que vbscript los transformaba en números según fuera necesario. Lo ha hecho correctamente para las operaciones -,*,/, que sólo pueden utilizar números, pero no para el operador +, que también puede utilizar cadenas. Aquí ha supuesto que queríamos concatenar cadenas.

Una solución sencilla a este problema es transformar las cadenas en números en cuanto se leen, 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. Sa introducción de datos con la función inputbox

Es posible que desee introducir datos en una interfaz gráfica en lugar de utilizar el teclado. En este caso, utilice la función inputBox. Hay muchos parámetros, pero sólo los dos primeros se utilizan con frecuencia:

reply=inputBox(mensaje,título)

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

He aquí un ejemplo en el que pedimos el nombre y la edad de una persona. Para el nombre, damos alguna información y pulsamos OK. Para la edad, también damos información pero pulsamos Cancelar.

Programa
Resultados

3.11. Utilizar objetos estructurados

Es posible crear objetos con métodos y propiedades utilizando vbscript. Para mantener las cosas simples, vamos a presentar aquí un objeto con propiedades y sin métodos. Consideremos una persona. Tiene muchas propiedades que la caracterizan: altura, peso, color de piel, ojos, pelo, etc. Nos centraremos sólo en dos: su nombre y su edad. Antes de poder utilizar objetos, hay que crear el molde que se utilizará para fabricarlos. Esto se hace en vbscript con un clase. La clase persona podría definirse del siguiente modo:

1
2
3
class personne
    Dim nom,age
End class

Esta es la instrucción [Dim nombre,edad] que define las dos propiedades del persona. Para crear copias (instancias) del personaescribimos :

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. Sólo puede contener su dirección. Al escribir set persona1=nueva personase produce la siguiente secuencia de acontecimientos:

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

Tenemos entonces el siguiente esquema de memoria para las variables persona1 y persona2 :

Dicho de otro modo, podríamos decir que persona1 es un objeto persona. Podemos aceptar este abuso del lenguaje si recordamospella que persona1 es de hecho la dirección de un persona y no el objeto persona él mismo.

Dijimos que un objeto persona tenía dos propiedades nombre y edad. ¿Cómo se pueden aprovechar estas propiedades? Utilización de la notación objeto.propiedad como se ha explicado anteriormente. Así que

personne1.nom designa el nombre de la persona 1 y personne1.age edad. He aquí una breve ilustración:

Programa
Resultados
p1=(dupont,18)

El programa anterior podría modificarse del siguiente modo:

Programa
Resultados
nom=dupont
age=18

Hemos utilizado el con ... fin con que puede utilizarse para "factorizar" nombres de objetos en expresiones. La estructura con p1 ... fin con en las líneas 9-12 y 15-18, puede utilizar la sintaxis .nombre en lugar de p1.nom y .edad en lugar de p1.age. Esto facilita la escritura de instrucciones en las que se utiliza repetidamente el mismo nombre de objeto.

3.12. Asignar un valor a una variable

Existen dos instrucciones para asignar un valor a una variable:

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

La forma 2 está reservada a las expresiones cuyo resultado es una referencia a un objeto. Para todos los demás tipos de expresiones, la forma 1 es la adecuada. La diferencia entre las dos formas es la siguiente:

  • en la instrucción variable=expresióna cada variable se le asigna un valor. Si v1 y v2 son dos variables, al escribir v1=v2 se asigna el valor de v1 a v2. Por tanto, se duplica un valor en dos lugares distintos. Si el valor de v2 se modifica posteriormente, el de v1 no.
  • en la instrucción set variable=expresióna una variable se le asigna 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, al escribir set v1=v2 se asigna el valor de v1 a v2, y por tanto la dirección del objeto obj2. Cuando el script manipula entonces v1 y v2, no son los "valores" de v1 y v2 los que se manipulan, sino los objetos "apuntados" por v1 y v2, es decir, el mismo objeto aquí. Decimos 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. En otras palabras, modificar el objeto referenciado por v2 modifica el objeto referenciado por 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. Évalorar expresiones

Los principales operadores para evaluar expresiones son :

Tipo de operador
Operadores
Ejemplo
Aritmética
+,-,*,/
 
mod
a mod b da el resto de la división entera de a por b. Antes, a y b se transformaban en enteros si era necesario.
\
a b da el cociente de la división entera de a por b. Anteriormente, a y b se transformaban en enteros si era necesario.
^
a^b eleva a a la potencia b. Así que a^2 es igual a a2
   
Comparación
<,<=
>, >=
=,<>
a<>b es verdadera si a es diferente de b
a=b es verdadera si a es igual a b
a y b pueden ser números o cadenas. 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 orden alfabético.
es
obj1 es obj2 es verdadero si obj1 y obj2 son referencias al mismo objeto.
   
Lógica
y, o, no, xor
Los operandos aquí son todos booleanos.
bool1 o bool2 es verdadero si bool1 o bool2 es verdadero
bool1 y bool2 es verdadero si bool1 y bool2 son verdaderos
no bool1 es verdadero si bool1 es falso y viceversa
bool1 xor bool2 es verdadero si sólo uno de los booleanos bool1, bool2 es verdadero
   
Concatenación
&, +
No es aconsejable utilizar el operador + para concatenar dos cadenas porque puede confundirse con la suma de dos números. Por lo tanto, debe utilizarse exclusivamente el operador &.

3.14. Control de la ejecución del programa

3.14.1. Exejecutar acciones condicionalmente

La instrucción 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
La expresión expresión se evalúa en primer lugar. Esta expresión debe tener un valor booleano. Si es verdadera, las acciones de la entonces se ejecutan, de lo contrario, el si no si está presente.

A continuación, un programa presenta distintas variantes de 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, puede escribir instrucción1:instrucción2:... instrucciónn en lugar de escribir una instrucción por línea. Esta posibilidad se ha explotado en la línea 10, por ejemplo.

3.14.2. Execute acciones repetidamente

Bucle con un número conocido de iteraciones
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 idstart
  3. el valor de i se compara con ifin. Si i<=ifin, el se ejecutan las acciones situadas entre los for... next
  4. i se incrementa en la cantidad ipas (i=i+ipas)
  5. volvemos al paso 3 anterior. Después de un número finito de pasos, el valor de i excederá ifin. La ejecución de script continúa con la siguiente instrucción
  6. si el incremento ipas es negativo, se cambia la condición del paso 3. Las acciones for...next sólo se ejecutan si i>=ifin.
Puede salir de un bucle for en cualquier momento con la tecla salida para.
Bucle con número desconocido de iteraciones
do while condition
    actions
loop
  1. se evalúa la expresión de la condición. Si es verdadera, se ejecutan las acciones while...loop
  2. las acciones realizadas pueden haber modificado el valor de la condición. Volvemos al paso 1 anterior.
  3. cuando la expresión de la condición se convierte en falsa, el bucle finaliza
Puede salir de un bucle do while en cualquier momento con la instrucción salir hacer.

El programa que figura a continuación 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 infrecuente que éste ejecute un "bucle", c.a.d. que nunca se detiene. En general, el programa ejecuta un bucle cuya condición de salida no se puede verificar, como en el siguiente ejemplo:

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

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

Si ejecutas el programa anterior, el primer bucle nunca se detendrá por sí solo. Puede forzarlo a detenerse escribiendo CTRL-C del teclado (pulse CTRL y la tecla C al mismo tiempo).

3.14.3. Finalizar la ejecución del programa

Instrucciones wscript.quit n termina la ejecución del programa devolviendo un código de error igual a n. En DOS, este código de error puede comprobarse con la sentencia if ERRORLEVEL n, que es verdadera si el código de error devuelto por el último programa ejecutado es >=n. Considere el siguiente programa y sus resultados:

  
début

Inmediatamente después de ejecutar el programa, se emiten los siguientes tres 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

El comando DOS 1 comprueba si el código de error devuelto por el programa es >=5. En caso afirmativo, muestra (echo) 5. En caso contrario, nada. 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. En caso afirmativo, muestra 4; en caso contrario, nada.

El comando DOS 5 comprueba si el código de error devuelto por el programa es >=3. En caso afirmativo, muestra 3. En caso contrario, nada. En caso afirmativo, muestra 3; en caso contrario, nada.

De los resultados mostrados, podemos deducir que el código de error devuelto por el programa fue 4.

3.15. Las tablas de datos en una variante

Una variante T puede contener una lista de valores. Se dice entonces 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 número entero con un índice entre 0 y n-1 si T tiene n elementos.
  • podemos averiguar el índice del último elemento de la matriz T utilizando la expresión ubound(T). El número de elementos de la matriz T es entonces ubound(T)+1. Este número suele denominarse tamaño de la matriz.
  • una variante T puede inicializarse con una matriz vacía utilizando la sintaxis T=array() o con una secuencia de elementos utilizando la sintaxis T=array(elemento0, elemento1, ...., elementon)
  • se pueden añadir elementos a un array T ya creado. Para ello, utilice la función redim preservar 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 conservar indica que el contenido actual de la matriz debe conservarse al cambiar de tamaño. 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 variante y, por 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 tablas se ilustran con 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

  • hemos utilizado una función llamada join se explica a continuación.

3.16. Las variables de matriz

Hay otra forma de usar un array en vbscript, que es usar una variable array. A diferencia de las variables escalares, una variable de matriz debe declararse con un carácter sol. Son posibles varias declaraciones :

  • dim array(n) declara una matriz estática de n+1 elementos numerados de 0 a n. Este tipo de matriz no se puede redimensionar
  • dim array() declara un array dinámico vacío. Tendrá que ser redimensionado para ser utilizado por la instrucción redim de la misma manera que para una variante que contenga un array
  • dim array(n,m) declara una matriz bidimensional de (n+1)*(m+1) elementos. El elemento (i,j) de la matriz se denota por tabla(i,j). Obsérvese la diferencia con una variante en la que se habría marcado el mismo elemento tabla(i)(j).

¿Por qué hay dos tipos de tabla que al final son muy similares? La documentación de vbscript no lo dice, ni indica si una funciona mejor que la otra. En lo que sigue, utilizaremos casi exclusivamente la matriz en una variante en nuestros ejemplos. Sin embargo, recuerde que VBscript deriva del lenguaje Visual Basic, que contiene datos tipados (integer, double, boolean, etc.). En este caso, si necesita utilizar una matriz de números reales, por ejemplo, la variable matriz será más eficiente que la variable variante. En este caso, declare algo como dim tableau(1000) as double para declarar una matriz de números reales o simplemente dim tableau() as double si la tabla es dinámica.

He aquí un ejemplo de utilización de variables de tabla:

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. Las funciones split y join

Las funciones split y join pueden utilizarse para cambiar entre cadenas y matrices:

  • Si T es una matriz y porque una cadena de caracteres, join(T,coche) es una cadena de caracteres formada por la combinación de todos los elementos de la matriz T, cada uno separado del siguiente por la cadena porque. Así, join(array(1,2,3), "abcd") dará la cadena "1abcd2abcd3"
  • Si C es una cadena de caracteres formada por una serie de campos separados por la cadena porque la función split(C,car) es una matriz cuyos elementos son los diferentes elementos de la cadena C. Así split("1abcd2abcd3", "abcd") dará el array (1,2,3)

He aquí un ejemplo:

Programa
Resultados
' transformación tabla-->cadena y viceversa

' array --> 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. Diccionarios

Se puede acceder al elemento de una matriz T cuando se conoce su número i. Se puede acceder a él utilizando la notación T(i). Existen matrices a cuyos elementos no se accede por un número, sino por una cadena de caracteres. El ejemplo típico de este tipo de matrices es el diccionario. Cuando buscamos el significado de una palabra en "Larousse" o "Le petit Robert", accedemos por la palabra. Este diccionario podría representarse mediante una matriz con 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 es similar al funcionamiento de un array, salvo que los índices del array no son enteros, sino cadenas de caracteres. Este tipo de matriz se denomina diccionario (o matriz asociativa, hashtable) y los índices de cadena el llaves del diccionario (claves). Los diccionarios se utilizan con mucha frecuencia 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 información sobre nosotros. En el modelo diccionario("clave")="información", aquí "clave" sería el número de la Seguridad Social e "información" sería toda la información almacenada sobre nosotros en los ordenadores de la Seguridad Social.

Windows utiliza un objeto Active X denominado "Scripting.Dictionary"Active X" es un componente de software que expone una interfaz que puede ser utilizada por programas. Un objeto Active X es un componente de software que expone una interfaz que puede ser utilizada por programas escritos en distintos lenguajes, siempre que cumplan la norma de uso de objetos Active X. Por tanto, el objeto Scripting.dictionary puede ser utilizado por lenguajes de programación Windows: javascript, per, python, C, C++, vb, vba, etc., no sólo vbscript.

1
Un objeto Scripting.Dictionary es creado por un
set dico=wscript.CreateObject("Scripting.Dictionary")
o simplemente
set dico=CreateObject("Scripting.Dictionary")
CreateObject es un método del objeto WScript utilizado para crear instancias de objetos Active X. La versión 2 muestra que wscript puede ser un objeto implícito. Cuando un método no puede "emparejarse" con un objeto, el contenedor WSH intentará emparejarlo con el objeto wscript.
2
Una vez creado el diccionario, podemos añadirle elementos mediante el método add:
dico.add "clave",valor
creará una nueva entrada en el diccionario asociada a la clave "key". El valor asociado es una variante de cualquier dato.
3
Para recuperar el valor asociado a una clave determinada, utilice la función artículo en el diccionario :
var=dico.item("clé")
o set var=dico.item("clave) si el valor asociado a la clave es un objeto.
4
Todas las claves del diccionario pueden recuperarse en una matriz variable utilizando la función llaves :
keys=dico.keys
llaves es una matriz cuyos elementos se pueden recorrer.
5
Todos los valores del diccionario pueden recuperarse en una matriz variable utilizando la función artículos :
valeurs=dico.items
artículos es una matriz cuyos elementos se pueden recorrer.
6
La existencia de una clave puede comprobarse mediante la función existe :
dico.exists("clé") es verdadero si la clave "clé" existe en el diccionario
7
Puede eliminar una entrada del diccionario (clave+valor) utilizando la función eliminar :
dico.remove("clé") elimina la entrada del diccionario asociada a la clave "key". dico.removeall elimina todas las claves, c.a.d. vacía el diccionario.

El siguiente programa utiliza estas distintas posibilidades:

Programa
' crear y utilizar un diccionario
Set dico=CreateObject("Scripting.Dictionary")

' dico relleno
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 llaves
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 artículos
' tecla1
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
' llave4  
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

' quitar llave 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

' acabamos con 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 tabla o un diccionario

Es común querer ordenar un array o un diccionario en orden ascendente o descendente de sus valores o de sus claves para un diccionario. Mientras que la mayoría de los lenguajes tienen funciones de ordenación, vbscript no parece tener ninguna. Esto es un defecto.

3.20. Los argumentos de un programa

Puede llamar a un programa vbscript pasándole parámetros, como en :

cscript prog1.vbs arg1 arg2 .... argn

Esto permite al usuario pasar información al programa. ¿Cómo recupera el programa esta información? 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 a script
  • una colección C es un objeto que tiene
    • una propiedad cuente que es el número de elementos de la colección
    • un método C(i) que da el elemento i en la colección

3.21. Una primera aplicación: IMPOTS

Queremos escribir un programa para calcular los impuestos de un contribuyente. El caso simplificado es el de un contribuyente que sólo tiene que declarar su sueldo:

  • se calcula el número de acciones de los empleados nbParts=nbEnfants/2 +1 si no están casados, nbEnfants/2+2 si está casado, dónde nbEnfants es el número de hijos.
  • calcule su base imponible R=0,72*S donde S es su salario anual
  • calcula tu coeficiente familiar Q=R/N

el impuesto I se calcula a partir de los siguientes datos

12620.0
0
0
13190
0.05
631
15640
0.1
1290.5
24740
0.15
2072.5
31810
0.2
3309.5
39970
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
172040
0.55
30710
195000
0.60
39312
0
0.65
49062

Cada línea tiene 3 campos. Para calcular el impuesto I, busque la primera línea donde QF<=champ1. Por ejemplo, si QF=30000 encontraremos la línea

    24740        0.15        2072.5

El impuesto I es igual a 0.15*R - 2072.5*nbParts. Si QF es tal que la relación QF<=champ1 nunca se verifica, 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 de la deuda tributaria del contribuyente
' el programa debe llamarse con tres parámetros: salario de los hijos casados
' casado: carácter Y si está casado, N si no lo está
' hijos: número de hijos
' salario: salario anual sin céntimos

' no se realiza ninguna verificación de la validez de los datos, pero sí
' compruebe que son tres

' declaración obligatoria de variables
Option Explicit

' comprobamos que hay 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

' recuperar 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
' niños es un número entero
enfants=cint(wscript.arguments(1))
' el salario es un entero largo
salaire=clng(wscript.arguments(2))

' definimos los datos necesarios para calcular el 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 acciones
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

' calculamos la cuota 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 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

Comentarios :

  • el programa utiliza lo que ya se ha explicado (declaración de variables, argumentos, cambios de tipo, pruebas, bucles, array en una variante)
  • no comprueba la validez de los datos, lo que sería anormal en un programa real
  • sólo el bucle while presenta una dificultad. Intenta determinar el índice i del array limites para el que tenemos limites(i)>qf y este para i<ubound(limites) (c.a.d. aquí i<13) porque el último elemento del array limites no es significativo. Sólo se ha añadido para que el [Visite En i<ubound(límites) Y qf>limites(i)] para i=13. La prueba es entonces 13<13 y qf>limites(13) y entonces (en vbscript) debe existir limits(13). Al salir del bucle while, se utiliza el último valor de i calculado para calcular el impuesto: [impot=int(ingresos*coeffr(i)-nbParts*coeffn(i))].