Título: [BATCH] problema con código (solucionado) Publicado por: corax en 26 Octubre 2009, 20:52 pm Buenas a todos. Estoy intentando desarrollar una nueva herramienta para los ordenadores del trabajo, pero me he encontrado con un par de problemillas.
Lo que estoy intentando hacer es un código que haga una acción cada cierto tiempo después de ejecutarlo en un equipo. La idea es que cuando pasen por ejemplo 20 días, como en el ejemplo de abajo, muestre el mensaje por pantalla de que es conveniente hacer un backup de las bases de datos. Lo que se me ha ocurrido para calcular el tiempo ha sido comparar la fecha de creación de un archivo (C:\marca.txt), que se cree la primera vez que se ejecute el programa, y comparar esa fecha con la del sistema. Ese código no me ha dado problemas para funcionar, compara bien las dos fechas. Código: @echo off :recordador1 If not exist "C:\marca.txt" echo >C:\marca.txt & goto recordador2 cd /d "C:\" call:datos marca.txt :datos set tmp=%~t1 set /a varanno=%date:~6,4%-%tmp:~6,4% If %varanno% EQU 0 set /a varmes=%date:~3,2%-%tmp:~3,2% If %varanno% EQU 1 set /a varmes=(%date:~3,2%+12)-%tmp:~3,2% If %varanno% GEQ 2 goto:tiempo1 If %varmes% EQU 0 set /a vardia=%date:~0,2%-%tmp:~0,2% If %varmes% EQU 1 set /a vardia=(%date:~0,2%+30)-%tmp:~0,2% If %varmes% GEQ 2 goto:tiempo1 If %vardia% LSS 20 goto:recordador2 If %vardia% GEQ 20 goto:tiempo1 :tiempo1 echo Ya han pasado 22 o más días. echo Por favor, haga un backup de las bases de datos. del /q /f "C:\marca.txt" & echo >C:\marca.txt & goto recordador2 :recordador2 :: más código Sin embargo, el código no funciona como debiera, no sé qué hago mal, pero da fallos al redireccionar a :tiempo y a :recordador2, y no sé qué le pasa. Por otra parte, ¿hay alguna manera más eficiente para saber en qué fecha se empezó a usar el programa sin necesidad de crear un archivo externo y ver su fecha de creación, como he hecho yo? Porque mi método me parece algo tosco. Gracias por adelantado. Título: Re: [BATCH] problema con código Publicado por: FranciskoAsdf en 26 Octubre 2009, 21:22 pm Código Lo que hice fue arreglar el primer IF, porque debes usar parentesis despues de la comparacion, los concatenadores se pueden usar pero, por lo menos yo, prefiero usar un par de lineas mas y asegurarme que el cidog funcione bien, y también arreglé los Goto, porke los estabas usando mal... eso saludos y sobre lo de la fecha no tengo idea :B saludos Título: Re: [BATCH] problema con código Publicado por: corax en 26 Octubre 2009, 21:33 pm Gracias, Panxin.boo
...pero a la línea: Código: If not exist "C:\marca.txt" echo >C:\marca.txt & goto recordador2 a mí por lo menos me funciona bien. El problema que da el código es bastante extraño, no sé si es que redirecciona a :tiempo1 y además a :recordador2, si vuelve a leer el código desde el principio, o qué le pasa, pero no redirecciona correctamente. De todas formas, gracias. Título: Re: [BATCH] problema con código Publicado por: FranciskoAsdf en 26 Octubre 2009, 23:23 pm segun lo que entiendo yo redirecciona como corresponde, a ver para empezar NO puede redireccionar a dos etiquetas a la vez porke solo puedes colocar una, lo que haces es:
si no existe C:\marca.txt crea el archivo marca.txt con un espacio dentro va a la etiqueta :recordador2 pero si existe se mueve a C:\ llama a la etiqueta datos + marca.txt y ahi redirecciona segun corresponda ... pero no veo que lo haga mal. saludos Título: Re: [BATCH] problema con código Publicado por: corax en 26 Octubre 2009, 23:59 pm Cuando uso este code de prueba:
Código: @echo off :recordador1 If not exist "%homedrive%\marca.txt" ( echo >C:\marca.txt goto :recordador2 ) cd /d "C:\" call:datos marca.txt :datos set tmp=%~t1 set /a varanno=%date:~6,4%-%tmp:~6,4% If %varanno% EQU 0 set /a varmes=%date:~3,2%-%tmp:~3,2% If %varanno% EQU 1 set /a varmes=(%date:~3,2%+12)-%tmp:~3,2% If %varanno% GEQ 2 goto:tiempo1 If %varmes% EQU 0 set /a vardia=%date:~0,2%-%tmp:~0,2% If %varmes% EQU 1 set /a vardia=(%date:~0,2%+30)-%tmp:~0,2% If %varmes% GEQ 2 goto:tiempo1 If %vardia% LSS 20 goto:recordador2 If %vardia% GEQ 20 goto:tiempo1 :tiempo1 echo Ya han pasado 22 o más días. echo Por favor, haga un backup de las bases de datos. del /q /f "C:\marca.txt" echo >C:\marca.txt goto :recordador2 :recordador2 echo estamos en recordador2 & pause>nul La primera vez, muestra por pantalla "estamos en recordador2", porque se limita a crear el archivo y a redirigirse a :recordador2... la 2ª vez que lo ejecuto muestra "estamos en recordador2" "Ya han pasado 22 o más días." "Por favor, haga un backup de las bases de datos." "estamos en recordador2" he llegado a la conclusión del que el 2º "estamos en recordador2" se debe a que desde :tiempo1 también se redirecciona hasta :recordador2, así que es normal que después de un "Ya han pasado 22 o más días, por favor, haga un backup de las bases de datos." venga un "estamos en recordador2". Lo que no es normal es que si de primeras pasa a :recordador2 luego salte a :tiempo1, ese es el fallo :-\ No sé qué hacer con este code :xD Título: Re: [BATCH] problema con código Publicado por: Di~OsK en 27 Octubre 2009, 00:10 am has provado con un exit despues del
Código: echo estamos en recordador2 & pause>nul ??No lo he probado... Solo se me ocurre... No me vallan a asesinar xD Saludos! Título: Re: [BATCH] problema con código Publicado por: corax en 27 Octubre 2009, 23:13 pm Debajo del :recordador2 no puedo poner un exit, el código continúa debajo :-\
De todas maneras, da igual... ejecuta las instrucciones de las dos etiquetas :¬¬ Y tranquilo, que por lo menos yo no asesino a nadie :xD Título: Re: [BATCH] problema con código Publicado por: Shinseiki86 en 28 Octubre 2009, 15:20 pm La razón del problema es que el comando call llama un procedimiento y luego retorna al punto donde se ejecutó (soy malo para explicar ;D)
Código: @echo off :recordador1 If not exist "%homedrive%\marca.txt" ( echo >C:\marca.txt goto recordador2 ) else ( cd /d "C:\" call:datos marca.txt ) :datos set tmp=%~t1 set /a varanno=%date:~6,4%-%tmp:~6,4% If %varanno% EQU 0 set /a varmes=%date:~3,2%-%tmp:~3,2% If %varanno% EQU 1 set /a varmes=(%date:~3,2%+12)-%tmp:~3,2% If %varanno% GEQ 2 (goto tiempo1) If %varmes% EQU 0 set /a vardia=%date:~0,2%-%tmp:~0,2% If %varmes% EQU 1 set /a vardia=(%date:~0,2%+30)-%tmp:~0,2% If %varmes% GEQ 2 (goto tiempo1) If %vardia% LSS 20 (goto recordador2) else (goto tiempo1) goto:eof :tiempo1 echo Ya han pasado 22 o m s días. echo Por favor, haga un backup de las bases de datos. del /q /f "C:\marca.txt" echo >C:\marca.txt goto recordador2 :recordador2 echo estamos en recordador2 pause>nul goto:eof Título: Re: [BATCH] problema con código Publicado por: corax en 28 Octubre 2009, 16:05 pm Sí, el problema debe estar en el call, no estoy familiarizado con él... :-\
¿qué code debo usar para que haga correctamente lo que tiene que hacer? También sigo con la curiosidad por sabre si hay una forma más eficiente de hacer lo de las fechas, lo de saber cuándo empezó a usarse el programa en el equipo. Porque hacer lo del archivo extra este es lo mejor que se me ha ocurrido :silbar: Toda ayuda es bienvenida :) Título: Re: [BATCH] problema con código Publicado por: Shinseiki86 en 28 Octubre 2009, 18:01 pm El code que te coloqué me funciona... no se si es que necesitas algo extra... Ejecutalo y nos contás.
Sobre una forma mas eficaz... la verdad no la veo... Necesitas tener una forma de saber cuando fue la ultima vez que se ejecutó, y eso solo lo haces con un archivo temporal que guarde la fecha... o si no... modificando el registro, creando una entrada que guarde la fecha de la ultima ejecución.. pero tiene inconvenientes: 1. El usuario debe tener permisos para modificar el registro. 2. Modificar el registro puede ser peligroso en manos inexpertas. (Lo es hasta en manos expertas...) Título: Re: [BATCH] problema con código Publicado por: corax en 28 Octubre 2009, 18:10 pm No, lo siento... el código me da el mismo error que los otros.
Y lo del registro... ya lo había pensado, pero es lo que dices, es mejor no tocarlo. No quiero ir llenando el registro de los ordenadores de ramas inútiles, ni arriesgarme a cambiar algo que no deba cambiar. Y también es verdad lo de los permisos, ni se me había ocurrido. En fin... me parece que el proyecto se va a quedar en eso, sólo un proyecto, durante un tiempecillo más, porque no sé cómo arreglarlo :-\ Título: Re: [BATCH] problema con código Publicado por: Shinseiki86 en 28 Octubre 2009, 21:43 pm Ok, estoy haciendole pruebas nuevamente y le he encontrado errores... :-[
1. La variable varmes se define asi: ... set /a varmes=%date2:~3,2%-%tmp:~3,2% El problema es que si el archivo es de sept y lo verificas ahora en octubre, te sale error ya que set /a varmes=10-09. Yo hago lo siguiente en esos casos: if %date:~-7,1% EQU 0 (set /a mes_act=%date:~-6,1%) else (set /a mes_act=%date:~-7,2%) if %date:~-10,1% EQU 0 (set /a dia_act=%date:~-9,1%) else (set /a dia_act=%date:~-10,2%) Prueba con lo siguiente y nos comentas como te va. Código: @echo off :recordador1 If not exist "%homedrive%\marca.txt" ( echo. >C:\marca.txt goto recordador2 ) else ( call:datos C:\marca.txt goto:eof ) :datos :: Fecha actual set anno_act=%date:~6,4% if %date:~-7,1% EQU 0 (set /a mes_act=%date:~-6,1%) else (set /a mes_act=%date:~-7,2%) if %date:~-10,1% EQU 0 (set /a dia_act=%date:~-9,1%) else (set /a dia_act=%date:~-10,2%) ::Fecha archivo set tmp=%~t1 set anno_arch=%tmp:~6,4% if %tmp:~3,1% EQU 0 (set /a mes_arch=%tmp:~4,1%) else (set /a mes_arch=%tmp:~3,2%) if %tmp:~0,1% EQU 0 (set /a dia_arch=%tmp:~1,1%) else (set /a dia_arch=%tmp:~0,2%) set /a dif_anno=%anno_act%-%anno_arch% If %dif_anno% EQU 0 set /a difer_mes=%mes_act%-%mes_arch% If %dif_anno% EQU 1 set /a difer_mes=(%mes_act%+12)-%mes_arch% If %dif_anno% GEQ 2 (goto tiempo1) If %difer_mes% EQU 0 set /a difer_dia=%dia_act%-%dia_arch% If %difer_mes% EQU 1 set /a difer_dia=(%dia_act%+30)-%dia_arch% If %difer_mes% GEQ 2 (goto tiempo1) If %difer_dia% LSS 20 (goto recordador2) else (goto tiempo1) goto:eof :tiempo1 echo Ya han pasado 22 o m s d¡as. echo Por favor, haga un backup de las bases de datos. del /q /f "C:\marca.txt" echo. >C:\marca.txt goto recordador2 :recordador2 echo estamos en recordador2 pause>nul goto:eof Título: Re: [BATCH] problema con código Publicado por: corax en 28 Octubre 2009, 22:30 pm Así que era eso... y yo convencido de que era un error del :call porque no estoy acostumbrado a usarlo... debería haberle hecho más pruebas al code de comprobación de la fecha.
Acabo de probar tu código y va genial, muchas gracias ;D Además de usarlo en el programa le echaré un buen rato a estudiarlo, tiene muy buena pinta. Otra vez, gracias por tu tiempo, si no llega a ser por ti no me habría dado cuenta de lo del 09. Un saludo! :P Título: Re: [BATCH] problema con código (solucionado) Publicado por: SuperDraco en 10 Noviembre 2009, 15:00 pm hola, me gustaria saber como funciona el script, me a interesado bastante, y lo que he echo es copiar la modificacion de "Shenseiki", y crear el bat y configurarlo para que se ejecute co windows al iniciar sesion... es eso lo que tengo que hacer para que funcione sin que yo toque nada no????
lo he echo bien??? gracias por el script. |