Restar Fechas en Batch Date

Tengo un código que funciona bien respecto un detalle, lo que quiero es que este batch copie la información contenida dentro de la fecha actual desde el 1 de este mes hasta el 1 del próximo mes y he desarrollado esto

set aaaa=%date:~10,4%
set mm=%date:~4,2%
set /a "aa=%date:~4,2%+1"
robocopy "\\10.109.0.99\c\CONSULTA" "C:\infoperu\CEDIS\VE" VE*.DBF  /e /z /MAXAGE:%aaaa%%aa%01 /MINAGE:%aaaa%%mm%01

Me esta dando error de tipo de dato, al parecer es una cadena y no puede sumarse el mes.

2 respuestas

Respuesta
1
set aaaa=%date:~10,4%
set /a mm=%date:~4,2%
set /a mm=+1%date:~4,2%-100
set /a aa=+1%date:~4,2%-99
robocopy "\\10.109.0.99\c\CONSULTA" "C:\infoperu\CEDIS\VE" VE*.DBF /e /z /MAXAGE:%aaaa%%aa%01 /MINAGE:%aaaa%%mm%01

Hola, logre saber el error, el problema es que esta reconociendo la variable como un numero en base 8, el 08 y cuando le añado uno el 09 no existe en base 8 y por eso me da error, lo que queria saber es si alguien puede ayudarme, ya que solvente el error añadiendole un uno adelante y restandole 100 y me da el mismo numero pero cuando quiero invocar la variable abajo me da error por que el formato que pide abajo es aaaa/mm/dd y yo le estoy retornando un 2019901.

Porfa ayudenme, me estoy rompiendo la cabezaaaa

Respuesta
1

Te respondo por aquí a tu propia respuesta porque en ella no puedo "RESPONDER" solo puedo "COMENTAR".

Te sugiero que pruebes con esto (he corregido algunas cosillas de lo que aportas en esa respuesta):

set aaaa=%date:~10,4%
set mm=%date:~4,2%
set /a aa=1%mm%-99
set /a mm=1%mm%-100
(if %aa% LSS 10 set aa=0%aa%)&(if %mm% LSS 10 set mm=0%mm%)
robocopy "\\10.109.0.99\c\CONSULTA" "C:\infoperu\CEDIS\VE" VE*.DBF /e /z /MAXAGE:%aaaa%%aa%01 /MINAGE:%aaaa%%mm%01

Ya me contarás.

Hola gggirald, eres un genio, esta excelente. Mira tengo el siguiente problema

net use  \\10.109.0.164 /user:Administrador oxxo
set aaaa=%date:~10,4%
set mm=%date:~4,2%
set dd=%date:~7,2%
set /a mm=1%mm%-100
set /a dd=1%dd%-100
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% = 1 set /a mm=1%mm%-101)
robocopy "\\10.109.0.164\c\CONSULTA" "C:\infoperu\El Polo\%aaaa%%mm%\VE" VE*.DBF /MAXAGE:%aaaa%%mm%02
robocopy "\\10.109.0.164\c\CONSULTA" "C:\infoperu\El Polo\%aaaa%%mm%\VH" VH*.DBF /MAXAGE:%aaaa%%mm%02
robocopy "\\10.109.0.164\c\CONSULTA" "C:\infoperu\El Polo\%aaaa%%mm%\VT" VT*.DBF /MAXAGE:%aaaa%%mm%02
robocopy "\\10.109.0.164\c\CONSULTA" "C:\infoperu\El Polo\%aaaa%%mm%\VD" VD*.DBF /MAXAGE:%aaaa%%mm%02

Tengo esto, le pongo un maxage de la fecha en curso desde el 02 pues siempre la información esta retrasada con un día (son backup) con eso estoy bien pues obtengo la fecha del dia 1 pero para el ultimo día quiero añadirle un segundo IF para que me diga que si es el dia 1 me jale el mes pasado (para que jale la información del ultimo dia del mes anterior sea 30 o 31). Pero al añadir esa restricción me esta dando error, quisiera saber si esta bien esta sentencia o es que tendría que darle otra forma, lo que quiero es que siga poniendo un cero adelante pero que solo en caso que el día sea 1 el evalúe el mes anterior. Y una ultima consulta para lanzarlo seria saber si tu le vez algún problema o si recomendarías cambiar de lógica o lo vez bien. Muchas Gracias!

(if %mm% LSS 10 set mm=0%mm%)&(if %dd% = 1 set /a mm=1%mm%-101)

Creo que la idea puede funcionar pero la sintaxis no es correcta. Tendría que ser algo como:

(if %mm% LSS 10 set mm=0%mm%)&(if %dd% == 1 set /a mm=1%mm%-101)

Y dado que ya has convertido a número la variable mm no sería necesario (y tal vez pueda dar error) usar el truco de preceder a la variable de un 1. Mejor sería:

(if %mm% LSS 10 set mm=0%mm%)&(if %dd%==1 set /a mm-=1)

Esta forma de trabajar dará problemas cuando el mes sea enero porque el nuevo mes calculado sería el mes cero y eso no lo va a tolerar el ROBOCOPY. Habría que incluir un nuevo IF para tratar esa eventualidad. Por cierto que creo que no hay ninguna razón especial para encadenar los IF con &. Yo lo hice así porque lo tengo así en algún BAT de los que creo para resolver problemas que me plantean en la página y no quise ponerme a analizarlo. Podría ser algo así:

if %mm% LSS 10 set mm=0%mm%
if %dd% = 1 (
   if %mm%==1 set /a mm=12&set /a aaaa=1%aaaa%-101
   else set /a mm-=1
   )

Además si no vas a hacer operaciones aritméticas no sería necesario convertir a número la variable dd.

No he probado lo anterior y los IF pueden dar problemas. Si tengo tiempo lo probaré mañana.

Ya he podido probarlo y tenía unos cuantos errores y erratas. Este sería el bat completo:

net use  \\10.109.0.164 /user:Administrador oxxo
set aaaa=%date:~10,4%
set mm=%date:~4,2%
set dd=%date:~7,2%
set /a mm=1%mm%-100
if %dd%==1 (if %mm%==1 (set /a mm=12&set /a aaaa=1%aaaa%-10001) else set /a mm-=1)
if %mm% LSS 10 set mm=0%mm%
robocopy "\\10.109.0.164\c\CONSULTA" "C:\infoperu\El Polo\%aaaa%%mm%\VE" VE*.DBF /MAXAGE:%aaaa%%mm%02
robocopy "\\10.109.0.164\c\CONSULTA" "C:\infoperu\El Polo\%aaaa%%mm%\VH" VH*.DBF /MAXAGE:%aaaa%%mm%02
robocopy "\\10.109.0.164\c\CONSULTA" "C:\infoperu\El Polo\%aaaa%%mm%\VT" VT*.DBF /MAXAGE:%aaaa%%mm%02
robocopy "\\10.109.0.164\c\CONSULTA" "C:\infoperu\El Polo\%aaaa%%mm%\VD" VD*.DBF /MAXAGE:%aaaa%%mm%02

Ya me dirás si funciona o si hay algún problema

Muchísimas gracias gggirald, ahora voy a probarlo y te cuento, sabes he tenido un inconveniente con el código, pasa que tengo 200 cajas y el batch lo estoy replicando 200 veces para que me jalen todas las cajas, ayer una de ellas estaba apagadas y se quedo esperando que loguee y después de es caja no copio nada, como puedo hacer para que intente loguear 2 veces y si no que me de un log de error? Eso estaría muy genial. Si necesitas que haga otra pregunta lo puedo hacer :D

No estoy seguro de haberte entendido bien. Intuyo que aparte del bat que estamos tratando tienes otro que copia ese bat en 200 destinos (¿en una red?) De forma secuencial. Si una de las copias remotas da problemas de conexión, el bat se queda esperando y no continua copiando en los demás destinos. Habria que ver si el comando que usas para conectarte/loguearte admite parámetros que permitan controlar tiempos máximos de espera de conexión y número máximo de reintentos. Si no los admite se podría hacer un PING previo a la conexión para determinar si el destino está en red. Mañana no voy a estar disponible porque tengo un viaje largo pero dime lo que sea y cuando pueda lo miraré.

Ese mismo bat que me ayudaste a modificar lo voy a copiar y pegar varias veces y cambiar el IP para jalar el destino de varias maquinas

net use  \\10.109.0.164 /user:Administrador oxxo

Al momento de iniciar sesión como no lo encuentra en el caso de que este apagado se queda esperando y no llega a terminar el batch, quisiera saber si se podria poner una restriccion que si no se puede logear a la primera que cancele y eso se guarde en un log. Algo asi habia pensado, crees que es factible? Gracias gggirald

Ya tengo un ratillo libre para contestarte. No veo en las ayudas de NET USE que se puedan incorporar parámetros que permitan el control que sugería. Esto me lleva a optar por el uso de la otra opción, la del PING. Prueba con esto:

ping 10.109.0.164 -n 1 > nul || (echo el ping a 10.109.0.164 no ha tenido ‚xito >> accesos.log & goto :eof)
net use \\10.109.0.164 /user:Administrador oxxo

Antes de intentar acceder a la IP indicada comprobamos que responde al ping. Si no responde se ejecuta la parte que sigue al "||", se registra en el archivo ACCESOS.LOG que ha habido un error y se sale del bat. Si responde correctamente al PING se ejecutará el NET USE y el resto del bat.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas