中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] [3] »
作者:
标题: 批处理版万年历 上一主题 | 下一主题
kidzgy
中级用户





积分 262
发帖 129
注册 2007-7-11
状态 离线
『第 31 楼』:  

我可是在20楼 点击 [Copy to clipboard]  复制到文本里去,然后改扩展名。

怎么会没有问题呢?你试着重新复制你自己的代码到bat中去,然后运行,输入里面所举的例子,会提示错误的。此时错误的界面一直是个循环,不管你按任意键,还是一样。

2007-8-2 07:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 32 楼』:  

应该是你的情况比较特殊一些
我和早前的namejm讨论都没有遇到这个问题
这次为了测试特意使用IE打开了这个页面
试了 [Copy to clipboard]  功能
也没有任何问题

所以请还是按照的建议插入调试语句看看结果再说

2007-8-2 07:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
frankkf
初级用户





积分 88
发帖 43
注册 2007-5-30
状态 离线
『第 33 楼』:  

[Copy to clipboard]  功能应该没问题
以前一些code我也用的是[Copy to clipboard]  功能

  Quote:
这次为了测试特意使用IE打开了这个页面

那qzwqzw用什么看网页?
firefox或者是opera?~~

2007-8-2 13:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
kidzgy
中级用户





积分 262
发帖 129
注册 2007-7-11
状态 离线
『第 34 楼』:  

http://upload.programfan.com/upfile/200708021645310.rar
你试试我这个,看看是不是有这个问题,我可是完全复制下来的哦。

随便打一个字,然后回车。提示“错误的日期.” 然后不管你按什么键是不会回到原来的界面的。

2007-8-2 16:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 35 楼』:  

非常感谢你的报告!
因此我又揭开了微软cmd的一个secret

解决你的问题方法很简单
请将你的代码文件扩展名改为.cmd
或者在代码中的set /a前加上一句 cd. 以复位错误号为0

==================================

现在描述一下解决问题的过程
首先下载到你的测试文件后
测试运行果然发现你所述的问题

然后我对问题代码与我的正常运行的源代码进行比较
发现问题代码分别在第2行和第一个goto Main所在行行尾多出两个空格
因为第2个空格位置的特殊性
我以为找到了问题所在

因为我使用的是EditPlus编辑源代码
它保存代码时会自动清除行尾的空格
而帖出去的代码很可能是因为使用了其它编辑器修改后多出来的

然而我在去除掉多余空格测试却发现问题依然存在
再次二进制比较两个代码文件的结果是完全一致

然后我开始漫长的跟踪调试
我发现问题代码总是在因为一次set /a的错误产生错误号9167后
不会再因为正确的set /a而复位错误号0
而正常代码就无此问题

经过再三的思索
终于确定这个问题与文件扩展名相关
也就是说,
在.bat文件中set 产生的错误总不会被set所复位
而在.cmd文件中则是可以的

以下是一段测试代码
将它分别保存为.bat和.cmd文件进行测试后发现
二者结果不同
至此问题基本明晰
@echo off
set /a ii=23 + 12
echo %errorlevel%.
set /a ii=23 + 09
echo %errorlevel%.
echo %errorlevel%.
set ii=23
echo %errorlevel%.
pause
但是至于这个问题的深层原因尚没有找到
这个留待有心人继续探索
而且我在EditPlus的工具栏中运行.bat文件并没有遇到此问题

2007-8-3 07:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
kidzgy
中级用户





积分 262
发帖 129
注册 2007-7-11
状态 离线
『第 36 楼』:  

那请你更新一下20楼的代码,以至于更完善一点。
不管在bat还是cmd中,能够保证正常运行就够了。

2007-8-3 20:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
kidzgy
中级用户





积分 262
发帖 129
注册 2007-7-11
状态 离线
『第 37 楼』:  

还是有错误,还是保存到BAT的时候,输入07-02-03提示错误。

我是复制20楼的代码到BAT中和CMD中分别测试的。

2007-8-4 18:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 38 楼』:  

问题已经查明
仍然是set的errorlevel问题

至于问题的细节
和代码的修改
就留给你当今晚的作业吧

也算考一考你对这个问题的认识

2007-8-4 19:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
kidzgy
中级用户





积分 262
发帖 129
注册 2007-7-11
状态 离线
『第 39 楼』:  

不会吧,我对批处理不是很熟悉啊,不像你们那么懂得资深。

如果叫我测试那还行,如果叫我修复问题,那简直是为难我。。

2007-8-4 19:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zjl5
初级用户





积分 82
发帖 15
注册 2007-5-26
状态 离线
『第 40 楼』:  

qzwqzw兄可能太忙了...
我就针对症状改改吧.可能会引出更多的问题呵~`
另外加入了 针对农历的生肖和干支年计算.
:: 月历查询工具 中国DOS联盟专用版 转载请注明版权
:: 原创:zjl5  更新:namejm, qzwqzw 2007-06-03

:: 算法:基姆拉尔森计算公式
:: W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
:: 把一月和二月看成是上一年的十三月和十四月
:: 例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。

:: 输入的日期格式为:年-月-日(-可以替换为:、/,可以混用)
:: 在日历里面,★=当天

:: 支持多种格式的日期输入:
:: ① 若只输入一个数,则认为是查询当年月份,自动截取后两位数字查询,★标在1日上;
:: ② 若输入两个数,则认为是查询年和月,★标在1日上;
:: ③ 输全的话,★标在指定日期上

:: 关于年份的转换:
:: ① 若年份上输入的数字少于三位,则作如下转换:
::     50~99判定为19xx
::     0~49判定为20xx
:: ② 若输入的年份数字超过两位,则截取后四位字符(不足部分在高位补0),
::    按 ① 的规则计算该年份的日期;

@echo off
color 3F
mode con cols=40 lines=20
setlocal enabledelayedexpansion
set str=日一二三四五六
set sdate=%date%

:Main
cls&echo.
:: 日期提取、格式化与校验
for /f "tokens=1,2,3 delims=-/: " %%i in ("%sdate%") do (
    (set sy=%%i) && (set sm=%%j) && (set sd=%%k))
if %sm% geq 13 (echo 错误的日期.&pause>nul&(set sdate=%date%)&pause>nul&goto :main)
if %sd% geq 32 (echo 错误的日期.&pause>nul&(set sdate=%date%)&pause>nul&goto :main)
if not defined sd set sd=1
if not defined sm set sm=%sy%& set sy=%date:~0,4%
(set sy=0000%sy%) && (set sm=00%sm%) && (set sd=00%sd%)
(set sy=%sy:~-4%) && (set sm=%sm:~-2%) && (set sd=%sd:~-2%)
set /a y=1%sy%-10000, m=1%sm%-100, d=1%sd%-100 2>nul
if %y% lss 100 (
    if %y% lss 50 (set /a y+=2000) else (set /a y+=1900)
    set sy=!y!
)
if %m% lss 13 if %d% lss 32 goto Calc

:Calc
set sx=猴鸡狗猪鼠牛虎兔龙蛇马羊
set tg=庚辛壬癸甲乙丙丁戊己
set dz=申酉戌亥子丑寅卯辰巳午未
set /a sxnum=%sy% %% 12
set /a tgnum=%sy:~-1%
title   农历!tg:~%tgnum%,1!!dz:~%sxnum%,1!年    生肖:!sx:~%sxnum%,1!
:: 计算每个月的天数
set days=31
for %%i in (4 6 9 11) do if %m% equ %%i set days=30
:: 计算2月份的偏差
set /a leap="^!(y%%4) & ^!(^!(y%%100)) | ^!(y%%400)"
if %m% equ 2 set /a days=28+%leap%
if %m% leq 2 (set /a y-=1& set /a m+=12)
:: 计算指定日期的星期数
set /a w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%%7

echo.  %sy%年%sm%月  查询日:%sy%-%sm%-%sd%,星期!str:~%w%,1!
echo.
:: 生成月历
set /a wb=(w+35-d) %% 7, we=wb+days+1, day=1
echo.    日   一   二   三   四   五   六
echo. ━━━━━━━━━━━━━━━━━━━
set /p= <nul
for /l %%i in (0,1,37) do (
    set "temp=  "
    if %%i GTR %wb% if %%i LSS %we% (
        set temp= !day!
        set temp=!temp:~-2!
        if !d! EQU !day! set temp=★
        set /a day+=1
    )
    set /p=   !temp!<nul
    set /a "wm=(%%i+1)%%7"
    if !wm! equ 0 echo.&echo.&set /p= <nul
)
echo.
echo  ━━━━━━━━━━━━━━━━━━━
echo.  输入日期可查询当日星期并显示当月月历
echo.
set sdate=
set /p sdate=  格式如:07-02-03,[回车]退出:
if defined sdate goto Main


2007-8-4 23:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zjl5
初级用户





积分 82
发帖 15
注册 2007-5-26
状态 离线
『第 41 楼』:  

奇怪%errorlevel%怎么会是9167,兄台解释一下,谢谢!!
因为没有编辑贴子的权限,所以又得另发一张了.
:: 月历查询工具 中国DOS联盟专用版 转载请注明版权
:: 原创:zjl5  更新:namejm, qzwqzw 2007-06-03

:: 算法:基姆拉尔森计算公式
:: W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
:: 把一月和二月看成是上一年的十三月和十四月
:: 例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。

:: 输入的日期格式为:年-月-日(-可以替换为:、/,可以混用)
:: 在日历里面,★=当天

:: 支持多种格式的日期输入:
:: ① 若只输入一个数,则认为是查询当年月份,自动截取后两位数字查询,★标在1日上;
:: ② 若输入两个数,则认为是查询年和月,★标在1日上;
:: ③ 输全的话,★标在指定日期上

:: 关于年份的转换:
:: ① 若年份上输入的数字少于三位,则作如下转换:
::     50~99判定为19xx
::     0~49判定为20xx
:: ② 若输入的年份数字超过两位,则截取后四位字符(不足部分在高位补0),
::    按 ① 的规则计算该年份的日期;

@echo off
color 3F
mode con cols=40 lines=20
setlocal enabledelayedexpansion
set str=日一二三四五六
set sdate=%date%

:Main
cls&echo.
:: 日期提取、格式化与校验
for /f "tokens=1,2,3 delims=-/: " %%i in ("%sdate%") do (
    (set sy=%%i) && (set sm=%%j) && (set sd=%%k)
)
if not defined sd set sd=1
if not defined sm set sm=%sy%& set sy=%date:~0,4%

(set sy=0000%sy%) && (set sm=00%sm%) && (set sd=00%sd%)
(set sy=%sy:~-4%) && (set sm=%sm:~-2%) && (set sd=%sd:~-2%)
set /a y=1%sy%-10000, m=1%sm%-100, d=1%sd%-100 2>nul
if errorlevel 9167 goto Error
if %y% lss 100 (
    if %y% lss 50 (set /a y+=2000) else (set /a y+=1900)
    set sy=!y!
)
if %m% lss 13 if %d% lss 32 goto Calc

:Error
echo.错误的日期.
pause>nul
cd.
set sdate=%date%
goto Main

:Calc
set sx=猴鸡狗猪鼠牛虎兔龙蛇马羊
set tg=庚辛壬癸甲乙丙丁戊己
set dz=申酉戌亥子丑寅卯辰巳午未
set /a sxnum=%sy% %% 12
set /a tgnum=%sy:~-1%
title   农历!tg:~%tgnum%,1!!dz:~%sxnum%,1!年    生肖:!sx:~%sxnum%,1!
:: 计算每个月的天数
set days=31
for %%i in (4 6 9 11) do if %m% equ %%i set days=30
:: 计算2月份的偏差
set /a leap="^!(y%%4) & ^!(^!(y%%100)) | ^!(y%%400)"
if %m% equ 2 set /a days=28+%leap%
if %m% leq 2 (set /a y-=1& set /a m+=12)
:: 计算指定日期的星期数
set /a w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%%7

echo.  %sy%年%sm%月  查询日:%sy%-%sm%-%sd%,星期!str:~%w%,1!
echo.
:: 生成月历
set /a wb=(w+35-d) %% 7, we=wb+days+1, day=1
echo.    日   一   二   三   四   五   六
echo. ━━━━━━━━━━━━━━━━━━━
set /p= <nul
for /l %%i in (0,1,37) do (
    set "temp=  "
    if %%i GTR %wb% if %%i LSS %we% (
        set temp= !day!
        set temp=!temp:~-2!
        if !d! EQU !day! set temp=★
        set /a day+=1
    )
    set /p=   !temp!<nul
    set /a "wm=(%%i+1)%%7"
    if !wm! equ 0 echo.&echo.&set /p= <nul
)
echo.
echo  ━━━━━━━━━━━━━━━━━━━
echo.  输入日期可查询当日星期并显示当月月历
echo.
set sdate=
set /p sdate=  格式如:07-02-03,[回车]退出:
if defined sdate goto Main


2007-8-5 01:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 42 楼』:  

9167是set /a因为无效数字(比如09)错误产生的errorlevel
需要注意的是set /p如果未获取到任何输入也会产生1的errorlevel
而且即使set /a和set /p再正常运行也不会复位早前的errorlevel

也就是说,在命令行或者.bat脚本中
set命令只有在运行出错时才会置errorlevel为非0值
在正确运行时是不会置0值的

而在.cmd脚本中
set在正确运行时是会置errorlevel为0值的

2007-8-5 18:47
查看资料  发短消息 网志   编辑帖子  回复  引用回复
sunny04551
贫困用户





积分 -4
发帖 5
注册 2007-8-20
状态 离线
『第 43 楼』:  

要是能查到农历就更好

2007-8-20 15:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
meicnk
初级用户





积分 22
发帖 11
注册 2006-9-1
状态 离线
『第 44 楼』:  

很好,收藏中

2007-8-27 11:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
hmilywenjia
新手上路





积分 8
发帖 5
注册 2008-2-2
状态 离线
『第 45 楼』:  

今天上来看到namejm的消息很是高兴啊,一直关注你的消息,你没事就好

2008-5-26 14:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: