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 Respuesta
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.
¿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.
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.
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.
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.
- Compartir respuesta