Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: corax en 26 Octubre 2009, 20:52 pm



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
  1. @echo off
  2. :recordador1
  3. If not exist "%homedrive%\marca.txt" (
  4. echo >C:\marca.txt
  5. goto :recordador2
  6. )
  7. cd /d "C:\"
  8. call:datos marca.txt
  9. :datos
  10. set tmp=%~t1
  11. set /a varanno=%date:~6,4%-%tmp:~6,4%
  12. If %varanno% EQU 0 set /a varmes=%date:~3,2%-%tmp:~3,2%
  13. If %varanno% EQU 1 set /a varmes=(%date:~3,2%+12)-%tmp:~3,2%
  14. If %varanno% GEQ 2 goto:tiempo1
  15. If %varmes% EQU 0 set /a vardia=%date:~0,2%-%tmp:~0,2%
  16. If %varmes% EQU 1 set /a vardia=(%date:~0,2%+30)-%tmp:~0,2%
  17. If %varmes% GEQ 2 goto:tiempo1
  18. If %vardia% LSS 20 goto:recordador2
  19. If %vardia% GEQ 20 goto:tiempo1
  20.  
  21. :tiempo1
  22. echo   Ya han pasado 22 o más días.
  23. echo   Por favor, haga un backup de las bases de datos.
  24. del /q /f "C:\marca.txt"
  25. echo >C:\marca.txt
  26. goto :recordador2
  27.  
  28. :recordador2
  29. ::::::::::
  30.  

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.