Windows Script Host para desarrolladores Visual FoxProPágina 1 de 23 Mapa del Sitio | Home | Worldwide Buscar en Microsoft.com: Ir Home Productos y Tecnologías MSDN Suscripciones Arquitectura Centros de Desarrollo Información Técnica MSDN Académico Universidad .NET Eventos MSDN Media Center Comunidad Online Partnering y Certificación TechNet Soporte Técnico Descargue el código fuente (19 Kb). | MSDN Library | Descarga | DCE 2005 | Eventos | Mapa | Países | Contacto Bienvenido a MSDN en Español Windows Script Host para desarrolladores Visual FoxPro. Por George Tasker y Ed Rauh Traducción de Martín Salías Introducción Si frecuenta algunos de los muchos foros y grupos de noticias acerca de VFP, debe haber visto últimamente un número de referencias a Windows Script Host (ó WSH). El WSH es una poderosa herramienta que puede poner a trabajar desde VFP y ayuda a simplificar el código. De hecho, para lograr algunas de las cosas que puede hacer con él, podría incluso tener que escribir una DLL en C. En realidad, Windows Script Host puede separarse en dos áreas diferentes. Primero, el componente de scripting que le permite escribir programas usando VBScript o JScript. Éstos puede ejecutarse bajo el control de uno de los ejecutables del scripting host, y pueden ser utilizados para crear objetos COM a través de compilación con el compilador de WSH. Segundo, una serie de objetos COM que son incluidos con la distribución de WSH que expone varias funcionalidades importantes de Windows que de otra forma requerirían el uso de la API de Win32. Es este juego de objetos COM el que es inmediatamente de mayor interés para el desarrollador VFP, ya que pueden ser usados dentro del contexto de una aplicación VFP. El propósito de este artículo no es el de ser un curso de WSH. Eso requeriría un libro, y de hecho, existe al menos uno sobre el tema. Mencionaremos los detalles del libro más adelante en esta nota junto con otras referencias que puede examinar. Lo que haremos aquí es una reseña sobre WSH y qué ha sido diseñado para hacer. Inclusive, tampoco intentaremos ser definitivos acerca de los objetos y sus PEMs. Nos limitaremos a las cosas que no se pueden hacer con VFP, o aquellas que solucionan, de alguna manera, falencias de comandos existentes. Qué es WSH WSH fue diseñado para cubrir una necesidad que existía desde la primer encarnación de Windows: archivos por lotes propios. Ciertamente, los archivos por lotes tradicionales de DOS aún pueden usarse, pero hacerlo requiere que se abra una ventana de comandos y lo que puede lograr es considerablemente más complejo que lo que podría con un lenguaje de programación de más alto nivel. WSH también http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art03.asp 26/04/2006 Windows Script Host para desarrolladores Visual FoxPro Página 2 de 23 provee acceso a muchas de las funciones internas de Windows (lo que no es posible desde DOS) y lo hace a través de dos lenguajes de scripting, VBScript y JScript, desde Windows mismo o a través de la consola (la ventana de DOS). Esta funcionalidad se accede a través de los ejecutables WSCRIPT.EXE, que ejecuta scripts como aplicaciones Windows, y CSCRIPT.EXE, que lo hace como aplicaciones de consola. ¿Si usamos scripting en nuestro trabajo? ¡Por supuesto! Luego de dos catástrofes de red, donde los supuestos backups no existían (contrariamente a lo que nos habían dicho), destruyeron literalmente años de trabajo, movimos nuestros directorios de desarrollo a discos locales. Ahora, diariamente, utilizamos un script para copiar el trabajo de vuelta a la red. De esta forma obtenemos doble protección. Si mis discos locales estallan, existen copias en la red, y en el caso de que tanto nuestras máquinas como la red estallaran, supuestamente, existen copias de resguardo en cinta. ¿Pero como juega VFP en esto? Ya que WSH expone su funcionalidad como un objeto COM, cualquier aplicación que pueda usar COM puede aprovecharlo. Como VFP no tiene problemas en ese área, es otra herramienta que merece consideración. ¿Está instalado WSH? Al contrario de Shell.application, sobre la que George escribió en anteriores oportunidades, encontrar si WSH está o no instalado es bastante fácil y directo. WSH era un componente opcional en Win98 y en el Option Pack 4 de NT. La versión 2.0 viene en Windows 2000. También se instala como un componente standard de Internet Explorer 4 o superior, y puede ser agregado al entorno de cualquier sistema operativo Win32, con las notables excepciones del Win32S que corre sobre Windows 3.1x o Windows para Grupos de Trabajo, Windows CE, Windows NT 3.51 y las distribuciones originales de Windows 95 y Windows NT 4.0 a las que no se le hayan aplicado los Service Packs apropiados. En el caso de Windows 95, debe tener OSR 2 o Internet Explorer 4 o posterior instalados ó, como mínimo, haber instalado exitosamente DCOM. Las versiones internacionales de Win95 requieren que tenga instalado al menos Internet Explorer 3.02 y DCOM, y en el caso de Windows NT 4.0, el Service Pack 3 e Internet Explorer 3.02 o posterior. En el caso de NT 4.0, la instalación de los últimos Service Packs (SP5, SP6 o SP6a) incluirán los componentes DCOM necesarios sin tener instalado Internet Explorer. Asumiendo que la clase para la Registry que viene con las FCC está en la ruta de búsqueda de Fox, simplemente: SET CLASSLIB TO REGISTRY.VCX oReg = CREATEOBJECT("Registry") ? oReg.IsKey("VBScript.RegExp") Le dirá si WSH 2.0 está instalado o no. El objeto VBScript.RegExp no apareció antes de esa versión. Como este artículo asume que está usando esta versión, si no lo tiene instalado, necesita hacerlo para poder seguir los ejemplos a continuación. Para obtener la última versión, vaya a: http://www.microsoft.com/msdownload/vbscript/scripting.asp y descargue la última disponible. Deberá seguir las instrucciones para obtener la versión correcta para su máquina, ya que hay diferentes para Windows 9x y Windows 2000. WSH - Las contras Hasta aquí sólo mencionamos los aspectos positivos de WSH. Sería un error fallar al mencionar las "contras". La primera, por supuesto, es que para usarlo, debe estar instalado. Hay dos maneras de manejar este problema, dependiendo de cómo instala sus aplicaciones. Si usa el Asistente de Instalación de VFP, puede escribir un ejecutable post-instalación que verifique si está, y si no lo encuentra, lo instale. Advierta que instalarlo de esta manera requerirá que reinicie el equipo antes de poder usar WSH. (Nota del traductor: el artículo original fue escrito antes de la aparición de VFP 7.0, que incorpora nuevas opciones de instalación al utilizar Install Shield Express) http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art03.asp 26/04/2006 es un recurso tremendo. deberá utilizar el mismo código para hacerlo desde su aplicación.asp para más detalle.nz/.glazier.wrox. los modelos de objetos de los browsers IE4 e IE5. incluyendo resúmenes de los componentes COM de WSH. la decisión final queda en usted. Actualmente. no todos los usuarios tendrán los premisos necesarios para hacerlo. El objeto debe ser instanciado. Dentro de lo posible.com/scripting/default. aquí hay más recursos que puede investigar. también de Wrox Press (ISBN 1-861002-71-8). y scripting detallado usando VBScript. hay una cantidad de sitios web dedicados a WSH. Arrancando Esto termina la introducción.htm es la entrada a todas ellas. Microsoft ha dedicado un área de su servicio MSDN Online a las tecnologías de Windows Scripting.com. Si no los conoce. con ejemplos concretos sobre cómo usarlos para lograr un número de tareas. hay otras referencias. la llamada a COM agrega una sobrecarga que una llamada directa a la API o a una función nativa de VFP no incurriría. Tratar de instalar Windows Script Host desde el ejecutable auto-extraíble apropiado es algo seguro aún si ya está instalado en sus sistema. el mejor (en nuestra opinión) libro sobre WSH es The Windows Script Host Programmers Reference de Dino Esposito.com/subscriptions/offer/faq. vbscrip5. Desde el punto de vista de los mismos componentes COM. está orientado hacia el programador VB/VBA/VBScript. The VBScript Programmer's Reference. Finalmente. La dirección del sitio web de Wrox es: http://www.Windows Script Host para desarrolladores Visual FoxPro Página 3 de 23 Si utiliza el Instalador de Visual Studio.htm?/scripting/windowshost/default.co.chm y wsh. y luego manipulado. Determine si el código adicional para instalarlo o el tiempo adicional de proceso es significativo o no. provee un resumen comprensivo sobre VBScript y los componentes COM de WSH. La MSDN Library viene con dos archivos. Una suscripción gratuita por un año a esta biblioteca está disponible para los usuarios registrados de VFP. que contienen la información en la que se basa este artículo. En este caso. Su Apéndice trae una tremenda cantidad de información.chm contiene una introducción a VBScript y también información sobre WSH. ADO y el lenguaje VBScript. Sin embargo habrá circunstancias en que los comandos nativos carecen de una funcionalidad presente en WSH. En general. La segunda "contra" es que hay una sobrecarga adicional al usarlo que no ocurriría de otra manera. El no-oficial WSH FAQ Site. trate de instalar con un usuario que tenga permisos de Administrador local. propiedad o colección expuesta por los objetos COM de WSH involucra pasar datos a través de una interfaz COM.microsoft.net/voices/art03. a veces por un orden de magnitud. o simularla lleva a una carga adicional que anula este tema.El Shell http://www. Vea http://msdn. o simplemente no sabe a esta altura si WSH es para usted o no.asp 26/04/2006 . Sin embargo.chm.microsoft. Vbscrip5. Cada referencia a un método. En un ambiente seguro. Si quiere comenzar antes de seguir con el resto de este artículo. http://wsh. En cualquier caso. por lo que bajo windows NT y 2000 el usuario debe ser capaz de crear entradas en la Registry bajo HKEY_CLASSES_ROOT. tenga en cuenta que registrará un número de componentes. Windows Script Host . http://msdn.microsoft. y tecnología de Windows Scripting en general. gratuitas. publicado por Wrox Press (ISBN 1-861002-65-3). Esto es causado principalmente por la sobrecarga de llamar a un servicio COM. y tardará más en completarse que utilizar un comando de FoxPro equivalente. la opción pos-instalación no está disponible.com/spanish/msdn/comunidad/mtj. microsoft.com/spanish/msdn/comunidad/mtj. Así que parece por completo apropiado comenzar esta parte discutiéndolo. no puede confiar en que esté en una ubicación específica. interactuando con el Shell.Carpeta de Programas del menú Inicio MyDocuments . su programa de instalación interactúa con él. aún antes de que su aplicación corra por primera vez.Shell expone métodos para mantener accesos directos. Todos los ejemplos que siguen pueden ser ejecutados directamente desde la ventana de comandos de VFP. es invisible bajo Win32. debe haberse preguntado porque no provee ninguna facilidad para crear accesos directos sobre el escritorio de Windows. Como puede haber creados múltiples escritorios para diferentes usuarios. Para obtener el escritorio activo utilice: * Crea la referencia al Shell oShell = CREATEOBJECT("WScript. una decisión simple y clara. El objeto COM WScript. Ahora entraremos en algunas aplicaciones prácticas con VFP.Application. WSH hace todo eso innecesario. e interactuar con documentos y aplicaciones externas. las llamadas a las funciones requeridas no están entre las que VFP puede acceder apropiadamente. identificar carpetas relativas al sistema sin importar cuestiones de instalación. La razón para esto es que el ejecutable de instalación que usa no tiene manera de crear un acceso directo.Carpeta Impresoras NetHood . El Shell de Windows es el punto central del Windows mismo. para nosotros. de una forma u otra. esto es exactamente lo que George hacía.Entorno de Red http://www. Esto es porque el ejecutable es de 16 bits. El objeto Shell expuesto por WSH no es el mismo que el objeto Shell. Una nota es adecuada en este punto.SpecialFolders("Desktop") El método SpecialFolders devolverá también un número de carpetas especiales. previo a la disponibilidad de WSH. El primer paso es recuperar la ruta del escritorio activo. "PM" significa Administrador de Programas (Program Manager). Cada vez que lanza un programa usted está. De hecho. Una opción que queda es escribir o usar una DLL escrita en C para tomar la información necesaria y crear el archivo de enlace.Shell") * Obtiene el escritorio activo lcdesktop = oShell.net/voices/art03. Esto es evidente en el paso 6. Instalando .Carpeta Mis Documentos Favorites . Para crear un archivo de enlace Win32 necesita la interfaz con la API. son objetos completamente distintos.asp 26/04/2006 . donde usted indica si algo es o no un ítem "PM". Decidir cuál de los objetos de WSH describir primero fue.Carpeta Favoritos PrintHood . Asumiremos que ya tiene el WSH instalado. pero no que haya profundizado en ninguno de los recursos y documentación que mencionamos antes.Windows Script Host para desarrolladores Visual FoxPro Página 4 de 23 En la primer parte hicimos una introducción general a Windows Script Host. Las técnicas descriptas aquí se aplican sólo al objeto de WSH. que por supuesto.Ubicación del menú Inicio Programs . Aunque hay cierta funcionalidad superpuesta. y la instalación crea los accesos utilizando la vieja interfaz DDE de la ventana del Administrador de Programas. incluyendo: StartMenu . Incluso. Desafortunadamente. De todas maneras.Vinculando accesos directos Si tiene experiencia con el asistente de instalación de VFP. su acceso directo está listo. Primero debe indicar el destino del acceso directo (el ejecutable).WindowStyle = 3 * Cualquier argumento opcional oLink. y si desea. Hay una cosa más para aclarar. lcFile es nombre de archivo con la ruta completa oLink.TargetPath = lcfile * Fija el icono oLink.com/spanish/msdn/comunidad/mtj. una tecla de método abreviado.asp 26/04/2006 . pero realmente no pone nada en el escritorio o en un grupo de programas. cuál es el directorio de inicio.Hotkey = "" && Cualquier cadena comenzando con Ctrl+Alt+ [ letra ] * Guarda el acceso directo oLink. el siguiente paso es crear el archivo de enlace al acceso directo. oLink = oShell. Antes de que esto ocurra. http://www.microsoft.net/voices/art03.CreateShortcut(lcdesktop + "\Mi Super Aplicación.Windows Script Host para desarrolladores Visual FoxPro Página 5 de 23 Una vez que obtuvo la ubicación del escritorio.lnk") El código de arriba devuelve un objeto referenciado al archivo de enlace. fijar el tipo de ventana. Puede hacerlo creando un objeto Link (enlace). indicar argumentos o parámetros especiales.IconLocation = lcfile * Fija el directorio de trabajo oLink. indicar qué icono usará. El código de abajo asigna valores a cada uno de éstos: * Indica el destino.Save() Una vez que invoca el método Save.WorkingDirectory = JUSTPATH(lcfile) * Fija el estilo de ventana como maximizada oLink. hay más trabajo que hacer. La propiedad WindowStyle es usualmente una de las constantes definidas abajo.Arguments = "" && En este caso nada * Tecla opcional de método abreviado oLink. oShell.asp 26/04/2006 .microsoft.net/voices/art03. Si. [ espera para terminar ]) Así que para ejecutar C:\Mydir\Mytext. estado de la ventana.com/spanish/msdn/comunidad/mtj. Segundo. No "corra" todavía Otro método útil del Shell es la habilidad de ejecutar otra aplicación.txt".Windows Script Host para desarrolladores Visual FoxPro Página 6 de 23 #DEFINE #DEFINE #DEFINE #DEFINE SW_HIDE 0 && La ventana no se muestra. La sintaxis es muy directa. la URL. pero el Shell puede hacer más.txt".Run( archivo.CreateShortcut( lcdesktop + "\Portada del VFUG. Si el enlace ya existe.TargetPath = "http://www.vfug.) Para continuar procesando: oShell.txt en una ventana normal y esperar a que sea cerrada: oShell.Run("C:\Mydir\Mytext. obtiene una referencia al mismo.T. . Hay otra cosa para notar. Las diferencias son bien fáciles de aseverar.org" * Guarda oLink. la única propiedad que debemos indicar es la ruta de destino.Save() Ahora tiene en el escritorio un hipervínculo a la portada del Virtual FoxPro User Group.Run("C:\Mydir\Mytext. Si le pasa al método Run del Shell el nombre de un archivo. éste lo abrirá en la aplicación apropiada.url" ) * Fija el destino oLink. Primero. el método Run también puede esperar a que el programa termine. verdad? Este no es el único tipo de acceso directo que el Shell puede crear. ya sabemos que el comando RUN de VFP puede hacer lo mismo.) http://www. SW_NORMAL. . en este caso. SW_NORMAL. Pruebe lo siguiente: * Crea un acceso directo oLink = oShell. Segundo.F. sea cauto con esto SW_SHOWNORMAL 1 SW_MINIMIZED 2 SW_MAXIMIZED 3 ¿Es bastante fácil. Primero. Esto le permite modificar los existentes. el comando RUN sólo puede ejecutar programas. el acceso directo tiene la extensión "url" en lugar de "lnk". net/voices/art03.Run("C:\Mydir\Mytext. AppActivate acepta un solo parámetro: el título de la ventana a traer al frente. Representa la tecla Enter. este método mapea una llamada de la API que podemos llamar simplemente. la función devuelve . SW_NORMAL) Funcionarán bien. ejecuta y luego activa la aplicación Notepad. Note que aquí se aplican las mismas constantes mostradas previamente. esa ventana es traída al frente. activarla. hacia la aplicación del frente. lea sobre el método SendKeys en el archivo WSH. Esto le da al objeto Wscript. El siguiente código (que puede escribir en un nuevo archivo de programa). a veces es necesario traerla al frente para darle prioridad y dirigir a ella la interfaz de usuario. y finalmente le envía teclas. Windows revisa para ver si alguna comienza con la cadena indicada.Windows Script Host para desarrolladores Visual FoxPro Página 7 de 23 ó oShell. Sin embargo. El criterio de selección es resuelto como sigue: Si el título coincide exactamente con el indicado. hay un pequeño problema: A la aplicación le lleva un lapso pequeño para estar activa. debemos notar que lo mencionado arriba sólo ha sido probado desde la ventana de comandos o un archivo de http://www. Si no hay coincidencia alguna. en VFP no tenemos acceso a él. VFP terminará enviando las teclas a sí mismo. Además de traer la aplicación al frente. lo que no es deseable.Shell la habilidad de interactuar con otra aplicación de la misma manera en que KEYBOARD le permite a una aplicación VFP enviarse teclas a sí misma. como Ctrl-Alt-Del y Alt-PrtSc.F.AppActivate("Sin título . Si ninguna comienza con la cadena. necesitaremos ejecutar una aplicación.SendKeys("Esto manda una frase al Bloc de notas desde VFP.asp 26/04/2006 . Si ninguna coincide exactamente. Wscript. se revisan nuevamente para ver si alguna termina con la strin. El método AppActivate permite asignar el foco del sistema a una ventana basándose en su título.Bloc de notas") = Sleep(100) && Detiene al VFP por una décima de segundo oShell.CHM de la biblioteca MSDN. Sleep. y finalmente enviarle las pulsaciones de tecla deseadas. INTEGER dwMilliseconds oShell. No se garantiza ningún orden o nivel de coincidencia. que permite a un script detenerse brevemente para lograr esto. Como se describió arriba.txt". SendKeys le permite enviar todas salvo un pequeño juego de teclas de sistema reservadas. Si no lo consideramos. Una vez que la aplicación se ha iniciado.Run("Notepad") oShell. Ahora pongamos todo esto junto para enviar teclas a una aplicación.microsoft. la primera que termine con ella es traída al frente. Antes de terminar esta parte.~") Habrá notado la tilde al final de la cadena que estamos pasando.Shell provee un mecanismo para dirigir las pulsaciones de tecla a la aplicación que está al frente. Sin embargo. De todas maneras. La ejecución de un script continúa mientras el mismo corre como una tarea en segundo plano. El objeto WSH mismo tiene un método. Para una lista de los carácteres especiales disponibles en WSH. la primer ventana comenzando con la cadena es traída al frente.com/spanish/msdn/comunidad/mtj. DECLARE Sleep IN Win32API. carpetas y archivos. se acerca a la parte "más simple o sencilla" de esa definición. encontrará que el FileSystemObject es el más útil.com/spanish/msdn/comunidad/mtj. El objeto FileSystem. ocurrirá un error. Antes de que comencemos.. Windows Script Host .microsoft. no lo hace desde VFP. El Shell también soporta un método PopUp() que despliega los mismos diálogos que la función MessageBox() de VFP.El objeto FileSystem De todos los objetos soportados por WSH. Nos limitaremos sólo a cosas que no se pueden hacer con VFP.". Antes de continuar. Note que si la carpeta destino es de sólo lectura. Como se ve arriba.Application. se producirá error si el destino es un archivo existente o si existen archivos en la carpeta destino con el mismo nombre y sobrescribir está en .. mientras el cuadro de diálogo expira apropiadamente al ejecutarlo desde un archivo VBScript. sin embargo.Windows Script Host para desarrolladores Visual FoxPro Página 8 de 23 programa con el código necesario resaltado y ejecutándolo a través del menú de contexto. pero tenga paciencia. A continuación veremos como WSH puede facilitar las tareas con discos. aquí está su respuesta porque esto es exactamente lo que hace DeleteFolder. con el valor por omisión siendo . probablemente más que ningún otro. DeleteFolder . < carpeta destino >.T. creemos el objeto al que haremos referencia en el transcurso de esta sección. pero con un parámetro de tiempo de expiración.DeleteFolder(< nombre de carpeta >. oFSO. o que son más simples o sencillas usando WSH. Desafortunadamente.F. [ sobreescribir ]) Los parámetros de carpeta origen y destino son cadenas. debemos repetir que no es nuestra intención cubrir todos los métodos y propiedades soportados por este o cualquier otro objeto de WSH. [ forzar ]) http://www. el parámetro sobrescribir es opcional. A pesar de que parece funcionar como se describe. Nada más sobre el "Shell" Así que hay al menos dos cosas útiles que el objeto Shell de WSH puede hacer por usted.CopyFolder(< carpeta origen >. Es más. eso lo puedo hacer con. Todos los ejemplos que mostraremos aquí.FileSystemObject") Una cosa que sabemos que muchos de ustedes pensarán durante esta explicación es: "Eh.El método CopyFolder copia una carpeta entera y sus subcarpetas. con la excepción de algunas funciones completas. no se muestra diálogo de progreso. Para crear el objeto: oFSO = CREATEOBJECT("Scripting. recomendamos a todo lector que lo pruebe por si mismo. Los métodos de FileSystemObject CopyFolder .¿Alguna vez quiso borrar una carpeta completa sin tener que eliminar todos los archivos y carpetas dentro? Si es así. La sintaxis es: oFSO. Explicaremos las limitaciones de esas otras alternativas. A diferencia del objeto Shell. pueden ser ejecutados desde la ventana de comandos.asp 26/04/2006 .net/voices/art03. Usar un parámetro distinto de los listados arriba generará un error.La carpeta Windows/System 2 . y determina si carpetas con el atributo de sólo lectura son borradas o no. Primero.asp 26/04/2006 . oFile = oFSO. y quizás más importante.microsoft. Nuevamente.La carpeta temporal de Windows Son los valores a pasar. realizar un recorte y pegado. MoveFile . la última versión en el sitio de Microsoft devuelve un objeto.GetFile("C:\UnaCarpeta\UnArchivo.La carpeta Windows 1 .Devuelven un objeto archivo o carpeta desde el FileSystemObject. como su nombre lo indica. sin embargo.T.Devuelve un objeto drive. < archivo destino >) MoveFolder .Este método también tiene dos usos. Por ejemplo. Ninguno soporta meta carácteres. Los objetos carpeta se describen más adelante en esta sección. no se muestra diálogo de http://www.GetFolder("C:\") GetSpecialFolder . "D:\Destino") Es similar a usar el Explorador de Windows para cortar y pegar entre las carpetas de origen y destino.MoveFolder("C:\Origen". La sintaxis básica es: oFSO.Devuelve objetos de las carpetas de Windows. Para recuperar estos valores: 0 . oDrive = oFSO.Tiene dos usos: mover y renombrar.com/spanish/msdn/comunidad/mtj. Segundo. ó .txt") oFolder = oFSO. para obtener la carpeta de temporales de Windows: loFolder = oFSO. Esto no debe confundirse con los métodos del objeto del Shell de WSH SpecialFolders descriptos en la sección anterior. El Windows Script Host Programmers Reference indica que el valor devuelto es una cadena.net/voices/art03. GetDrive .GetSpecialFolder(2) Devuelve una referencia a un objeto con la carpeta de archivos temporales de Windows. El único error que puede ocurrir es que no exista la carpeta indicada por la cadena pasada.MoveFile(< archivo origen >. puede renombrar una carpeta existente. moviendo una carpeta a una ubicación diferente.GetDrive("C:\") GetFile y GetFolder .Windows Script Host para desarrolladores Visual FoxPro Página 9 de 23 El parámetro opcional forzar puede ser . Si utiliza MoveFolder con una sintaxis como la siguiente: oFSO.F. Windows/System o la de temporales de Windows. microsoft. Hallar si un drive existe o no con el FileSystemObject es una sola línea de código. esta persona está absolutamente en lo correcto. el usuario podrá ver lo que llamamos "El más horrendo diálogo de Windows".IsReady Sabemos que ahora alguien estará pensando. es de uso limitado ya que puede lograr lo mismo con el objeto carpeta.MoveFolder("C:\Origen"." En muchos casos. Ya sabe. "C:\Destino") La carpeta "fuente" es renombrada como "Destino". Esto. Los dos puntos tras la letra del drive son opcionales. Bajo Windows NT.DriveLetter NEXT Con los drives.net/voices/art03. para saber si está listo para escribir. pero no en todos. por supuesto. Lo mismo es cierto para la sintaxis: oFSO. si usara: oFSO. miremos los objetos.Drives ? oDrive. En el sistema donde este artículo está siendo escrito: ? oFSO.asp 26/04/2006 . Ahora que hemos cubierto los métodos. La propiedad IsReady del objeto drive no lo produce.com/spanish/msdn/comunidad/mtj. Una vez que sabemos si existe. todo lo que tenemos que hacer es obtener una referencia para hallar otras cosas acerca suyo. jamás. usualmente hay dos preguntas importantes: "¿Existe?" y "¿Está listo?". La colección y objeto Drive La colección Drives del FileSystemObject contiene objetos Drive.MoveFolder("C:\Origen". simplemente: ? oDrive. Puede iterar a través de ellos fácilmente con: FOR EACH oDrive IN oFSO. ? oFSO.F.T.DriveExists("B") && Devuelve .DriveExists("A") && Devuelve . Para hacerlo: oDrive = oFSO.GetDrive("A") Ahora. "C:\Destino\Origen") Sin embargo.Windows Script Host para desarrolladores Visual FoxPro Página 10 de 23 progreso. http://www. pero DISKSPACE("A") devuelve -1 si el drive no está listo. es blanco que realmente odia ver. La última es especialmente cierta si el drive en cuestión es un floppy u otro medio removible. "bueno. no siempre devuelven valores correctos.Name NEXT Esto desplegará la propiedad Name de cada subcarpeta y archivo en la carpeta. Tanto la colección de Carpetas como la de Archivostienen propiedades Count e Items.SubFolders http://www. Como esta propiedad es de lectura y escritura. FreeSpace.SubFolders ? oSub.El tamaño total de drive. Salvo que se indique especialmente.asp 26/04/2006 . existe el mismo problema con esta propiedad bajo Win9x que con AvailableSpace y FreeSpace. Carpetas/Archivos Colecciones/Objetos Como las Carpetas y Archivos comparten tantos métodos y propiedades.microsoft. Sin embargo hay una diferencia particular que debe ser tenida en cuenta inmediatamente. TotalSize .Una cadena representando el nombre del sistema de archivos. Bajo Windows 2000 y Windows Me.Son dos propiedades separadas. Por ejemplo: FAT32. Esto está documentado en el artículo Q225032 de la Base de Conocimientos de Microsoft.(Lectura/Escritura) Aunque puede obtener el nombre del volumen con la función ADIR(). esta limitación no está presente aquí. trabajan correctamente. Naturalmente. Desafortunadamente.net/voices/art03. A menos que se indique de otra manera. FileSystemProperty . La propiedad Count devuelve el número de ítems en la colección. Devuelve una cadena vacía en una computadora no conectada en red. RootFolder . AvailableSpace devuelve el espacio disponible para el usuario. Para iterar por ellos: oFolder = oFSO.Files ? oFile.GetFolder("C:\") FOR EACH oSub IN oFolder. Por ejemplo: oFolder = oFSO. limitan el valor de retorno a 2 gigabytes bajo Win9x. SerialNumber . Como DISKSPACE() en VFP.Windows Script Host para desarrolladores Visual FoxPro Página 11 de 23 He aquí algunas otras propiedades del objeto drive que puede encontrar útiles.El nombre compartido del drive. un objeto Archivo no tiene colecciones. es apropiado que los describamos al mismo tiempo.com/spanish/msdn/comunidad/mtj.Devuelve un objeto representando la carpeta raíz del drive. el espacio total libre. VolumeName . no puede cambiarlo. lo que discutamos aquí se aplica a ambos objetos. Una carpeta puede contener dos colecciones: Subcarpetas y Archivos. por las que puede iterar.GetFolder("C:\") oSubFolders = oFolder.Name NEXT FOR EACH oFile IN oFolder. La propiedad Item devuelve una referencia al objeto cuando su nombre es indicado. éstos y TotalSpace más abajo.El número de serie del disco. Sin embargo. son de sólo lectura. si se corresponde. ShareName . AvailableSpace y FreeSpace . Esta propiedad es de lectura y escritura. IsRootFolder . WSH brinda un método eficiente de leer esa información ya que sólo una llamada a una función es requerida antes de tener el dato datetime para comparar.asp 26/04/2006 . Para alternar la propiedad read-only (sólo lectura) de un archivo. debe obtener primero un objeto carpeta o archivo usando los métodos GetFile() ó GetFolder().GetFile(lclocal) oRemote = oFSO.Devuelve un objeto drive representando el drive en que está un archivo o carpeta.GetFile(lcremote) IF oRemote. no intente modificar el atributo directorio. es: oLocal = oFSO.Propiedades de sólo lectura que devuelven un valor datetime. Están definidos como: #DEFINE #DEFINE #DEFINE #DEFINE READONLY 1 HIDDEN 2 SYSTEM 4 DIRECTORY 16 Asumiendo que tiene una referencia a un archivo o carpeta. Puede usarse en VFP para modificar el nombre de un directorio. por ejemplo: * Se aplica a un objeto archivo o carpeta OFile.Item("Program Files") ? oFolder.microsoft. El valor http://www. no pueden ser modificadas.Los atributos del archivo o carpeta.Name && Devuelve Program Files Propiedades de los Objetos Carpetas/Archivos Aunque ambos objetos tienen métodos. Con WSH todo lo que necesita. DateLastAccessed. no los tocaremos porque ellos duplican comandos nativos disponibles en VFP. Este tipo de comparación es necesaria si está usando una programa "lanzador" para copiarla nueva versión de un archivo desde un drive de red.com/spanish/msdn/comunidad/mtj. en lugar de con las letras que devuelve la función e VFP ADIR().Propiedad de lectura y escritura para un archivo o carpeta. aunque pueden ser recuperadas parcialmente. Attributes . La fecha de la última modificación está disponible en VFP. puede usar las funciones de manejo de bits de VFP para modificar los atributos.Attributes = BITXOR(oFile. luego de crear el objeto FileSytemObject. ya que es de sólo lectura. DateLastModified . READONLY) DateCreated. Es n valor lógico que indica si ésta es o no la raíz. Incluso en algunos casos. Sin embargo. Para acceder a estos. o la propiedad Item() de la colección apropiada. Sin embargo. A menos que se indique. corresponde con los atributos de las banderas de Windows.Se aplica sólo al objeto carpeta. en cambio. Las propiedades.DateLastModified > oLocal.net/voices/art03. sin embargo. VFP no brinda toda la información dada por FileSystemObject.Windows Script Host para desarrolladores Visual FoxPro Página 12 de 23 oFolder = oSubFolders. Name . Note que estas propiedades no están disponibles para carpetas raíz.DateLateModified * Copiar el archivo ENDIF Drive . las propiedades son de sólo lectura.Attributes. ParentFolder .El nombre corto de la ruta como se usaría en MS-DOS. EnumNetworkDrives.EnumNetworkDrives FOR lni = 0 TO oNetDrives. y UserName. ShortName . Métodos de drives de Red El primer método que veremos aquí.El tipo como aparecerá en el Explorador de Windows.Name = lcNuevoNombre Realiza el truco.Network") Una vez que el objeto está creado.Count-1 ? oNetDrives. Para cambiar el nombre de un directorio. Windows Script Host . Es equivalente al nombre de archivo MS-DOS. ya que elimina la necesidad de crear una rutina recursiva para hacerlo.Count-1 ? oNetDrives. primero debemos crear un objeto que nos permitirá hacerlo: oNet = CREATEOBJECT("WScript. Size .El tamaño total de un archivo o carpeta.com/spanish/msdn/comunidad/mtj. Veremos primero los métodos asociados a drives de red.Devuelve un objeto representando la carpeta padre de un archivo o carpeta.Windows Script Host para desarrolladores Visual FoxPro Página 13 de 23 devuelto es sólo el nombre del archivo o carpeta y no incluye la ruta.Item(lni) && Muestra STEP 2 el drive mapeado STEP 2 el nombre del recurso compartido http://www.El nombre corto (8 carácteres máximos como nombre primario y tres máximos como extensión). entraremos al manejo de dispositivos de red.El Objeto Network Hasta aquí solo hemos tratado sobre cómo WSH puede ayudarnos con utilizar cosas dentro de la computadora local más fácilmente. devuelve un objeto drives respecto a los servidores conectados a nuestra computadora. inmediatamente tendrá acceso a tres propiedades informativas: ComputerName. En esta sección. simplemente: oFolder. Type . oNetDrives = oNet. UserDomain. El siguiente fragmento muestra primero los mapeos. ShortPath . Esto puede ser útil al copiar a otro dispositivo.asp 26/04/2006 . acceder a esta propiedad puede tomar algo de tiempo ya que se calcula el tamaño total de todas las subcarpetas y sus archivos.net/voices/art03.Item(lni) && Muestra NEXT FOR lni = 1 TO oNetDrives. una vez que tiene el objeto referencia a la carpeta.microsoft. Para hacerlo.Devuelve la ruta completa de un archivo o carpeta. Path . y luego los nombres de recurso compartido. En el caso de las carpetas. Hay ocho métodos disponibles. El primero. Para resolverlo.T. Si lo está. Sin embargo. devuelve el número ítems. sólo el drive y recurso compartido.T. pero el valor máximo legal que puede tomarse es uno menos que el total ya que la enumeración comienza en cero en lugar de uno. El parámetro actualizar perfil es un valor lógico. pero aún está conectado al servidor. esto no representa un problema. Esta información es similar a la devuelta por ANETRESOURCES(). excepto que no se requiere ningún nombre de red y no devuelve impresoras. entonces el parámetro debe ser la letra del drive.Locales y Remotas Como las impresoras también pueden ser de Red. como cadenas. el objeto WSHNetwork también tiene métodos para tratar con éstas. Devuelve un objeto conteniendo información respecto a las impresoras instaladas. y es automáticamente restaurado (mapeado) cuando la computadora vuelve a encenderse. si utiliza la opción Desconectar Unidad de Red del Explorador de Windows. entonces toma el nombre remoto. Si se conocen los nombre de los recursos compartidos.com/spanish/msdn/comunidad/mtj. Los parámetros usuario y contraseña deben ser pasados para permitir el mapeo de drives que no han sido accedidos previamente.FileSystemObject.microsoft. NetResource. contraseña]) Arriba. para remover el mapeo automático del drive cuando la computadora se reinicia. su clase CLSHeap también es necesaria. al pasarse en . desmapea el drive. En este caso. también tiene otro para desconectar los drives de red. La propiedad Count. use el nombre remoto para desconectarse. Impresoras .MapNetworkDrive( letra del drive. por lo tabto. el objeto drive devuelto por el método no es el mismo devuelto por el método GetDrive() de Scripting. puede serlo. La sintaxis es: oNet. como WSH brinda un método para mapearlos. Por ejemplo. Ed creó una clase. trabaja como el método EnumNetworkDrives discutido previamente. actualizar perfil]. remueve el recurso esté o no en uso. EnumPrinterConnections.EnumPrinterConnections http://www. forzar ][. Como las estructuras involucradas requieren punteros a cadenas embebidos. Naturalmente. WSH provee métodos para mapear y remover drives. Si por el contrario sólo está conectado al servidor sin estar mapeado. Primero. Actualizar perfil también es un valor lógico y puede usarse. que el objeto es de tipo enumerado con base cero. debe usar la API de Windows. son requeridos. [ actualizar perfil ]]) El parámetro name toma dos formas: el nombre local o el remoto. para lograrlo. Cuál usa depende de si el drive está o no mapeado. El parámetro forzar. Desafortunadamente no existe un método en WSH para recuperar los drives a los que un usuario se ha mapeado en el pasado. recurso compartido[[.net/voices/art03.RemoveNetworkDrive( nombre [..Windows Script Host para desarrolladores Visual FoxPro Página 14 de 23 NEXT Hay un par de cosas para notar aquí. La sintaxis para mapear un drive es: oNet.asp 26/04/2006 . usuario. indicando si el mapeo es almacenado o no en la información del perfil. si no se conocen. Segundo. oPrinters = oNet. Ambos archivos están disponibles para descarga aquí y también puede hallarse en diversos recursos web especializados en VFP. al pasarse en . Usuario y contraseña son parámetros opcionales. El segundo argumento. Son: AddPrinterConnection.net/voices/art03. que puede ser usado por aplicaciones DOS y Windows. usuario. Las impresoras compartidas por un http://www. en general. un NT o Win2K con toda probabilidad le pida que seleccione un controlador y lo cargue de un disco provisto por el fabricante. es probable que los controladores de la impresora estén almacenados en el servidor. son pasados al servidor o sus servicios de autenticación para establecer la conexión. en la forma \\NombreServidor\RecursoCompartido. la máquina servidora. nombre remoto [[. puede usar un nombre de puerto como LPT1: (el rango de puertos soportados varía según la versión del sistema operativo.com/spanish/msdn/comunidad/mtj.Count-1 ? oPrinters.puerto físico o identidad de dispositivo. Determinar el nombre desde NDS puede ser un poco complicado.microsoft. El primer argumento. NombreServidor será el nombre NetBios de un sistema en su red. si son especificados. y este número puede ser incrementado esditando las entradas del registro asociadas con los nombre de dispositivos.AddPrinterConnection( puerto. puede ser la dirección IP del servidor. contacte a su administrador de red si el UNC de la impresora no es inmediatamente aparente. RemovePrinterConnection. especialmente NT o Win2K. necesita para . puerto. Si la conexión de la impresora debe ser una asociación permanente. Los sistemas Win9x usualmente sólo tienen a mano controladores Win9x para la impresora compartida. Si la impresora es compartida desde un sistema Windows. es el nombre de red asociado con el dispositivo de impresión. un servidor administrado por NetWare managed server tendrá el noombre \\NombreServidorImpresoras\NombreCola desde el entorno de NetWare. ó algunos casos controlado por .Item(lni) && Muestra NEXT STEP 2 el puerto STEP 2 el nombre de la impresora Esta información.Item(lni) && Muestra NEXT FOR lni = 1 TO oPrinters. RecursoCompartido será un nombre único publicado por el servidor que identifica el dispositivo compartido en. o en WinNT/Win2K. actualizar perfil]. Actualizar perfil es una valor lógico que indica si el mapeo del dispositivo debe restaurarse cada vez que Windows se reinicia. y son. Si no se especifican.Windows Script Host para desarrolladores Visual FoxPro Página 15 de 23 FOR lni = 0 TO oPrinters. y SetDefaultPrinter. sin embargo.asp 26/04/2006 . Esta convención de nombres se aplica aún al usar otros clientes que el MSNetwork Client.Count-1 ? oPrinters. es idéntica a la devuelta por la función APRINTERS(). contraseña]) AddPrinterConnection() mapea una impresora de red a un nombre de dispositivo local . al menos 8 dispositivos LPT puede ser mapeados. especifica el nombre del dispositivo local a ser asociado con la impresora de red. remote name. el nombre de y contraseña de Windows (o la autenticación de dominio si está en un entorno de dominio) serán pasados para pedir acceso a la impresora. usando el cuadro de Puertos del Panel de Control. o bajo Windows NT o Windows 2000. similares. AddWindowsPrinterConnection. La forma más fácil de ver y entender las diferencias es verlos a ambos lado a lado: oNet. Éste debe ser un UNC.T. o del juego de controladores que vienen con el sistema operativo. y automáticamente se carguen al conectar. Los otros cuatro métodos vinculados con impresoras no tiene equivalente directo en VFP. Los dos primeros parecen. El objeto WScript. * Windows NT/2000 oNet.Actualizar]) Strname es el nombre de la impresora que desea desasociar del sistema local. ya no se volverá a tratar de mapear la impresora al reiniciarse Windows.microsoft. como un servidor de impresión administrado por NetWare.en otras palabras.asp 26/04/2006 . un controlador explícito debe ser especificado al agregar una impresora. y ningún controlador está preinstalado. http://www. usualmente no tienen a mano controladores para un sistema Windows. Si usó AddPrinterConnection. un puerto local debe ser asignado a la conexión. Si usó AddWindowsPrinterConnection. Más allá de esto.Network tiene un método. el comportamiento de AddWindowsPrinterConnection() varía dramáticamente.AddWindowsPrinterConnection( nombre remoto.Windows Script Host para desarrolladores Visual FoxPro Página 16 de 23 sistema no-MS. se debe especificar el puerto mapeado al dispositivo. SetDefaultPrinter. Será sólo direccionable como una Impresora Windows . será pedida la selección de un controlador apropiado para la Impresora Windows.net/voices/art03. la impresora será visible para Win16 y las VDMs virtuales y las aplicaciones Win32. Especificando la Impresora predeterminada Una pregunta preguntada con frecuencia en los foros es: "¿Cómo selecciono la impresora predeterminada?". Forzar indica que la impresora debe desconectarse incondicionalmente sin importar la condición o actividad de la cola. Forzar debe pasarse en . Asume que tomará el controlador apropiado de la impresora del recurso compartido. si lo es.RemovePrinterConnection( strNombre [. RemoveNetWorkPrinter hace exactamente ésto: oNet.Forzar] [.las sesiones DOS no podrán accederlas. Si falla en especificar el resultado del puerto resultará en que el dispositivo sea invisible para las VDMs. puerto] ) Bajo Win9x y WinME. Primero. puede liberar aquellos asignados al sistema local como impresoras de red. aunque WSH no puede brindar una lista de las impresoras instaladas.AddWindowsPrinterConnection(nombre remoto) AddWindowsPrinterConnection bajo WinNT y Win2K permite a Windows conectarse a una impresora remota sin asignarle un puerto. Opcionalmente. una falla en hacerlo ocasionará que la llamada a la función falle. RemovePrinterConnection Además de crear nuevos mapeos de impresora. deberá identificar e instalar el controlador para el nuevo dispositivo cuando sea referenciado por un sistema. Si existe alguna duda.com/spanish/msdn/comunidad/mtj. controlador[. Uselo para desconectar permanentemente un impresora de red adosada automáticamente. se especifica el UNC del recurso compartido.T. y puede hacerlo sin un montón de código. FoxPro si puede. que puede manejar esta tarea fácilmente. Actualizar indica si el desmapeo es una desconexión permanente o no . sino. * Windows 9x/Me oNet. WSH puede dar la respuesta. SetDefaultPrinter(lcdefault) El intérprete de expresiones regulares Cuando empezamos este artículo explicamos que una manera de saber si WSH ya estaba instalado era chequear la presencia de el ProgID del Intérprete de expresiones regulares en la registry. pregunte en cualquiera de los foros en línea.RegExp") Propiedades y Métodos Aunque cubriremos al menos la mayoría de las propiedades y métodos del intérprete. En el transcurso. parece adecuado que concluyamos con él. La propiedad pattern representa a la cadena y las características de ella que deben interpretarse.frx TO PRINTER NOCONSOLE oNet.com/spanish/msdn/comunidad/mtj. El código de abajo supone que el nombre de su impresora es "MyPrinter". Hay tantas combinaciones posibles que cualquier intento sería inútil. Mencionamos antes la validación de una dirección de email.net/voices/art03. usaremos ejemplos que pueden ser implementados más directa y fácilmente a través de las funciones de cadena de FoxPro. En primer lugar. Finalmente. Su uso. como mostraremos en breve. Por el contrario. cuanto mejor comprenda estos patrones. sin embargo. obtengamos una referencia al objeto que hará todo esto posible: oRE = CREATEOBJECT("VBScript. Se estará preguntando que son exactamente las expresiones regulares. Lo que cubriremos es el uso fundamental del intérprete. son cualquier cadena que sigue un patrón predeterminado. Ahora. junto con su propia experimentación con el objeto en VFP. Mostraremos eso y más. No es nuestra intención aquí demostrar un gran número de posibilidades. le brindará muchos más ejemplos de los que nosotros podamos proveerle. el grueso de esta sección se concentrará en una sola propiedad: el pattern (patrón). esto es incorrecto.asp 26/04/2006 . http://www. Por lo tanto. 2) && Obtiene la impresora predeterminada actual oNet. han sido enormemente simplificados. si tiene problemas con el intérprete.Windows Script Host para desarrolladores Visual FoxPro Página 17 de 23 Mientras la documentación indica que este método sólo funciona con impresoras remotas. entonces las restantes propiedades y métodos tendrán poco o ningún uso. Veamos primero el formato de una dirección.SetDefaultPrinter("MyPrinter") REPORT FORM Myreport. dando algunos ejemplos del mundo real y dejando el resto librado a su imaginación. lcdefault = SET('PRINTER". Funciona también con impresoras locales. Lo alentamos sinceramente a acceder al menos al archivo de ayuda VBScrip5.microsoft. En pocas palabras. siempre que las mismas hayan sido instaladas. y luego restaurar la original. supongamos que quiere cambiar la impresora predeterminada. El propósito de estos ejemplos no es de ninguna manera sugerir que la funcionalidad del intérprete deba ser utilizada en su lugar. Esto puede usarse para algo como validad una dirección de email o una URL según el formato apropiado. y en honor a la claridad. o incluso comenzar a cubrirlas. Estos ejemplos intentan simplemente demostrar el "cómo" y explicar el "porqué" del intérprete. Sin lugar a dudas la propiedad pattern es el nudo. y luego el patrón que corresponde con ella. El intérprete puede fácilmente hacer modificaciones y validaciones sobre esas cadenas. Esto es hecho por una representación simbólica de la cadena. tanto más útil encontrará el intérprete. Si no logra un buen entendimiento de ésta.chm que lo cubre. es un indicador de que lo que sigue debe ocurrir. lndotpt llresult = .net/voices/art03.com wholename@domain." Están incluidos.Test(tceMailAddr) Como probablemente adivinó. asumiendo que el objeto RegExp ya ha sido creado. un punto. entonces? Aquí es donde se vuelve confuso.Pattern = "\a\w+" ? oRE.com
[email protected]("awesome") && Muestra . lnatpt = AT("@". haríamos lo mismo que arriba con los siguiente: oRE. deberá indicar el pattern: oRE.asp 26/04/2006 . una o más palabras. como puede haberse imaginado. que están separados por una palabra. luego una palabra.F. que la "@" viene antes que el ". puede estar rascándose la cabeza sorprendido acerca del pattern mismo.Pattern = "\w+\@\w+\.".com Verificar que estas direcciones son correctas en Fox requeriría verificar para estar seguro que: tanto la "@" como el ".".\w+" llresult = oRE. http://www. Por ejemplo. el símbolo "@". mientras otros no.name@domain. Por ejemplo.microsoft. y que ninguno de ambos es el primero ó último carácter de la cadena." La barra invertida. Sin ambrago. el símbolo "@". un punto. tceMailAddr) lndotpt = AT(". el método Test() devuelve un valor lógico basado en que el parámetro coincida con el pattern.com/spanish/msdn/comunidad/mtj. lnatpt. tceMailAddr) IF lnatpt > 0 AND lndotpt > 0 IF lnatpt < lndotpt IF lnatpt > 1 llresult = (lndotpt < LEN(tceMailAddr)) ENDIF ENDIF ENDIF RETURN llresult ENDFUNC Ahora.T. si quiere determinar si una palabra comienza con la letra "a". Para chequearlo deberíamos escribir una función como la que sigue: FUNCTION VerifyEFormat LPARAMETER tceMailAddr LOCAL llresult. las siguientes son variantes de esto: whole." Indican que esos símbolos deben estar en la cadena. una o más palabras. La "w" y algunos otros carácteres tienen un significado especial. en los puestos indicados.Windows Script Host para desarrolladores Visual FoxPro Página 18 de 23 La direcciones de email toman el siguiente formato: una o más palabras. Por ejemplo"\@" y "\. Re-examinemos nuestra descripción original acerca de éste: "…una o más palabras. ¿Qué hay de "\w+". luego otra palabra. Ver los ejemplos que siguen.}" es igual a "o*".microsoft. veamos todos los carácteres y su significado para la propiedad Pattern.}" no conincide con la "o" en "Koala" y coincide con todas las "oes" en "zooooom".}" es lo mismo que "o+". . "\w" busca cualquier palabra (ver abajo). Coincide cualquier carácter no incluido.F. Toma el carácter inmediatamente precedente cero o una vez. (punto) Toma cualquier carácter con excepción de uno de nueva línea. "\w+" indica que cualquier secuencia de carácteres alfanuméricos pued aparecer. m y n son mayores o iguales a cero. "[m-z]" toma cualquier carácter que no esté en el rango de "m" a "z". "o{2}" no coincide con la "o" en "Koala. Un rango de caracteres que no deben coincidir. Un juego de caracteres que no debe coincidir.F. De la misma forma. "o{2." pero si con las dos "oes" en "zoológico". Toma al menos n veces. Esta es la posición entre una palabra y un espacio o signo de puntuación. Un juego de caracteres. Carácter \ ^ * + ? Descripción Indica que el próximo carácter es un carácter especial o debe ser tomado como literal.m} [xyz] [^xyz] [x-z] [^m-z] \b \B Toma cualquier carácter. "\w" significa cualquier carácter. o dicho de otra forma. Toma cualquier carácter no especificado en el rango.} {n. "w" busca el carácter "w". Antes de irnos demasiado lejos. Un rango de caracteres a ser incluidos en el juego. En nuetro ejemplo usando la dirección de email. "an*t\B" coincide con "ant" en "nunca antes". "(z|f)ood" conincide con "zood" ó "food". "o{0. "zood". el dominio y el tipo. n es cero o mayor. Concuerda con cualquier carácter en el rango especificado. Cualquiera de los caracteres entre corchetes coincide. Toma el límite de no-palabra. "er\b" coincide con "er" en "tener" pero no con "er" en "verbo". Por ejemplo. Por ejemplo "wo+" concuerda con "woo" pero no con "w". "wo*" concuerda con "w" o con "woo". no coincide. Toma el carácter inmediatamente precedente una o más veces. "o{1. "o{1.Test("awesome") && Muestra .T. "ve?" concuerda con "ve" en "avena". Por ejemplo.Pattern = "[w]" ? oRE. Por ejemplo. "[^abc]" coincide con la "p" en "paño". incluyendo espacios y tabuladores. "\w+" es usado para indicar el nombre. debe usar "[w]".1}" es lo mismo que "o?".net/voices/art03. la posición en la cadena. Pro ejemplo. En caso de que esté preguntándose como hace para determinar que una palabra comienza con "w" con el intérprete. x|y {n} {n. Por ejemplo. Usado para indicar un NO lógico para los caracteres que siguen. n es cero o mayor.asp 26/04/2006 . Por ejemplo. "o{0. Por ejemplo. http://www. Toma al menos n veces y como máximo m.com/spanish/msdn/comunidad/mtj. entonces. sin embargo. ? oRe. Así: oRE.Test("wonderful") && Muestra . Toma el límite de una palabra. "[abc]" coincide sólo con la "a" en "paño". Toma el carácter inmediatamente precedente cero o más veces.Windows Script Host para desarrolladores Visual FoxPro Página 19 de 23 ? oRe. "[a-m]" coincide con cualquier carácter alfabético en minúscula en el rango de la "a" a la "m".Test("wonderful") && Muestra . Toma exactamente n veces.3}" coincide con las 3 "oes" en "zoooooom". "z|food" concuerda con "z" ó "food". microsoft. pero el intérprete lo seguiría evaluando como coincidiendo con el criterio especificado.Verifica cada parte de la cadena y almacena los resultados exitosos en la colección de coincidencias.vfug. Para ilustrarlo.F. salto de página. probablemente sea más fácil dar un ejemplo: oRE. tilde o guión o cualquier otro carácter no listado en la tabla superior que se aplique a las partes del dominio o tipo de la cadena. Toma cualquier carácter que no sea un espacio. Métodos Execute . Toma un único carácter no-numérico.dominio.Test("whole. volvamos a nuestro ejemplo del método Test con la dirección de email. Aunque veamos algunas otras más adelante en esta sección. Es usada comúnmente en conjunto con el método Replace. ¿Por qué? Simplemente porque el patrón provisto coincidió.\w+\.(\w+)".com") http://www. El valor por omisión de esta propiedad es . Lo mismo que "[^A-Za-z0-9_]". Hay definiciones adicionales de patrones que pueden encontrarse en el archivo de ayuda mencionado previamente.F. para verificarlo en código VFP. etc.org") && Muestra . si quisiéramos verificar que una URL fue ingresada como www. podemos realmente extraer porciones de la coincidencia.(\w+)" IF
[email protected]/spanish/msdn/comunidad/mtj.Pattern = "(\w+)@(\w+)\. Ahora. Lo mismo que "[^ \f\n\r\t\v]". Otras propiedades IgnoreCase .tipo. Lo mismo que [^0-9]. Nuevamente. Según esto. el valor por omisión es .T. Toma cualquier carácter de no-palabra.Otro valor lógico indicando si el patrón buscado debe aplicarse a toda la cadena. y ya que hay otras propiedades y métodos para cubrir. deberíamos agregar más código. comenzando luego del primer punto. Cualquier entrada que no comience con "www" será rechazada. Para entenderlo. el patrón sería: oRE. Si modificamos el patrón para ser "(\w+)@(\w+)\. Con un poco de manipulación del patrón..Este es un valor lógico indicando si en los casos que el patrón toma mayúsculas ó minúsculas si éstas deben ser ignoradas. Igualq ue cualquiera con un espacio. Obviamente.\w+" ? oRE. Lo mismo que [0-9]. que veremos enseguida. Toma cualquier espacio en blanco incluyendo un espacio. Intencionalmente.Test("www. el número de posibilidades para la propiedad Pattern es virtualmente ilimitado. Lo mismo que "[A-Za-z0-9_]". cada ítem encerrado en paréntesis será almacenado en la colección submatches de matches (coincidencias).net/voices/art03.asp 26/04/2006 .Windows Script Host para desarrolladores Visual FoxPro Página 20 de 23 \d \D \s \S \w \W Toma un único carácter numérico.Pattern = "w{3}\. Global . Toma cualquier carácter de palabra incluyendo el guión bajo. Debemos aclarar que la tabla de arriba no está completa. dejaremos la discusión en este punto. tabulador. dejamos fuera la posibilidad de que la dirección contenga un punto a la izquierda del símbolo "@". Lo mismo que "[ \f\n\r\t\v]". Replace . 2 ) +. "ciudadanos") ¿Qué tal un ejemplo del mundo real sobre intercambio? ¿Qué pasaría si tuviese un archivo de texto (SDF) con la fecha en formato "MM/DD/AAAA"? Básicamente tiene dos alternativas.com") FOR EACH oMatch IN oMatches ? oMatch. tres variables. y que luce así: "Algunos datos de caracter09. Aquí hay código que hace eso sobre la cadena de arriba.Windows Script Host para desarrolladores Visual FoxPro Página 21 de 23 oMatches =
[email protected] && Muestra name@domain. Primero. y "com" en ese orden. Luego deberíamos intercambiar las piezas de un lado al otro. Antes de que alguien piense: "Bueno.microsoft. y mover de lugar los caracteres usando las funciones de VFP como SUBSTR(). Sin embargo. pruebe lo siguiente desde la ventana de comandos. esta tarea es más fácil. eliminar las barras.com FOR EACH lcsub IN oMatch. 47 ) lcString = lcStart + RIGHT( lcDate. Esto fueron cuatro líneas de código.Pattern = "hombres" ? oRE. 8 ) lcDtart = LEFT( lcString. Segundo. Luego agregarlo a una tabla real. Mejor que ejemplos de sintaxis. lcstring = "Es la hora de que todos los hombres buenos vengan a ayudar a su país. reemplaza una cadena por otra. 2 ) + lcFinish Es un montón de trabajo. 4 ) + LEFT( lcDate. Hace que lo anterior sea la opción más fácil. como el nombre sugiere." oRE.Este método hace una o dos cosas. Digamos que hay un solo campo fecha.com/spanish/msdn/comunidad/mtj.Submatches ? lcsub NEXT NEXT Las tres iteraciones del bucle interior mostrarán ""name". "domain". considere que la computadora en que corra este código puede no tener la fecha configurada como AMERICAN ó MDY. 38 ) lcFinish = SUBSTR( lcString.00mas caracteres02/01/2001mas sobrantes" Lo que tenemos arriba es la fecha profundamente incrustada en la cadena. Primero deberíamos poner código fijo para el inicio y el largo de la fecha. incrustado en alguna parte de la línea. SUBSTR( lcDate. Considere lo siguiente: oRE. puede intercambiar pares de palabras ó más. y luego volver a grabarlo. 39. Primero puede agregar los datos directamente a un cursos con el tipo de datos como C (8).Pattern = "(\d+)\/(\d+)\/(\d+)" http://www. con el método Replace. más seis llamadas a funciones. * lcString es la cadena mostrada antes lcDate = SUBSTR( lcString.net/voices/art03.asp 26/04/2006 . Consideremos ahora que deberíamos hacer primero. Esta elección requiere extraer la cadena.Execute("whole. qué hay con DTOS(CTOD(lcdate))?". 4.Replace(lcstring. las tres instancias de (\d+) son las palabras. http://www. Una vez que lo haga. descubrirá que puede hacer fácilmente cosas como resguardar su trabajo.com. Test .Global igual a . copiarla y luego correrla puede hacerse con unas pocas líneas de código.Test(< cadena a probar >) Y con esto terminamos Esto concluye el artículo sobre Windows Script Host. Por ejemplo. La propiedad global que se mencionó antes puede usarse en este caso. George Tasker trabaja para el Shaw Contract Group. implementar aplicaciones a través de una red de área local o mayor. Por tanto la cadena "$3$1$2" indica que la palabra 3 va primero. En el patrón. este método realiza la prueba para saber si la cadena pasada como parámetro coincide con el patrón proporcionado y devuelve un valor lógico indicando el resultado. Si pone oRE. Puede ser contactado en gatasker@msn. de Cartersville. Usar archivos de script para realizar tareas que consumen tiempo. Como dijimos al comienzo.com/spanish/msdn/comunidad/mtj.Replace( lcString. e incluso buscar en un servidor una versión más reciente de una aplicación. y terminamos con "20010201". aprender VBScript no resultará terriblemente difícil para un desarrollador VFP experimentado. pero no es así.microsoft. Ahora se preguntará que pasa con una cadena con más de una fecha. su habilidad para leer y escribir claves de la registry.00mas caracteres02/01/2001mas sobrantes02/14/2001y aun mas" Puede pensar que deberá procesar esto más de una vez. Si es así. De ninguna manera cubrimos todo lo que WSH es capaz de hacer. la indicación de las barras (\/) no.asp 26/04/2006 . Lo que no cubrimos es mayormente útil solamente dentro de archivos VBScript ó Jscript que WSH es capaz de ejecutar. como: "Algunos datos de caracter09. no hay gran diferencia con lo que ya le es familiar.Windows Script Host para desarrolladores Visual FoxPro Página 22 de 23 lcString = oRE. El signo pesos representa el comienzo de una palabra.Como vimos antes. sólo cubrimos los ítems que pueden ser utilizados para simplificar y/o extender la funcionalidad de VFP. y el objeto diccionario (entre otros) no han sido tocados. Esperamos que haya disfrutado este artículo y haber "puesto nuevas herramientas en su caja". que debe hacer manualmente. que se agrega a la tabla muy prolijamente. todas las instancias en que el patrón coincida serán reemplazadas. Georgia. u otras cosas en el entorno Windows puede interesarle.. "$3$1$2") Se preguntará porqué funciona esto.T. Sintácticamente. llResult = oRE.net/voices/art03. y la palabra 1 tercera. la palabra 1 segunda. Puede ser contactado en edr@edrauh. Todos los derechos reservados. Aviso Legal | Marcas registradas | Privacidad Ultima actualización: 13 de Enero de 2003 http://www. Administre su perfil | Envíe esta pagina por e-mail | Suscríbase al MSDN Flash ©2006 Microsoft Corporation.net/voices/art03.microsoft.com/spanish/msdn/comunidad/mtj. VC++ y tecnologías Windows DNA.com.Windows Script Host para desarrolladores Visual FoxPro Página 23 de 23 Ed Rauh (MCP) es especialista en desarrollo dentro del entorno Win32 utilizando VFP. Es MVP en Visual FoxPro desde el año 1999.asp 26/04/2006 .