Página 1 de 1

Guardar fecha en txt

Publicado: 06 Mar 2012, 06:08
por nelson13
Hola, con la ayuda de ustedes hize un scipt que me baja solo 3 archivos que descargo diariamente, utilizo un script distinto para cada archvo. Ahora necesito hacer que esos script cuando se ejecutan, me guarde la fecha local en un txt.
tambien necesito otro script que este todo el tiempo en ejecucion y compare la fecha de la pc con la de cada uno de los 3 txt, y en caso que no concuerde me muestre un icono rojo (los iconos los busco yo) y si no, osea que coinciden las fechas de los 3 txt, uno verde. y en la barra tray y al pocisionarme sobre el icono cuando este en rojo me diga cual/cuales es el txt que no coincide la fecha.
De este modo puedo saber con una simple mirada en la barra de tareas cuando se descargaron correctamente los archivos y cuando no.
Cualquier ayuda, o info para saber como arrancar con esto es bienvenida!, porque no entiendo mucho. :smt022
aclaracion: el scpit de descaga va en una pc y con el que miro si todo esta ok en otra, por lo que el scpit deberia ser capas de leer los txt de una pc en red.
gracias de antemano! Nelson

Re: Guardar fecha en txt

Publicado: 06 Mar 2012, 10:41
por Ximorro
Guardar la hora en un archivo es fácil:

Código: Seleccionar todo

$archivoHora = "d:\hora.txt"
$hora = @YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC
FileWrite($archivoHora, $hora)
Leerla es parecido:

Código: Seleccionar todo

$archivoHora = "d:\hora.txt"
$hora = FileRead($archivoHora)
Acceder a un archivo en red es fácil (siempre que tengas permisos, evidentemente). Si tienes acceso a través de una unidad de red pues se hace igual que si es en local, simplemente usando la letra correspondiente. Pero no hace falta, también se puede acceder directamente usando dirección UNC, por ejemplo
$archivoHora = "\\ordenador\carpeta\hora.txt"

Naturalmente hay que poner el nombre de archivo que toca y el path correspondiente.

Por favor ten en cuenta que esta manera de trabajar con archivos (usando el nombre en FileWrite y FileRead) es muy ineficiente cuando se hacen varias operaciones, porque cada vez se abre y cierra el archivo. En esos casos hay que abrir con Open y cerrar con Close, y usar el descriptor que devuelve open.
En este caso como sólo vamos a realizar una operación la forma simplificada es ideal.

Para poner un icono en la bandeja... en realidad el icono se pone por defecto, lo que pasa es que es el de AutoIt. Para cambiarlo y poner el que quieras se hace con:
TraySetIcon("archivo.ico")
También se puede indicar un icono dentro de una dll (y creo que de un exe) indicando el índice en el segundo parámetro.

Para asignar el texto al icono para que se vea cuando pones el ratón encima se hace con:
TraySetToolTip($texto)

Re: Guardar fecha en txt

Publicado: 06 Mar 2012, 10:43
por arkcrew
Hola,

Pues lo que se me ocurre:

Hola, con la ayuda de ustedes hize un scipt que me baja solo 3 archivos que descargo diariamente, utilizo un script distinto para cada archvo. Ahora necesito hacer que esos script cuando se ejecutan, me guarde la fecha local en un txt.
Para guardar la fecha, en el mismo script donde estés descargando, pues tienes las funciones filewritelog o algo por el estilo, o simplemente un filewrite personalizado con tus datos, tienes las macros @DAY, @HOUR @YEAR etc, con eso conseguirías escribir en un archivo de texto la hora y demás datos en el momento de la descarga.
tambien necesito otro script que este todo el tiempo en ejecucion y compare la fecha de la pc con la de cada uno de los 3 txt, y en caso que no concuerde me muestre un icono rojo (los iconos los busco yo) y si no, osea que coinciden las fechas de los 3 txt, uno verde. y en la barra tray y al pocisionarme sobre el icono cuando este en rojo me diga cual/cuales es el txt que no coincide la fecha.
Puedes hacer que el mismo script que te baje los archivos te escriba la fecha local y la fecha del archivo y luego el programa externo que compare ambas fechas.
Si están en red es creo, más fácil, puedes enviar ambos datos por TCP al otro pc y que este esté en ejecución y interprete los datos a tiempo real, es cuestión que investigues un poco. o si tienes una carpeta compartida en red, puedes ubicar ahi el archivo.
Para que muestre siempre activa la ejecución puedes meter en un while el código y que esté siempre comparando y ya muestre las advertencias a tu gusto.

Espero que te sirva o al menos te aclare algo!.

Saludos!

Re: Guardar fecha en txt

Publicado: 07 Mar 2012, 03:32
por nelson13
Antes que nada Muchisimas gracias Por tu ayuda!,Beno la verdad no tenia ni idea de como empezar y gracias al foro, ya va tomando forma esto.:smt003
Bueno te cuento primero y principal modifique el codigo, y le quite los macros @HOUR, @MIN, @SEC. ya que esta informacion no me servia para mi scpit ya que este script se descarga ua vez al dia. En principio quedaría así

Código: Seleccionar todo

$archivoHora = "\\Baja-PC\MusicBokOK.txt"
$hora = @YEAR & "/" & @MON & "/" & @MDAY
FileWrite($archivoHora, $hora)
Luego cuando lo ejecute me di cuenta que en el txt se van acumulando las fechas cada vez que se ejecuta el script. por lo que ahora el codigo deberia ser capas de borrar todo dato que exista en el txt y luego recien guardar la fecha local. por otro lado busque info en google y en el foro de como trabajar un txt y no encontre nada.
por otro lado lo del trabajo en red lo voy a hacer a travez de una UNC. mas que nada explique que necesitaba que funcione en red con dos scpit, (uno es el que baja y guarda la fecha y el otro el que compara y van en distintas pc) porque pense que alguien me sugeriría que el mismo codigo que baja los archivos todo fuera el que comparara las fechas y anuncie cuando algo fallo.
Muchas gracias por los codigos de la bandeja!, todabia no los probe por que me falta avanzar mas en el scpit, creo que las comparaciones de las fechas con If, y cada txt en una variable distinta, y la fecha local, tambien en una variable. no es asi?
la verdad me encanta autoit y este foro es genial.
Ximorro escribió:Guardar la hora en un archivo es fácil:

Código: Seleccionar todo

$archivoHora = "d:\hora.txt"
$hora = @YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC
FileWrite($archivoHora, $hora)
Leerla es parecido:

Código: Seleccionar todo

$archivoHora = "d:\hora.txt"
$hora = FileRead($archivoHora)
Acceder a un archivo en red es fácil (siempre que tengas permisos, evidentemente). Si tienes acceso a través de una unidad de red pues se hace igual que si es en local, simplemente usando la letra correspondiente. Pero no hace falta, también se puede acceder directamente usando dirección UNC, por ejemplo
$archivoHora = "\\ordenador\carpeta\hora.txt"

Naturalmente hay que poner el nombre de archivo que toca y el path correspondiente.

Por favor ten en cuenta que esta manera de trabajar con archivos (usando el nombre en FileWrite y FileRead) es muy ineficiente cuando se hacen varias operaciones, porque cada vez se abre y cierra el archivo. En esos casos hay que abrir con Open y cerrar con Close, y usar el descriptor que devuelve open.
En este caso como sólo vamos a realizar una operación la forma simplificada es ideal.

Para poner un icono en la bandeja... en realidad el icono se pone por defecto, lo que pasa es que es el de AutoIt. Para cambiarlo y poner el que quieras se hace con:
TraySetIcon("archivo.ico")
También se puede indicar un icono dentro de una dll (y creo que de un exe) indicando el índice en el segundo parámetro.

Para asignar el texto al icono para que se vea cuando pones el ratón encima se hace con:
TraySetToolTip($texto)

Re: Guardar fecha en txt

Publicado: 07 Mar 2012, 03:45
por nelson13
arkcrew escribió: Hola, Muchas gracias por tu respuesta!,
Pues lo que se me ocurre:
Hola, con la ayuda de ustedes hize un scipt que me baja solo 3 archivos que descargo diariamente, utilizo un script distinto para cada archvo. Ahora necesito hacer que esos script cuando se ejecutan, me guarde la fecha local en un txt.
Para guardar la fecha, en el mismo script donde estés descargando, pues tienes las funciones filewritelog o algo por el estilo, o simplemente un filewrite personalizado con tus datos, tienes las macros @DAY, @HOUR @YEAR etc, con eso conseguirías escribir en un archivo de texto la hora y demás datos en el momento de la descarga.
si gracias con la ayuda de ximorro esta parte la tengo casi resuelta, exceto, justamente lo que comentaba, se me van acumulando las fechas en el txt y debería borrar el contenido antes de guarda la nueva fecha.
tambien necesito otro script que este todo el tiempo en ejecucion y compare la fecha de la pc con la de cada uno de los 3 txt, y en caso que no concuerde me muestre un icono rojo (los iconos los busco yo) y si no, osea que coinciden las fechas de los 3 txt, uno verde. y en la barra tray y al pocisionarme sobre el icono cuando este en rojo me diga cual/cuales es el txt que no coincide la fecha.
Puedes hacer que el mismo script que te baje los archivos te escriba la fecha local y la fecha del archivo y luego el programa externo que compare ambas fechas.
Si están en red es creo, más fácil, puedes enviar ambos datos por TCP al otro pc y que este esté en ejecución y interprete los datos a tiempo real, es cuestión que investigues un poco. o si tienes una carpeta compartida en red, puedes ubicar ahi el archivo.
Para que muestre siempre activa la ejecución puedes meter en un while el código y que esté siempre comparando y ya muestre las advertencias a tu gusto.

Espero que te sirva o al menos te aclare algo!.
es cierto!, gracias no se me habia ocurrido de poner el codigo en un while. talvez tendria que ponerle algun contador para que el while se ejecute a cada 5 min por ejemplo ya que imaginate esto se descarga una vez al dia y seria un desperdicio de recuersos, que este todo el tiempo en ejecucion ¿no?.
Saludos!, mil gracias por aportar

Re: Guardar fecha en txt

Publicado: 07 Mar 2012, 04:19
por nelson13
por el momento hize este codigo, puse un msgboxpara ir probando y utilizo archivos locales. se aceptan correciones:

Código: Seleccionar todo

$archivofecha1 = "fecha1.txt"
$fechatxt1 = FileRead($archivofecha1)
$archivofecha2 = "fecha2.txt"
$fechatxt2 = FileRead($archivofecha2)
$archivofecha3 = "fecha3.txt"
$fechatxt3 = FileRead($archivofecha3)
$archivofecha4 = "fecha4.txt"
$fechatxt4 = FileRead($archivofecha4)
$fecha = @YEAR & "/" & @MON & "/" & @MDAY

If $fecha <> $fechatxt1 Then
   MsgBox(4096, "error", "Error 1", 10)
   Else
   MsgBox(4096, "Ok", "Ok 1", 10)
EndIf

If $fecha <> $fechatxt2 Then
   MsgBox(4096, "error", "Error 2", 10)
   Else
   MsgBox(4096, "Ok", "Ok 2", 10)
EndIf

If $fecha <> $fechatxt3 Then
   MsgBox(4096, "error", "Error 3", 10)
   Else
   MsgBox(4096, "Ok", "Ok 3", 10)
EndIf

If $fecha <> $fechatxt4 Then
   MsgBox(4096, "error", "Error 4", 10)
   Else
   MsgBox(4096, "Ok", "Ok 4", 10)
EndIf

Re: Guardar fecha en txt

Publicado: 07 Mar 2012, 09:16
por Ximorro
Nelson13 por favor, cuando contestes no repitas todo el comentario anterior, que tu comentario se hace muy largo y además más difícil de leer.
Pon sólo los trozos que hagan falta si crees que es necesario, pero no todo...

Para recrear el archivo una manera será abrirlo para escritura borrando el contenido, para eso ya hace falta el sistema Open/Close:

Código: Seleccionar todo

$archivoFecha = "\\Baja-PC\MusicBokOK.txt"
$fecha = @YEAR & "/" & @MON & "/" & @MDAY
$hFich = FileOpen($archivoFecha, 2) ; 2 = Modo escritura borrando contenido previo
FileWrite($hFich, $fecha)
FileClose($hFich)
Que por cierto, como has quitado la hora la variable ahora la llamo fecha, que tiene más sentido ;-)
Otra manera sería borrarlo antes con FileDelete ;-)

Para hacer las comprobaciones periódicas una manera efectivamente es hacer un bucle While con un Sleep de 5 minutos. Otra manera bastante cómoda es con las funciones Adlib, que sirven precisamente para programar funciones cada cierto tiempo, aunque si el programa no va a hacer nada más igual tendrías que ponerle un bucle con Sleep para que espere, así que en este caso quizás sea mejor usar directamente el While.

Re: Guardar fecha en txt

