VBScript Tutorial

6,801 views

Published on

Les traigo el Tutorial de programación de VBScript hecho por Novlucker…

  • Be the first to comment

VBScript Tutorial

  1. 1. Tutorial de vbscript by NovluckerTemas • Introducción - 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, 2Se irán añadiendo nuevos objectos para descarga en pdfBueno, primero aclarar que este tutorial, pretende explicar de manera básica las distintasinstrucciones aplicadas en visual basic script (vbs de aquí en más), para que así de este modo, todosaquellos interesados en este lenguaje de scripting, tengan la posibilidad de comenzar a desarrollarsus pequeños scripts.Introducción:Para empezar, debemos decir, que los vbs, tal y como lo dice su nombre, son "simples" scripts, quese ejecutan por medio de un intérprete en el sistema, con lo que bastará con crear el código en unsimple bloc de notas (o similar), y guardarlo con extensión *.vbs, sin necesidad de realizar ningunacompilación (aunque existe la posibilidad).En este caso el intérprete 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í quepodremos hacer uso de estos archivos en prácticamente, todos los Windows.Se puede decir que los vbs son una mejora con respecto a los bat, ya que estos permiten una mayorinteracción con el sistema operativo, y decir además que este lenguaje, es un derivado de VisualBasic, por lo que desde un principio y aunque de manera mucho más limitada, se podrá familiarizarcon dicho leguaje (la sintaxis es similar en todos los aspectos).A tener en cuenta antes de comenzar:• En vbs no importan las mayúsculas o minúsculasVBscript = vbscript• Para indicar un final de línea, no se debe de hacer más que pasar a la siguiente (no es necesarioterminar 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 más legible el
  2. 2. código Se pueden declarar utilizando Dim, o bien, se les da valor directamente. Dim nuestravariable También puede ser utilizado Option explicit para así "obligarse" a declarar las variables (en lospequeños ejemplos lo haré así)En la mayoría de los ejemplos utilizaré la función msgbox, la cual se encarga de mostrar unmensaje en pantalla.Tipos de dato:Existen varios tipos de datos que pueden manejarse en vbs, y los que más vamos a utilizar, son ;Booleano, Byte, Fecha, Double, Entero, Entero largo, Objeto, Single, Cadena.Todos estos representan valores verdadero/falso, fecha/hora, númerosentero positivo/negativo,cadena de texto (no creo necesite más explicación que esta).Operadores:Tendremos varios tipos de operadores a nuestra disposición.1. Aritméticos: Suma(+), Resta(-), Multiplicación(*), División decimal(/), División entero(),Potencia(^), Resto división(mod)2. Comparación: Igual(=), Distinto(<>), Mayor(>), Menor(<), Menos o igual(<=), Mayor oigual(>=)3. Lógicos: Y(and), O(or), Xor, No(not)4. De cadena: Concatenación(&)Estos han sido a grandes rasgos, los operadores a utilizar en vbs, por lo que después, y haciendo usode nuestro próximo tema (estructuras de control), se mostrarán algunos ejemplos.Estructuras de control:1. IF (condicional)Esta se utiliza para evaluar 2 o más posibles resultados, en virtud del cual, se tomarán diferentesacciones.CitarDim valorValor = 8If valor < 10 then Msgbox "El valor es MENOR a diez "Else Msgbox "El valor es MAYOR a diez "End ifComo se ve en este ejemplo se comienza declarando la variable "valor", luego de esto, se le asignael valor 8, y posterior a esto, se evalúa dicho valor (haciendo uso de los operadores de comparaciónvistos anteriormente), por lo que si el valor es menor a 10, se mostrará un mensaje en pantallaindicando que es MENOR, de lo contrario, el mensaje indicará MAYOR (en este caso le habíamosasignado el valor 8, por lo que será menor).
  3. 3. 2. Case (condicional)En el caso del IF, si bien no se ha mostrado, existe la posibilidad de anidar dos o más, para asírealizar varias evaluaciones, pero el caso es que cuando se realizan muchas, el código puedevolverse algo engorroso. Es en estos casos, donde recurrimos al select case.CitarDim numeronumero = 8Select case numero case 6 msgbox "El valor es seis " case 7 msgbox "El valor es siete " case 8 msgbox "El valor es ocho "End selectAl igual que en el anterior, en este ejemplo, se comienza definiendo la variable "numero", y se leasigna 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, eneste caso, "case 6", en el caso de que el valor sea 6, "case 7", y "case 8", para el caso de que el valorsea 7 y 8 respectivamente (como sabemos es 8), es decir, "si es 6", mensaje "El valor es seis", "si es7", 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 acción un cierto número de veces.CitarDim iFor i=1 to 5 step 1 Msgbox "El valor de i es: " & iNextComenzamos definiendo la variable "i", luego de esto, inicializamos el bucle for, es decir, decimosque; desde "i" igual 1, a "i" igual 5, incrementando de a1, mostraremos un mensaje con la frase "El valor de i es: " y luego de esto, el valor real de "i", porlo que en cada "paso" que de nuestro bucle, mostrará algo más o menos así…Como ven, 5 mensajes "casi" iguales, ya que la secuencia se repite 5 veces, y lo único que cambiaes el valor de "i" (la hemos concatenado al mensaje con el carácter &), ya que va tomando distintosvalores 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 coleccióno vector. Antes de continuar, intentaré explicar lo que es un "array", ya que será lo que utilicemos enel ejemplo.Un array o matriz, es una estructura de datos en forma de variable, que permite almacenar más deun único valor, dentro de una única variable. Para acceder a cada uno de estos valores, seránecesario hacer uso de índices.Citar
  4. 4. Dim nombres(2)nombres(0)= "Martín"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 cuentaque 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 elsiguiente resultado…Como se ve, el mensaje muestra el nombre "Pablo" porque al llamar al array, hemos puesto el índice1, y como se ve cuando lo declaramos, le habíamos asignado valor "Pablo", en el caso de indicar 2en lugar del 1, el mensaje mostraría "Carlos".Espero esto haya quedado lo suficientemente claro.Ahora, volviendo al For each (espero ya no te hayas olvidado), este podría ser utilizado en el casodel array (hay otros casos).CitarDim nombresDim nnombres = array("Martín","Pablo","Carlos")For each n in nombres Msgbox nnextA pesar de que no lo parezca, es muy similar al anterior, y algunos estarán diciendo, "que tenía quever el array con esto", pero si se fijan, solamente he mostrado, una segunda manera de declarar elarray.En este caso, en lugar de ir metiendo cada uno de los valores con sus respectivos índices, declaro elarray en una sola línea y va quedando organizado según el orden en el que meta los valores, por eso,"Martín" quedará en el lugar 0, "Pablo" en el lugar 1, y "Carlos", en el lugar 2, al igual que en elcaso anterior. Esto con respecto al array, ahora a lo que íbamos, el for each.En líneas siguientes comenzamos con el for, y decimos, por cada "n" (la letra, en este caso "n" laelegimos nosotros) en "nombres" (es un array que contiene tresnombres), 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 ejecucióndel for completa. Para decirlo de otra manera, con esto escapamos al for.WHILE (bucle)El bucle while, es utilizado cuando queremos que una determinada acción se repita mientras unadeterminada condición de cumpla.CitarDim numero
  5. 5. Numero = 1While numero <= 10 Msgbox numero numero = numero + 1WendComenzamos el ejemplo declarando la variable numero, y le asignamos valor 10, luegoejecutamos bucle, mientras el valor de "numero" sea menor o igual a 10,mostramos mensaje con el valor de numero, y además le sumamos 1 al propio valor de numero (deeste 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 condición esta no se cumplirá, por lo que terminará.5. DO (bucle)El bucle do tiene varias opciones, pero básicamente hará algo, "mientras", o "hasta que" ocurraalgo.CitarDo Msgbox "Esto es un mensaje"LoopEste bucle, se repetirá al infinito, por lo que mostrará un mensaje, interminables veces.Ahora bien, este do, puede ser modificado, para tener algo más de control sobre él, y es justamentehaciendo uso de esas condiciones que comentaba antes, "mientras", o "hasta que"CitarDim a = 1Do until a=10 Msgbox "Esto es un mensaje"LoopEste código se resume en; mensaje de "Esto es un mensaje" hasta que "a" sea igual a 10.En lugar de until podría utilizarse while, para cambiar la condición a mensaje de "Esto es unmensaje" mientras "a" sea distinta de 10.CitarDim a = 1Do while a<>10 Msgbox "Esto es un mensaje"LoopY también puede utilizarse until y while, antes o después de ejecutarse el bucleCitarDo until/while condición (es distinta según sea until o while) Msgbox "Esto es un mensaje"Loop until/whileComo se ve, este bucle nos permite darle varios usos según nos convenga, por lo que termina siendomuy versátil y útil.Al igual que para los for, en el caso de querer salir de un bucle do, también contamos con unafunción de escape, en este caso, exit do
  6. 6. Así termina está pequeña introducción a las rutinas básicas de visual basic script, la idea es seguirextendiendo este "tuto", como comentario agrego además, que este lenguaje posee muchisimasfunciones, las cuales no detallaré, ya que sería interminable, además de que me centraré másadelante, en explicar funciones expecificas de objetos.En el caso de querer más documentación al respecto, se pueden descargar la documentación sobrewindows script host, donde tendrán la referencia a todas las funciones de las que podemos haceruso. Windows Script 5.6 Documentation Manejo de objetosAnteriormente, he intentado mostrar las diferentes estructuras de control que nos permitenencaminar nuestros vbs, es por esto que ahora, pasaremos a los OBJETOS.Toda interacción de vbs con el sistema se basa en el manejo de objectos (ActiveX), que no son másque librerías especializadas y a nuestra diposición, por lo que dependiendo de lo que busquemoshacer, 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 básicos de los que se hace uso son dos:1. FSO (FileSystemObject): manejo de unidades, archivos y carpetas.2. WshShell: acceso a información de sistema, trabajo con el registro, manejo accesos directos,ejecución de aplicaciones.Antes de continuar debo de explicar que al trabajar con los objetos, los mismos se deben de declararde la siguiente manera:Set variable = createobject(objecto)Ejemplo:Set objfso = createobject("scripting.filssystemobject")Ahora sí, pasamos directamente al análisis del objeto FSO.FSO (File System Object)Las distintas funciones que se pueden realizar a través 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 sistemaMover archivos
  7. 7. Objfso.movefile origen, destinoEjemplo:CódigoSet objfso = createobject("scripting.filesystemobject")Objfso.movefile "C:archivo.txt", "D:Carpeta"Borrar archivosObjfso.deletefile archivoEjemplo:CódigoSet objfso = createobject("scripting.filesystemobject")Objfso.deletefile "C:archivo.txt"Copiar archivosObjfso.copyfile origen, destino, sobreescribirEjemplo:CódigoSet objfso = createobject("scripting.filesystemobject")Objfso.copyfile "C:archivo.txt", "D:destino.txt", trueCrear carpetasSet variable = objfso.createfolder(destino carpeta)Ejemplo:CódigoSet objfso = createobject("scripting.filesystemobject")Set micarpeta = objfso.createfolder("C:carpeta")Mover carpetasObjfso.movefolder origen, destinoEjemplo:CódigoSet objfso = createobject("scripting.filesystemobject")Objfso.movefolder "C:Carpeta", "D:Destino"Borrar carpetasObjfso.deletefolder carpeta
  8. 8. Ejemplo:CódigoObjfso.deletefolder "C:Carpeta"Copiar carpetasObjfso.copyfolder origen, destino, sobreescribirEjemplo:CódigoSet objfso = createobject("scripting.filesystemobject")Objfso.copyfolder "C:Carpeta", "D:Destino", trueLeer y escribir en archivosPara el manejo de archivos de texto, debemos de tener en cuenta, la existencia o no del archivo, y elmodo en el que accedemos a él.Obviamente, si un archivo no existe, no podrémos acceder a él, y a su vez, si abrimos un archivo enmodo de léctura, nunca podremos escribir dentro.Crear archivos de texto y escribir en ellosSet variable = objfso.createtextfile(ruta, sobreescribir)Ejemplo:CódigoSet objfso = createobject("scripting.filesystemobject")Set archivotexto = objfso.createtextfile("C:archivo.txt",true) creamos elarchivoarchivotexto.writeline "Este es el texto que estoy escribiendo" escribimos unalineaarchivotexto.writeblanklines(2) escribimos 2 lineas enblancoarchivotexto.writeline "Aqui mas texto" escribimosotra linea de textoarchivotexto.close cerramos elarchivoNotese que al comenzar, hemos creado el archivo y lo hemos asignado a una variable, luego hemosutilizado el identificador de archivo (variable), para escribir dentro de él, en este caso, hemosutilizado writeline, que escribe una línea, y agrega un retorno de carro para que si volvemos aescribir, lo hagamos en una nueva línea, en cambio , si en su lugar, utilizamos write, el resultado,será que no habrá salto de línea, por lo que todas las oraciones iran quedando una detrás de la otra.Por último, hemos cerrado el archivo.Abrir archivos de texto y escribir en ellosSet variable = objfso.opentextfile(ruta, modo, creación)
  9. 9. Ejemplo:CódigoSet objfso = createobject("scripting.filesystemobject")Set archivotexto = objfso.opentextfile("C:archivo.txt",8,true)abrimos el archivoarchivotexto.writeline "Este es el texto que estoy escribiendo"escribimos una lineaarchivotexto.closecerramos el archivoComo se puede ver, al abrir el archivo, hemos indicado la ruta, el modo 8 que se utiliza paraappending o escritura al final de archivo, y true, que quiere decir que en caso de que no exista elarchivo se cree, es decir que de este modo, no solo abrimos el archivo, sino que de no existir, dichoarchivo será creado en el proceso.Para tener en cuenta, los modos en los que se puede abrir un archivo son:1- Modo LECTURA2- 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 paraappending o escritura al final de archivo, y true, que quiere decir que en caso de que no exista elarchivo se cree, es decir que de este modo, no solo abrimos el archivo, sino que de no existir, dichoarchivo será creado en el proceso.Leer desde archivos de textoAsí como abrimos archivos y podemos escribir en ellos, también existe la posibilidad de leer desdeellos, para lo cual utilizaremos readline, y readall.Como se puede imaginar, con readline iremos leyendo una a una las líneas del archivo (cada vezque pongamos readline leeremos solo una), con este, leemos una línea, y el puntero se situa al finalde la línea, para que a la próxima ejecución de esta función, sea la línea siguiente la que sea leída.Con readall en cambio, leeremos el total de archivo.Existe además una función llamada skipline, con la cual saltaremos la lectura de una línea.Ejemplo:CódigoSet objfso = createobject("scripting.filesystemobject")Set archivotexto = objfso.opentextfile("C:archivo.txt",1) abrimos elarchivomsgbox archivotexto.readline leemos unalinea, la primeraarchivotexto.skiplinesaltamos una lineamsgbox archivotexto.readline leemos unalinea, la terceraarchivotexto.closecerramos el archivoAtributos de archivos y carpetasA continuación explicaré el método mediante el cual, se puede obtener, o bien cambiar, los atribuos
  10. 10. de archivos y carpetas (es prácticamente igual para ambas cosas)Obtener atributosSet variable = objfso.getfile(ruta)variable.attributesEjemplo:CódigoSet objfso = createobject("scripting.filesystemobject")Set archivo = objfso.getfile("C:tutorial.pdf") obtenemos el control sobre elarchivo pdfMsgbox archivo.attributes mensaje con los attributos delarchivoEn este ejemplo vemos que luego de declarar el objeto, lo que hacemos es obtener el control del elarchivo 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 susatributos, que no será más que un número que englobará todas las constantes de los atributos.Las constantes que hacen referencia a los atributos de archivo son:Valor Atributo0 Normal1 Solo Lectura2 Oculto4 Sistema8 Letra de disco16 Carpeta/directorio32 Archivo64 Link o acceso directo128 ComprimidoComo comentaba antes, attributes devolverá un valor único que será la sumatoria de cada uno de losvalores para cada atributo del archivo.Como ejemplo:Un archivo que tenga atributos de; solo lectura, oculto, de sistema, y de archivo, tendrá un valor de1+2+4+32= 39Cambiar atributosSet variable = objfso.getfile(ruta)variable.attributes = sumaatributosEjemplo:CódigoSet objfso = createobject("scripting.filesystemobject")Set archivo = objfso.getfile("C:tutorial.pdf") obtenemos el control sobre elarchivo pdfarchivo.attributes = 34 attributo dearchivo y ocultoEl cambiar atributos consiste simplemente en asignar un valor a attributes.
  11. 11. En el ejemplo anterior he puesto como valor 34 que representa atributos de archivo y oculto.Propiedades de archivos y carpetasAsí como podemos obtener y modificar los atributos de los archivos y carpetas, podemos acceder adeterminadas propiedades de los mismos, entre ellas:• Nombre; name• Nombre corto; shortname• Tamaño; Size• Ruta completa; path• Ruta corta; shortpath• Fecha de creación/modificación/último acceso; datecreated, datelastmodified, datelastaccessed• Tipo de archivo; type• Carpeta contenedora; parentfolderEstas son las principales propiedades a las que podemos acceder, lo cual se hará de la siguienteforma:Set variable = objfso.getfile(ruta)Msgbox variable.propiedadEjemplo:CódigoSet objfso = createobject("scripting.filesystemobject")Set archivo = objfso.getfile("C:tutorial.pdf") obtenemos el controlsobre el archivo pdfMsgbox archivo.size tamano del archivo enbytesPara obtener otras propiedades, simplemente sería cuestión de cambiar "size" por alguna de lasotras propiedades a las que tenemos acceso (les recomiendo probar con cada una para ver losresultados), y de igual manera, se haría con carpetas en lugar de archivos, para lo que solamentetendríamos que cambiar getfile, por getfolder.Listar subcarpetasCon listar subcarpetas, nos referimos a, acceder a la colección de subcarpetas de una carpeta "X",para trabajar con cada una de ellas de manera independiente.Cuando hablamos de colección, hacemos referencia a un array, en el que están todos los elementoscontenidos en un determinado "listado".Set variable = objfso.getfolder(ruta)Set subvariable = variable.subfoldersEjemplo:CódigoSet objfso = createobject("scripting.filesystemobject")Set micarpeta = objfso.getfolder("C:Carpeta") obtenemos el controlsobre la carpetaSet subcarpetas = micarpeta.subfolders obtenemos la coleccion desubcarpetasFor each s in subcarpetas por cada carpeta(s) en
  12. 12. la coleccion(subcarpetas)Msgbox s.name mensaje con el nombreNext pasamos a la siguientesubcarpetaBueno, como se ve en este caso, el acceder a las subcarpetas no es totalmente directo, sino que, enun principio, obtenemos la colección (array) de carpetas, para luego trabajar con cada una de ellaspor medio de un for que recorre toda la colección.Al listar subcarpetas, se debe de terner en cuenta además, que la colección, solamente contiene, lascarpetas del primer nivel, y no las que se encuentran en los niveles consiguientes, para que quedemás claro:C:carpetaC:carpetanivel1C:carpetanivel1nivel2Si listamos la colección de subcarpetas en la carpeta "C:carpeta", obtendremos todas las del nivel1, pero no las del nivel 2, para eso, deberíamos de implementar otro for que haga referencia a estas.Listar discos/particionesAl igual que para listar subcarpetas, para listar discos y particiones lo haremos a traves de unacolección, por lo que en realidad, será muy similar al punto anterior.Set variable = objfso.getfolder(ruta)Set discos = variable.drivesEjemplo:CódigoSet objfso = createobject("scripting.filesystemobject")Set discos = objfso.drives obtenemos lacoleccion de discosFor each d in discos por cada disco(d) en lacoleccion(discos)Msgbox d.driveletter mensaje con la letra dediscoNext pasamos al siguientediscoComo ya se había dicho, el método de listar los discos y particiones, es el mismo que para obtenerlas subcarpetas de una carpeta, por lo que no debería de presentar ningún problema el hacerlo.También aclarar, que en el anterior ejemplo, solo he incluído una propiedad que no se había vistoanteriormente, y esta es la de driveletter, y que como ya se habrán dado cuenta, hace referencia a laletra que tiene asignado el disco o partición 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 discoComo hemos visto en el anterior punto, a traves del objecto FSO es posible acceder a la colecciónde discos, así como a sus propiedades, siendo estas propiedades, lassiguientes:
  13. 13. • 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• Número de serie; serialnumber• Nombre compartido; sharename• Tipo de disco; drivetypeEjemplo, no pondré en este caso, ya que es sería igual al que he puesto anteriormente.Por otra parte, solamente profundizaré en una de las propiedades de los discos (creo que las otrasson 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 Tipo0 Unknown/Desconocido1 Removable/Removible2 Fixed/Rígido3 Network/Red4 CD-Rom5 RAM DiskTambién he de acotar, que la disquetera (Unidad A), es reconocida como disco extraíble, así comotambién ocurre, con las unidades virtuales, ej; aquellas carpetas montadas con el comando SUBSTde ms-dos.Rutas de carpetasPor último, pero no menos importante, debo de comentar que el objecto FSO, permite obtener laruta de tres de las carpetas más importantes del sistema, como lo son:• Windows (0)• System32 (1)• Temp (2)Para acceder a ellas, haremos uso de la función getspecialfolder.Set variable = objfso.getspecialfolder(constante)Ejemplo:CódigoSet objfso = createobject("scripting.filesystemobject")Set micarpeta = objfso.getspecialfolder(0) obtenemos el controlsobre la carpetaMsgbox micarpeta.path mensaje con la ruta de lacarpetaComo se ve en ejemplo, en este caso, nos hacemos con el control de la carpeta de windows, y luego
  14. 14. mostramos su ruta, para poder acceder a las carpetas, las constantes son las que he indicado en unentre parentesis en un principio, al nombrar las carpetas.Bueno, con esto hemos terminado con el objeto FSO, pasemos entonces al segundo y principalobjeto, la shell.Shell (wscript.shell)A través de este objeto podemos entre otras cosas:• Mostrar mensajes temporizados• Leer, borrar, y escribir en el registro de windows• Ejecutar aplicaciones (dos métodos)• Obtener el foco de una ventana• Enviar pulsaciones de teclado• Acceder multiples carpetas de sistema• Obtener variables del sistema• Crear accesos directosMostrar mensajes temporizadosEsta es la menos importante de todas las funciones de este objeto, pero no deja de ser útil en algunasocasiones, sobre todo, si no queremos que un proceso se bloquee, solo por intentar mostrar unmensaje. Para que quede más claro, a lo largo de todos los ejemplo que he puesto, he ido mostrandodeterminados mensajes a traves de la función de msgbox (opción básica). Los mensajes generadoscon dicha función, no salen de pantalla, hasta bien el usuario, no da click en el/los botones que tieneel cuadro de mensaje, por lo que en caso de utilizar un mensaje de este tipo, la ejecución de nuestroscript, 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 cualdesaparecerá sola al cabo del tiempo que hayamos especificado, luego de lo cual, continuará laejecución del script.Modo en el que se emplea esta ventana:Variablemensaje = variable.popup(texto, tsegundos, título, botones)Ejemplo:CódigoSet 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, loreferente al mensaje, creo que una imagen dice más que mil palabras, hemos mostrado un mensajeen 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:
  15. 15. Valor Descripción0 OK1 OK y Cancelar2 Abortar, Reintentar e Ignorar3 Si, No y Cancelar4 Si y No5 Reintentar y CancelarIconosValor Descripción16 Parar/Error32 Pregunta48 Exclamación64 InformaciónEn el caso de mi mensaje, el 64 corresponde a la suma del botón de ok (cero) y el icono deinformación (64)Si quisieramos mostrar un mensaje de Si, No y Cancelar, con un icono de pregunta, deberíamos deponer como valor el número 35 (3+32).Por otro lado, también vemos en el ejemplo como el popup, se guarda en una variable de nombrermensaje. En dicha variable, se guarda el valor de la respuesta dada al mensaje, es decir, para elcaso de un mensaje con los botones de Si, No y Cancelar, la variable rmensaje guardaría el valor decual de esos botones fue presionado por el usuario, siendo estas las posibilidades:Valor Descripción1 OK2 Cancelar3 Abortar4 Reintentar5 Ignorar6 Si7 NoEs decir, que en caso de que la persona presione Si, el resultado obtenido será 6, esto puedeservirnos de mucho si queremos darle un poco de interactividad a nuestros scripts y tomardiferentes caminos en virtud de las respuestas de los usuarios, lo cual puede ser utilizado junto a lasfunciones de msgbox (para esta también valen los botones e iconos) e inputbox, aunque a pesar dela mención las veremos en detalle, ya que no dependen de ningún objeto, y son de fácilcomprensión.Leer, borrar y modificar el registro de windowsSin lugar a dudas, es una de las funciones más atractivas de este objeto, y su implementación noimplica ninguna dificultad, y aún así, la implementación de esta función, no presenta ningunadificultad.Leer valores
  16. 16. variable.regread(llave de registro)Ejemplo:CódigoSet objshell = createobject("wscript.shell")Msgboxobjshell.regread("HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerShellFoldersMy Pictures") va todo en una misma linea, la llave es muy largaSencillo de entender, a través del objeto shell llamamos a la función regread, encargada de leer lasllaves del registro, en este caso, he optado por una llave un tanto larga, pero que contiene la ruta dela carpeta de "mis imágenes", al igual que en otros ejemplos, muestro el valor por medio de unmsgbox, pero como en todos los casos, es posible guardar este valor en una variable para luegotrabajar con ella.Borrar valoresvariable.regdelete(llave de registro)Ejemplo:CódigoSet objshell = createobject("wscript.shell")objshell.regdelete("HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerShell FoldersMy Pictures")Al igual que para leer, el borrar cadenas no tiene nada de especial, sino que simplemente debemosde llamar a la función regdelete para deshacernos de la cadena en cuestión.Escribir/modificar el registroAlgo que de seguro le interesará a varios.variable.regwrite(llave de registro, valor, tipo de dato)Ejemplo:CódigoSet objshell = createobject("wscript.shell")objshell.regwrite("HKCUSoftwareMicrosoftWindowsCurrentVersionPoliciesSystemDisableTaskMgr",1,"REG_DWORD") va todo en una misma linea, la llave es muy largaEn este ejemplo, estaríamos modificando la llave del registro que deshabilita el administrador detareas (taskmgr).Los datos que debemos de pasarle a esta función son; la llave a modificar/crear claro esta, el valorque le daremos, en mi ejemplo ha sido 1, y el tipo de datos que estamos ingresando.Como muchos sabrán, el registro de windows soporta ciertos tipos de datos en las diferentes clavesde las que hace uso, a saber:
  17. 17. Tipo DescripciónREG_SZ CadenaREG_DWORD NuméricoREG_BINARY BinarioREG_EXPAND_SZ Una cadena expandibleExiste un quinto tipo de datos, el REG_MULTI_SZ, pero no es soportado por esta función.Tener en cuenta que regwrite puede tener problemas con cadenas demasiado largas, y considerartambién, que tal como he puesto en el título, regwrite creará una llave en caso de no existir, y lamodificará en caso de que ya esté presente.También he de recomendar que en caso de trabajar con el registro se ha de tener mucho cuidado, yque quererse dejar el code más legible, se utilicen las siguientesabreviaciones (lo he hecho en mi ejemplo):Llave principal AbreviaciónHKEY_CURRENT_USER HKCUHKEY_LOCAL_MACHINE HKLMHKEY_CLASSES_ROOT HKCRHKEY_USERS HKEY_USERSHKEY_CURRENT_CONFIG HKEY_CURRENT_CONFIGEjecutar aplicacionesComo he comentado antes, a traves de este objeto existen dos métodos diferentes de ejecutaraplicaciones, los cuales además, tendrán diferentes opciones y resultados.Método RunEste es el más simple y usado de los dos métodos.variable.run rutaprograma, estadoventana, esperaEjemplo:CódigoSet objshell = createobject("wscript.shell")Objshell.run "notepad", 1, trueEn este caso ejecutamos el bloc de notas, en modo normal, y establecemos, que el script se pause(true) hasta que se cierre la aplicación (notepad).Los estados en los que se puede abrir la ventana, van del 0 al 10, pasando por oculto, maximizado yminimizado, entre otros, pero pasaré de explicar cada uno de ellos ya que resulta mejor opciónprobar y ver el resultado, que lo que podría ser la explicación.Lo que si cabe destacar, es el estado 0 (cero) o vbhide, que ejecuta una aplicación en modo oculto,sin mostrar ningún tipo de ventana. Probar por ejemplo sustituyendo el número 1 por vbhide en elejemplo que he dejado, para ver (en realidad no se verá nada) como se ejecuta el notepad sinmostrar ninguna ventana (si se verá el proceso en el administrador de tareas).Tener en cuenta además, que el estado de la ventana, y la espera del programa, son totalmenteopcionales , así que con poner simplemente objshell.run "notepad" hubiese alcanzado.Método Exec
  18. 18. Este método es muy similar al anterior, solamente que nos permite un mayor control sobre laaplicación que estamos corriendo, con la excepción de que no nos permite seleccionar estado de laventana.variable.exec(rutaprograma)Ejemplo:CódigoSet objshell = createobject("wscript.shell")Objshell.Exec("notepad")Como vemos, el método en el que se ejecuta la aplicación es practicamente igual al anterior,solamente hemos sutituído run por exec y no hemos pasado ningún parámetroa la función, pero ahora veamos que es lo que o hace diferente del otro método.• Status• ProcessID• Terminate• Stdin, Stdout, StderrEstas serían las funciones que diferencian el exec del run, todas estas se aplican sobre la aplicación/comando que estamos ejcutando, por lo que, para hacer uso de esta funcionalidad, es necesarioejecutar la aplicación, y asignar la misma a una variable para luego trabajar a traves de esta.Veamos esto, junto a la explicación de status y processidEl status identifica el estado de la aplicación ejecutada, 0 (cero) representa una aplicación enejecución, y 1 (uno), indentifica que la aplicación fue cerrada y su proceso ya no se encuentrapresente.Con respecto al processid, creo que salta a la vista la función del mismo, no es más que elidentificador de proceso (PID).Ejemplo:CódigoSet objshell = createobject("wscript.shell")Set bloc = Objshell.Exec("notepad")Msgbox bloc.statusMsgbox bloc.processidEn este ejemplo, ejecutamos el bloc de notas, asignando su proceso a la variable "bloc", y luegomostramos dos mensajes, uno con el status (debería de ser 0), y otro con el número de proceso.La función status nos servirá en definitiva, para poder monitorear nuestro proceso, y realizar unadeterminada acción en función de si permanece abierto, o bien, lo han cerrado.Ejemplo:CódigoSet 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 desegundoloopmsgbox "Se ha cerrado el bloc de notas"
  19. 19. Pasemos entonces a terminateEsta función, permite terminar el proceso que habíamos iniciado, por lo que por su nombre era fácilpredecirloEjemplo:CódigoSet objshell = createobject("wscript.shell")Set bloc = objshell.Exec("notepad")Wscript.sleep 5000 Pausa de 5000 milesimas, o 5 segundosbloc.terminateAbrimos el bloc de notas, realizamos una espera de 5 segundos, y cerramos el bloc de notas, fácil.Pasando ahora a las últimas funciones de exec; stdin, stdout, stderr, debo de aclarar que estasfunciones pueden ser utiles a la hora de trabajar en línea de comandos, pero dado que en línea decomandos hay mejores maneras (a mi criterio) de hacerlo, obviaré la explicación de dos de estasfunciones, y solo le daré importancia a stdout que si puede facilitarnos la tarea en la ejecución decomandos de ms-dos.Stdout nos muestra la salida de un los comandos ejecutados a traves de exec, y para que se entiendamejor, pasare directamente a un..Ejemplo:CódigoSet objshell = createobject("wscript.shell")Set ping = objshell.exec("cmd /c ping www.google.com")Msgbox ping.stdout.readallEl resultado:En este ejemplo, hemos ejecutado un ping a google a traves del cmd, y luego por medio de stdout ysu readall hemos leído el contenido completo de la salida del comando y lo hemos mostrado en unmsgbox.También, en lugar de readall podemos utilizar read(x), donde x es el número de caracteres quequeremos leer.En un ejemplo un poco mas "elaborado", haremos lo mismo que antes, pero esta vez haciendo usode read, leeyendo el texto completo, pero carácter a carácter.CódigoSet objshell = createobject("wscript.shell")Set ping = objshell.exec("cmd /c ping www.google.com")doif not ping.stdout.atendofstream thenrespuesta = resultado & ping.stdout.read(1)elseexit doend if
  20. 20. loopmsgbox respuestaEste ejemplo, es un poco más dificil de explicar, así como también lo es entender, por lo que quienquiera entenderlo deberá prestar atención y visualizarlo detenidamente.En resumen, ejecutamos el ping a google, y luego nos metemos en un bucle infinito (do), dentro deeste, un análisis condicional, si no se alcanza el final de la salida (stdout.atendofstream), la variablerespuesta, es igual a la propia variable y un carácter (concatenamos). Ese analisis se continuaráhaciendo hasta que se alcance el final de la lectura, es ahí donde entonces, pasamos al else, y el elsedice 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 semostrara el msgbox con la "respuesta". Un poco más complicado, pero espero se entienda la idea deeste ejemplo.Obtener el foco de una ventanaVariable.appactivate tituloventanaEjemplo.CódigoSet objshell = createobject("wscript.shell")Objshell.appactivate "Sin titulo"Con esto, obtendríamos el foco de una ventana con por ejemplo, el título "Sin título – Bloc denotas", que como se habrán dado cuenta, es el título que tiene un nuevo bloc de notas.Las consideraciones que debemos de tener en cuenta al utilizar esta función, son las referentes alorden en el que realiza las comparaciones en busca de nuestra ventana;• Primero busca la ventana que tiene el título exacto que hemos establecido• Si no encuentra el título exacto, busca aquella ventana que coincida en el principio del título• Si no encuentra ni el título exacto, ni tampoco encuentra título que comience como el nuestro,entonces busca aquel que termina como el que queremos.• También, en el caso de haber varias ventanas con el mismo nombre, elegira una cualquiera alazar, y le dará el foco.Enviar pulsaciones del tecladoOtra de las funciones llamativas de este objeto, es la función sendkeys que nos permitirá enviarpulsaciones de teclado, como si estuviesemos escribiendo, así que hay que tener cuidado con el usoque se da, ya que una vez ejecutada, enviará las pulsaciones a la ventana activa, por lo que si no eslo que deseabamos, podemos terminar presionando un montón de teclas en un programa x, con losresultados que ello puede acarrear.Variable.sendkeys teclasEjemplo:CódigoSet objshell = createobject("wscript.shell")Objshell.sendkeys "Estas son las teclas"
  21. 21. Este es un ejemplo muy simple ,que además 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 continuación muestro un ejemplo más claro de esta función, haciendo uso además,de funciones que hemos visto anteriormente.CódigoSet objshell = createobject("wscript.shell")Set bloc = objshell.exec("notepad") ejecutamos el bloc de notasWscript.sleep 2000 espera de dos segundosObjshell.appactivate bloc.processid ponemos el foco en la ventanadel blocWscript.sleep 200 espera de milesimasObjshell.sendkeys "Tutorial vbs" enviamos un mensaje consendkeysObjshell.sendkeys "{ENTER}" luego del mensaje anterior, unENTERWscript.sleep 2000 nueva espera de dossegundosObjshell.sendkeys "Probando la funcion sendkeys" enviamos unasegunda linea de mensajeComo había 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 función exec, podría optarse porrun, pero este ejemplo me servía para mostrarles el uso que puede hacerse del processid. Comovemos, a la hora de obtener el foco de la ventana con appactivate, he puesto como "título" elprocessid, ya que vbs nos permite hacer uso conjunto de estas dos funciones, para de este modoasegurarnos de que el foco se ponga en la ventana que corresonde y no en otra con similar nombre.Al igual que antes, podríamos poner simplemente el nombre de la ventana del bloc de notas en lugarde processid, pero igualmente creo no quedarán dudas de por que el uso de esta.Luego, con respecto al envío de las teclas, no creo que merezca explicación alguna, ya que essimplemente el mensaje/pulsación que queremos envíar.Igualmente habrán visto en medio del envío de teclas que también esta presente una tecla especial,el {ENTER}, es por eso que dejo a continuación, la tabla con el listado de argumentos para estasteclas:Tecla ArgumentoBACKSPACE {BACKSPACE}, {BS}, or {BKSP}BREAK {BREAK}CAPS LOCK {CAPSLOCK}DEL or DELETE {DELETE} or {DEL}DOWN ARROW {DOWN}END {END}ENTER {ENTER} or ~ESC {ESC}HELP {HELP}HOME {HOME}INS or INSERT {INSERT} or {INS}LEFT ARROW {LEFT}NUM LOCK {NUMLOCK}PAGE DOWN {PGDN}PAGE UP {PGUP}
  22. 22. PRINT SCREEN {PRTSC}RIGHT ARROW {RIGHT}SCROLL LOCK {SCROLLLOCK}TAB {TAB}UP ARROW {UP}F1 {F1}F2 {F2}Fx {Fx}Para el caso de las teclas SHIFT, CTRL y ALT, los argumentos con +, ^ y % respectivamente, nosiendo posible utilizar, la tecla PRTSC, o lo que es igual, la tecla de PRINT (la que se utiliza paracapturar 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 función specialfoldersVariable.specialfolders(carpeta)Ejemplo:CódigoSet objshell = createobject("wscript.shell")Msgbox objshell.specialfolders("Desktop")Con lo que obtendríamos un msgbox, con la ruta del escritorio, algo como "C:Documents andSettingsNovluckerEscritorio", de igual modo y como he mencionado antes, podemos acceder a lasrutas de otras carpetas, para lo que, contamos con la siguiente tabla.Carpeta IdentificadorEscritorio AllUsersDesktopMenú Inicio AllUsersStartMenuProgramas AllUsersProgramsInicio AllUsersStartupEscritorio DesktopFavoritos FavoritesFuentes FontsMis documentos MyDocumentsEntorno de red NetHoodImpresoras PrintHoodProgramas ProgramsReciente RecentEnviar a SendToMenú Inicio StartMenuInicio StartupPlantillas TemplatesCon esta tabla, solo bastaría cambiar "desktop" en nuestro ejemplo, para ver las rutas de otras de las
  23. 23. carpetas disponibles, y nótese también que si bien, algunas carpetasparecen estar repetidas, algunos identificadores hacen referencia a las carpetas de todos losusuarios, y otras a la del usuario activo.Obtener variables de sistemaBueno, habrán visto entonces, que a pesar de la cantidad de carpetas de las que se puede obtener laruta, hay algunas muy interesantes que no aparecen con el specialfolders, como ser "Archivos deprograma", la carpeta de usuario, etc. , es por eso que entonces, haremos uso de la funciónexpandenvironmentstrings.Este función, y como se ha adelantado en el título, permite acceder a todas las variables del sistema,como ser, USERNAME, USERPROFILE, COMPUTERNAME, y todas aquellas que aparecen através del comando SET de ms-dos.Variable.expandenvironmentstrings(%variablesistema%)Ejemplo:CódigoSet 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 "Archivosde programa".Crear accesos directosBueno, luego de haber visto ya, varias funciones, solo queda por ver, la de createshortcut, la cualpermite crear accesos directos a cualquier aplicación/archivo, quizás parezca una función un poco"insulsa", pero quizás alguien quiera por ejemplo, agregar un acceso directo en la carpeta de Inicio,y será aquí cuando recurramos a esta función.En esta función es necesario definir varios valores, así que en lugar de explicarla, pasarédirectamente a un ejemplo:CódigoSet objshell = createobject("wscript.shell")Set ellink = objshell.createshortcut("C:Acceso directo.lnk") creamosel linkEllink.targetpath = "C:windowsnotepad.exe" completamos los valoresEllink.windowstyle = 1Ellink.hotkey = "CTRL+SHIFT+N"Ellink.iconlocation = "C:windowsnotepad.exe,0"Ellink.description = "Acceso directo a notepad"Ellink.workingdirectory ="C:"Ellink.save guardamos ellinkCreo que este ejemplo alcanza para entender sin problemas esta función, no hacemos más que crearel 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 encuenta demás que no todos son indispensables.
  24. 24. Falta agregar, que pueden crearse links a páginas web’s del siguiente modo.Ejemplo:CódigoSet objshell = createobject("wscript.shell")Set weburl = objshell.createshortcut("C:google.url")Weburl.targetpath = http://www.google.comWeburl.saveSimplemente hemos cambiado la extensión del link a url, en lugar de lnk como tenía antes, y la rutadel link pasa a ser la dirección de la web a la que queremos acceder.Bueno, así termina la segunda parte de este tutorial, en donde he intentado mostrar a quienes notienen conocimientos, los dos principales objetos de la "librería" 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é más post, pero si agregaré y colgaré en el "temario" enlaces para descargade pdfSaludosContinuará....

×