Coo conseguir un batchero que identifique día de semana

Quetiendo ponerle fecha a mis bk diferenciales me veo conla necesidad de separarlos por día de semana: "Lunes", "Martes"... Etc. Pero sólo puedo ponerle la fecha en número "SET mifecha=%date:~6, 4%%date:~3, 2%%date:~0, 2%."

¿Existe alguna forma de tomar el date pero como cadena de día?

1

1 respuesta

Respuesta
1

El tratamiento en profundidad de cosas relacionadas con las fechas en programación BAT es complicado. Afortunadamente ha habido gente que nos ha facilitado el trabajo. Puedes consultar todas las rutinas creadas para ello en http://www.commandline.co.uk/cmdfuncs/dandt/#datetodays 

Vamos a trabajar sobre un ejemplo, más o menos ajustado a lo que he entendido que necesitas. Voy a crear un BAT (digamos DiaSem.bat) que nos diga que día de la semana es hoy.

@echo off&setlocal
call :DateToWeek %date:~6, 4% %date:~3, 2% %date:~0, 2% yn cw dw
if "%dw%" == "1" echo Lunes
if "%dw%" == "2" echo Martes
if "%dw%" == "3" echo Miercoles
if "%dw%" == "4" echo Jueves
if "%dw%" == "5" echo Viernes
if "%dw%" == "6" echo Sabado
if "%dw%" == "7" echo Domingo
goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:DateToWeek %yy% %mm% %dd% yy cw dw
::
:: By: Ritchie Lawrence, Updated 2002-11-20. Version 1.1
::
:: Func: Returns an ISO 8601 Week date from a calendar date.
::       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 year, 4 digits (by ref)
::       %5 var to receive calendar week, 2 digits, 01 to 53 (by ref)
::       %6 var to receive day of week, 1 digit, 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,Jd=153*m+2
set /a Jd=Jd/5+dd+y*365+y/4-y/100+y/400-32045
set /a y=yy+4798,Jp=y*365+y/4-y/100+y/400-31738,t=Jp+3,Jp=t-t%%7
set /a y=yy+4799,Jt=y*365+y/4-y/100+y/400-31738,t=Jt+3,Jt=t-t%%7
set /a y=yy+4800,Jn=y*365+y/4-y/100+y/400-31738,t=Jn+3,Jn=t-t%%7
set /a Jr=%Jp%,yn=yy-1,yn+=Jd/Jt,yn+=Jd/Jn
if %Jd% GEQ %Jn% (set /a Jr=%Jn%) else (if %Jd% GEQ %Jt% set /a Jr=%Jt%)
set /a diff=Jd-Jr,cw=diff/7+1,wd=diff%%7,wd+=1
if %cw% LSS 10 set cw=0%cw%
endlocal&set %4=%yn%&set %5=%cw%&set %6=%wd%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Puede ocurrir que el editor de la página cambie indebidamente algún carácter porque no sería la primera vez. He copiado tal cual la rutina DateToWeek pero seguramente no sería necesario usarla entera. Si tienes ganas de partirte la cabeza puedes intentar entenderla. Yo lo he intentado y no lo he conseguido del todo. De modo que si lo consigues estaré encantado de que me lo expliques.

Ya me dirás si con esto te basta o quieres algo más.

 trate de entenderlo para aplicarlo... pero no se como aplicarlo a mi caso  Gracias igual

¿Has comprobado que funciona? Si es así en lugar de "echo Lunes", por ejemplo, tendrías que poner "set diasem=Lunes" y luego utilizar la variable %diasem% donde quieras que figure. Supongamos que quieres que la copia del archivo "Archivito.txt" se guarde con el nombre "bk_Martes_20160823.txt" dado que hoy es Martes y es 23/08/2016. Le quito a la rutina los comentarios de ayuda para simplificar. Sería esto:

@echo off&setlocal
call :DateToWeek %date:~6, 4% %date:~3, 2% %date:~0, 2% yn cw dw
if "%dw%" == "1" set diasem=Lunes
if "%dw%" == "2" set diasem=Martes
if "%dw%" == "3" set diasem=Miercoles
if "%dw%" == "4" set diasem=Jueves
if "%dw%" == "5" set diasem=Viernes
if "%dw%" == "6" set diasem=Sabado
if "%dw%" == "7" set diasem=Domingo
copy Archivito.txt bk_%diasem%_%date:~6,4%%date:~3,2%%date:~0,2%.txt
goto :EOF
:DateToWeek %yy% %mm% %dd% yy cw dw
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,Jd=153*m+2
set /a Jd=Jd/5+dd+y*365+y/4-y/100+y/400-32045
set /a y=yy+4798,Jp=y*365+y/4-y/100+y/400-31738,t=Jp+3,Jp=t-t%%7
set /a y=yy+4799,Jt=y*365+y/4-y/100+y/400-31738,t=Jt+3,Jt=t-t%%7
set /a y=yy+4800,Jn=y*365+y/4-y/100+y/400-31738,t=Jn+3,Jn=t-t%%7
set /a Jr=%Jp%,yn=yy-1,yn+=Jd/Jt,yn+=Jd/Jn
if %Jd% GEQ %Jn% (set /a Jr=%Jn%) else (if %Jd% GEQ %Jt% set /a Jr=%Jt%)
set /a diff=Jd-Jr,cw=diff/7+1,wd=diff%%7,wd+=1
if %cw% LSS 10 set cw=0%cw%
endlocal&set %4=%yn%&set %5=%cw%&set %6=%wd%&goto :EOF

Si todavía no sabes como usarlo concrétame un poco más los comandos concretos del BAT.

¿Qué pasó con este asunto? ¿Lo probaste?

Sí, lo probé ,pero no tuve resultados... quise probar con vbscripts y si sale..l el tema de fechas ya que es muy sencillo ahí,pero necesito hacerlo con cmd.. :(

Tiene que funcionar. No intentes entenderlo. Cópiame aquí el resultado de la ejecución y el listado del BAT y lo miramos. No abandones, que acabará funcionando. ¿Con qué versión de Windows trabajas?

Tengo WIndows 7(donde estoy probando, los servidores tienen server 2008 y server 2012)

Este es el batchero de que copie el .bak diferencial :

=====================

Echo InicioComprimidoDIFERENCIAL: %date% %time% >> C:\2042010254\baklog.txt
set intento=0
set maxintent=5
CD\
"C:\Program Files\7-Zip\7z" a C:\2042010254\DIFINFOREST.7z C:\2042010254\INFORESTdif.bak
Echo FinComprimidoDIFERENCIAL: %date% %time% >> C:\2042010254\baklog.txt
echo ZipeadoDIF Correcto, espere mientras se copia el bakDIF a la ruta de destino
Echo InicioCopiadoDIFERENCIAL: %date% %time% >> C:\2042010254\baklog.txt
:BucleCopia
copy C:\2042010254\DIFINFOREST.7z \\172.16.1.9\Autobackups\Restaurantes\1007DT1PardosLAP
if errorlevel 1 (
set /a intento=%intento% + 1
if %intento% LEQ %maxintent% (
echo Error en copiaDIF. Reintento numero %intento% >> C:\2042010254\baklog.txt
goto :BucleCopia
)
echo Excedido numero de intentos, copia abortada
echo Excedido numero de intentos, copia abortada >> C:\2042010254\baklog.txt
goto :fin
)
Echo FinCopiadoDIF: %date% %time% >> C:\2042010254\baklog.txt
echo Proceso Completo
:Fin
exit

=================

Funciona, sólo que quería separar los diferenciales por día de semana y estos se sobreescriban solos ya que el .bak full es una vez por semana. Si le asigno fecha con número (01/09/2016) no me ayudaría mucho...

Cuando pruebo el anterior código. no me sale nada...

Me figura "Intento no válido " entre líneas, trate de reemplazar rutas y archivos con nombres reales para replicar el caso pero... el resultado fue el mismo

Gracias

Vamos a ir por partes, si te parece. Primero copia el código de la ventanita de más abajo en un BAT, de nombre, por ejemplo DiaSeman.bat, abres una ventana CMD, te sitúas en la carpeta dónde lo hayas creado, haces un TYPE DIASEMAN.BAT para que podamos ver que no ha habido errores y a continuación lo ejecutas. Debe salir, simplemente, el día de la semana en que lo ejecutas. Si esta prueba sale bien ya vemos luego como lo integramos en tu "batchero" como le llamas. Yo lo acabo de probar en Windows7 (de 32 bits) y en Windows 10 (de 64 bits) y funciona correctamente.

@echo off&setlocal
call :DateToWeek %date:~6, 4% %date:~3, 2% %date:~0, 2% yn cw dw
if "%dw%" == "1" echo Lunes
if "%dw%" == "2" echo Martes
if "%dw%" == "3" echo Miercoles
if "%dw%" == "4" echo Jueves
if "%dw%" == "5" echo Viernes
if "%dw%" == "6" echo Sabado
if "%dw%" == "7" echo Domingo
goto :EOF
:DateToWeek %yy% %mm% %dd% yy cw dw
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,Jd=153*m+2
set /a Jd=Jd/5+dd+y*365+y/4-y/100+y/400-32045
set /a y=yy+4798,Jp=y*365+y/4-y/100+y/400-31738,t=Jp+3,Jp=t-t%%7
set /a y=yy+4799,Jt=y*365+y/4-y/100+y/400-31738,t=Jt+3,Jt=t-t%%7
set /a y=yy+4800,Jn=y*365+y/4-y/100+y/400-31738,t=Jn+3,Jn=t-t%%7
set /a Jr=%Jp%,yn=yy-1,yn+=Jd/Jt,yn+=Jd/Jn
if %Jd% GEQ %Jn% (set /a Jr=%Jn%) else (if %Jd% GEQ %Jt% set /a Jr=%Jt%)
set /a diff=Jd-Jr,cw=diff/7+1,wd=diff%%7,wd+=1
if %cw% LSS 10 set cw=0%cw%
endlocal&set %4=%yn%&set %5=%cw%&set %6=%wd%&goto :EOF

Si no funciona saca un pantallazo de la ventana CMD al intentar la ejecución, y otro con el TYPE, y vemos cuál es la causa. Pero te aseguro que conseguiremos que funcione.

Hola, estimado. Eso es lo que me sale no me sale nada...

Veo que la salida del Type parece correcta. Pero te falta ejecutar el bat, es decir, teclear d:\pruebas\diasemana (+ intro/enter, claro). El type solo muestra el contenido, no lo ejecuta.

Si es verdad tienes razón si me da el día

Bien. No sé exactamente dónde quieres que se escriba el día de la semana. Supongamos que quieres ponerlo delante de 1007DT1PardosLAP (el destino del COPY). Si fuera así prueba con esto (y si no colócalo donde proceda):

@echo off&setlocal
call :DateToWeek %date:~6, 4% %date:~3, 2% %date:~0, 2% yn cw dw
if "%dw%" == "1" set diasem=Lunes
if "%dw%" == "2" set diasem=Martes
if "%dw%" == "3" set diasem=Miercoles
if "%dw%" == "4" set diasem=Jueves
if "%dw%" == "5" set diasem=Viernes
if "%dw%" == "6" set diasem=Sabado
if "%dw%" == "7" set diasem=Domingo
goto :seguir
:DateToWeek %yy% %mm% %dd% yy cw dw
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,Jd=153*m+2
set /a Jd=Jd/5+dd+y*365+y/4-y/100+y/400-32045
set /a y=yy+4798,Jp=y*365+y/4-y/100+y/400-31738,t=Jp+3,Jp=t-t%%7
set /a y=yy+4799,Jt=y*365+y/4-y/100+y/400-31738,t=Jt+3,Jt=t-t%%7
set /a y=yy+4800,Jn=y*365+y/4-y/100+y/400-31738,t=Jn+3,Jn=t-t%%7
set /a Jr=%Jp%,yn=yy-1,yn+=Jd/Jt,yn+=Jd/Jn
if %Jd% GEQ %Jn% (set /a Jr=%Jn%) else (if %Jd% GEQ %Jt% set /a Jr=%Jt%)
set /a diff=Jd-Jr,cw=diff/7+1,wd=diff%%7,wd+=1
if %cw% LSS 10 set cw=0%cw%
endlocal&set %4=%yn%&set %5=%cw%&set %6=%wd%&goto :EOF
:seguir
Echo InicioComprimidoDIFERENCIAL: %date% %time% >> C:\2042010254\baklog.txt
set intento=0
set maxintent=5
CD\
"C:\Program Files\7-Zip\7z" a C:\2042010254\DIFINFOREST.7z C:\2042010254\INFORESTdif.bak
Echo FinComprimidoDIFERENCIAL: %date% %time% >> C:\2042010254\baklog.txt
echo ZipeadoDIF Correcto, espere mientras se copia el bakDIF a la ruta de destino
Echo InicioCopiadoDIFERENCIAL: %date% %time% >> C:\2042010254\baklog.txt
:BucleCopia
copy C:\2042010254\DIFINFOREST.7z \\172.16.1.9\Autobackups\Restaurantes\%diasem%1007DT1PardosLAP
if errorlevel 1 (
set /a intento=%intento% + 1
if %intento% LEQ %maxintent% (
echo Error en copiaDIF. Reintento numero %intento% >> C:\2042010254\baklog.txt
goto :BucleCopia
)
echo Excedido numero de intentos, copia abortada
echo Excedido numero de intentos, copia abortada >> C:\2042010254\baklog.txt
goto :fin
)
Echo FinCopiadoDIF: %date% %time% >> C:\2042010254\baklog.txt
echo Proceso Completo
:Fin
exit

Prueba y dime como va.

¡Gracias!

Gracias Giraldd Funciona muy bien

Me alegro mucho. Creo que deberías cerrar la pregunta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas