Board logo

标题: [分享]批处理日历 [打印本页]

作者: huanbei     时间: 2008-11-5 21:29    标题: [分享]批处理日历

大家好,这里学习DOS和batch真是个不错的好地方。

我一直想找个dos下CAL命令,类似于linux下的cal。

后来再这里发现了批处理日历http://www.cn-dos.net/forum/view ... E5%8E%86&page=1这个帖子,用电脑也很久了,现在想稍微了解一下batch,正是通过这篇文章了解了xp下batch。感谢huzixuan和my3439955,一边学习代码一边消化,花了我几天的时间——发现真笨,现在自己改写了那篇文章的部分代码,原因如下:
1. 代码中有个临时文件,我觉得不爽。
2. 目前通用的日历排序是:日、一、二、三、四、五、六
3. 学习嘛,所以看看自己能否看懂,在这过程中不知不觉就改了

为什么想找一个cal命令呢,是因为我通常用USER登陆xp的,系统中自带的小日历只能是管理员才可打开(更改),这样让我很郁闷。

有错误的地方,请大家指正。
代码如下:
@echo off

setlocal enabledelayedexpansion

:::::::::::定义s1~s12,为每个月的天数
for %%b in (31,28,31,30,31,30,31,31,30,31,30,31) do (
set /a y+=1
set s!y!=%%b
)

:::::::::::判断输入年份是否为闰年,更改2月的天数
set /p year=查几年?

set /a year_chk1=year%%400
set /a year_chk2=year%%4
set /a year_chk3=year%%100
if %year_chk1% equ 0 set s2=29
if %year_chk2% equ 0 if %year_chk3% neq 0 set s2=29

::::::::::输入月份,并计算当年的第一天到上月月底的天数
set /p m=查几月?
set n=%m%
set /a n-=1
for /l %%c in (1,1,%n%) do (
set /a day+=!s%%c!)


::::::::::判断这一年的第一天是星期几?再判断所要查询月份的第一天是星期几?
set /a yearflag=(%year%+(%year%-1)/4-(%year%-1)/100+(%year%-1)/400)%%7
if %m%==1 (set  monthflag=%yearflag% ) else (set /a monthflag=%yearflag%+!day!%%7 )

if %monthflag% geq 7 (set /a monthflag-=7)

echo    日   一   二   三   四   五   六   

:::::::::输入月份1号前的空日期
for /l %%d in (1,1,%monthflag%) do (
set /p=     <nul)
:::::::::找出要换行的日期(第一个,后每7个一换),显示当月日期并换行
set /a cl=7-%monthflag%

for /l %%e in (1 1 !s%m%!) do (
if %%e lss 10 (set /p=    %%e<nul) else (set /p=   %%e<nul)
if %%e==!cl! (echo.&set /a cl+=7)
)
echo.
程序有错,自己更正了一下。

[ Last edited by huanbei on 2008-11-6 at 00:53 ]
作者: yishanju     时间: 2008-11-5 22:14
网上不是有网页版的日历嘛
干嘛要找命令的。
作者: yishanju     时间: 2008-11-5 22:21
这里有几个软件能当日历用

http://www.time.ac.cn/serve/down.htm
作者: huanbei     时间: 2008-11-5 23:04


  Quote:
Originally posted by yishanju at 2008-11-5 22:14:
网上不是有网页版的日历嘛
干嘛要找命令的。

1. 学习DOS batch
2. 命令版的很有用,如果你的工作环境不能上网呢,并且非管理用户
3. 其短小精悍
4. 我们不是有Windows吗?干嘛用DOS?:)
作者: HAT     时间: 2008-11-6 00:58    标题: Re 2楼

在批处理室说这样的话,让人感觉很奇怪^_^
作者: BC     时间: 2008-11-6 13:22
有个疑问,为什么不在最后加个pause呢...
作者: huanbei     时间: 2008-11-6 19:00


  Quote:
Originally posted by BC at 2008-11-6 13:22:
有个疑问,为什么不在最后加个pause呢...

让程序自动返回DOS命令符不好吗?

我是看到原来的程序中最后用了pause>nul,但是相对于本程序而言,这样有什么实际的作用呢?显示结束后,要回到提示符还要再按一下空格。
作者: BC     时间: 2008-11-6 21:35
哦...原来如此,请兄原谅我的鲁莽.要是搞个dos兼容的就好看了...
作者: huanbei     时间: 2008-11-6 21:59
刚才读了批处理参数问题一点谈
http://www.cn-dos.net/forum/view ... =%E5%8F%82%E6%95%B0学习了一下。

为日历加入了参数。效果如下:



新代码如下:
@echo off

setlocal enabledelayedexpansion

:::::加入batch参数功能
set year=%~1
set m=%~2
if not defined m (
        if not defined year (
                echo 输入格式 cal year month 例:cal 2008 10
        ) else (
                echo 输入格式 cal year month 例:cal 2008 10
                )
) else (
        call :main       
        )
goto :eof

:main

:::::::::::定义s1~s12,为每个月的天数
for %%b in (31,28,31,30,31,30,31,31,30,31,30,31) do (
set /a y+=1
set s!y!=%%b
)

:::::::::::判断输入年份是否为闰年,更改2月的天数
set /a year_chk1=year%%400
set /a year_chk2=year%%4
set /a year_chk3=year%%100
if %year_chk1% equ 0 set s2=29
if %year_chk2% equ 0 if %year_chk3% neq 0 set s2=29

::::::::::输入月份,并计算当年的第一天到上月月底的天数
set n=%m%
set /a n-=1
for /l %%c in (1,1,%n%) do (
set /a day+=!s%%c!)


::::::::::判断这一年的第一天是星期几?再判断所要查询月份的第一天是星期几?
set /a yearflag=(%year%+(%year%-1)/4-(%year%-1)/100+(%year%-1)/400)%%7
if %m%==1 (set  monthflag=%yearflag% ) else (set /a monthflag=%yearflag%+!day!%%7 )
if %monthflag% geq 7 (set /a monthflag-=7)

echo.
echo.
echo    %year% %m%
echo.
echo.
echo    日   一   二   三   四   五   六   

:::::::::输入月份1号前的空日期
for /l %%d in (1,1,%monthflag%) do (
set /p=     <nul)
:::::::::找出要换行的日期(第一个,后每7个一换),显示当月日期并换行
set /a cl=7-%monthflag%
for /l %%e in (1 1 !s%m%!) do (
if %%e lss 10 (set /p=    %%e<nul) else (set /p=   %%e<nul)
if %%e==!cl! (echo.&set /a cl+=7)
)
echo.

作者: huanbei     时间: 2008-11-6 22:04
发现那篇帖子讨论的真深啊,真佩服无奈何、willsort版主的钻研精神,从中现学现用。
作者: ucdos12     时间: 2008-11-7 15:13
不错,收藏使用
作者: yyyyyyyyy     时间: 2008-11-7 20:27
润色了一下,增强了:
避免有好事者输英文
默认一月

@echo off

setlocal enabledelayedexpansion

:::::加入batch参数功能
set year=%~1
set m=%~2
set /a year1=!year!+1-1
set /a m1=!m!+1-1
if not "!year!"=="!year1!" goto help
if not "!m!"=="!m!" goto help
if not defined m (
        if not defined year (
                goto :help
        ) else (
                set m=1
                goto :main
        )
)

:help
@echo 输入格式:
@echo cal year month
@echo 例:cal 2008 10
@echo 如未输入月份,则默认为1月
exit /b

:main

:::::::::::定义s1~s12,为每个月的天数
for %%b in (31,28,31,30,31,30,31,31,30,31,30,31) do (
set /a y+=1
set s!y!=%%b
)

:::::::::::判断输入年份是否为闰年,更改2月的天数
set /a year_chk1=year%%400
set /a year_chk2=year%%4
set /a year_chk3=year%%100
if %year_chk1% equ 0 set s2=29
if %year_chk2% equ 0 if %year_chk3% neq 0 set s2=29

::::::::::输入月份,并计算当年的第一天到上月月底的天数
set n=%m%
set /a n-=1
for /l %%c in (1,1,%n%) do (
set /a day+=!s%%c!)


::::::::::判断这一年的第一天是星期几?再判断所要查询月份的第一天是星期几?
set /a yearflag=(%year%+(%year%-1)/4-(%year%-1)/100+(%year%-1)/400)%%7
if %m%==1 (set  monthflag=%yearflag% ) else (set /a monthflag=%yearflag%+!day!%%7 )
if %monthflag% geq 7 (set /a monthflag-=7)

echo.
echo.
echo    %year% %m%
echo.
echo.
echo    日   一   二   三   四   五   六   

:::::::::输入月份1号前的空日期
for /l %%d in (1,1,%monthflag%) do (
set /p=     <nul)

:::::::::找出要换行的日期(第一个,后每7个一换),显示当月日期并换行
set /a cl=7-%monthflag%
for /l %%e in (1 1 !s%m%!) do (
if %%e lss 10 (set /p=    %%e<nul) else (set /p=   %%e<nul)
if %%e==!cl! (echo.&set /a cl+=7)
)
echo.