Página 1 de 1

Esperar por un texto

Publicado: 22 Oct 2009, 12:52
por pep
Me gustaría saber si hay alguna forma de esperar por un determinado texto en una ventana, una especie de WinWaitForText()

Para que se entienda lo que necesito voy a poner un ejemplo, supongamos que quiero automatizar una conexion ftp utilizando el comando ftp de windows que se ejecuta en consola y pide un usuario y una contraseña, la interacción sería algoa así:

c:\> ftp ftp.misitio.com

user: miusuario
password: mipwd

ftp>

el codigo autoit para ello sería algo así:

Código: Seleccionar todo


Run(@ComSpec & " /c " & 'ftp', "") 

WinWaitActive("cmd","")

Send("open ftp.misitio.com{enter}")

WinWaitForText("user:")             ;  <-------------  esta es la función que necesito, que espera hasta que aparezca ese texto

Send("miusuario{enter}")

WinWaitForText("user:")             ;  <-------------  esta es la función que necesito, que espera hasta que aparezca ese texto

Send("mipwd{enter}")

 

Re: Esperar por un texto

Publicado: 22 Oct 2009, 16:06
por Jonny
Hola

Claro que puedes hacerlo. Al ejecutar un programa externo, puedes recoger lo que este devuelva en su ejecución. Por supuesto, ejecutando @comspec también puedes hacerlo. Aquí te pongo un ejemplo, que envía el comando help al CMD y espera hasta que se reciba de este la ayuda del comando ls (Borrar pantalla).

Código: Seleccionar todo


#Include <Constants.au3>

Global $BuffConsole

$_Console=Run(@ComSpec&" /c help", "", @SW_HIDE, $STDOUT_CHILD)

While 1

Sleep(10)

If @Error Then ExitLoop

$BuffConsole=StdoutRead($_Console)

If StringInStr($BuffConsole, "Borra la pantalla")<>0 Then

Msgbox(0, "Texto encontrado", "CLS      Borra la pantalla. ")

ExitLoop

EndIf

Wend

 
Salu2!

Re: Esperar por un texto

Publicado: 23 Oct 2009, 12:20
por pep
Eso ya lo había pensado pero no vale porque al utilizar la opción $STDOUT_CHILD para obtener la salida del programa, éste no se ejecuta de forma interactiva.

De hecho prueba este código:

Código: Seleccionar todo


#Include <Constants.au3>

opt("WinTitleMatchMode",2)

$out=Run(@ComSpec & " /c cmd", "", @SW_SHOW, $STDOUT_CHILD)

WinWaitActive("cmd","")

Send("lolailo")

 
y compáralo con este otro:

Código: Seleccionar todo


#Include <Constants.au3>

opt("WinTitleMatchMode",2)

$out=Run(@ComSpec & " /c cmd", "", @SW_SHOW)

WinWaitActive("cmd","")

Send("lolailo")

 
verás lo que quiero decir.

Lo que yo necesito es algo parecido al expect (que sonará a los programadores TCL), o a los scripts que usaban los emuladores de terminal (que sonará a los que llegaron a usar un modem alguna vez).

Poniendolo en términos de tu ejemplo, lo que yo necesitaría es una forma de ejecutar el programa interactivamente (como ocurre en el ejemplo que te puse sin $STDOUT_CHILD) pero de forma que pudiese conectar la salida estándar a una variable de autoit de forma que cada escritura del programa en pantalla (STDOUT) actualizase la variable de autoit y así consultándola periódicamente pudiese saber que está escribiendo el programa. El uso tradicional de la redirección ($STDOUT_CHILD) no vale porque necesita que el programa termine para obtener toda su salida y yo necesito algo interactivo, mientras el programa está en ejecución.

Re: Esperar por un texto

Publicado: 23 Oct 2009, 13:24
por Jonny
Hola

Ya entiendo mejor lo que quieres. La verdad es que no se me ocurre como comprobar así dinámicamente la salida de un programa. Seguro que es posible y sin mucha complicación. A ver si los gurus del AutoIt se animan a decirnos como.

salu2!

Re: Esperar por un texto

Publicado: 23 Oct 2009, 13:31
por BasicOs
Hola,
  • No se si en $out=Run(@ComSpec & " /c cmd >>salidainteractiva.txt", "", @SW_SHOW) te va guardando al segundo la salida, en el fichero de texto las salidas del programa en dos, luego el fichero de texto podrías leerlo con FileRead. Puedes probar.
  • Sino tienes otra opción que es como en el cmd las escrituras son muy estereotipadas, puedes crear muy facilmente un OCR, en el que tienes los 30 o 40 caracteres posibles prearchivados, luego defines la zona de la pantalla donde tienen que buscar los caracteres previos,
    y lo que haces es un for next, en el que comparas cada zona, y guardas en una variable los caracteres existentes, si defines la zona donde entran el user y el pass, ya los tienes, si defines la zona más grande tendrias que eliminar los caracteres escaneados por el OCR, y quedarte con los que son estos. El ocr es muy rapido y en pocos segundos tienes el resultado.
  • Otra opcion es usar las funciones FTP de Autoit, y crearte un interface tu mismo para acceder a este, como un programa tipo filezilla, más simple donde tu preparas con unos botones las opciones q vas deseando,
Ya contaras a ver cual de las 3 opciones te fue mejor :smt026

Salu2:)