Publicado: 08 Mar 2012, 00:00
por nelson13
Ok, muchas gracias, hasta ahora el codigo que analiza los txt me quedo así, como estoy probando su correcto funcionamiento utilizo archivos locales y un sleep de 5 seg.
el otro lo deje igual que como me pusistes.

Código: Seleccionar todo

$x=0
While $x<>1

$archivofecha1 = "fecha1.txt"
$fechatxt1 = FileRead($archivofecha1)
$archivofecha2 = "fecha2.txt"
$fechatxt2 = FileRead($archivofecha2)
$archivofecha3 = "fecha3.txt"
$fechatxt3 = FileRead($archivofecha3)
$archivofecha4 = "fecha4.txt"
$fechatxt4 = FileRead($archivofecha4)
$fecha = @YEAR & "/" & @MON & "/" & @MDAY

If $fecha <> $fechatxt1 Then
   $baja1="error 1"

   Else
   $baja1="ok1"
EndIf


If $fecha <> $fechatxt2 Then
   $baja2="error 2"

   Else
   $baja2="ok2"
EndIf


If $fecha <> $fechatxt3 Then
   $baja3="error 3"

   Else
   $baja3="ok3"
EndIf

If $fecha <> $fechatxt4 Then
   $baja4="error 4"

   Else
   $baja4="ok4"
EndIf
 
 
 
 IF $baja1 = "ok1" and $baja2 = "ok2"and $baja3 = "ok3"and $baja4 = "ok4"  Then
   TraySetIcon("Ok.ico")
   TraySetToolTip($baja1 & ". "& $baja2 &". "& $baja3 &". "& $baja4)
 Else
   TraySetIcon("Error.ico")
   TraySetToolTip($baja1 &". "& $baja2 &". "& $baja3 &". "& $baja4)

 EndIf
	

Sleep(5000)
   WEnd
cualquier mejora/correcion, es bienvenida, pero hasta ahora funciona bien.

Re: Guardar fecha en txt

Publicado: 08 Mar 2012, 09:54
por Ximorro
Buen trabajo, como estás empezando a programar con esto si quieres te puedo contar algunas optimizaciones, aunque no es tan importante, lo importante es que has llegado al programa funcional, sólo son detalles que pueden mejorar algo el código.

Por ejemplo el bucle infinito lo puedes hacer sin necesidad de usar una variable y una comparación. La cosa tal como has puesto es hacer el bucle mientras la condición sea verdadera, pues eso se puede poner directamente:

Código: Seleccionar todo

While True
...
WEnd
La constante True siempre va a dar cierto, no hace falta computar una comparación y usar memoria y accesos a variables, ¡así es directo!

También suele ser típico, supongo que para escribir menos ;-) usar simplemente un valor 1 para que se evalúe como true (en una expresión lógica el cero se avalúa como false y cualquier otro número como true):

Código: Seleccionar todo

While 1
...
WEnd
Ya la otra es que suele ser interesante sacar fuera del bucle código constante que no hay que reevaluar. En este caso no es importante pero te lo cuento porque en bucles que hagan cálculos fuertes o se requiera velocidad todo lo que puedas calcular sólo una vez ayuda.
Por ejemplo en este caso las asignaciones de los nombres de fichero no hace falta hacerlas cada vez que se entra en el bucle, pues siempre son las mismas, así que se puede poner:

Código: Seleccionar todo

$archivofecha1 = "fecha1.txt"
$archivofecha2 = "fecha2.txt"
$archivofecha3 = "fecha3.txt"
$archivofecha4 = "fecha4.txt"
While 1
	$fechatxt1 = FileRead($archivofecha1)
	$fechatxt2 = FileRead($archivofecha2)
	$fechatxt3 = FileRead($archivofecha3)
	$fechatxt4 = FileRead($archivofecha4)
	$fecha = @YEAR & "/" & @MON & "/" & @MDAY
[...]
WEnd
Ah, de la misma manera cuando en las dos ramas de un IF se hace la misma operación al principio o al final, se puede sacar fuera. En este caso al poner el ToolTip se hace igual si es todo ok o no, así que se puede simplificar.

Código: Seleccionar todo

IF $baja1 = "ok1" and $baja2 = "ok2"and $baja3 = "ok3"and $baja4 = "ok4"  Then
	TraySetIcon("Ok.ico")
Else
	TraySetIcon("Error.ico")
EndIf
TraySetToolTip($baja1 & ". "& $baja2 &". "& $baja3 &". "& $baja4)
Ya ves que es una tontería, es por afinar. Son cosas que van optimizando el código y realmente con la costumbre acabas haciéndolas sin darte cuenta, lo que no hace daño ;-)

