[Batch] Calendario

Iniciado por 0x0309, 29 Agosto 2009, 07:38 AM

0 Miembros y 1 Visitante están viendo este tema.

0x0309

Hola, he realizado un calendario en batch. La idea es que se ejecute desde la línea de comandos, por ello si lo abren haciendo doble clic se abrirá y se cerrará.

M a t t

El mejor calendario que he visto, te felicito.

xassiz_

C:\> calend.bat

Agosto de 2009
::::::::::::::::::::::::::::::
: l   m   m   j   v   s   d  :
::::::::::::::::::::::::::::::
:01 02 :
:03 04 05 06 07 08 09 :
:10 11 12 13 14 15 16 :
:17 18 19 20 21 22 23 :
:24 25 26 27 28 29 30 :
:(31):
::::::::::::::::::::::::::::::


Probado en vista, sale un poco deforme :P

Debe ser por el
set/p=x<nul


Muy bueno bro ^^

Felicidades  ;D



YXVuIGVyZXMgbWF0YWRvIHBhcmEgcG9uZXJ0ZSBhIGRlc2NpZnJhciBlc3RvIHhE

0x0309

#3
modificado, por encontrar un error grave en el código.

0x0309

#4
modificado, por encontrar un error grave en el código.

xassiz_

Esta muy bueno ;-)

Pero porque no funciona en Vista?

Yo pense que el fallo era de los espacios con set/p=<nul , pero ahora ya no hay espacios =/


bytes ;)



YXVuIGVyZXMgbWF0YWRvIHBhcmEgcG9uZXJ0ZSBhIGRlc2NpZnJhciBlc3RvIHhE

0x0309

#6
Encontré un error grave en el código, en la función diaSemana que hacía que en los meses de noviembre y diciembre se mostrará el primer día del mes con uno que no correspondía, he codificado otra función en su reemplazo. Edité los posts anteriores, pues contenían código malo.
A continuación muestro el código funcional, y con las siguientes opciones:
-[language] -[show weeks numbers]
-[en|es|ge] -w

Pueden editar el código para seleccionar el idioma por defecto, en este caso es english, pero si lo quieren en español:
cambien:
(set lang=en)
por
(set lang=es)


@echo off
:calendario
::version 17:37 06-12-2000
::Fixed various errors.
::Switchs:
::-[language] -[show weeks numbers]
::-[en|es|ge] -w
::
::Compatible with windows vista
setlocal enableextensions enabledelayedexpansion

(set lang=en)
rem choose your default language.
rem lang en for english. ge for german. es for spanish.

for %%l in (en ge es) do (
if /i "-%%l"=="%~1" (set lang=%%l)
if /i "-%%l"=="%~2" (set lang=%%l)
)
(set /a showw=0)
for %%o in (w) do (
if /i "-%%o"=="%~1" (set /a showw=1)
if /i "-%%o"=="%~2" (set /a showw=1)
)

(set errorlevel=)
call :extFecha
call :diaSemana 1 "!m!" "!y!"
set /a ds=!errorlevel!
set /a tk=!m!
call :esBisiesto !y!
set /a b=!errorlevel!
if %m% equ 2 (if %b% equ 1 (
set /a tk=13))
for /f "tokens=%tk%" %%l in (
"31 28 31 30 31 30 31 31 30 31 30 31 29") do set /a limite=%%l
if %d% geq 10 (set dia=^(%d%^)) else (
set dia=^(0%d%^))
echo.
set meses[en]=January February March April May
set meses[en]=%meses[en]% June July August
set meses[en]=%meses[en]% September October November December
set meses[ge]=Januar Februar Maerz April Mai
set meses[ge]=%meses[ge]% Juni Juli August
set meses[ge]=%meses[ge]% September Oktober November Dezember
set meses[es]=Enero Febrero Marzo Abril Mayo
set meses[es]=%meses[es]% Junio Julio Agosto Septiembre
set meses[es]=%meses[es]%  Octubre Noviembre Diciembre
for /f "tokens=%m%" %%m in ("!meses[%lang%]!") do echo. %%m %y%
echo.
(set meses_m[en]=_Mo__Tu__We__Th__Fr__Sa__Su_)
(set meses_m[ge]=_Mo__Di__Mi__Do__Fr__Sa__So_)
(set meses_m[es]=_Lu__Ma__Mi__Ju__Vi__Sa__Do_)
set /a "nd=1"
call :nroSemana !nd! %m% %y%
set /a wn=!errorlevel!
if %showw% equ 1  (set /p "=____"<nul)
echo.!meses_m[%lang%]!
if %showw% equ 1 (call :wn1)
for /l %%s in (2,1,%ds%) do set /p "=...."<nul
set /a "r=8-ds"
for /l %%d in (1,1,%r%) do (
if %%d equ %d% (set /p "=%dia%"<nul) else (
set /p "=.0%%d."<nul))
if %showw% equ 1 (call :wn0 7)
echo.&if %showw% equ 1 (call :wn1)
set /a i=0
set /a r +=1
for /l %%d in (%r%,1,%limite%) do (
if %%d equ %d% (set /p "=%dia%"<nul) else (
if %%d geq 10 (set /p "=.%%d."<nul) else (
set /p "=.0%%d."<nul)
)
set /a i +=1
if !i! equ 7 (
if %showw% equ 1 (call :wn0 7)
set /a i=0&echo.&if %showw% equ 1 (
if %%d lss %limite% (call :wn1))
)
)
set /a i +=1
if %i% equ 1 (set /a i=8)
if %i% lss 8 for /l %%s in (%i%,1,7) do set /p "=...."<nul
echo.
goto :eof

:wn0
set /a "nd+=%~1"
call :nroSemana !nd! %m% %y%
set /a "wn=!errorlevel!"
goto :eof

:wn1
if !wn! lss 10 (set /p "=w0!wn!."<nul) else (
(set /p "=w!wn!."<nul))
goto :eof

:nroSemana
::call :nroSemana %dia% %mes% %año%
::return errorlevel
setlocal enableextensions enabledelayedexpansion
set /a "d=%~1,m=%~2,y=%~3"
call :esBisiesto %y%
set /a b=!errorlevel!
set /a "y_1=y-1"
call :esBisiesto %y_1%
set /a b_1=!errorlevel!
for /f "tokens=%m%" %%d in (
"0 31 59 90 120 151 181 212 243 273 304 334") do (
set /a doyn=%d%+%%d)
if %b% equ 1 (if %m% equ 2 (set /a doyn +=1))
call :diaSemana 1 1 %y%
set /a "j1wd=!errorlevel!"
set /a "wd=1+((doyn+j1wd-2)%%7),yn=y,ejw=8-j1wd"
if %doyn% leq %ejw% (if %j1wd% gtr 4 (
set /a "yn=y-1,wn=52"
if %j1wd% equ 5 (set /a "wn=53")
if %j1wd% equ 6 (if %b_1% equ 1 (set /a "wn=53")
)))
if %yn% equ %y% (if %b% equ 1 (
set /a "i=366") else (
set /a "i=365")
set /a "i_dyn=i-doyn,f_wd=4-wd"
if !i_dyn! lss !f_wd! (set /a "yn=y+1,wn=1")
if %yn% equ %y% (set /a "wn=(doyn+(7-wd)+(j1wd-1))/7"
if %j1wd% gtr 4 (set /a "wn -=1"))
)
exit /b !wn!

:diaSemana
::Basado en el algoritmo de Tomohiko Sakamot
::Retorn 1 Monday, 7 Sunday
setlocal enableextensions disabledelayedexpansion
for /f "tokens=* delims=0 eol=0" %%d in ("%~1") do set /a "d=%%d"
for /f "tokens=* delims=0 eol=0" %%m in ("%~2") do set /a "m=%%m"
set /a "y=%~3"
for /f "tokens=%m%" %%t in (
"0 3 2 5 0 3 5 1 4 6 2 4") do set /a "t=%%t"
if %m% lss 3 (set /a y-=1)
set /a "dw=(y+y/4-(y/100)+(y/400)+t+d)%%7"
if %dw% equ 0 (set /a dw=7)
exit /b %dw%

:esBisiesto
setlocal enableextensions disabledelayedexpansion
set y=%~1
set /a "b=(!(y%%4)&!!(y%%100))|!(y%%400)"
exit /b %b%

:extFecha
:: extract day month and year of the current date
:: Adapatacion del code de Herbert Kleebauer
:: Este codigo extrae en tres variables el contenido de la fecha
:: compatible con las distintas configuraciones regionales.
:: Retorna variables d,m,y que corresponden a dia mes año
setlocal enableextensions
set "date="
pushd "%Temp%"
:loop
set d="%date%"
echo.>-.-
if not %d%=="%date%" goto :loop
for /f "tokens=1-3 delims=0123456789 " %%i in (
"%date%") do set d=%%i%%j%%k
for /f "tokens=1-3 delims=%d% " %%i in (
"%date%") do set /a d=1%%i,m=1%%j,y=1%%k
if %d% gtr %m% (
  set d=%m%
  set m=%d%)
if %m% gtr %y% (
  set m=%y%
  set y=%m%)
if %d% gtr %m% (
  set d=%m%
  set m=%d%)
set /a d=%d%-100,m=%m%-100,y=%y%-10000
if %d% gtr 12 goto :eFEof
if %d% equ %m% goto :eFEof
if %m% gtr 12 (
  set m=%d%
  set d=%m%
  goto :eFEof)
xcopy /l /d:%m%-%d%-%y% -.- \|find "-.-" >nul
if errorlevel 1 goto :l1
xcopy /l /d:%d%-%m%-%y% -.- \|find "-.-" >nul
if not errorlevel 1 goto :eFEof
:l1
(set m=%d%
set d=%m%)
:eFEof
del -.-
popd
(
endlocal
set y=%y%
set m=%m%
set d=%d%
)
setlocal enableextensions && goto :Eof



y produce:


C:\>kal -es

Septiembre 2009

_Lu__Ma__Mi__Ju__Vi__Sa__Do_
.....01..02..03..04..05.(06)
.07..08..09..10..11..12..13.
.14..15..16..17..18..19..20.
.21..22..23..24..25..26..27.
.28..29..30.................

C:\>kal -es -w

Septiembre 2009

_____Lu__Ma__Mi__Ju__Vi__Sa__Do_
w36......01..02..03..04..05.(06)
w37..07..08..09..10..11..12..13.
w38..14..15..16..17..18..19..20.
w39..21..22..23..24..25..26..27.
w40..28..29..30.................

C:\>



La opción -w muestra el número de la semana.