中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-10 08:59
47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,255 会员排行
DOS批处理 & 脚本技术(批处理室) » [分享]批处理日历
可打印版本  2,744 / 11
第1楼 huanbei 发表于 2008-11-05 21:29
初级用户 发帖 14 积分 32
[分享]批处理日历
大家好,这里学习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的,系统中自带的小日历只能是管理员才可打开(更改),这样让我很郁闷。

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



程序有错,自己更正了一下。

[ Last edited by huanbei on 2008-11-6 at 00:53 ]
第2楼 yishanju 发表于 2008-11-05 22:14
银牌会员 发帖 1,357 积分 1,488
网上不是有网页版的日历嘛
干嘛要找命令的。
第3楼 yishanju 发表于 2008-11-05 22:21
银牌会员 发帖 1,357 积分 1,488
这里有几个软件能当日历用

http://www.time.ac.cn/serve/down.htm
第4楼 huanbei 发表于 2008-11-05 23:04
初级用户 发帖 14 积分 32
Originally posted by yishanju at 2008-11-5 22:14:
网上不是有网页版的日历嘛
干嘛要找命令的。


1. 学习DOS batch
2. 命令版的很有用,如果你的工作环境不能上网呢,并且非管理用户
3. 其短小精悍
4. 我们不是有Windows吗?干嘛用DOS?:)
第5楼 HAT 发表于 2008-11-06 00:58
版主 发帖 5,017 积分 9,023
Re 2楼
在批处理室说这样的话,让人感觉很奇怪^_^
第6楼 BC 发表于 2008-11-06 13:22
中级用户 发帖 175 积分 338
有个疑问,为什么不在最后加个pause呢...
第7楼 huanbei 发表于 2008-11-06 19:00
初级用户 发帖 14 积分 32
Originally posted by BC at 2008-11-6 13:22:
有个疑问,为什么不在最后加个pause呢...


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

我是看到原来的程序中最后用了pause>nul,但是相对于本程序而言,这样有什么实际的作用呢?显示结束后,要回到提示符还要再按一下空格。
第8楼 BC 发表于 2008-11-06 21:35
中级用户 发帖 175 积分 338
哦...原来如此,请兄原谅我的鲁莽.要是搞个dos兼容的就好看了...
第9楼 huanbei 发表于 2008-11-06 21:59
初级用户 发帖 14 积分 32
刚才读了批处理参数问题一点谈
http://www.cn-dos.net/forum/viewthread.php?tid=17785&fpage=1&highlight=%E5%8F%82%E6%95%B0学习了一下。

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



新代码如下:
第10楼 huanbei 发表于 2008-11-06 22:04
初级用户 发帖 14 积分 32
发现那篇帖子讨论的真深啊,真佩服无奈何、willsort版主的钻研精神,从中现学现用。
第11楼 ucdos12 发表于 2008-11-07 15:13
新手上路 发帖 11 积分 11
不错,收藏使用
第12楼 yyyyyyyyy 发表于 2008-11-07 20:27
初级用户 发帖 85 积分 137
润色了一下,增强了:
避免有好事者输英文
默认一月

@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.
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023