Igual 5 segundos es demasiado a menudo para esta tarea ¿no? ¿cada cuánto bajas esos archivos?
Si es porque crees que el Sleep está muy limitado tranquilo, se pueden poner hasta casi 25 DÍAS de espera (2147483647 milisegundos = 24.85 días) ¡Casi nada! ;-)

Re: Guardar fecha en txt

Publicado: 08 Mar 2012, 10:08
por Ximorro
Se me ha ocurrido otra supersimplificación, al principio no te la puse porque se complicaba hacer el tip pero si te vale lo que pongo es interesante tener en cuenta la técnica que te voy a contar.

Las variables booleanas o lógicas parecen muy chorras, sólo valen True o False, pero son más potentes de lo que parecen y a veces se nos olvida que podemos usarlas directamente.

En tu caso en vez de usar tantas variables tipo string se puede tener una variable lógica indicando si la fecha del archivo coincide con la actual, por ejemplo:
$ok1 = ($fecha = $fechatxt1)
valdrá true si son iguales y false si no lo son.
Ojo que el primer igual es un operador de asignación, como se asignan expresiones (que pueden ser constantes o retornos de funciones) el segundo igual está en una expresión, así que ahí es un operador de comparación.

Con esto todos los IF para crear las cadenas $baja con "error" u "ok" se simplifican y tengo en las variables $ok un true si la fecha es buena y un false si no lo es.
El IF final también se simplifica porque no hay que comparar cadenas, los valores lógicos se operan con los operadores lógicos (And, Or, Not) de forma natural y directa.
El problema era el toolip, pues usaba los textos no como valores lógicos para comprobar cosas, sino que ahí funcionaban como verdaderos textos para ser mostrados. Lo que he hecho es pasar los valores true y false y añadir el número al montar el string. Ahora en vez de por ejemplo
error 1. ok2. error 3. ok4
te daría
False1. True2. False3. True4

Eso ciertamente cambia, si aceptas ese cambio mira cómo se queda el programa, de 57 líneas a 26, haciendo exactamente lo mismo excepto ese texto del tooltip ¿simplificado, no?:

Código: Seleccionar todo

$archivofecha1 = "fecha1.txt"
$archivofecha2 = "fecha2.txt"
$archivofecha3 = "fecha3.txt"
$archivofecha4 = "fecha4.txt"
While 1
	$fechatxt1 = FileRead($archivofecha1)
	$fechatxt2 = FileRead($archivofecha2)
	$fechatxt3 = FileRead($archivofecha3)
	$fechatxt4 = FileRead($archivofecha4)

	$fecha = @YEAR & "/" & @MON & "/" & @MDAY

	$ok1 = ($fecha = $fechatxt1)
	$ok2 = ($fecha = $fechatxt2)
	$ok3 = ($fecha = $fechatxt3)
	$ok4 = ($fecha = $fechatxt4)

	If $ok1 and $ok2 and $ok3 and $ok4  Then
		TraySetIcon("Ok.ico")
	Else
		TraySetIcon("Error.ico")
	EndIf
	TraySetToolTip($ok1 & "1. " & $ok2 & "2. " & $ok3 & "3. " & $ok4 & "4")

	Sleep(5000)
WEnd

Re: Guardar fecha en txt

Publicado: 13 Mar 2012, 00:28
por nelson13
Ximorro muchas gracias por todo, mil disculpas por tardar tanto en postear, sin esta gran comunidad no ubiese podido lograr el scpitt :smt038 .
Bueno, me quede con el ultimo codigo que me diste, me funciona de 10! me simplificastes muchisimo el codigo. sos un genio! la verdad estoy en deuda contigo.
mme gusto tanto esto, que ya estoy pensando en un nuevo proyecto con Autoit, asique seguramente pronto aqui estare de nuevo! :smt003

Re: Guardar fecha en txt

Publicado: 13 Mar 2012, 09:33
por Ximorro
Nada hombre, un placer. El tuyo ya estaba bien, expliqué esta manera de hacerlo porque como ves esta técnica de usar directamente los valores lógicos puede ser muy útil así que es interesante verla en acción por si es útil en otra ocasión.

Como estás aprendiendo me he permitido hacerte estos comentarios, pero si sigues dándole caña dentro de poco ya no hará falta decirte nada ;-)