Sie sind auf Seite 1von 24

Tutorial de vbscript

Temas

by

Novlucker

Introduccin - pdf 1,2 Operadores Esctructuras de control If Case For While Do Manejo de objetos Filesystemobject(FSO) - pdf 1, 2 wshShell wshNetwork - pdf 1, 2 Dictionary - pdf 1, 2 Commondialog - pdf 1, 2
Se irn aadiendo nuevos objectos para descarga en pdf

Bueno, primero aclarar que este tutorial, pretende explicar de manera bsica las distintas instrucciones aplicadas en visual basic script (vbs de aqu en ms), para que as de este modo, todos aquellos interesados en este lenguaje de scripting, tengan la posibilidad de comenzar a desarrollar sus pequeos scripts. Introduccin: Para empezar, debemos decir, que los vbs, tal y como lo dice su nombre, son "simples" scripts, que se ejecutan por medio de un intrprete en el sistema, con lo que bastar con crear el cdigo en un simple bloc de notas (o similar), y guardarlo con extensin *.vbs, sin necesidad de realizar ninguna compilacin (aunque existe la posibilidad). En este caso el intrprete es, el Windows Script Host de Microsoft, por lo que estar presente (aunque en distintas versiones) de manera predeterminada desde Win 98 en adelante, as que podremos hacer uso de estos archivos en prcticamente, todos los Windows. Se puede decir que los vbs son una mejora con respecto a los bat, ya que estos permiten una mayor interaccin con el sistema operativo, y decir adems que este lenguaje, es un derivado de Visual Basic, por lo que desde un principio y aunque de manera mucho ms limitada, se podr familiarizar con dicho leguaje (la sintaxis es similar en todos los aspectos). A tener en cuenta antes de comenzar: En vbs no importan las maysculas o minsculas VBscript = vbscript Para indicar un final de lnea, no se debe de hacer ms que pasar a la siguiente (no es necesario terminar con por ejemplo " ; " como en javascript) Los comentarios, van precedidos de una " " (comilla simple) Esto es un comentario No es obligatorio declarar las variables, aunque es conveniente hacerlo para dejar ms legible el

cdigo Se pueden declarar utilizando Dim, o bien, se les da valor directamente. Dim nuestravariable Tambin puede ser utilizado Option explicit para as "obligarse" a declarar las variables (en los pequeos ejemplos lo har as) En la mayora de los ejemplos utilizar la funcin msgbox, la cual se encarga de mostrar un mensaje en pantalla. Tipos de dato: Existen varios tipos de datos que pueden manejarse en vbs, y los que ms vamos a utilizar, son ; Booleano, Byte, Fecha, Double, Entero, Entero largo, Objeto, Single, Cadena. Todos estos representan valores verdadero/falso, fecha/hora, nmerosentero positivo/negativo, cadena de texto (no creo necesite ms explicacin que esta). Operadores: Tendremos varios tipos de operadores a nuestra disposicin. 1. Aritmticos: Suma(+), Resta(-), Multiplicacin(*), Divisin decimal(/), Divisin entero(\), Potencia(^), Resto divisin(mod) 2. Comparacin: Igual(=), Distinto(<>), Mayor(>), Menor(<), Menos o igual(<=), Mayor o igual(>=) 3. Lgicos: Y(and), O(or), Xor, No(not) 4. De cadena: Concatenacin(&) Estos han sido a grandes rasgos, los operadores a utilizar en vbs, por lo que despus, y haciendo uso de nuestro prximo tema (estructuras de control), se mostrarn algunos ejemplos. Estructuras de control: 1. IF (condicional) Esta se utiliza para evaluar 2 o ms posibles resultados, en virtud del cual, se tomarn diferentes acciones. Citar Dim valor Valor = 8 If valor < 10 then Msgbox "El valor es MENOR a diez " Else Msgbox "El valor es MAYOR a diez " End if Como se ve en este ejemplo se comienza declarando la variable "valor", luego de esto, se le asigna el valor 8, y posterior a esto, se evala dicho valor (haciendo uso de los operadores de comparacin vistos anteriormente), por lo que si el valor es menor a 10, se mostrar un mensaje en pantalla indicando que es MENOR, de lo contrario, el mensaje indicar MAYOR (en este caso le habamos asignado el valor 8, por lo que ser menor).

2. Case (condicional) En el caso del IF, si bien no se ha mostrado, existe la posibilidad de anidar dos o ms, para as realizar varias evaluaciones, pero el caso es que cuando se realizan muchas, el cdigo puede volverse algo engorroso. Es en estos casos, donde recurrimos al select case. Citar Dim numero numero = 8 Select case numero case 6 msgbox "El valor es seis " case 7 msgbox "El valor es siete " case 8 msgbox "El valor es ocho " End select Al igual que en el anterior, en este ejemplo, se comienza definiendo la variable "numero", y se le asigna 8 como valor. Luego con select case se indica que es lo que se va a revisar, en este caso, cuanto es el valor de "numero", luego, se indican las opciones con un case por cada una de ellas, en este caso, "case 6", en el caso de que el valor sea 6, "case 7", y "case 8", para el caso de que el valor sea 7 y 8 respectivamente (como sabemos es 8), es decir, "si es 6", mensaje "El valor es seis", "si es 7", mensaje "El valor es siete", y "si es 8", mensaje "El valor es ocho". 3. FOR (bucle) El for es utilizado cuando queremos repetir una determinada accin un cierto nmero de veces. Citar Dim i For i=1 to 5 step 1 Msgbox "El valor de i es: " & i Next Comenzamos definiendo la variable "i", luego de esto, inicializamos el bucle for, es decir, decimos que; desde "i" igual 1, a "i" igual 5, incrementando de a 1, mostraremos un mensaje con la frase "El valor de i es: " y luego de esto, el valor real de "i", por lo que en cada "paso" que de nuestro bucle, mostrar algo ms o menos as

Como ven, 5 mensajes "casi" iguales, ya que la secuencia se repite 5 veces, y lo nico que cambia es el valor de "i" (la hemos concatenado al mensaje con el carcter &), ya que va tomando distintos valores en cada uno de los "pasos". 4. FOR EACH(bucle) El for each, tiene la particularidad de que es un for que recorre todos los elementos de una coleccin o vector. Antes de continuar, intentar explicar lo que es un "array", ya que ser lo que utilicemos en el ejemplo. Un array o matriz, es una estructura de datos en forma de variable, que permite almacenar ms de un nico valor, dentro de una nica variable. Para acceder a cada uno de estos valores, ser necesario hacer uso de ndices. Citar

Dim nombres(2) nombres(0)= "Martn" nombres(1)= "Pablo " nombres(2)= "Carlos " Msgbox nombres(1) En este ejemplo, se define la variable "nombres" que tendr espacio para 3 valores (tener en cuenta que comienza por 0, por eso que se ponga 2), y luego, se definen cada uno de los valores de "nombres". Por ltimo utilizamos un mensaje, para mostrar el valor del ndice 1 del array, con el siguiente resultado

Como se ve, el mensaje muestra el nombre "Pablo" porque al llamar al array, hemos puesto el ndice 1, y como se ve cuando lo declaramos, le habamos asignado valor "Pablo", en el caso de indicar 2 en lugar del 1, el mensaje mostrara "Carlos". Espero esto haya quedado lo suficientemente claro. Ahora, volviendo al For each (espero ya no te hayas olvidado), este podra ser utilizado en el caso del array (hay otros casos). Citar Dim nombres Dim n nombres = array("Martn","Pablo","Carlos") For each n in nombres Msgbox n next A pesar de que no lo parezca, es muy similar al anterior, y algunos estarn diciendo, "que tena que ver el array con esto", pero si se fijan, solamente he mostrado, una segunda manera de declarar el array. En este caso, en lugar de ir metiendo cada uno de los valores con sus respectivos ndices, declaro el array en una sola lnea y va quedando organizado segn el orden en el que meta los valores, por eso, "Martn" quedar en el lugar 0, "Pablo" en el lugar 1, y "Carlos", en el lugar 2, al igual que en el caso anterior. Esto con respecto al array, ahora a lo que bamos, el for each. En lneas siguientes comenzamos con el for, y decimos, por cada "n" (la letra, en este caso "n" la elegimos nosotros) en "nombres" (es un array que contiene tres nombres), mensaje con el "n", o lo que es igual, por cada nombre, en el "contenedor" "nombres", mensaje con el nombre, y el resultado es el siguiente

Tanto en for simple, como en el for each, podemos hacer uso de exit for, para parar la ejecucin del for completa. Para decirlo de otra manera, con esto escapamos al for. WHILE (bucle) El bucle while, es utilizado cuando queremos que una determinada accin se repita mientras una determinada condicin de cumpla. Citar Dim numero

Numero = 1 While numero <= 10 Msgbox numero numero = numero + 1 Wend Comenzamos el ejemplo declarando la variable numero, y le asignamos valor 10, luego ejecutamos bucle, mientras el valor de "numero" sea menor o igual a 10, mostramos mensaje con el valor de numero, y adems le sumamos 1 al propio valor de numero (de este modo lo utilizamos a modo de contador), luego de 10 veces de mostrar mensaje, el valor de "numero" ser igual a 11 y al verificarse la condicin esta no se cumplir, por lo que terminar. 5. DO (bucle) El bucle do tiene varias opciones, pero bsicamente har algo, "mientras", o "hasta que" ocurra algo. Citar Do Msgbox "Esto es un mensaje" Loop Este bucle, se repetir al infinito, por lo que mostrar un mensaje, interminables veces. Ahora bien, este do, puede ser modificado, para tener algo ms de control sobre l, y es justamente haciendo uso de esas condiciones que comentaba antes, "mientras", o "hasta que" Citar Dim a = 1 Do until a=10 Msgbox "Esto es un mensaje" Loop Este cdigo se resume en; mensaje de "Esto es un mensaje" hasta que "a" sea igual a 10. En lugar de until podra utilizarse while, para cambiar la condicin a mensaje de "Esto es un mensaje" mientras "a" sea distinta de 10. Citar Dim a = 1 Do while a<>10 Msgbox "Esto es un mensaje" Loop Y tambin puede utilizarse until y while, antes o despus de ejecutarse el bucle Citar Do until/while condicin (es distinta segn sea until o while) Msgbox "Esto es un mensaje" Loop until/while Como se ve, este bucle nos permite darle varios usos segn nos convenga, por lo que termina siendo muy verstil y til. Al igual que para los for, en el caso de querer salir de un bucle do, tambin contamos con una funcin de escape, en este caso, exit do

As termina est pequea introduccin a las rutinas bsicas de visual basic script, la idea es seguir extendiendo este "tuto", como comentario agrego adems, que este lenguaje posee muchisimas funciones, las cuales no detallar, ya que sera interminable, adems de que me centrar ms adelante, en explicar funciones expecificas de objetos. En el caso de querer ms documentacin al respecto, se pueden descargar la documentacin sobre windows script host, donde tendrn la referencia a todas las funciones de las que podemos hacer uso. Windows Script 5.6 Documentation

Manejo de objetos
Anteriormente, he intentado mostrar las diferentes estructuras de control que nos permiten encaminar nuestros vbs, es por esto que ahora, pasaremos a los OBJETOS. Toda interaccin de vbs con el sistema se basa en el manejo de objectos (ActiveX), que no son ms que libreras especializadas y a nuestra diposicin, por lo que dependiendo de lo que busquemos hacer, haremos uso de una u otra (mezclandolas en nuestros scripts) Nota: No har uso de dim para declarar variables en los ejemplos, para as ahorrar espacio. Los objetos bsicos de los que se hace uso son dos: 1. FSO (FileSystemObject): manejo de unidades, archivos y carpetas. 2. WshShell: acceso a informacin de sistema, trabajo con el registro, manejo accesos directos, ejecucin de aplicaciones. Antes de continuar debo de explicar que al trabajar con los objetos, los mismos se deben de declarar de la siguiente manera: Set variable = createobject(objecto) Ejemplo: Set objfso = createobject("scripting.filssystemobject") Ahora s, pasamos directamente al anlisis del objeto FSO. FSO (File System Object) Las distintas funciones que se pueden realizar a travs de este objeto son: Borrar, mover y copiar archivos Leer y escribir en archivos de texto (Crear) Obtener y modificar atributos de archivos y carpetas Crear, borrar, mover y copiar carpetas Obtener propiedades de archivos y carpetas Listar subcarpetas Listar discos y particiones Obtener propiedades de discos y particiones Obtener determinadas rutas de sistema Mover archivos

Objfso.movefile origen, destino Ejemplo: Cdigo


Set objfso = createobject("scripting.filesystemobject") Objfso.movefile "C:\archivo.txt", "D:\Carpeta"

Borrar archivos Objfso.deletefile archivo Ejemplo: Cdigo


Set objfso = createobject("scripting.filesystemobject") Objfso.deletefile "C:\archivo.txt"

Copiar archivos Objfso.copyfile origen, destino, sobreescribir Ejemplo: Cdigo


Set objfso = createobject("scripting.filesystemobject") Objfso.copyfile "C:\archivo.txt", "D:\destino.txt", true

Crear carpetas Set variable = objfso.createfolder(destino carpeta) Ejemplo: Cdigo


Set objfso = createobject("scripting.filesystemobject") Set micarpeta = objfso.createfolder("C:\carpeta")

Mover carpetas Objfso.movefolder origen, destino Ejemplo: Cdigo


Set objfso = createobject("scripting.filesystemobject") Objfso.movefolder "C:\Carpeta", "D:\Destino"

Borrar carpetas Objfso.deletefolder carpeta

Ejemplo: Cdigo
Objfso.deletefolder "C:\Carpeta"

Copiar carpetas Objfso.copyfolder origen, destino, sobreescribir Ejemplo: Cdigo


Set objfso = createobject("scripting.filesystemobject") Objfso.copyfolder "C:\Carpeta", "D:\Destino", true

Leer y escribir en archivos Para el manejo de archivos de texto, debemos de tener en cuenta, la existencia o no del archivo, y el modo en el que accedemos a l. Obviamente, si un archivo no existe, no podrmos acceder a l, y a su vez, si abrimos un archivo en modo de lctura, nunca podremos escribir dentro. Crear archivos de texto y escribir en ellos Set variable = objfso.createtextfile(ruta, sobreescribir) Ejemplo: Cdigo
Set objfso = createobject("scripting.filesystemobject") Set archivotexto = objfso.createtextfile("C:\archivo.txt",true) 'creamos el archivo archivotexto.writeline "Este es el texto que estoy escribiendo" 'escribimos una linea archivotexto.writeblanklines(2) 'escribimos 2 lineas en blanco archivotexto.writeline "Aqui mas texto" ' escribimos otra linea de texto archivotexto.close 'cerramos el archivo

Notese que al comenzar, hemos creado el archivo y lo hemos asignado a una variable, luego hemos utilizado el identificador de archivo (variable), para escribir dentro de l, en este caso, hemos utilizado writeline, que escribe una lnea, y agrega un retorno de carro para que si volvemos a escribir, lo hagamos en una nueva lnea, en cambio , si en su lugar, utilizamos write, el resultado, ser que no habr salto de lnea, por lo que todas las oraciones iran quedando una detrs de la otra. Por ltimo, hemos cerrado el archivo. Abrir archivos de texto y escribir en ellos Set variable = objfso.opentextfile(ruta, modo, creacin)

Ejemplo: Cdigo
Set objfso = createobject("scripting.filesystemobject") Set archivotexto = objfso.opentextfile("C:\archivo.txt",8,true) 'abrimos el archivo archivotexto.writeline "Este es el texto que estoy escribiendo" 'escribimos una linea archivotexto.close 'cerramos el archivo

Como se puede ver, al abrir el archivo, hemos indicado la ruta, el modo 8 que se utiliza para appending o escritura al final de archivo, y true, que quiere decir que en caso de que no exista el archivo se cree, es decir que de este modo, no solo abrimos el archivo, sino que de no existir, dicho archivo ser creado en el proceso. Para tener en cuenta, los modos en los que se puede abrir un archivo son: 1- Modo LECTURA 2- Modo ESCRITURA (escribe al principio) 8- Modo APPENDING (escribe al final) Como se puede ver, al abrir el archivo, hemos indicado la ruta, el modo 8 que se utiliza para appending o escritura al final de archivo, y true, que quiere decir que en caso de que no exista el archivo se cree, es decir que de este modo, no solo abrimos el archivo, sino que de no existir, dicho archivo ser creado en el proceso. Leer desde archivos de texto As como abrimos archivos y podemos escribir en ellos, tambin existe la posibilidad de leer desde ellos, para lo cual utilizaremos readline, y readall. Como se puede imaginar, con readline iremos leyendo una a una las lneas del archivo (cada vez que pongamos readline leeremos solo una), con este, leemos una lnea, y el puntero se situa al final de la lnea, para que a la prxima ejecucin de esta funcin, sea la lnea siguiente la que sea leda. Con readall en cambio, leeremos el total de archivo. Existe adems una funcin llamada skipline, con la cual saltaremos la lectura de una lnea. Ejemplo: Cdigo
Set objfso = createobject("scripting.filesystemobject") Set archivotexto = objfso.opentextfile("C:\archivo.txt",1) archivo msgbox archivotexto.readline linea, la primera archivotexto.skipline 'saltamos una linea msgbox archivotexto.readline linea, la tercera archivotexto.close 'cerramos el archivo 'abrimos el 'leemos una

'leemos una

Atributos de archivos y carpetas A continuacin explicar el mtodo mediante el cual, se puede obtener, o bien cambiar, los atribuos

de archivos y carpetas (es prcticamente igual para ambas cosas) Obtener atributos Set variable = objfso.getfile(ruta) variable.attributes Ejemplo: Cdigo
Set objfso = createobject("scripting.filesystemobject") Set archivo = objfso.getfile("C:\tutorial.pdf") 'obtenemos el control sobre el archivo pdf Msgbox archivo.attributes 'mensaje con los attributos del archivo

En este ejemplo vemos que luego de declarar el objeto, lo que hacemos es obtener el control del el archivo tutorial.pdf, para lo cual utilizamos getfile, y asignamos el archivo a la variable archivo. Luego, y ya con el archivo en la variable, podemos utilizarlo directamente para mostrar sus atributos, que no ser ms que un nmero que englobar todas las constantes de los atributos. Las constantes que hacen referencia a los atributos de archivo son: Valor 0 1 2 4 8 16 32 64 128 Atributo Normal Solo Lectura Oculto Sistema Letra de disco Carpeta/directorio Archivo Link o acceso directo Comprimido

Como comentaba antes, attributes devolver un valor nico que ser la sumatoria de cada uno de los valores para cada atributo del archivo. Como ejemplo: Un archivo que tenga atributos de; solo lectura, oculto, de sistema, y de archivo, tendr un valor de 1+2+4+32= 39 Cambiar atributos Set variable = objfso.getfile(ruta) variable.attributes = sumaatributos Ejemplo: Cdigo
Set objfso = createobject("scripting.filesystemobject") Set archivo = objfso.getfile("C:\tutorial.pdf") 'obtenemos el control sobre el archivo pdf archivo.attributes = 34 'attributo dearchivo y oculto

El cambiar atributos consiste simplemente en asignar un valor a attributes.

En el ejemplo anterior he puesto como valor 34 que representa atributos de archivo y oculto. Propiedades de archivos y carpetas As como podemos obtener y modificar los atributos de los archivos y carpetas, podemos acceder a determinadas propiedades de los mismos, entre ellas: Nombre; name Nombre corto; shortname Tamao; Size Ruta completa; path Ruta corta; shortpath Fecha de creacin/modificacin/ltimo acceso; datecreated, datelastmodified, datelastaccessed Tipo de archivo; type Carpeta contenedora; parentfolder Estas son las principales propiedades a las que podemos acceder, lo cual se har de la siguiente forma: Set variable = objfso.getfile(ruta) Msgbox variable.propiedad Ejemplo: Cdigo
Set objfso = createobject("scripting.filesystemobject") Set archivo = objfso.getfile("C:\tutorial.pdf") 'obtenemos el control sobre el archivo pdf Msgbox archivo.size 'tamano del archivo en bytes

Para obtener otras propiedades, simplemente sera cuestin de cambiar "size" por alguna de las otras propiedades a las que tenemos acceso (les recomiendo probar con cada una para ver los resultados), y de igual manera, se hara con carpetas en lugar de archivos, para lo que solamente tendramos que cambiar getfile, por getfolder. Listar subcarpetas Con listar subcarpetas, nos referimos a, acceder a la coleccin de subcarpetas de una carpeta "X", para trabajar con cada una de ellas de manera independiente. Cuando hablamos de coleccin, hacemos referencia a un array, en el que estn todos los elementos contenidos en un determinado "listado". Set variable = objfso.getfolder(ruta) Set subvariable = variable.subfolders Ejemplo: Cdigo
Set objfso = createobject("scripting.filesystemobject") Set micarpeta = objfso.getfolder("C:\Carpeta") 'obtenemos el control sobre la carpeta Set subcarpetas = micarpeta.subfolders 'obtenemos la coleccion de subcarpetas For each s in subcarpetas 'por cada carpeta(s) en

la coleccion(subcarpetas) Msgbox s.name Next subcarpeta

'mensaje con el nombre 'pasamos a la siguiente

Bueno, como se ve en este caso, el acceder a las subcarpetas no es totalmente directo, sino que, en un principio, obtenemos la coleccin (array) de carpetas, para luego trabajar con cada una de ellas por medio de un for que recorre toda la coleccin. Al listar subcarpetas, se debe de terner en cuenta adems, que la coleccin, solamente contiene, las carpetas del primer nivel, y no las que se encuentran en los niveles consiguientes, para que quede ms claro: C:\carpeta C:\carpeta\nivel1 C:\carpeta\nivel1\nivel2 Si listamos la coleccin de subcarpetas en la carpeta "C:\carpeta", obtendremos todas las del nivel 1, pero no las del nivel 2, para eso, deberamos de implementar otro for que haga referencia a estas. Listar discos/particiones Al igual que para listar subcarpetas, para listar discos y particiones lo haremos a traves de una coleccin, por lo que en realidad, ser muy similar al punto anterior. Set variable = objfso.getfolder(ruta) Set discos = variable.drives Ejemplo: Cdigo
Set objfso = createobject("scripting.filesystemobject") Set discos = objfso.drives 'obtenemos la coleccion de discos For each d in discos 'por cada disco(d) en la coleccion(discos) Msgbox d.driveletter 'mensaje con la letra de disco Next 'pasamos al siguiente disco

Como ya se haba dicho, el mtodo de listar los discos y particiones, es el mismo que para obtener las subcarpetas de una carpeta, por lo que no debera de presentar ningn problema el hacerlo. Tambin aclarar, que en el anterior ejemplo, solo he includo una propiedad que no se haba visto anteriormente, y esta es la de driveletter, y que como ya se habrn dado cuenta, hace referencia a la letra que tiene asignado el disco o particin en el sitema, por lo que una vez mencionado esto, pasaremos justamente, a identificar, cuales son las propiedades de disco a las que tendremos acceso. Propiedades de disco Como hemos visto en el anterior punto, a traves del objecto FSO es posible acceder a la coleccin de discos, as como a sus propiedades, siendo estas propiedades, las siguientes:

Letra; driveletter Nombre del disco; volumename Espacio disponible; availablespace Espacio libre; freespace Espacio total; totalsize Disponibilidad; isready Ruta; path Sistema de ficheros (NTFS, FAT, CDFS); filesystem Carpeta principal; rootfolder Nmero de serie; serialnumber Nombre compartido; sharename Tipo de disco; drivetype

Ejemplo, no pondr en este caso, ya que es sera igual al que he puesto anteriormente. Por otra parte, solamente profundizar en una de las propiedades de los discos (creo que las otras son facilmente identificables), y es justamente, la ltima que he enumerado, drivetype. El tipo de disco de un disco (valga la redundancia), puede estar entre los siguientes: Valor 0 1 2 3 4 5 Tipo Unknown/Desconocido Removable/Removible Fixed/Rgido Network/Red CD-Rom RAM Disk

Tambin he de acotar, que la disquetera (Unidad A), es reconocida como disco extrable, as como tambin ocurre, con las unidades virtuales, ej; aquellas carpetas montadas con el comando SUBST de ms-dos. Rutas de carpetas Por ltimo, pero no menos importante, debo de comentar que el objecto FSO, permite obtener la ruta de tres de las carpetas ms importantes del sistema, como lo son: Windows (0) System32 (1) Temp (2) Para acceder a ellas, haremos uso de la funcin getspecialfolder. Set variable = objfso.getspecialfolder(constante) Ejemplo: Cdigo
Set objfso = createobject("scripting.filesystemobject") Set micarpeta = objfso.getspecialfolder(0) 'obtenemos el control sobre la carpeta Msgbox micarpeta.path 'mensaje con la ruta de la carpeta

Como se ve en ejemplo, en este caso, nos hacemos con el control de la carpeta de windows, y luego

mostramos su ruta, para poder acceder a las carpetas, las constantes son las que he indicado en un entre parentesis en un principio, al nombrar las carpetas. Bueno, con esto hemos terminado con el objeto FSO, pasemos entonces al segundo y principal objeto, la shell. Shell (wscript.shell) A travs de este objeto podemos entre otras cosas: Mostrar mensajes temporizados Leer, borrar, y escribir en el registro de windows Ejecutar aplicaciones (dos mtodos) Obtener el foco de una ventana Enviar pulsaciones de teclado Acceder multiples carpetas de sistema Obtener variables del sistema Crear accesos directos Mostrar mensajes temporizados Esta es la menos importante de todas las funciones de este objeto, pero no deja de ser til en algunas ocasiones, sobre todo, si no queremos que un proceso se bloquee, solo por intentar mostrar un mensaje. Para que quede ms claro, a lo largo de todos los ejemplo que he puesto, he ido mostrando determinados mensajes a traves de la funcin de msgbox (opcin bsica). Los mensajes generados con dicha funcin, no salen de pantalla, hasta bien el usuario, no da click en el/los botones que tiene el cuadro de mensaje, por lo que en caso de utilizar un mensaje de este tipo, la ejecucin de nuestro script, se parar hasta bien este no salga de pantalla. Pero en lugar de utilizar este tipo de mensaje, podemos hacer uso de una mensaje popup, la cual desaparecer sola al cabo del tiempo que hayamos especificado, luego de lo cual, continuar la ejecucin del script. Modo en el que se emplea esta ventana: Variablemensaje = variable.popup(texto, tsegundos, ttulo, botones) Ejemplo: Cdigo
Set objshell = createobject("Wscript.shell") rmensaje = objshell.popup("Este es un mensaje de prueba",3,"Mensaje Popup",64)

El resultado;

Para empezar, se puede apreciar que el objeto shell, se declara con Wscript.shell, y bueno, lo referente al mensaje, creo que una imagen dice ms que mil palabras, hemos mostrado un mensaje en pantalla, el cual al cabo de 3 segundos, desaparecera y dar paso al resto de nuestro script. Si se ha mirado detenidamente, se notar que para los "botones" he puesto el valor 64, este valor, hace referencia a la sumatoria de los botones e iconos que aparecen en la ventana de mensaje, siendo los mismos: Botones:

Valor 0 1 2 3 4 5 Iconos Valor 16 32 48 64

Descripcin OK OK y Cancelar Abortar, Reintentar e Ignorar Si, No y Cancelar Si y No Reintentar y Cancelar

Descripcin Parar/Error Pregunta Exclamacin Informacin

En el caso de mi mensaje, el 64 corresponde a la suma del botn de ok (cero) y el icono de informacin (64) Si quisieramos mostrar un mensaje de Si, No y Cancelar, con un icono de pregunta, deberamos de poner como valor el nmero 35 (3+32).

Por otro lado, tambin vemos en el ejemplo como el popup, se guarda en una variable de nombre rmensaje. En dicha variable, se guarda el valor de la respuesta dada al mensaje, es decir, para el caso de un mensaje con los botones de Si, No y Cancelar, la variable rmensaje guardara el valor de cual de esos botones fue presionado por el usuario, siendo estas las posibilidades: Valor 1 2 3 4 5 6 7 Descripcin OK Cancelar Abortar Reintentar Ignorar Si No

Es decir, que en caso de que la persona presione Si, el resultado obtenido ser 6, esto puede servirnos de mucho si queremos darle un poco de interactividad a nuestros scripts y tomar diferentes caminos en virtud de las respuestas de los usuarios, lo cual puede ser utilizado junto a las funciones de msgbox (para esta tambin valen los botones e iconos) e inputbox, aunque a pesar de la mencin las veremos en detalle, ya que no dependen de ningn objeto, y son de fcil comprensin. Leer, borrar y modificar el registro de windows Sin lugar a dudas, es una de las funciones ms atractivas de este objeto, y su implementacin no implica ninguna dificultad, y an as, la implementacin de esta funcin, no presenta ninguna dificultad. Leer valores

variable.regread(llave de registro) Ejemplo: Cdigo


Set objshell = createobject("wscript.shell") Msgbox objshell.regread("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\My Pictures") 'va todo en una misma linea, la llave es muy larga

Sencillo de entender, a travs del objeto shell llamamos a la funcin regread, encargada de leer las llaves del registro, en este caso, he optado por una llave un tanto larga, pero que contiene la ruta de la carpeta de "mis imgenes", al igual que en otros ejemplos, muestro el valor por medio de un msgbox, pero como en todos los casos, es posible guardar este valor en una variable para luego trabajar con ella. Borrar valores variable.regdelete(llave de registro) Ejemplo: Cdigo
Set objshell = createobject("wscript.shell") objshell.regdelete("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shel l Folders\My Pictures")

Al igual que para leer, el borrar cadenas no tiene nada de especial, sino que simplemente debemos de llamar a la funcin regdelete para deshacernos de la cadena en cuestin. Escribir/modificar el registro Algo que de seguro le interesar a varios. variable.regwrite(llave de registro, valor, tipo de dato) Ejemplo: Cdigo
Set objshell = createobject("wscript.shell") objshell.regwrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Syste m\DisableTaskMgr",1,"REG_DWORD") 'va todo en una misma linea, la llave es muy larga

En este ejemplo, estaramos modificando la llave del registro que deshabilita el administrador de tareas (taskmgr). Los datos que debemos de pasarle a esta funcin son; la llave a modificar/crear claro esta, el valor que le daremos, en mi ejemplo ha sido 1, y el tipo de datos que estamos ingresando. Como muchos sabrn, el registro de windows soporta ciertos tipos de datos en las diferentes claves de las que hace uso, a saber:

Tipo Descripcin REG_SZ Cadena REG_DWORD Numrico REG_BINARY Binario REG_EXPAND_SZ Una cadena expandible Existe un quinto tipo de datos, el REG_MULTI_SZ, pero no es soportado por esta funcin. Tener en cuenta que regwrite puede tener problemas con cadenas demasiado largas, y considerar tambin, que tal como he puesto en el ttulo, regwrite crear una llave en caso de no existir, y la modificar en caso de que ya est presente. Tambin he de recomendar que en caso de trabajar con el registro se ha de tener mucho cuidado, y que quererse dejar el code ms legible, se utilicen las siguientes abreviaciones (lo he hecho en mi ejemplo): Llave principal HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_CLASSES_ROOT HKEY_USERS HKEY_CURRENT_CONFIG Ejecutar aplicaciones Como he comentado antes, a traves de este objeto existen dos mtodos diferentes de ejecutar aplicaciones, los cuales adems, tendrn diferentes opciones y resultados. Mtodo Run Este es el ms simple y usado de los dos mtodos. variable.run rutaprograma, estadoventana, espera Ejemplo: Cdigo
Set objshell = createobject("wscript.shell") Objshell.run "notepad", 1, true

Abreviacin HKCU HKLM HKCR HKEY_USERS HKEY_CURRENT_CONFIG

En este caso ejecutamos el bloc de notas, en modo normal, y establecemos, que el script se pause (true) hasta que se cierre la aplicacin (notepad). Los estados en los que se puede abrir la ventana, van del 0 al 10, pasando por oculto, maximizado y minimizado, entre otros, pero pasar de explicar cada uno de ellos ya que resulta mejor opcin probar y ver el resultado, que lo que podra ser la explicacin. Lo que si cabe destacar, es el estado 0 (cero) o vbhide, que ejecuta una aplicacin en modo oculto, sin mostrar ningn tipo de ventana. Probar por ejemplo sustituyendo el nmero 1 por vbhide en el ejemplo que he dejado, para ver (en realidad no se ver nada) como se ejecuta el notepad sin mostrar ninguna ventana (si se ver el proceso en el administrador de tareas). Tener en cuenta adems, que el estado de la ventana, y la espera del programa, son totalmente opcionales , as que con poner simplemente objshell.run "notepad" hubiese alcanzado. Mtodo Exec

Este mtodo es muy similar al anterior, solamente que nos permite un mayor control sobre la aplicacin que estamos corriendo, con la excepcin de que no nos permite seleccionar estado de la ventana. variable.exec(rutaprograma) Ejemplo: Cdigo
Set objshell = createobject("wscript.shell") Objshell.Exec("notepad")

Como vemos, el mtodo en el que se ejecuta la aplicacin es practicamente igual al anterior, solamente hemos sutitudo run por exec y no hemos pasado ningn parmetro a la funcin, pero ahora veamos que es lo que o hace diferente del otro mtodo. Status ProcessID Terminate Stdin, Stdout, Stderr Estas seran las funciones que diferencian el exec del run, todas estas se aplican sobre la aplicacin/ comando que estamos ejcutando, por lo que, para hacer uso de esta funcionalidad, es necesario ejecutar la aplicacin, y asignar la misma a una variable para luego trabajar a traves de esta. Veamos esto, junto a la explicacin de status y processid El status identifica el estado de la aplicacin ejecutada, 0 (cero) representa una aplicacin en ejecucin, y 1 (uno), indentifica que la aplicacin fue cerrada y su proceso ya no se encuentra presente. Con respecto al processid, creo que salta a la vista la funcin del mismo, no es ms que el identificador de proceso (PID). Ejemplo: Cdigo
Set objshell = createobject("wscript.shell") Set bloc = Objshell.Exec("notepad") Msgbox bloc.status Msgbox bloc.processid

En este ejemplo, ejecutamos el bloc de notas, asignando su proceso a la variable "bloc", y luego mostramos dos mensajes, uno con el status (debera de ser 0), y otro con el nmero de proceso. La funcin status nos servir en definitiva, para poder monitorear nuestro proceso, y realizar una determinada accin en funcin de si permanece abierto, o bien, lo han cerrado. Ejemplo: Cdigo
Set objshell = createobject("wscript.shell") Set bloc = objshell.Exec("notepad") Do while bloc.status = 0 Wscript.sleep 200 'sirve para hacer una pausa de x milesimas de segundo loop msgbox "Se ha cerrado el bloc de notas"

Pasemos entonces a terminate Esta funcin, permite terminar el proceso que habamos iniciado, por lo que por su nombre era fcil predecirlo Ejemplo: Cdigo
Set objshell = createobject("wscript.shell") Set bloc = objshell.Exec("notepad") Wscript.sleep 5000 'Pausa de 5000 milesimas, o 5 segundos bloc.terminate

Abrimos el bloc de notas, realizamos una espera de 5 segundos, y cerramos el bloc de notas, fcil. Pasando ahora a las ltimas funciones de exec; stdin, stdout, stderr, debo de aclarar que estas funciones pueden ser utiles a la hora de trabajar en lnea de comandos, pero dado que en lnea de comandos hay mejores maneras (a mi criterio) de hacerlo, obviar la explicacin de dos de estas funciones, y solo le dar importancia a stdout que si puede facilitarnos la tarea en la ejecucin de comandos de ms-dos. Stdout nos muestra la salida de un los comandos ejecutados a traves de exec, y para que se entienda mejor, pasare directamente a un.. Ejemplo: Cdigo
Set objshell = createobject("wscript.shell") Set ping = objshell.exec("cmd /c ping www.google.com") Msgbox ping.stdout.readall

El resultado:

En este ejemplo, hemos ejecutado un ping a google a traves del cmd, y luego por medio de stdout y su readall hemos ledo el contenido completo de la salida del comando y lo hemos mostrado en un msgbox. Tambin, en lugar de readall podemos utilizar read(x), donde x es el nmero de caracteres que queremos leer. En un ejemplo un poco mas "elaborado", haremos lo mismo que antes, pero esta vez haciendo uso de read, leeyendo el texto completo, pero carcter a carcter. Cdigo
Set objshell = createobject("wscript.shell") Set ping = objshell.exec("cmd /c ping www.google.com") do if not ping.stdout.atendofstream then respuesta = resultado & ping.stdout.read(1) else exit do end if

loop msgbox respuesta

Este ejemplo, es un poco ms dificil de explicar, as como tambin lo es entender, por lo que quien quiera entenderlo deber prestar atencin y visualizarlo detenidamente. En resumen, ejecutamos el ping a google, y luego nos metemos en un bucle infinito (do), dentro de este, un anlisis condicional, si no se alcanza el final de la salida (stdout.atendofstream), la variable respuesta, es igual a la propia variable y un carcter (concatenamos). Ese analisis se continuar haciendo hasta que se alcance el final de la lectura, es ah donde entonces, pasamos al else, y el else dice que, se sale del bucle do (exit do). Por lo que en definitiva, el if se ejecutar una y otra vez, e ira guardando en la variable (respuesta) letra por letra hasta formar el mensaje completo, cuando se llegue al final, se saldr del bucle, y se mostrara el msgbox con la "respuesta". Un poco ms complicado, pero espero se entienda la idea de este ejemplo. Obtener el foco de una ventana Variable.appactivate tituloventana Ejemplo. Cdigo
Set objshell = createobject("wscript.shell") Objshell.appactivate "Sin titulo"

Con esto, obtendramos el foco de una ventana con por ejemplo, el ttulo "Sin ttulo Bloc de notas", que como se habrn dado cuenta, es el ttulo que tiene un nuevo bloc de notas. Las consideraciones que debemos de tener en cuenta al utilizar esta funcin, son las referentes al orden en el que realiza las comparaciones en busca de nuestra ventana; Primero busca la ventana que tiene el ttulo exacto que hemos establecido Si no encuentra el ttulo exacto, busca aquella ventana que coincida en el principio del ttulo Si no encuentra ni el ttulo exacto, ni tampoco encuentra ttulo que comience como el nuestro, entonces busca aquel que termina como el que queremos. Tambin, en el caso de haber varias ventanas con el mismo nombre, elegira una cualquiera al azar, y le dar el foco. Enviar pulsaciones del teclado Otra de las funciones llamativas de este objeto, es la funcin sendkeys que nos permitir enviar pulsaciones de teclado, como si estuviesemos escribiendo, as que hay que tener cuidado con el uso que se da, ya que una vez ejecutada, enviar las pulsaciones a la ventana activa, por lo que si no es lo que deseabamos, podemos terminar presionando un montn de teclas en un programa x, con los resultados que ello puede acarrear. Variable.sendkeys teclas Ejemplo: Cdigo
Set objshell = createobject("wscript.shell") Objshell.sendkeys "Estas son las teclas"

Este es un ejemplo muy simple ,que adems no recomiendo probar, ya que como he dicho antes, enviar las pulsaciones de las teclas a la ventana activa, y los resultados pueden no "gustarnos". Es por eso que a continuacin muestro un ejemplo ms claro de esta funcin, haciendo uso adems, de funciones que hemos visto anteriormente. Cdigo
Set objshell = createobject("wscript.shell") Set bloc = objshell.exec("notepad") 'ejecutamos el bloc de notas Wscript.sleep 2000 'espera de dos segundos Objshell.appactivate bloc.processid 'ponemos el foco en la ventana del bloc Wscript.sleep 200 'espera de milesimas Objshell.sendkeys "Tutorial vbs" 'enviamos un mensaje con sendkeys Objshell.sendkeys "{ENTER}" 'luego del mensaje anterior, un ENTER Wscript.sleep 2000 'nueva espera de dos segundos Objshell.sendkeys "Probando la funcion sendkeys" 'enviamos una segunda linea de mensaje

Como haba dicho, en este ejemplo he hecho uso de algunas otras fuciones vistas anteriormente. Para empezar he optado por ejecutar el bloc de notas a traves de la funcin exec, podra optarse por run, pero este ejemplo me serva para mostrarles el uso que puede hacerse del processid. Como vemos, a la hora de obtener el foco de la ventana con appactivate, he puesto como "ttulo" el processid, ya que vbs nos permite hacer uso conjunto de estas dos funciones, para de este modo asegurarnos de que el foco se ponga en la ventana que corresonde y no en otra con similar nombre. Al igual que antes, podramos poner simplemente el nombre de la ventana del bloc de notas en lugar de processid, pero igualmente creo no quedarn dudas de por que el uso de esta. Luego, con respecto al envo de las teclas, no creo que merezca explicacin alguna, ya que es simplemente el mensaje/pulsacin que queremos envar. Igualmente habrn visto en medio del envo de teclas que tambin esta presente una tecla especial, el {ENTER}, es por eso que dejo a continuacin, la tabla con el listado de argumentos para estas teclas: Tecla BACKSPACE BREAK CAPS LOCK DEL or DELETE DOWN ARROW END ENTER ESC HELP HOME INS or INSERT LEFT ARROW NUM LOCK PAGE DOWN PAGE UP Argumento {BACKSPACE}, {BS}, or {BKSP} {BREAK} {CAPSLOCK} {DELETE} or {DEL} {DOWN} {END} {ENTER} or ~ {ESC} {HELP} {HOME} {INSERT} or {INS} {LEFT} {NUMLOCK} {PGDN} {PGUP}

PRINT SCREEN RIGHT ARROW SCROLL LOCK TAB UP ARROW F1 F2 Fx

{PRTSC} {RIGHT} {SCROLLLOCK} {TAB} {UP} {F1} {F2} {Fx}

Para el caso de las teclas SHIFT, CTRL y ALT, los argumentos con +, ^ y % respectivamente, no siendo posible utilizar, la tecla PRTSC, o lo que es igual, la tecla de PRINT (la que se utiliza para capturar pantalla). Para utilizar estas tres letras; Objshell.sendkeys "+A" Objshell.sendkeys "^V" Objshell.sendkeys "%{TAB}" Carpetas "especiales" Con carpetas especiales me refiero a aquellas carpetas como "Inicio", "Enviar a" y "Favoritos" entre otras. Para eso, haremos uso de la funcin specialfolders Variable.specialfolders(carpeta) Ejemplo: Cdigo
Set objshell = createobject("wscript.shell") Msgbox objshell.specialfolders("Desktop")

Con lo que obtendramos un msgbox, con la ruta del escritorio, algo como "C:\Documents and Settings\Novlucker\Escritorio", de igual modo y como he mencionado antes, podemos acceder a las rutas de otras carpetas, para lo que, contamos con la siguiente tabla. Carpeta Escritorio Men Inicio Programas Inicio Escritorio Favoritos Fuentes Mis documentos Entorno de red Impresoras Programas Reciente Enviar a Men Inicio Inicio Plantillas Identificador AllUsersDesktop AllUsersStartMenu AllUsersPrograms AllUsersStartup Desktop Favorites Fonts MyDocuments NetHood PrintHood Programs Recent SendTo StartMenu Startup Templates

Con esta tabla, solo bastara cambiar "desktop" en nuestro ejemplo, para ver las rutas de otras de las

carpetas disponibles, y ntese tambin que si bien, algunas carpetas parecen estar repetidas, algunos identificadores hacen referencia a las carpetas de todos los usuarios, y otras a la del usuario activo. Obtener variables de sistema Bueno, habrn visto entonces, que a pesar de la cantidad de carpetas de las que se puede obtener la ruta, hay algunas muy interesantes que no aparecen con el specialfolders, como ser "Archivos de programa", la carpeta de usuario, etc. , es por eso que entonces, haremos uso de la funcin expandenvironmentstrings. Este funcin, y como se ha adelantado en el ttulo, permite acceder a todas las variables del sistema, como ser, USERNAME, USERPROFILE, COMPUTERNAME, y todas aquellas que aparecen a travs del comando SET de ms-dos. Variable.expandenvironmentstrings(%variablesistema%) Ejemplo: Cdigo
Set objshell = createobject("wscript.shell") Msgbox objshell.expandenvironmentstrings("%Programfiles%")

Como es de esperarse, en este caso, nos aparecer un mensaje con la ruta de la carpeta de "Archivos de programa". Crear accesos directos Bueno, luego de haber visto ya, varias funciones, solo queda por ver, la de createshortcut, la cual permite crear accesos directos a cualquier aplicacin/archivo, quizs parezca una funcin un poco "insulsa", pero quizs alguien quiera por ejemplo, agregar un acceso directo en la carpeta de Inicio, y ser aqu cuando recurramos a esta funcin. En esta funcin es necesario definir varios valores, as que en lugar de explicarla, pasar directamente a un ejemplo: Cdigo
Set objshell = createobject("wscript.shell") Set ellink = objshell.createshortcut("C:\Acceso directo.lnk") 'creamos el link Ellink.targetpath = "C:\windows\notepad.exe" 'completamos los valores Ellink.windowstyle = 1 Ellink.hotkey = "CTRL+SHIFT+N" Ellink.iconlocation = "C:\windows\notepad.exe,0" Ellink.description = "Acceso directo a notepad" Ellink.workingdirectory ="C:\" Ellink.save 'guardamos el link

Creo que este ejemplo alcanza para entender sin problemas esta funcin, no hacemos ms que crear el link, completamos todos los datos que lleva el link, y salvamos. Los campos a completar son los que aparecen en cualquier link (imagen adjunta), teniendo en cuenta dems que no todos son indispensables.

Falta agregar, que pueden crearse links a pginas webs del siguiente modo. Ejemplo: Cdigo
Set objshell = createobject("wscript.shell") Set weburl = objshell.createshortcut("C:\google.url") Weburl.targetpath = http://www.google.com Weburl.save

Simplemente hemos cambiado la extensin del link a url, en lugar de lnk como tena antes, y la ruta del link pasa a ser la direccin de la web a la que queremos acceder.

Bueno, as termina la segunda parte de este tutorial, en donde he intentado mostrar a quienes no tienen conocimientos, los dos principales objetos de la "librera" de vbs, espero se haya entendido , y como he dado a entender en mi primer mensaje, la idea es ir agregando nuevo objetos, seguramente no agregar ms post, pero si agregar y colgar en el "temario" enlaces para descarga de pdf

Saludos Continuar....