中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: [分享]批处理日历 上一主题 | 下一主题
huanbei
初级用户





积分 32
发帖 14
注册 2008-10-26
状态 离线
『楼 主』:  [分享]批处理日历

大家好,这里学习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 ]

   此帖被 +8 点积分     点击查看详情   
评分人:【 HAT 分数: +4  时间:2008-11-5 22:01
评分人:【 BC 分数: +2  时间:2008-11-6 13:22
评分人:【 dosjj 分数: +2  时间:2008-11-7 07:42




用过DOS的人
2008-11-5 21:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yishanju
银牌会员

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 2 楼』:  

网上不是有网页版的日历嘛
干嘛要找命令的。




有问题请发论坛或者自行搜索,再短消息问我的统统是SB
2008-11-5 22:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
yishanju
银牌会员

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 3 楼』:  

这里有几个软件能当日历用

http://www.time.ac.cn/serve/down.htm




有问题请发论坛或者自行搜索,再短消息问我的统统是SB
2008-11-5 22:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
huanbei
初级用户





积分 32
发帖 14
注册 2008-10-26
状态 离线
『第 4 楼』:  



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

1. 学习DOS batch
2. 命令版的很有用,如果你的工作环境不能上网呢,并且非管理用户
3. 其短小精悍
4. 我们不是有Windows吗?干嘛用DOS?:)



用过DOS的人
2008-11-5 23:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 5 楼』:  Re 2楼

在批处理室说这样的话,让人感觉很奇怪^_^



2008-11-6 00:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
BC
中级用户




积分 338
发帖 175
注册 2007-10-21
状态 离线
『第 6 楼』:  

有个疑问,为什么不在最后加个pause呢...



C:\
C:\Del BC
2008-11-6 13:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
huanbei
初级用户





积分 32
发帖 14
注册 2008-10-26
状态 离线
『第 7 楼』:  



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

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

我是看到原来的程序中最后用了pause>nul,但是相对于本程序而言,这样有什么实际的作用呢?显示结束后,要回到提示符还要再按一下空格。



用过DOS的人
2008-11-6 19:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
BC
中级用户




积分 338
发帖 175
注册 2007-10-21
状态 离线
『第 8 楼』:  

哦...原来如此,请兄原谅我的鲁莽.要是搞个dos兼容的就好看了...



C:\
C:\Del BC
2008-11-6 21:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
huanbei
初级用户





积分 32
发帖 14
注册 2008-10-26
状态 离线
『第 9 楼』:  

刚才读了批处理参数问题一点谈
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.


   此帖被 +2 点积分    点击查看详情   
评分人:【 HAT 分数: +2  时间:2008-11-7 01:02




用过DOS的人
2008-11-6 21:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
huanbei
初级用户





积分 32
发帖 14
注册 2008-10-26
状态 离线
『第 10 楼』:  

发现那篇帖子讨论的真深啊,真佩服无奈何、willsort版主的钻研精神,从中现学现用。



用过DOS的人
2008-11-6 22:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ucdos12
新手上路





积分 11
发帖 11
注册 2008-11-7
状态 离线
『第 11 楼』:  

不错,收藏使用

2008-11-7 15:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yyyyyyyyy
初级用户





积分 137
发帖 85
注册 2007-11-26
状态 离线
『第 12 楼』:  

润色了一下,增强了:
避免有好事者输英文
默认一月

@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.

2008-11-7 20:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: