Título: [Batch] Calendario
Publicado por: 0x0309 en 29 Agosto 2009, 07:38 am
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á.
Título: Re: [Batch] Calendario
Publicado por: M a t t en 30 Agosto 2009, 02:23 am
El mejor calendario que he visto, te felicito.
Título: Re: [Batch] Calendario
Publicado por: xassiz_ en 31 Agosto 2009, 22:31 pm
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 Muy bueno bro ^^ Felicidades ;D
Título: Re: [Batch] Calendario
Publicado por: 0x0309 en 2 Septiembre 2009, 08:01 am
modificado, por encontrar un error grave en el código.
Título: Re: [Batch] Calendario
Publicado por: 0x0309 en 2 Septiembre 2009, 09:36 am
modificado, por encontrar un error grave en el código.
Título: Re: [Batch] Calendario
Publicado por: xassiz_ en 2 Septiembre 2009, 15:13 pm
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 ;)
Título: Re: [Batch] Calendario
Publicado por: 0x0309 en 6 Septiembre 2009, 23:16 pm
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] Pueden editar el código para seleccionar el idioma por defecto, en este caso es english, pero si lo quieren en español: cambien: por @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.
|