Ms-Dos - Errores en bat con fechas

 
Vista:
Imágen de perfil de Luis

Errores en bat con fechas

Publicado por Luis (17 intervenciones) el 03/12/2021 17:06:27
Hola a todos, con ayudas y lecturas varias, pude armar un bat que toma la fecha actual del sistema y le resta 1 dia, si por el formato del equipo, el mes ó el día de esa fecha tiene 1 solo digito, les agrego un "0" por delante, y lo guardo en las variables d y m . Tambien lo propio con el año en "y".
Luego cree varios if para que según el mes me de el valor o número del último día.
La fecha completa, la cargo en una variable y le agrego la extensión .reg , luego busco en una carpeta de red un archivo con ese nombre.reg exacto ( ejemplo 03122021.reg ), la idea es "siempre" traer el archivo cuyo nombre corresponde al día anterior al actual, luego copio, lo muevo,etc.

@echo off
set /a d=%date:~0,2%
set /a m=%date:~3,2%
set /a y=%date:~6,4%
set /a d-=1

if %d% LSS 10 set d=0%d%
if %m% LSS 10 set m=0%m%

if %m% == 01 set FinMes=31
if %m% == 02 set FinMes=28
if %m% == 03 set FinMes=31
if %m% == 04 set FinMes=30
if %m% == 05 set FinMes=31
if %m% == 06 set FinMes=30
if %m% == 07 set FinMes=31
if %m% == 08 set FinMes=31
if %m% == 09 set FinMes=30
if %m% == 10 set FinMes=31
if %m% == 11 set FinMes=30
if %m% == 12 set FinMes=31

if %d% EQU 01 (
set d=%FinMes%
set /a m-=1

if %m% == 01 (
set m=12
set /a y-=1
)
)


set archivo=%y%%m%%d%
echo %archivo%

Set Orig= "M:\BACK\Control\backup\%archivo%.reg"
Set Dest= "C:\Base\Files\."
Set backup="M:\BACK\Control\backup\pasados\."

XCOPY %Orig% %Dest% /Y
@ECHO.Proceso finalizado - Fecha : %date% - Hora : %time:~0,8% - File : %archivo% >> procesos.log
cd /D "M:\BACK\Control\backup\"
FOR %%a in (%archivo%.reg) do call :REG %%a
EXIT

:REG
if exist M:\BACK\Control\backup\pasados\%1 (
echo. >> M:\BACK\Control\backup\pasados\%1
type %1 >> M:\BACK\Control\backup\pasados\%1
del %1
) else (
move %1 %backup%
)

Cada fin de mes la rutina falla, podrían ayudarme a solucionarlo o corregirlo ? Gracias !
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 1.419
Oro
Ha mantenido su posición en Ms-Dos (en relación al último mes)
Gráfica de Ms-Dos

Errores en bat con fechas

Publicado por Antoni Masana (811 intervenciones) el 07/12/2021 16:39:19
Arreglo para el dia 1 de cada mes.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@echo off
cls
set /a d=%date:~0,2%
set /a m=%date:~3,2%
set /a y=%date:~6,4%
 
set /a d-=1
 
if %d% LSS 10 set d=0%d%
if %m% LSS 10 set m=0%m%
 
if %m% == 01 set FinMes=31
if %m% == 02 set FinMes=28
if %m% == 03 set FinMes=31
if %m% == 04 set FinMes=30
if %m% == 05 set FinMes=31
if %m% == 06 set FinMes=30
if %m% == 07 set FinMes=31
if %m% == 08 set FinMes=31
if %m% == 09 set FinMes=30
if %m% == 10 set FinMes=31
if %m% == 11 set FinMes=30
if %m% == 12 set FinMes=31
 
if %d% EQU 00 set /a m=%m% - 1
if %d% EQU 00 set    d=%FinMes%
 
if %m% ==   0 set /a y-=1
if %m% ==   0 set    m=12
set archivo=%y%%m%%d%
echo %archivo%
 
Set Orig= "M:\BACK\Control\backup\%archivo%.reg"
Set Dest= "C:\Base\Files\."
Set backup="M:\BACK\Control\backup\pasados\."
 
XCOPY %Orig% %Dest% /Y
@ECHO.Proceso finalizado - Fecha : %date% - Hora : %time:~0,8% - File : %archivo% >> procesos.log
cd /D "M:\BACK\Control\backup\"
FOR %%a in (%archivo%.reg) do call :REG %%a
goto :EOF
 
:REG
    if exist M:\BACK\Control\backup\pasados\%1 (
        echo. >> M:\BACK\Control\backup\pasados\%1
        type %1 >> M:\BACK\Control\backup\pasados\%1
        del %1
    ) else (
        move %1 %backup%
    )

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Luis

Errores en bat con fechas

Publicado por Luis (17 intervenciones) el 07/12/2021 21:36:27
Buenísimo Antoni ! No sabía que a al restar 1 a %m% 01 quedaría 1 solo dígito ... 0 en vez de 00 .. pensé que 00 lo tomaria como cadena pero no .. Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.419
Oro
Ha mantenido su posición en Ms-Dos (en relación al último mes)
Gráfica de Ms-Dos

Errores en bat con fechas

Publicado por Antoni Masana (811 intervenciones) el 08/12/2021 15:41:42
Por cierto el BAT tiene un fallo y no es propio de BAT sino de los señores programadores de Microsoft que son bastante p.... (dejemoslo aqui)

El BAT fallara en Agosto, Septiembre y los días 8 y 9 de cada mes.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.419
Oro
Ha mantenido su posición en Ms-Dos (en relación al último mes)
Gráfica de Ms-Dos

Errores en bat con fechas

Publicado por Antoni Masana (811 intervenciones) el 08/12/2021 16:49:57
El BAT con los errores corregidos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
@echo off
set /a d=1%date:~0,2%
set /a m=1%date:~3,2%
set /a y=%date:~6,4%
set /a d-=1
 
if %d% EQU 100 set /a m-=1
 
if %m% ==  101 set FinMes=131
if %m% ==  102 set FinMes=128
if %m% ==  103 set FinMes=131
if %m% ==  104 set FinMes=130
if %m% ==  105 set FinMes=131
if %m% ==  106 set FinMes=130
if %m% ==  107 set FinMes=131
if %m% ==  108 set FinMes=131
if %m% ==  109 set FinMes=130
if %m% ==  110 set FinMes=131
if %m% ==  111 set FinMes=130
if %m% ==  112 set FinMes=131
 
if %d% EQU 100 set    d=%FinMes%
if %m% ==  100 set /a y-=1
if %m% ==  100 set    m=12
 
set d=%d:~1,2%
set m=%m:~1,2%
 
set archivo=%y%%m%%d%
echo %archivo%
 
Set Orig= "M:\BACK\Control\backup\%archivo%.reg"
Set Dest= "C:\Base\Files\."
Set backup="M:\BACK\Control\backup\pasados\."
 
XCOPY %Orig% %Dest% /Y
@ECHO.Proceso finalizado - Fecha : %date% - Hora : %time:~0,8% - File : %archivo% >> procesos.log
cd /D "M:\BACK\Control\backup\"
FOR %%a in (%archivo%.reg) do call :REG %%a
goto :EOF
 
:REG
    if exist M:\BACK\Control\backup\pasados\%1 (
        echo. >> M:\BACK\Control\backup\pasados\%1
        type %1 >> M:\BACK\Control\backup\pasados\%1
        del %1
    ) else (
        move %1 %backup%
    )


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Luis

Errores en bat con fechas

Publicado por Luis (17 intervenciones) el 10/12/2021 02:41:43
Gracias de nuevo Antoni !
Por lo que puedo entender .... anteponiendo el 0 me lo toma como Octal ? O sea ... no hay 8 ni 9 ... solo es una duda.
Respecto a los If de la variable FinMes, creo que viene n error de arrastre, que quisiera me confirmes.

Por ej. tenemos los primeros 4 meses

if %m% == 101 set FinMes=131
if %m% == 102 set FinMes=128
if %m% == 103 set FinMes=131
if %m% == 104 set FinMes=130

Es posible que lo correcto sea :

if %m% == 101 set FinMes=131
if %m% == 102 set FinMes=131
if %m% == 103 set FinMes=128
if %m% == 104 set FinMes=131

Pregunto porque se supone que debería tomar el último día del mes anterior , pero quizás no sea asi y me falta comprender algo mas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.419
Oro
Ha mantenido su posición en Ms-Dos (en relación al último mes)
Gráfica de Ms-Dos

Errores en bat con fechas

Publicado por Antoni Masana (811 intervenciones) el 10/12/2021 14:48:06
Los días 8 y 9 y los meses 8 y 9 para es SET al tenerlo como 08 o 09 no lo toma como numérico decimal y es un error de los programadores de Microsoft, han desarrollado mal la parte aritmética y es una chapuza descomunal.


En tu código ponías esto:

1
2
3
if %m% == 01 set FinMes=31
if %m% == 02 set FinMes=28
if %m% == 03 set FinMes=31

y después restabas 1 al mes.
Si la fecha actual era 1 de marzo el día anterior resultaba 31 de febrero porque miras el fin de mes antes de restar o séa marzo y no Febrero.

lo correcto era lo que he realizado o esto

1
2
3
4
5
if %m% == 01 set FinMes=31
if %m% == 02 set FinMes=31
if %m% == 03 set FinMes=28
if %m% == 04 set FinMes=31
if %m% == 05 set FinMes=30

En ese caso el nombre mas correcto de la variable no es FinMes si no FinMesAnterior

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar