Crear un .bat para crear una carpeta con fecha del día anterior de ejecución.

Crear un .bat para crear una carpeta con fecha del día anterior de ejecución y los días lunes cree la carpeta con la fecha del día viernes (sábado y domingo no).

no importa el formato de la fecha aaaa-mm-dd                                                                                                                                                                                                                                                                                     ..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

1 respuesta

Respuesta
1

Imagino que la carpeta se debe crear solo si no existe. La ubicación de las carpetas creadas la cargo en una variable (destCarp) en la que deberás poner la ubicación que te interese. He adoptado el formato aaaa-mm-dd para las carpetas creadas. Utilizo una de las muchas rutinas de tratamiento de fechas en entorno MSDOS creadas por Ritchie Lawrence y conseguidas en http://www.commandline.co.uk/cmdfuncs/dandt/#datetodays y otra inspirada en las de José Manuel Tella Llop conseguida en http://multingles.net/docs/jmt/difecha.htm. (esta última dirección ya no existe). Esta es mi propuesta:

@echo off&setlocal
set destCarp=d:\bat
call :DateToDOW %date:~6,4% %date:~3,2% %date:~0,2% dow
if %dow% gtr 5 goto :EOF
if %dow% equ 1 call :diaant %date% -3
if %dow% gtr 1 call :diaant %date% -1
if not exist %destCarp%\%yy%-%mm%-%dd% echo md %destCarp%\%yy%-%mm%-%dd%
goto :EOF
:diaant
call :dias %1
set /a j+=%2
call :inc %j%
goto :EOF
:dias
for /f "tokens=1,2,3 delims=-/." %%a in ("%1") do (
   set dd=%%a&set mm=%%b&set yy=%%c)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-719469
goto :EOF
:inc
set /a a=%1+719468,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:DateToDOW %yy% %mm% %dd% days
::
:: By: Ritchie Lawrence, 2003-04-29. Version 1.1
::
:: Func: Creates a day of week number from a calendar date, where 1 = Mon
::       and 7 = Sun. For NT4/2K/XP.
::
:: Args: %1 year component to be converted, 2 or 4 digits (by val)
:: %2 month component to be converted, leading zero ok (by val)
:: %3 day of month to be converted, leading zero ok (by val)
::       %4 var to receive day of week number, 1 to 7 (by ref)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Setlocal ENABLEEXTENSIONS
set yy=%1&set mm=%2&set dd=%3
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,dow=153*m+2
set /a dow=dow/5+dd+y*365+y/4-y/100+y/400-2472630,dow%%=7,dow+=1
endlocal&set %4=%dow%&goto :EOF

He dejado el comando de creación de las carpetas precedido de un ECHO para que puedas ver el comando que se ejecutaría, en su caso (es decir si se dan las condiciones y no existe ya la carpeta). Una vez que quede claro que va a hacer lo que quieres eliminas el ECHO para que se ejecute el comando MD (estoy hablando de la séptima línea).

Por último espero que la página no haga alguna de las suyas cambiando partes del código.

Ya me dirás si te funciona o si le encuentras algún problema.

Buenas tardes

muchas gracias por tu tiempo y ayudarme.

realice los cambios mencionados y no me arroja ningún resultado. tengo Windows 7 pro 64 bits por si es por tema de versión de SO que no funciona.

No, no es un problema de la versión del SO. Yo creo que es, más bien, un problema relacionado con la forma de ejecutar un bat. Intuyo que creas el BAT con el texto que te facilité, y luego lo ejecutas directamente desde la ventana del explorador de Windows. Cuando se hace así, al finalizar la ejecución del BAT se cierra la ventana y no se puede ver lo que había en ella. Al menos en la fase de depuración de un BAT lo más recomendable es ejecutarlo desde una ventana CMD/Símbolo del sistema.

Imagino que sabes a qué me refiero pero por si acaso:

1. Botón de inicio de Windows 7, escribir CMD en casilla "Buscar programas y archivos" y dar Intro/Enter

2. En la ventana (normalmente negra) que se abre, situarse en la carpeta donde se guardó el bat. Si esa carpeta fuera c:\prueba el comando sería "cd \prueba".

3. Comprobar que el bat está ahí y, de paso, revisar su texto. Si hemos llamado al bat CarpDiaAnt.bat (por ejemplo) tecleamos el comando "type carpdiaant.bat".

4. Ejecutar el bat. Tecleamos (en el supuesto anterior) "carpdiaant"

5. Capturamos los pantallazos necesarios para poder presentar en esta página todos los resultados de la ventana CMD, usando la barra de desplazamiento de la misma, para que pueda echarles un vistazo.

A partir de ahí podremos seguir. Paciencia, que se conseguirá.

Buenos días Estimado

este fue el resultado de las pruebas

Veo que has cumplido los puntos 1, 2, 3 y 5 y que al bat lo has llamado PRUEBACARPETAS.bat y lo has situado en la carpeta raíz de la unidad C. Pero no has cumplido el punto 4 (o no veo el comando de ejecución: PRUEBACARPETAS sin más).  Además aunque el aspecto general del bat parece correcto, puede observarse que no has cambiado el valor de la variable %destCarp% (segunda línea "set destCarp = d:\bat"), cosa que te indicaba que debías hacer en mi primera respuesta "La ubicación de las carpetas creadas la cargo en una variable (destCarp) en la que deberás poner la ubicación que te interese". Si quieres que las carpetas de fecha se creen en la propia carpeta raíz de la unidad C deberías editar esa segunda línea para que diga "set destCarp=c:". Curiosamente si que has eliminado el "ECHO" del que también hablaba en esa primera respuesta: "He dejado el comando de creación de las carpetas precedido de un ECHO para que puedas ver el comando que se ejecutaría, en su caso (es decir si se dan las condiciones y no existe ya la carpeta). Una vez que quede claro que va a hacer lo que quieres eliminas el ECHO para que se ejecute el comando MD (estoy hablando de la séptima línea)." Y de momento no deberías eliminarlo porque te permitirá ver lo que se va a hacer antes de darlo por bueno (o por malo).

Perdón, veo que sí que cambiaste la línea 2, pero no sé si en tu entorno existe la carpeta C:\bat que es lo que has puesto. Debe ser una carpeta preexistente. Y en todo caso falta el comando de ejecución del bat: PRUEBACARPETAS. Si él no se ejecutará y no podremos ver que dice el sistema.

Quería decir "Sin él..." en lugar de "Si él..."

Otra aclaración: acabo de comprobar que si no existe C:\bat el comando MD la crearía y colgaría de ella las carpetas de fechas. Por tanto solo queda pendiente la ejecución del bat: teclear en C:\> el comando PRUEBACARPETAS (puede ser en minúsculas).

buenas tardes estimado

adjunto pantallazo de las pruebas ejecutando el (PRUEBASCARPETAS.bat) asi se llama el .bat.

si se creo la carpeta con fecha del día anterior.

ultima consulta... con este .bat si el día lunes se ejecuta estaría tomando la fecha del día viernes?? es la parte mas complicada me imagino.

muchas muchas gracias por tu ayuda.. eres un crack fuera de serie.

saludos cordiales

Sí, debe cumplir "tus especificaciones". Los sábados y domingos no generará carpeta y los lunes la generará con la fecha del viernes anterior. Puedes probar eso sin más que cambiar de forma manual la fecha del ordenador, durante un ratito. Los tres primeros if se encargan de eso. La variable %dow% (de "day of week" para respetar al autor) contiene el día de la semana (del 1-lunes al 7-domingo). Si es mayor que 5 (viernes) no hace nada. Si es 1 (lunes) le resta 3 días a la fecha actual. Si es mayor que 1 (y menor que 6) le resta un día a la fecha actual.

Si la consideras resuelta puedes cerrar la pregunta.

Voy a probar a saludar yo también. He dejado de hacerlo porque la página me "censuraba" los saludos.

Me los sigue censurando. En fin saludos desde dentro del texto para evitar la censura.

Te recuerdo que debes cerrar la pregunta, y calificar la respuesta, si consideras que ya está resuelta.

donde las cierro?

Aquí mismo. Al responder te debe salir alguna opción de valorar la respuesta, pero la verdad es que no recuerdo exactamente como sale.

estimado experto

el .bat tenia alguna fecha de caducidad o de no ejecutarse.. el dia de hoy no hay manera que ejecute la creación del archivo con la fecha. no se le ha modificado nada desde el dia viernes que funciono perfectamente.

adjunto imagen de las pruebas de ejecución.

No tiene ninguna fecha de caducidad.

Pide un dir de c:\bat a ver que hay.

Si quieres ver el valor de la variable %dow% puedes colocar, antes del primer IF, el comando:

Echo El dia de la semana es: %dow%

Si no hace nada solo debería ser por dos cosas, o esa variable tiene un valor mayor que 5 (si hoy es martes debería ser 2 y si fuera miércoles debería ser 3), o la carpeta con la fecha de hoy (c:\bat\2017-09-12) ya existe.

adjunto la imagen del dir a C:\bat y tampoco se le ha realizado modificaciones.

podría ser el formato de la fecha que tiene mi PC el problema? no se divagando un poco.

Claro, dado que los datos de partida se obtienen de la variable de entorno %DATE% si el formato de la misma no es el esperado el resultado puede no serlo tampoco. Deduzco del pantallazo con el DIR C:\BAT que el formato en tu entorno es mm/dd/aaaa en lugar del dd/mm/aaaa con el que estaba trabajando. En esas condiciones la "invocación" a la rutina DateToDow debería ser:

call :DateToDOW %date:~6,4% %date:~0,2% %date:~3,2% dow

Prueba a ver si de esta forma funciona correctamente, aunque habría que explicar por qué te funcionó la primera vez, a no ser que probaras en un equipo con el otro formato de fecha.

De todas formas insisto en que no vendría mal poner instrucciones ECHO en los puntos que pueda interesar, para poder tener alguna información que aporte datos. Yo pondría, de momento,

Echo El dia de la semana es: %dow%

antes del primer IF y antepondría un echo al md del IF NOT EXIST.

Una vez que todo esté en orden ya podrías eliminarlos.

buenos días estimado experto

las pruebas las realice en este mismo equipo siempre. lo único que se me ocurre divagando es que como eran fechas menores a 10 los meses los tomo como días y por eso generaba las carpetas pero con el formato de fechas diferente.

ya realice los cambios mencionados, adjunto el pantallazo

¡Qué cosa tan rara! Ahora crearía la carpeta c:\bat\2018-01-08.

El ECHO que debías poner antes del IF era literalmente (sin comillas) "echo El dia de la semana es: %dow%", al poner ECHO solamente nos cuenta en que situación se encuentra el comando ECHO (desactivado por el comando @echo off). Pero tal como van las cosas te sugiero que añadas un "echo La fecha es: %date%"

con los cambios realizados

la fecha la esta tomando idéntica al formato que tiene mi PC

el día de la semana sale que es 3 me imagino porque hoy es miércoles.

adjunto todo el pantallazo de las pruebas

ud me indica que otros cambios le vamos haciendo al .bat  hasta que salga las pruebas.

muchas gracias

No entiendo por qué ahora no sale el ECHO del md (lo que en la prueba anterior salió como "md C:\bat\2018-01-08").

Añade este otro "echo %yy%/%mm%/%dd%" detrás de los dos que ya están y cuando termine la ejecución del BAT un "dir c:\bat".

Ya he visto que poniendo en la configuración regional Español(Panamá) salen las cosas como te salen a ti. Ahora no puedo ocuparme porque tengo que ir al dentista, pero con esto creo que ya podré trabajar "en local" hasta conseguir adaptar el BAT a tu entorno. Ya te avisaré cuando lo haya conseguido.

mucha suerte en el dentista...

adjunto pantalla de la ultima prueba estimado

vamos menos rendirse.. respirar hondo y seguir.

Creo que ya lo tengo. Hay que cambiar la línea (primera de la rutina ":dias"):

for /f "tokens=1,2,3 delims=-/." %%a in ("%1") do (
   set dd=%%a&set mm=%%b&set yy=%%c)

por esta otra:

for /f "tokens=1,2,3 delims=-/." %%a in ("%1") do (
   set mm=%%a&set dd=%%b&set yy=%%c)

Con eso ya debe funcionar pero primero veremos si los ECHOs salen como deben y luego ya los eliminamos. Y ya me voy.

estimado experto

funciono correctamente.!!

cambie la fecha de mi equipo a la fecha del día lunes y creo la carpeta con fecha del día viernes. perfectamente.

muchas gracias

si yo deseo crear un .bat o utilizar este mismo para q dentro de la carpeta que se crea(con la fecha del día anterior) poder copiarles unos archivos pdf de otra carpeta. que me recomiendas.??

Puedes añadirlo a este bat, que ya tiene "calculado" el nombre de la carpeta de destino, después del IF del MD, por ejemplo.

buenas tardes estimado experto

utilice un ROBOCOY y coloque después del MD.

me funciono.. copio los archivos de la carpeta que coloque en un Set src1

después hice una prueba cambiando la fecha de mi PC al día lunes y me creo la carpeta con fecha del día viernes.

En resumen me funciona bastante bien. te adjunto la pantalla y me dices si tengo que modificarle el cambio que adicione de ultimo o si lo dejo asi.

muchas gracias por tu excelente ayuda.. un abrazo a la distancia

Yo creo que ya puedes eliminar los tres ECHOs que preceden al primer IF. Los pusimos solo como ayuda a la depuración.

Y no tengo nada que objetar respecto al ROBOCOPY. No le veo ninguna ventaja a lanzarlo con START pero tampoco tengo nada en contra de hacerlo así.

Y ha sido un placer echarte una mano. Ya me he apuntado que en este tipo de casos es fundamental aclarar cuál es la "configuración regional" por si hubiera ocasión de recordarlo y evitarse el dar "palos de ciego".

Un abrazo.

Estimado experto

Ultima consulta... el .bat me funciona muy bien..

Que me recomiendas utilizar para copiar archivos con fecha de modificación igual a la carpetas que se crean con las fechas del día anterior.

Ejemplo el día lunes 18 cuando ejecuto el .bat creara la carpeta con fecha del día viernes, en esa carpeta quiero copiar archivos que fueron modificados solo el día viernes.

Actualmente en el robocopy lo tengo definido con un /MAXAGE:1 pero los días lunes no me funciona porque solo copia los de 24hrs modificados y como son más de 3 días si amplio el /MAXAGE:3 se modifica por completo el .bat y todas las carpetas me copia archivos de más de 72 horas de todos los días.

La verdad es que nunca he usado el ROBOCOPY. Le acabo de echar un vistazo y me parece muy potente pero hasta ahora el XCOPY había cubierto todas mis necesidades.

No obstante creo que está claro que deberías invocarlo con un parámetro MAXAGE diferente según el día de la semana. Bastaría, por tanto, reproducir la pareja de IF que hace esa distinción y asignar a cada uno de ellos el comando adecuado. Debe repetirse después de la creación de la carpeta, si se incluyese en los IF de entrada habría que crear la carpeta previamente al ROBOCOPY.

Esa parte quedaría así:

if %dow% equ 1 call :diaant %date% -3
if %dow% gtr 1 call :diaant %date% -1
if not exist %destCarp%\%yy%-%mm%-%dd% md %destCarp%\%yy%-%mm%-%dd%
if %dow% equ 1 robocopy .... /MAXAGE:3 ....
if %dow% gtr 1 robocopy .... /MAXAGE:1 ....

No incluyo la sintaxis completa del ROBOCOPY sino solo el parámetro que habría que cambiar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas