中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-10 09:03
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [分享]批处理日历 查看 2,746 回复 11
楼 主 [分享]批处理日历 发表于 2008-11-05 21:29 ·  中国 安徽 合肥 联通
初级用户
积分 32
发帖 14
注册 2008-10-26 20:01
17年会员
UID 129177
性别 男
状态 离线
大家好,这里学习DOS和batch真是个不错的好地方。

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

后来再这里发现了批处理日历http://www.cn-dos.net/forum/viewthread.php?tid=27739&fpage=1&highlight=%E6%97%A5%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 ]
本帖最近评分记录 (共 3 条) 点击查看详情
评分人分数时间
HAT +4 2008-11-05 22:01
BC +2 2008-11-06 13:22
dosjj +2 2008-11-07 07:42
用过DOS的人
2 发表于 2008-11-05 22:14 ·  中国 北京 联通
银牌会员
★★★★
[b]看你妹啊[/b]
积分 1,488
发帖 1,357
注册 2006-05-20 12:00
20年会员
UID 55770
状态 离线
网上不是有网页版的日历嘛
干嘛要找命令的。

有问题请发论坛或者自行搜索,再短消息问我的统统是SB
3 发表于 2008-11-05 22:21 ·  中国 北京 联通
银牌会员
★★★★
[b]看你妹啊[/b]
积分 1,488
发帖 1,357
注册 2006-05-20 12:00
20年会员
UID 55770
状态 离线
这里有几个软件能当日历用

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

有问题请发论坛或者自行搜索,再短消息问我的统统是SB
4 发表于 2008-11-05 23:04 ·  中国 安徽 合肥 联通
初级用户
积分 32
发帖 14
注册 2008-10-26 20:01
17年会员
UID 129177
性别 男
状态 离线
Originally posted by yishanju at 2008-11-5 22:14:
网上不是有网页版的日历嘛
干嘛要找命令的。


1. 学习DOS batch
2. 命令版的很有用,如果你的工作环境不能上网呢,并且非管理用户
3. 其短小精悍
4. 我们不是有Windows吗?干嘛用DOS?:)
用过DOS的人
5 Re 2楼 发表于 2008-11-06 00:58 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
在批处理室说这样的话,让人感觉很奇怪^_^
6 发表于 2008-11-06 13:22 ·  中国 广东 江门 电信
中级用户
★★
积分 338
发帖 175
注册 2007-10-21 15:30
18年会员
UID 100351
性别 男
状态 离线
有个疑问,为什么不在最后加个pause呢...
7 发表于 2008-11-06 19:00 ·  中国 安徽 合肥 联通
初级用户
积分 32
发帖 14
注册 2008-10-26 20:01
17年会员
UID 129177
性别 男
状态 离线
Originally posted by BC at 2008-11-6 13:22:
有个疑问,为什么不在最后加个pause呢...


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

我是看到原来的程序中最后用了pause>nul,但是相对于本程序而言,这样有什么实际的作用呢?显示结束后,要回到提示符还要再按一下空格。
用过DOS的人
8 发表于 2008-11-06 21:35 ·  中国 广东 江门 电信
中级用户
★★
积分 338
发帖 175
注册 2007-10-21 15:30
18年会员
UID 100351
性别 男
状态 离线
哦...原来如此,请兄原谅我的鲁莽.要是搞个dos兼容的就好看了...
9 发表于 2008-11-06 21:59 ·  中国 安徽 芜湖 联通
初级用户
积分 32
发帖 14
注册 2008-10-26 20:01
17年会员
UID 129177
性别 男
状态 离线
刚才读了批处理参数问题一点谈
http://www.cn-dos.net/forum/viewthread.php?tid=17785&fpage=1&highlight=%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.
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
HAT +2 2008-11-07 01:02
用过DOS的人
10 发表于 2008-11-06 22:04 ·  中国 安徽 芜湖 联通
初级用户
积分 32
发帖 14
注册 2008-10-26 20:01
17年会员
UID 129177
性别 男
状态 离线
发现那篇帖子讨论的真深啊,真佩服无奈何、willsort版主的钻研精神,从中现学现用。
用过DOS的人
11 发表于 2008-11-07 15:13 ·  中国 重庆 沙坪坝区 电信
新手上路
积分 11
发帖 11
注册 2008-11-07 14:45
17年会员
UID 130285
性别 男
状态 离线
不错,收藏使用
12 发表于 2008-11-07 20:27 ·  中国 江苏 无锡 江阴市 电信
初级用户
★★
积分 137
发帖 85
注册 2007-11-26 21:05
18年会员
UID 103862
性别 男
状态 离线
润色了一下,增强了:
避免有好事者输英文
默认一月

@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.
论坛跳转: