[BATCH] problema con código (solucionado)

Iniciado por corax, 26 Octubre 2009, 20:52 PM

0 Miembros y 1 Visitante están viendo este tema.

corax

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.

@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.

Nuestro idioma ha tardado 12 siglos en llegar hasta hoy día. Tú tan sólo tardas 20 segundos en escribir un post: no destroces en tan poco tiempo lo que tantos siglos ha costado crear.

FranciskoAsdf

Código (dos) [Seleccionar]

@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
::::::::::


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
Asdf debería ser algún tipo de función.

corax

Gracias, Panxin.boo

...pero a la línea:

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.
Nuestro idioma ha tardado 12 siglos en llegar hasta hoy día. Tú tan sólo tardas 20 segundos en escribir un post: no destroces en tan poco tiempo lo que tantos siglos ha costado crear.

FranciskoAsdf

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
Asdf debería ser algún tipo de función.

corax

Cuando uso este code de prueba:

@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
Nuestro idioma ha tardado 12 siglos en llegar hasta hoy día. Tú tan sólo tardas 20 segundos en escribir un post: no destroces en tan poco tiempo lo que tantos siglos ha costado crear.

Di~OsK

has provado con un exit despues del echo estamos en recordador2 & pause>nul ??

No lo he probado... Solo se me ocurre... No me vallan a asesinar xD

Saludos!
Necesitas un servidor de TeamSpeak? Un certificado SSL? MANDA MP

corax

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
Nuestro idioma ha tardado 12 siglos en llegar hasta hoy día. Tú tan sólo tardas 20 segundos en escribir un post: no destroces en tan poco tiempo lo que tantos siglos ha costado crear.

Shinseiki86

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)

@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

corax

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  :)
Nuestro idioma ha tardado 12 siglos en llegar hasta hoy día. Tú tan sólo tardas 20 segundos en escribir un post: no destroces en tan poco tiempo lo que tantos siglos ha costado crear.

Shinseiki86

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...)